ورود

View Full Version : پروزه اسمبلی دوستان کمک کنید



zh00bin
دوشنبه 12 خرداد 1393, 20:30 عصر
سلام دوستان یه پروژه دارم نمیتونم کاملش کنم خواهشن کمک کنید
یه صفحه است که 4 تا گزینه داره که از این قرار اند

N^3+N^2+N
2^n
IS N EVEN OR ODD
EXIT
گزینه سوم فرد یا زوج بودن هدد و مشخص میکنه
با امولاتور 8086 باید بنویسیم
ممنون میشم کمک کنید

vahid-p
دوشنبه 12 خرداد 1393, 21:17 عصر
تا کجاشو نوشتی.
شروع کن ما هم کمک میکنیم تا جایی که بتونیم

zh00bin
سه شنبه 13 خرداد 1393, 17:25 عصر
تا کجاشو نوشتی.
شروع کن ما هم کمک میکنیم تا جایی که بتونیم
سلام دوست عزیز
تا اینجا نوشتم:
مشکل اصلیم تبدیل رشته ورودی به عدد و دوباره تبدیل عدد به اسکیه البته یه ماکرو واسه این کار نوشتم گزینه یک هم یه مقدار تو محاسبه ش مشکل دارم بقیش واسم مشکل نیست. ماکرو پرینت با بعضی رشته ها مشکل داره حروف عجیب غریب چاپ میکنه
توی پروسیجر P1 از یه دستور دیگه واسه پرینت استفاده کردم که اون جواب میده
البته نمیدونم چطوری از طریق پشته به پروسیجرم پارامتر بفرستم هر کاری کردم با PUSH و POP کردن جواب نگرفتم

;------------------------------
PRINT MACRO MESSAGE
MOV AH,09
MOV DX,OFFSET MESSAGE
INT 21H
ENDM
;-------------------------------
CLSCR MACRO
MOV AX,0600H
MOV BH,07
MOV CX,0000
MOV DX,184FH
INT 10H
ENDM
;-------------------------------
GOTO MACRO X,Y
MOV AH,02
MOV BH,00
MOV DH,Y
MOV DL,X
INT 10H
ENDM
;-------------------------------
GETCH MACRO ;GET A CHARACTER TO AL
MOV AH,01
INT 21H
ENDM
;-------------------------------
CONTOBCD MACRO ASC,BCD,LEN;CONVERT ASCII TO BINARY
MOV CX,LEN
SUB BX,BX
L1: MOV AL,ASC[BX]
AND AL,0FH
MOV BCD[BX],AL
INC BX
LOOP L1


ENDM


;-------------------------------
CONTOASC MACRO BCD,ASC,LEN;CONVERT BINARY TO ASCII
MOV CX,LEN
SUB BX,BX
L2: MOV AL,BCD[BX]
OR AL,30H
MOV ASC[BX],AL
INC BX
LOOP L2


ENDM


;-------------------------------
READ MACRO
MOV AH,0AH
MOV DX,OFFSET MAXLEN
INT 21H
ENDM


;-------------------------------

STSEG SEGMENT
DB 64 DUP(?)
STSEG ENDS
;----------------------------
DTSEG SEGMENT
M1 DB "PLEASE ENTER A NUMBER:","$"
M2 DB "1) N^3+N^2+N","$"
M3 DB "2) 2^N","$"
M4 DB "3) IS N EVEN OR ODD","$"
M5 DB "4) EXIT","$"
RE DB ?
M6 DB " PLEASE ENTER N :","$"
MAXLEN DB 3
ACTLEN DB ?
N DB 3 DUP('')
M DB ?
RES DW ?
DTSEG ENDS


;----------------------------
CDSEG SEGMENT
MAIN PROC FAR
ASSUME CS:CDSEG,DS:DTSEG,SS:STSEG
MOV AX,DTSEG
MOV DS,AX
GOTO 2,2
PRINT M1
GOTO 2,4
PRINT M2
GOTO 2,6
PRINT M3
GOTO 2,8
PRINT M4
GOTO 2,10
PRINT M5
GOTO 25,2
GETCH
CMP AL,'1'
JNZ EXIT
CLSCR



