| 
 | 
 
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册  
 
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 
 
 
 
 
 
 
 
 |