汇编新手,在线等,急~~
来源:百度知道 编辑:UC知道 时间:2024/05/27 04:11:02
附上我的部分程序
DATA SEGMENT
firNUM DB 8 DUP(0)
secNUM DB 8 DUP(0)
tempNum DB 8 DUP(0)
tempNum2 DB 8 DUP(0)
DATA ENDS
;输入操作数子程序
InputNUM PROC NEAR
LEA DI,tempNUM
MOV BX,0
MOV DX,7
Input:
MOV AH,01H
INT 21H
MOV CX,0
CMP AL,0DH
JE EndInput
CMP AL,30H ;判断输入是否为数字
JB ErrorInput
CMP AL,39H
JA ErrorInput
AND AL,0FH ;清除高位
MOV [BX][DI],AL
INC BX
JMP Input
ErrorInput:
LEA DX,ErrorIn
MOV AH,09H
INT 21H
JMP Exit
EndInput:
MOV CX,BX
DEC BX
D:MOV AL,[BX][DI]
PUSH BX
MOV BX,DX
MOV [BX][SI],AL
POP BX
DEC BX
DEC DX
LOOP D
RET
InputNUM ENDP
2568和26输入后怎样读出来,然后相除?
2568在firNUM
首先,你给出的程序中SI=?
当然,我相信你能够编写出正确的程序将被除数放入firNUM以及将除数放入secNUM。
那么剩下的问题其实就是将firNUM和secNUM转换成二进制数(可参考非紧缩BCD码转换成二进制数的方法,自己找,我不在此赘述,嘿嘿),然后用除法指令计算即可。
这里的问题还有:8086是16位CPU,而你给出的被除数和除数都是8位10进制数(可能的最大值超过65536,虽然你给出的例子没有此问题),所以转换成二进制数以及除法运算要麻烦得多。
几句话很难说清楚,真的。
如果不考虑更大的数字(>9999),也就是只转换4位10进制数的话:
LEA SI,secNUM+4
CALL GETNUM
MOV CX,AX ;CX=除数
LEA SI,firNUM+4
CALL GETNUM
MOV DX,0 ;DX:AX=被除数
DIV CX
;现在商在AX中,至于显示,再把二进制转成BCD,再转成ASCII,然后调用系统功能进行显示,还是你自己做吧
GETNUM: ;将SI所指的4位BCD码转换成二进制,在AX中返回
MOV CX,4
MOV BX,10
MOV AX,0
LOP1: MUL BX
ADD AL,[SI]
ADC AH,0
INC SI
LOOP LOP1
RET
看看这个符不符合你的要求:
DATAS SEGMENT
firNUM DB 5,?,4 DUP(0)
secNUM DB 5,?,4 DUP(0)
tempNum DW 0
tempNum2 DB 8 DUP(0)
DATAS ENDS
STACKS SEGMENT
db 64 dup(?)
STACKS ENDS
CODES SEGMENT
ASSUME CS