這個問題我見過兩次。原因是用t命令調試時,實際上觸發了單步中斷,而單步中斷發生時,CS、IP、flag位等東西也會存儲在堆棧中。程序的壓棧操作覆蓋了壹步中斷保存的CS或IP,使用t命令後無法正確返回。
解決方法:將堆棧的大小設置得更大;不要手動設置棧段、SP等。讓編譯器自己設置。
例如:
假設cs:code,ds:data,ss:sseg
數據段
dw 0123h,0456h,0789h,0abch,0defh,0fedh,0cbah,0987h
數據結束
sseg段棧;定義段時,在末尾添加stack關鍵字。
dw 512 dup(?) ;將堆棧設置得更大。
sseg結束
代碼段
開始:
移動軸,數據
移動ds,ax
;不要手動設置堆棧段和SP。
mov cx,8
mov bx,0
學生:
按[bx]
添加bx,2
循環s
mov cx,8
mov bx,0
s1:
pop [bx]
添加bx,2
循環s1
mov ax,4c00h
int 21h
代碼結束
結束開始