汇编新手,在线等,急~~

来源:百度知道 编辑:UC知道 时间:2024/05/27 04:11:02
我把数据输入,存到内存中,比如输入2568和26,处理之后在内存中是 00 00 00 00 02 05 06 08|00 00 00 00 00 00 02 06 现在要让2526除以26,要怎样做?

附上我的部分程序

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