jmp后的div问题
本问题出自实验10的编写子程序第三题:数值显示但本代码简化了过程,仅是将数值转换为ASCII码的过程显示出来,代码如下:
assume cs:code
data segment
db 10 dup (0)
data ends
code segment
start: mov ax, data
mov ds, ax
mov ax, 12666
call show_str
mov ax, 4c00H
int 21H
show_str:
mov bx,10 ;设置除数
s: div bx ;进行除法
mov cx,ax
jcxz ok ;若商为0则跳转
add dx,30H
push dx ;ASCII处理后入栈
inc di ;di记录余数个数
jmp short s ;再除
ok: add dx,30H ;此时商为零,但仍有余数
push dx ;入栈最后一位
inc di ;确定位数
mov cx,di ;把位数设置为循环次数
mov si,0 ;清零si
r: pop ds: ;出栈之前入栈数据到data段
add si,2 ;为出栈下个数据做准备
loop r
code ends
end start
但是debug跟踪运行发现:
执行到jmp short s后,debug内容如下:
(为什么代码显示: ???)
应该是除法溢出导致的中断,后面有讲的
你看看此时cs,ip的值明显异常,看到后面就知道了 dx:ax / bx
003604f2 / 000a = 566e5
溢出
人造人 发表于 2020-5-27 23:24
dx:ax / bx
003604f2 / 000a = 566e5
谢谢,是我忘记把DX中的值设为0了
页:
[1]