CALL P2
EXIT: MOV AH,4CH
INT 21H
MAIN ENDP
;-----------------------------




;-----------------------------
P2 PROC
GOTO 2,2
PRINT M6
READ
GOTO 2,4
MOV BX,0001H
MOV CL,[ACTLEN]
LEA DX,N
MOV AH,40H
INT 21H
CONTOBCD N,M,2
CONTOASC M,N,2
GOTO 2,6
MOV CL,ACTLEN
SUB AX,AX
MOV AX,2
MOV BL,2
L3: MUL BL
LOOP L3
MOV AX,RES
PRINT RES
RET
P2 ENDP


;-----------------------------


;-----------------------------
CDSEG ENDS
END MAIN

vahid-p
سه شنبه 13 خرداد 1393, 20:15 عصر
اگه میبینید یه جایی کاراکترها الکی شدن و اینا مطمئن باش، اومدی مقدار یک عدد رو مستقیم چاپ کردی. در صورتی که یک عدد باید به رقم های تشکیل دهندش شکسته بشه، با کاراکتر '0' جمع بشه و اونوقت نمایش داده بشه.
گفتید مشکل اصلیتون تبدیل رشته به عدد است. کاش میگفتید عددتون چند بیتی یا چند رقم میتونه باشه. البته خودم از رو کد متوجه شدم، ولی خیلی کدتون رو هم بد نوشتید و هم کد اسمبلی باید توضیح مناسب رو بدی، چون چک کردن کد خیلی سخته و همچنین شما وقتی از MACRO استفاده میکنید از طریق emu میدونید که خط جاری رو نشون نمیده.

خب اول اینکه N db 3 dup(0) بذارید، چون برای من در ادامه با '' -دو single quote کنار هم- مشکل ایجاد شد! ( دلیلی براش ندارم )
نوشتی :
CMP AL,'1'
JNZ EXIT
موقتیه دیگه؟ بعدا که برای 2 و 3 و 4 هم خواهیم داشت نه؟ اینو تغییر دادم و داخل p2 بخش ها مشخص میشن! چون همگی N رو میخوان پس یه جا مینویسیم اونم تو P2.

از طرفی دلیل این کار رو همراه هم نفهمیدم چرا :
CONTOBCD N,M,2
CONTOASC M,N,2
طولش ثابت نیست بهتره همون mov cl,actlen رو جایگذاری میکردی، پس و Ch=0 CL و CX رو جای 2 بنویسی.
اینجاش بد شده. مگه نمیخوای این عبارت رو برات محاسبه کنه؟ N^3+N^2+N
بعد مثلا دستوراتی مثل SUB BX,BX داری در صورتی که میتونی بنویسی MOV BX,0. کلا دلیل این کارها رو نفهمیدم. یا یکی دیگش : AND AL,0FH
خدایا! توضیح بده دلیل داشتی برای اینکار یا فقط میخواستی ما رو بپیچونی!
به هر حال نمیدونم چرا کدت رو اینجوری نوشتی، ولی من طبق چیزی که خودم فکر میکنم منظورت این بوده تغییرش میدم.

اینم اشتباهه !! : MOV BCD[BX],AL
چون قراره M که جای BCD قرار میگیره، یه عدد 8 بیتی باشه، دیگه خونه بعدی در کار نیست. و شما مثل یک آرایه یا رشته برخورد کردید!

دلیل اون قضیه که پرینت بد کار میکنه و همه چیز خراب میشه، اینه که رشته و عدد رو اشتباه در نظر گرفتی و باعث شده شروع رو از خونه از بذاری که از حد بگذره و خونه ها حافظه رو چاپ کنه. ( خونه هایی که اصلا مربوط نیست )

کدتون رو تصحیح کردم، گرچه چیزای اضافه زیادی داشت. قسمت 1 رو هم نوشتم. برای قسمت های 2 و 3 کافیه P4 , P5 رو بنویسید و مثل P3 انجام بدید. فقط قبل از CALL کردن هر کدوم چک کنید که کدوم یک از عملیات بالا رو میخواد.

