实验10.3中div后问题
assume cs:code,ds:datadata segment
dw 10 dup (0)
data ends
code segment
start:
mov ax,12666
mov bx,data
mov ds,bx
mov si,0
call dtoc
mov dh,8
mov dl,3
mov cl,2
call show_str
mov ax,4c00h
int 21h
dtoc:
mov bx,10
mov cx,1
s:
jcxz s1
div bx
add dx,30h ;第二次循环div bx后指令位置不知道跳哪了,第一次也没什么问题呀。
mov ds:,dl
mov cx,ax
inc si
jmp short s
s1:
ret
本帖最后由 jackz007 于 2020-11-20 01:13 编辑
div bx
这是 16 位的除法,被除数是 dx : ax,除数是 bx,操作的结果,ax 是商,dx 是余数,在第一轮的操作中,余数 dx 被增加了 30h,这个 dx 值作为被除数的高16位被直接带入了下一轮的除法运算,由于被除数高16位 (dx )的值大于30h,而除数的值却只有 0ah,二者的值相差悬殊,结果,商的数值必然超出 16 位而导致除法溢出,这就是楼主所描述问题的根本原因。
由于本例的除法运算根本就不使用 dx 寄存器,所以,解决问题的办法,就是每次在除法运算前,专门对 dx 寄存器进行清零。
楼主的这个代码
dtoc:
mov bx,10
mov cx,1
s:
jcxz s1
div bx
add dx,30h
mov ds:,dl
mov cx,ax
inc si
jmp short s
s1:
ret
修改为下面这样试试
dtoc:
mov bx,10
s:
xor dx,dx
div bx
add dl , 30h
mov ds: , dl
inc si
or ax,ax
jnz s
ret jackz007 发表于 2020-11-19 20:56
这是 16 位的除法,被除数是 dx : ax,除数是 bx,操作的结果,ax 是商,dx 是余数,在第一轮的操 ...
嗯,没考虑到这方面,想不到溢出还会出现指令位置乱跳的情况。
页:
[1]