用汇编语言写的程序,将存在数据段的十六进制数转化成十进制数并显示出来

我调试的时候没有错误,执行的时候却总是divide overflow,是什么情况呀,怎么修改呀?急急急~~~
DATA SEGMENT
D1 DW 123FH
D2 DW 1000 DUP (?)
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START: MOV BX,DATA
MOV DS,BX
MOV SI,0
MOV AX,[D1]
MOV DX,0
MOV BX,1000
DIV BX
XCHG AX,DX
ADD DX,30H
MOV CL,4
SHL DX,CL
MOV BX,100
DIV BX
ADD AL,30H
ADD DL,AL
MOV CL,4
SHL DX,CL
XCHG AL,AH
MOV BX,10
DIV BX
ADD AL,30H
ADD DL,AL
MOV CL,4
SHL DX,CL
ADD AH,30H
ADD DL,AH
MOV D2[SI],DX
LEA DX,D2
MOV AH,09H
INT 21H
MOV AH,4CH
INT 21H
CODE ENDS
END START

程序调试通过后仿真,具体如下:
MOV R0,TL0
MOV R1,TH0
CLR一个
MOV R2,A;先清除的
MOV R3 ,一个
MOV R4,A,
MOV R5,#16,总转换的16位数字
LOOP:
CLR的C
MOV A,R0;待高端数字转换的一个赛扬
RLC A
MOV R0,一个
MOV A,R1的
RLC A
MOV R1,A <BR / MOV A,R4;低端的BCD码的
ADDC A,R4;进加。自己的总和相当于左一
DA A;的十进制调整到BCD码
MOV R4,A
MOV A,R3
ADDC A,R3 DA A BR /> MOV R3,一个
MOV A,R2
ADDC A,R2
MOV R2,A
DJNZ R5,LOOP;转换成一个总的16号
; -------在这一点上,已经数字化转换成BCD码TH1 TL1发送到R2 R3 R4。
------以下,分别为R4 R3 R2 R1 R0。
MOV A,R4

DIV AB
MOV R1,A
MOV R0,乙

MOV A,#16 MOV B, R2
一个

MOV A,R3
MOV B,#16
DIV AB
MOV R3,A MOV R4,
MOV R2 ,B
RET
我希望您的帮助!
温馨提示:答案为网友推荐,仅供参考
第1个回答  2012-11-22
DIV BX 表示用DX,AX中的内容除以BX,如果除完后的商超过16位就会报溢出错误。
在上面的程序中有三条这样的指令,除了第一条因DX是0不会溢出外,后面两条,由于没有很好考试DX的当前值都会溢出。因此只要在除之前把先把DX的值保存好,再让DX的值改成0就好。
第2个回答  2012-12-03
DATA SEGMENT
D1 DW 123FH
D2 DB 10 DUP ('$')
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE, DS:DATA
START:
MOV BX, DATA
MOV DS, BX
MOV SI, 0
MOV AX, [D1]
MOV DX, 0
MOV BX, 10000
DIV BX
XCHG AX, DX
ADD DL, 30H
MOV D2[SI], DL
INC SI
MOV DX, 0
MOV BX, 1000
DIV BX
XCHG AX, DX
ADD DL, 30H
MOV D2[SI], DL
INC SI
MOV DX, 0
MOV BX, 100
DIV BX
XCHG AX, DX
ADD DL, 30H
MOV D2[SI], DL
INC SI
MOV DX, 0
MOV BX, 10
DIV BX
XCHG AX, DX
ADD DL, 30H
MOV D2[SI], DL
INC SI
ADD AL, 30H
MOV D2[SI], AL
LEA DX, D2
MOV AH, 09H
INT 21H
MOV AH, 4CH
INT 21H
CODE ENDS
END START

执行后显示:
04671
相似回答