به هر حال من MACRO ها رو تغییر دادم و CONTOASC رو هم حذف کردم. چون تو PRINTNUM خودش انجام میده.
اینم کد تصحیح شده :

;------------------------------
PRINTNUM MACRO NUM
LEA SI,RESSTR
ADD SI,10
MOV AX,NUM
LABEL1:
MOV BX,10
MOV DX,0
DIV BX
ADD DL,'0'
MOV [SI],DL
DEC SI
CMP AX,0
JNZ LABEL1
LEA SI,RESSTR
DEC SI
LABEL2:
INC SI
CMP [SI],'$'
JE LABEL2
LABEL3:
MOV DX,SI
MOV AH,09H
INT 21H
ENDM
;------------------------------

;------------------------------
PRINT MACRO MESSAGE
MOV AH,09
MOV DX,OFFSET MESSAGE
INT 21H
ENDM
;-------------------------------
CLSCR MACRO
MOV AX,0600H
MOV BH,07
MOV CX,0000
MOV DX,184FH
INT 10H
ENDM
;-------------------------------
GOTO MACRO X,Y
MOV AH,02
MOV BH,00
MOV DH,Y
MOV DL,X
INT 10H
ENDM
;-------------------------------
GETCH MACRO ;GET A CHARACTER TO AL
MOV AH,01
INT 21H
ENDM
;-------------------------------
CONTOBCD MACRO ASC,BCD,LEN;CONVERT ASCII TO BINARY
MOV CX,LEN
MOV BX,0
MOV AX,0
L1:
MOV DL,10
MUL DL
MOV DL,ASC[BX]
SUB DL,'0'
ADD AL,DL
INC BX
LOOP L1
MOV BCD,AL
ENDM

READ MACRO
MOV AH,0AH
MOV DX,OFFSET MAXLEN
INT 21H
ENDM


;-------------------------------

STSEG SEGMENT
DB 64 DUP(?)
STSEG ENDS
;----------------------------
DTSEG SEGMENT
M1 DB "PLEASE ENTER A NUMBER:","$"
M2 DB "1) N^3+N^2+N","$"
M3 DB "2) 2^N","$"
M4 DB "3) IS N EVEN OR ODD","$"
M5 DB "4) EXIT","$"
RE DB ?
M6 DB " PLEASE ENTER N :","$"
M7 DB "ANSWER = ","$"
MAXLEN DB 3
ACTLEN DB ?
N DB 3 DUP(0)
M DB ?
RES DW ?
RESSTR DB 12 DUP('$')
DTSEG ENDS


;----------------------------
CDSEG SEGMENT
MAIN PROC FAR
ASSUME CS:CDSEG,DS:DTSEG,SS:STSEG
MOV AX,DTSEG
MOV DS,AX
MOV ES,AX
GOTO 2,2
PRINT M1
GOTO 2,4
PRINT M2
GOTO 2,6
PRINT M3
GOTO 2,8
PRINT M4
GOTO 2,10
PRINT M5
GOTO 25,2
GETCH
CMP AL,'4'
JZ EXIT
CLSCR



CALL P2
EXIT: MOV AH,4CH
INT 21H
MAIN ENDP
;-----------------------------




;-----------------------------
P2 PROC
GOTO 2,2
PRINT M6
READ
GOTO 2,4
MOV BX,0001H
MOV CL,[ACTLEN]
LEA DX,N
MOV AH,40H
INT 21H
MOV Cl,ACTLEN
MOV CH,0
CONTOBCD N,M,CX
GOTO 2,6

CALL P3 ;RES=M^3+M^2+M
;CALL P4 ;M^2
;CALL P5 ;M IS EVEN OR NOT
LEA DX,M7
MOV AH,09H
INT 21H
PRINTNUM RES
RET
P2 ENDP


;-----------------------------
P3 PROC ;RES=M^3+M^2+M
MOV AL,M
MOV AH,0
MOV BH,0
MOV BL,M
MUL BX
MUL BX
MOV CX,AX
MOV AL,M
MOV AH,0
MUL BX
ADD CX,AX
ADD CX,BX
MOV RES,CX
RET
P3 ENDP

