说明:数据段定义在代码段的后面,在单步调试中,可以正确完成单步调试。
原因:堆栈数据在代码段数据的前面,堆栈初始化后, 堆栈数据因为入栈,破坏了后面的代码段的数据,导致代码段数据改变,程序指令改变。
原程序,单步调试出错
assume cs:code,ds:data,ss:stack
data segment
dw 0011h,0022h,0033h,0044h,0055h,0066h,0077h,0088h
data ends
stack segment
dw 0,0,0,0,0,0,0,0
stack ends
code segment
start:mov ax,stack
mov ss,ax
mov sp,20h
mov ax,data
mov ds,ax
mov bx,0
mov cx,8
f1: push [bx]
add bx,2
loop f1
mov bx,0
mov cx,8
f2: pop [bx]
add bx,2
loop f2
mov ax,4c00h
int 21h
code ends
end start
修改后程序,可以进行单步调试
assume cs:code,ds:data,ss:stack
code segment
start:mov ax,stack
mov ss,ax
mov sp,20h
mov ax,data
mov ds,ax
mov bx,0
mov cx,8
f1: push [bx]
add bx,2
loop f1
mov bx,0
mov cx,8
f2: pop [bx]
add bx,2
loop f2
mov ax,4c00h
int 21h
code ends
data segment
dw 0011h,0022h,0033h,0044h,0055h,0066h,0077h,0088h
data ends
stack segment
dw 0,0,0,0,0,0,0,0
stack ends
end start