|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
code segment
start: mov ax, data
mov ds, ax
mov ax, table
mov es, ax
mov bx, 0
mov di, 0
mov si, 0
mov cx, 21
s: mov al, [bx]
mov es:[di], al
mov al, [bx+1]
mov es:[di+1h], al
mov al, [bx+2h]
mov es:[di+2h], al
mov al, [bx+3h]
mov es:[di+3h], al
mov ax, [bx+54h]
mov dx, [bx+56h]
mov es:[di+5h], ax
mov es:[di+7h], dx
mov ax, [si+0a8h]
mov es:[di+0ah], ax
mov ax, [bx+54h]
mov dx, [bx+56h]
div word ptr ds:[si+0a8h]
mov es:[di+0dh], ax
add bx, 4h
add si, 2h
add di, 10h
loop s
mov ax, 4c00H
int 21H
code ends
end start
这是汇编语言第8章实验七的代码,当我用dosbox跟踪运行的时候,发现:本该用p命令结束loop循环,却发生了意外
原本用p命令结束loop后,后面应该是
mov ax, 4c00H
int 21H
但是实际显示的却不是,不明白。请哪位朋友帮忙看看
本帖最后由 jackz007 于 2019-12-12 00:19 编辑
- div word ptr ds:[si+0a8h]
复制代码
这个和 DosBox 关系不大,问题出在被除数 DX:AX 与除数 word ptr ds:[si+0a8h] 之间的大小不匹配,使得商的数值太大,以至于无法在一个 16 位的寄存器中保存,因而引发除法溢出异常,而 DosBox 和 Debug.exe 事先并没有对这个异常的中断(int 0)进行接管和处理,当中断发生的时候,CS : IP 被切换到了随机的垃圾内存地址,从而导致 debug.exe 产生溢出奔溃。
楼主在跟踪到 LOOP 指令的时候,改用 t 命令逐条指令跟踪,重点是监视除法指令执行前,DX:AX 的数值和内存 word ptr ds:[si+0a8h] 的数值,看看原因是否是这个问题。
|
-
p命令无法结束loop
|