;-----------------------------
;-----------------------------
P4 PROC ;RES=M^2

RET
P4 ENDP

;-----------------------------
;-----------------------------
P5 PROC ;RES=IS EVEN OR ODD

RET
P5 ENDP

;-----------------------------
CDSEG ENDS
END MAIN

zh00bin
سه شنبه 13 خرداد 1393, 21:29 عصر
اگه میبینید یه جایی کاراکترها الکی شدن و اینا مطمئن باش، اومدی مقدار یک عدد رو مستقیم چاپ کردی. در صورتی که یک عدد باید به رقم های تشکیل دهندش شکسته بشه، با کاراکتر '0' جمع بشه و اونوقت نمایش داده بشه.
گفتید مشکل اصلیتون تبدیل رشته به عدد است. کاش میگفتید عددتون چند بیتی یا چند رقم میتونه باشه. البته خودم از رو کد متوجه شدم، ولی خیلی کدتون رو هم بد نوشتید و هم کد اسمبلی باید توضیح مناسب رو بدی، چون چک کردن کد خیلی سخته و همچنین شما وقتی از MACRO استفاده میکنید از طریق emu میدونید که خط جاری رو نشون نمیده.

خب اول اینکه N db 3 dup(0) بذارید، چون برای من در ادامه با '' -دو single quote کنار هم- مشکل ایجاد شد! ( دلیلی براش ندارم )
نوشتی :
CMP AL,'1'
JNZ EXIT
موقتیه دیگه؟ بعدا که برای 2 و 3 و 4 هم خواهیم داشت نه؟ اینو تغییر دادم و داخل p2 بخش ها مشخص میشن! چون همگی N رو میخوان پس یه جا مینویسیم اونم تو P2.

از طرفی دلیل این کار رو همراه هم نفهمیدم چرا :
CONTOBCD N,M,2
CONTOASC M,N,2
طولش ثابت نیست بهتره همون mov cl,actlen رو جایگذاری میکردی، پس و Ch=0 CL و CX رو جای 2 بنویسی.
اینجاش بد شده. مگه نمیخوای این عبارت رو برات محاسبه کنه؟ N^3+N^2+N
بعد مثلا دستوراتی مثل SUB BX,BX داری در صورتی که میتونی بنویسی MOV BX,0. کلا دلیل این کارها رو نفهمیدم. یا یکی دیگش : AND AL,0FH
خدایا! توضیح بده دلیل داشتی برای اینکار یا فقط میخواستی ما رو بپیچونی!
به هر حال نمیدونم چرا کدت رو اینجوری نوشتی، ولی من طبق چیزی که خودم فکر میکنم منظورت این بوده تغییرش میدم.

اینم اشتباهه !! : MOV BCD[BX],AL
چون قراره M که جای BCD قرار میگیره، یه عدد 8 بیتی باشه، دیگه خونه بعدی در کار نیست. و شما مثل یک آرایه یا رشته برخورد کردید!

دلیل اون قضیه که پرینت بد کار میکنه و همه چیز خراب میشه، اینه که رشته و عدد رو اشتباه در نظر گرفتی و باعث شده شروع رو از خونه از بذاری که از حد بگذره و خونه ها حافظه رو چاپ کنه. ( خونه هایی که اصلا مربوط نیست )

کدتون رو تصحیح کردم، گرچه چیزای اضافه زیادی داشت. قسمت 1 رو هم نوشتم. برای قسمت های 2 و 3 کافیه P4 , P5 رو بنویسید و مثل P3 انجام بدید. فقط قبل از CALL کردن هر کدوم چک کنید که کدوم یک از عملیات بالا رو میخواد.

به هر حال من MACRO ها رو تغییر دادم و CONTOASC رو هم حذف کردم. چون تو PRINTNUM خودش انجام میده.
اینم کد تصحیح شده :

;------------------------------
PRINTNUM MACRO NUM
LEA SI,RESSTR
ADD SI,10
MOV AX,NUM
LABEL1:
MOV BX,10
MOV DX,0
DIV BX
ADD DL,'0'
MOV [SI],DL
DEC SI
CMP AX,0
JNZ LABEL1
LEA SI,RESSTR
DEC SI
LABEL2:
INC SI
CMP [SI],'$'
JE LABEL2
LABEL3:
MOV DX,SI
MOV AH,09H
INT 21H
ENDM
;------------------------------

