sia0368
12-03-2009, 09:50
قبلا تبدیل مبنا رو تو پاسکال و c نوشته بودم ولی الان تو اسمبلی به دو تا مشکل برخوردم یکی در مورد تبدیل مبنای غیر دهی به ده مثل باینری به دسیمال که باید اعداد رو یکی یکی در ارزش اون عدد ضرب کرد الان سر به دست آوردن ارزش اعداد برای ضرب کردن گیر کردم یا همون به توان رسوندن
مشکل دیگرم هم سر تقسیمهای متوالیه که باید باقیمانده رو برعکس چاپ کنیم بدون آرایه و با پوش و پاپ چهجوری میشه
یه برنامه از تو اینترنت گیر اوردم که کامله ولی از الگوریتم تبدیل مبناش چیزی سر در نیاوردم در ضمن از دستورات سطح بالا استفاده کرده مثل .if من با همون دستورای معمولی میخوام این کار رو انجام بدم
.model small
.stack 100h
.data
base db 10
base1 db 10
base2 db 10
op db 0
digit db 0
Number dw 0
Number1 dw 0
Number2 dw 0
End_Loop db 0
App_State db 0
str_newLine db 10,13,"$"
str_BlankLine db 80 dup(32),"$"
str_Numbers db "0123456789ABCDEF"
msg_MainMenu db "> Main Menu","$"
msg_MainMenu_1 db " [1] Calculator","$"
msg_MainMenu_2 db " [2] Convert Base","$"
msg_MainMenu_3 db " [3] Exit","$"
msg_Calc_Step_0 db "Base:$"
msg_Calc_Step_1 db "First Number:$"
msg_Calc_Step_2 db "Oprateion:$"
msg_Calc_Step_3 db "Second Number:$"
msg_Cnvrt_Step_1 db "First Base:$"
msg_Cnvrt_Step_2 db "Number:$"
msg_Cnvrt_Step_3 db "Second Base:$"
msg_Cnvrt_Step_4 db "Convertation Result:$"
msg_Base db "Base: $"
err_BadBase db "ERROR: Base most be in 2 to 10 and 16.$"
err_BadOpration db "ERROR: Only + , - , * or /$"
msg_EnterYourChoice db " >Enter Your Choice: ","$"
.code
START:
MOV AX,@data
MOV DS,AX
App_Loop:
MOV App_State,0
CALL MainMenu
.if App_State == 1
CALL Calculate
.endif
.if App_State == 2
CALL BaseConvert
.endif
CMP App_State,-1
JNE App_Loop
App_End:
;exit to dos
MOV AX,4C00h
INT 21h
WriteDX PROC
MOV AH,9
INT 21h
RET
WriteDX ENDP
WriteNumber PROC
PUSH CX
PUSH BX
MOV AX,Number
MOV BH,0
MOV BL,base
XOR CX,CX
WNP_L1:
XOR DX,DX
DIV BX
PUSH DX
INC CX
CMP AX,0
JE WNP_L2
JMP WNP_L1
WNP_L2:
POP BX
MOV Dl,str_Numbers[BX]
MOV AH,2h
INT 21h
LOOP WNP_L2
POP BX
POP CX
RET
WriteNumber ENDP
PutCharDl PROC
MOV AH,2
INT 21h
RET
PutCharDl ENDP
NewLine PROC
MOV AH,9
MOV DX,OFFSET str_newLine
INT 21h
RET
NewLine ENDP
ClearLineDh PROC
MOV DL,0
CALL GotoDhDl
MOV AH,9
MOV DX,OFFSET str_BlankLine
INT 21h
RET
ClearLineDh ENDP
GotoDhDl PROC
MOV AH,02h
MOV BH,0
INT 10h
RET
GotoDhDl ENDP
ReadKey PROC
MOV AH,7
INT 21h
RET
ReadKey ENDP
ReadNumber PROC
MOV Number,0
MOV End_Loop,0
.repeat
CALL ReadKey
MOV CL,-1
.if AL == 13
MOV End_Loop,1
.endif
.if AL >= "0" && AL <= "9"
MOV CL,AL
SUB CL,"0"
.endif
.if AL >= "a" && AL <= "f"
MOV CL,AL
SUB CL,"a"
ADD CL,10
.endif
.if AL >= "A" && AL <= "F"
MOV CL,AL
SUB CL,"A"
ADD CL,10
.endif
.if CL < base
MOV BX,0
MOV BL,CL
MOV DL,str_Numbers[BX]
CALL PutCharDl
XOR DX,DX
MOV AX,Number
MOV BH,0
MOV BL,base
MUL BX
MOV CH,0
ADD AX,CX
MOV Number,AX
.endif
.until End_Loop == 1
RET
ReadNumber ENDP
ClearScreen PROC
MOV AH,06h
MOV AL,0
MOV BH,1Fh
MOV CX,0
MOV DH,24
MOV DL,79
INT 10h
MOV DX,0
CALL GotoDHDL
RET
ClearScreen ENDP
MainMenu PROC
CALL ClearScreen
CALL NewLine
MOV DX,OFFSET msg_MainMenu
CALL WriteDX
Call NewLine
Call NewLine
MOV DX,OFFSET msg_MainMenu_1
CALL WriteDX
Call NewLine
MOV DX,OFFSET msg_MainMenu_2
CALL WriteDX
Call NewLine
MOV DX,OFFSET msg_MainMenu_3
CALL WriteDX
Call NewLine
Call NewLine
MOV DX,OFFSET msg_EnterYourChoice
CALL WriteDX
LBL_MM_1:
CALL ReadKey
CMP AL,"1"
JL LBL_MM_1
CMP AL,"3"
JG LBL_MM_1
.if AL=="1"
MOV App_State,1
.endif
.if AL=="2"
MOV App_State,2
.endif
.if AL=="3"
MOV App_State,-1
.endif
RET
MainMenu ENDP
Calculate PROC
CALL ClearScreen
JMP LBL_C_1
LBL_C_0:
CALL NewLine
MOV DX,OFFSET err_BadBase
CALL WriteDX
CALL NewLine
LBL_C_1:
MOV DX,OFFSET msg_Calc_Step_0
CALL WriteDX
MOV base,10
CALL ReadNumber
MOV AX,Number
CMP AX,2
JL LBL_C_0
.if AX > 10 && AX != 16
JMP LBL_C_0
.endif
MOV base,AL
CALL NewLine
MOV DX,OFFSET msg_Calc_Step_1
CALL WriteDX
CALL ReadNumber
MOV AX,Number
MOV Number1,AX
LBL_C_2:
CALL NewLine
MOV DX,OFFSET msg_Calc_Step_2
CALL WriteDX
CALL ReadKey
MOV DL,AL
CALL PutCharDl
.if AL != "+" && AL != "-" && AL != "*" && AL != "/"
CALL NewLine
MOV DX,OFFSET err_BadOpration
CALL WriteDX
JMP LBL_C_2
.endif
MOV op,AL
CALL NewLine
MOV DX,OFFSET msg_Calc_Step_3
CALL WriteDX
CALL ReadNumber
MOV AX,Number
MOV Number2,AX
CALL NewLine
MOV AX,Number1
MOV Number,AX
CALL WriteNumber
MOV DL,op
CALL PutCharDl
MOV AX,Number2
MOV Number,AX
CALL WriteNumber
MOV DL,"="
CALL PutCharDl
MOV AX,Number1
MOV DX,Number2
.if op == "+"
ADD AX,DX
MOV Number,AX
.endif
.if op == "-"
SUB AX,DX
MOV Number,AX
.endif
.if op == "*"
PUSH DX
PUSH AX
MOV BX,DX
XOR DX,DX
MUL BX
MOV Number,AX
POP AX
POP DX
.endif
.if op == "/"
PUSH DX
PUSH AX
MOV BX,DX
XOR DX,DX
DIV BX
MOV Number,AX
POP AX
POP DX
.endif
CALL WriteNumber
CALL ReadKey
RET
Calculate ENDP
BaseConvert PROC
CALL ClearScreen
JMP LBL_Cnv_1
LBL_Cnv_0:
CALL NewLine
MOV DX,OFFSET err_BadBase
CALL WriteDX
CALL NewLine
LBL_Cnv_1:
MOV DX,OFFSET msg_Cnvrt_Step_1
CALL WriteDX
MOV base,10
CALL ReadNumber
MOV AX,Number
CMP AX,2
JL LBL_Cnv_0
.if AX > 10 && AX != 16
JMP LBL_Cnv_0
.endif
MOV AX,Number
MOV base1,AL
CALL NewLine
MOV DX,OFFSET msg_Cnvrt_Step_2
CALL WriteDX
MOV AL,base1
MOV base,AL
CALL ReadNumber
MOV AX,Number
MOV Number1,AX
JMP LBL_Cnv_3
LBL_Cnv_2:
CALL NewLine
MOV DX,OFFSET err_BadBase
CALL WriteDX
LBL_Cnv_3:
CALL NewLine
MOV DX,OFFSET msg_Cnvrt_Step_3
CALL WriteDX
MOV base,10
CALL ReadNumber
MOV AX,Number
CMP AX,2
JL LBL_Cnv_2
.if AX > 10 && AX != 16
JMP LBL_Cnv_2
.endif
MOV AX,Number
MOV base,AL
CALL NewLine
MOV DX,OFFSET msg_Cnvrt_Step_4
CALL WriteDX
MOV AX,Number1
MOV Number,AX
CALL WriteNumber
CALL ReadKey
RET
BaseConvert ENDP
END START
مشکل دیگرم هم سر تقسیمهای متوالیه که باید باقیمانده رو برعکس چاپ کنیم بدون آرایه و با پوش و پاپ چهجوری میشه
یه برنامه از تو اینترنت گیر اوردم که کامله ولی از الگوریتم تبدیل مبناش چیزی سر در نیاوردم در ضمن از دستورات سطح بالا استفاده کرده مثل .if من با همون دستورای معمولی میخوام این کار رو انجام بدم
.model small
.stack 100h
.data
base db 10
base1 db 10
base2 db 10
op db 0
digit db 0
Number dw 0
Number1 dw 0
Number2 dw 0
End_Loop db 0
App_State db 0
str_newLine db 10,13,"$"
str_BlankLine db 80 dup(32),"$"
str_Numbers db "0123456789ABCDEF"
msg_MainMenu db "> Main Menu","$"
msg_MainMenu_1 db " [1] Calculator","$"
msg_MainMenu_2 db " [2] Convert Base","$"
msg_MainMenu_3 db " [3] Exit","$"
msg_Calc_Step_0 db "Base:$"
msg_Calc_Step_1 db "First Number:$"
msg_Calc_Step_2 db "Oprateion:$"
msg_Calc_Step_3 db "Second Number:$"
msg_Cnvrt_Step_1 db "First Base:$"
msg_Cnvrt_Step_2 db "Number:$"
msg_Cnvrt_Step_3 db "Second Base:$"
msg_Cnvrt_Step_4 db "Convertation Result:$"
msg_Base db "Base: $"
err_BadBase db "ERROR: Base most be in 2 to 10 and 16.$"
err_BadOpration db "ERROR: Only + , - , * or /$"
msg_EnterYourChoice db " >Enter Your Choice: ","$"
.code
START:
MOV AX,@data
MOV DS,AX
App_Loop:
MOV App_State,0
CALL MainMenu
.if App_State == 1
CALL Calculate
.endif
.if App_State == 2
CALL BaseConvert
.endif
CMP App_State,-1
JNE App_Loop
App_End:
;exit to dos
MOV AX,4C00h
INT 21h
WriteDX PROC
MOV AH,9
INT 21h
RET
WriteDX ENDP
WriteNumber PROC
PUSH CX
PUSH BX
MOV AX,Number
MOV BH,0
MOV BL,base
XOR CX,CX
WNP_L1:
XOR DX,DX
DIV BX
PUSH DX
INC CX
CMP AX,0
JE WNP_L2
JMP WNP_L1
WNP_L2:
POP BX
MOV Dl,str_Numbers[BX]
MOV AH,2h
INT 21h
LOOP WNP_L2
POP BX
POP CX
RET
WriteNumber ENDP
PutCharDl PROC
MOV AH,2
INT 21h
RET
PutCharDl ENDP
NewLine PROC
MOV AH,9
MOV DX,OFFSET str_newLine
INT 21h
RET
NewLine ENDP
ClearLineDh PROC
MOV DL,0
CALL GotoDhDl
MOV AH,9
MOV DX,OFFSET str_BlankLine
INT 21h
RET
ClearLineDh ENDP
GotoDhDl PROC
MOV AH,02h
MOV BH,0
INT 10h
RET
GotoDhDl ENDP
ReadKey PROC
MOV AH,7
INT 21h
RET
ReadKey ENDP
ReadNumber PROC
MOV Number,0
MOV End_Loop,0
.repeat
CALL ReadKey
MOV CL,-1
.if AL == 13
MOV End_Loop,1
.endif
.if AL >= "0" && AL <= "9"
MOV CL,AL
SUB CL,"0"
.endif
.if AL >= "a" && AL <= "f"
MOV CL,AL
SUB CL,"a"
ADD CL,10
.endif
.if AL >= "A" && AL <= "F"
MOV CL,AL
SUB CL,"A"
ADD CL,10
.endif
.if CL < base
MOV BX,0
MOV BL,CL
MOV DL,str_Numbers[BX]
CALL PutCharDl
XOR DX,DX
MOV AX,Number
MOV BH,0
MOV BL,base
MUL BX
MOV CH,0
ADD AX,CX
MOV Number,AX
.endif
.until End_Loop == 1
RET
ReadNumber ENDP
ClearScreen PROC
MOV AH,06h
MOV AL,0
MOV BH,1Fh
MOV CX,0
MOV DH,24
MOV DL,79
INT 10h
MOV DX,0
CALL GotoDHDL
RET
ClearScreen ENDP
MainMenu PROC
CALL ClearScreen
CALL NewLine
MOV DX,OFFSET msg_MainMenu
CALL WriteDX
Call NewLine
Call NewLine
MOV DX,OFFSET msg_MainMenu_1
CALL WriteDX
Call NewLine
MOV DX,OFFSET msg_MainMenu_2
CALL WriteDX
Call NewLine
MOV DX,OFFSET msg_MainMenu_3
CALL WriteDX
Call NewLine
Call NewLine
MOV DX,OFFSET msg_EnterYourChoice
CALL WriteDX
LBL_MM_1:
CALL ReadKey
CMP AL,"1"
JL LBL_MM_1
CMP AL,"3"
JG LBL_MM_1
.if AL=="1"
MOV App_State,1
.endif
.if AL=="2"
MOV App_State,2
.endif
.if AL=="3"
MOV App_State,-1
.endif
RET
MainMenu ENDP
Calculate PROC
CALL ClearScreen
JMP LBL_C_1
LBL_C_0:
CALL NewLine
MOV DX,OFFSET err_BadBase
CALL WriteDX
CALL NewLine
LBL_C_1:
MOV DX,OFFSET msg_Calc_Step_0
CALL WriteDX
MOV base,10
CALL ReadNumber
MOV AX,Number
CMP AX,2
JL LBL_C_0
.if AX > 10 && AX != 16
JMP LBL_C_0
.endif
MOV base,AL
CALL NewLine
MOV DX,OFFSET msg_Calc_Step_1
CALL WriteDX
CALL ReadNumber
MOV AX,Number
MOV Number1,AX
LBL_C_2:
CALL NewLine
MOV DX,OFFSET msg_Calc_Step_2
CALL WriteDX
CALL ReadKey
MOV DL,AL
CALL PutCharDl
.if AL != "+" && AL != "-" && AL != "*" && AL != "/"
CALL NewLine
MOV DX,OFFSET err_BadOpration
CALL WriteDX
JMP LBL_C_2
.endif
MOV op,AL
CALL NewLine
MOV DX,OFFSET msg_Calc_Step_3
CALL WriteDX
CALL ReadNumber
MOV AX,Number
MOV Number2,AX
CALL NewLine
MOV AX,Number1
MOV Number,AX
CALL WriteNumber
MOV DL,op
CALL PutCharDl
MOV AX,Number2
MOV Number,AX
CALL WriteNumber
MOV DL,"="
CALL PutCharDl
MOV AX,Number1
MOV DX,Number2
.if op == "+"
ADD AX,DX
MOV Number,AX
.endif
.if op == "-"
SUB AX,DX
MOV Number,AX
.endif
.if op == "*"
PUSH DX
PUSH AX
MOV BX,DX
XOR DX,DX
MUL BX
MOV Number,AX
POP AX
POP DX
.endif
.if op == "/"
PUSH DX
PUSH AX
MOV BX,DX
XOR DX,DX
DIV BX
MOV Number,AX
POP AX
POP DX
.endif
CALL WriteNumber
CALL ReadKey
RET
Calculate ENDP
BaseConvert PROC
CALL ClearScreen
JMP LBL_Cnv_1
LBL_Cnv_0:
CALL NewLine
MOV DX,OFFSET err_BadBase
CALL WriteDX
CALL NewLine
LBL_Cnv_1:
MOV DX,OFFSET msg_Cnvrt_Step_1
CALL WriteDX
MOV base,10
CALL ReadNumber
MOV AX,Number
CMP AX,2
JL LBL_Cnv_0
.if AX > 10 && AX != 16
JMP LBL_Cnv_0
.endif
MOV AX,Number
MOV base1,AL
CALL NewLine
MOV DX,OFFSET msg_Cnvrt_Step_2
CALL WriteDX
MOV AL,base1
MOV base,AL
CALL ReadNumber
MOV AX,Number
MOV Number1,AX
JMP LBL_Cnv_3
LBL_Cnv_2:
CALL NewLine
MOV DX,OFFSET err_BadBase
CALL WriteDX
LBL_Cnv_3:
CALL NewLine
MOV DX,OFFSET msg_Cnvrt_Step_3
CALL WriteDX
MOV base,10
CALL ReadNumber
MOV AX,Number
CMP AX,2
JL LBL_Cnv_2
.if AX > 10 && AX != 16
JMP LBL_Cnv_2
.endif
MOV AX,Number
MOV base,AL
CALL NewLine
MOV DX,OFFSET msg_Cnvrt_Step_4
CALL WriteDX
MOV AX,Number1
MOV Number,AX
CALL WriteNumber
CALL ReadKey
RET
BaseConvert ENDP
END START