1. 变量未初始化导致DEBUG.EXE和直接执行程序不一致
这是在王爽老师的<汇编语言 第三版>,第10章实验10的第3个小实验转换为课程设计1中的双字节版本的dtoc过程中遇到的.
如图,DEBUG.EXE调试时,显示的值是12666,结果是正确的.但是在没有DEBUG.EXE介入时,运行的结果确是58138.
观察如下代码:
mov ax,stack
mov ss,ax
mov sp,16
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
; (dx): high 16 bits of dword data
; (ax): low 16 bits of dword data
; (ds):data buffer
; (si): ds offset
; return: set data buffer, ds:si point to string begin address
dtoc:
...
上面的程序中,没有对dx进行初始化操作,导致dx可能是个随机值.修改方法就是mov dx,0即可.
2. DIV指令异常,CS:IP跑飞
DEBUG.EXE单步调试中发现执行了DIV CL指令后,整个CS:IP从076A:XXXX跑到了FFXXH:BBBBH(具体记不清了).
这个原因是因为结果长度无法在AH寄存器中放下而导致了异常.同理,DIV 16bits长度的寄存器也会出现这种类似的问题.
还有一种可能的情况就是除0导致了异常.
对于结果溢出导致程序跑飞的情况,可以使用第10章的divdw子程序进行除法操作.
assume cs:code
stack segment
dw 16 dup (0)
stack ends
code segment
start:
mov ax,stack
mov ss,ax
mov sp,0
mov ax, 4242h ; 被除数低16
mov dx, 0fh ; 被除数高16
mov cx, 0ah ; 除数
call divdw
mov ax, 4c00h
int 21h
divdw:
push bx
push si
mov bx, ax ; store ax register in bx
mov ax, dx
mov dx, 0
div cx ; int(h/n)
mov si, ax ; save int(h/n) in si
mov ax, bx
div cx
mov cx, dx
mov dx, si
pop si
pop bx
ret
code ends
end start