;------------------------------
PRINT MACRO MESSAGE
MOV AH,09
MOV DX,OFFSET MESSAGE
INT 21H
ENDM
;-------------------------------
CLSCR MACRO
MOV AX,0600H
MOV BH,07
MOV CX,0000
MOV DX,184FH
INT 10H
ENDM
;-------------------------------
GOTO MACRO X,Y
MOV AH,02
MOV BH,00
MOV DH,Y
MOV DL,X
INT 10H
ENDM
;-------------------------------
GETCH MACRO ;GET A CHARACTER TO AL
MOV AH,01
INT 21H
ENDM
;-------------------------------
CONTOBCD MACRO ASC,BCD,LEN;CONVERT ASCII TO BINARY
MOV CX,LEN
MOV BX,0
MOV AX,0
L1:
MOV DL,10
MUL DL
MOV DL,ASC[BX]
SUB DL,'0'
ADD AL,DL
INC BX
LOOP L1
MOV BCD,AL
ENDM

READ MACRO
MOV AH,0AH
MOV DX,OFFSET MAXLEN
INT 21H
ENDM


;-------------------------------

STSEG SEGMENT
DB 64 DUP(?)
STSEG ENDS
;----------------------------
DTSEG SEGMENT
M1 DB "PLEASE ENTER A NUMBER:","$"
M2 DB "1) N^3+N^2+N","$"
M3 DB "2) 2^N","$"
M4 DB "3) IS N EVEN OR ODD","$"
M5 DB "4) EXIT","$"
RE DB ?
M6 DB " PLEASE ENTER N :","$"
M7 DB "ANSWER = ","$"
MAXLEN DB 3
ACTLEN DB ?
N DB 3 DUP(0)
M DB ?
RES DW ?
RESSTR DB 12 DUP('$')
DTSEG ENDS


;----------------------------
CDSEG SEGMENT
MAIN PROC FAR
ASSUME CS:CDSEG,DS:DTSEG,SS:STSEG
MOV AX,DTSEG
MOV DS,AX
MOV ES,AX
GOTO 2,2
PRINT M1
GOTO 2,4
PRINT M2
GOTO 2,6
PRINT M3
GOTO 2,8
PRINT M4
GOTO 2,10
PRINT M5
GOTO 25,2
GETCH
CMP AL,'4'
JZ EXIT
CLSCR



CALL P2
EXIT: MOV AH,4CH
INT 21H
MAIN ENDP
;-----------------------------




;-----------------------------
P2 PROC
GOTO 2,2
PRINT M6
READ
GOTO 2,4
MOV BX,0001H
MOV CL,[ACTLEN]
LEA DX,N
MOV AH,40H
INT 21H
MOV Cl,ACTLEN
MOV CH,0
CONTOBCD N,M,CX
GOTO 2,6

CALL P3 ;RES=M^3+M^2+M
;CALL P4 ;M^2
;CALL P5 ;M IS EVEN OR NOT
LEA DX,M7
MOV AH,09H
INT 21H
PRINTNUM RES
RET
P2 ENDP


;-----------------------------
P3 PROC ;RES=M^3+M^2+M
MOV AL,M
MOV AH,0
MOV BH,0
MOV BL,M
MUL BX
MUL BX
MOV CX,AX
MOV AL,M
MOV AH,0
MUL BX
ADD CX,AX
ADD CX,BX
MOV RES,CX
RET
P3 ENDP

;-----------------------------
;-----------------------------
P4 PROC ;RES=M^2

RET
P4 ENDP

;-----------------------------
;-----------------------------
P5 PROC ;RES=IS EVEN OR ODD

RET
P5 ENDP

;-----------------------------
CDSEG ENDS
END MAIN
بله یه قسمت هایی را به یه سری عدد جایگزین کردم چون جواب نمی داد می خواستم ببینم مشکل از کجاست. مثه همون طول عدد
مرسی واقعا لطف کردید