本帖最后由 jackz007 于 2022-9-14 11:27 编辑 stack segment
dw 0h,0h,0h,0h,0h,0h,0h,0h
stack ends
code segment
start: mov ax,stack
mov ss,ax
mov sp,20h
你定义了 10h 字节的堆栈空间,却实际使用了 20h,那么,堆栈的上半部空间(10h)就会落入代码段,就是说,代码段前 10h 字节同时属于堆栈段,堆栈一旦开始使用,位于代码开始处的这 10h 字节就随时都有可能被堆栈数据所覆盖,你在调试中所发现的代码被意外改变的现象,其实,应该就是代码中的两个 push 操作所导致。
代码像下面这样写,你就完全不用操心堆栈段的事情了,因为,编译程序会为你搞定一切的。assume cs:code,ds:data,ss:stack
data segment para public 'data'
dw 0123h,0456h,0789h,0abch,0defh,0fedh,0cbah,0987h
data ends
stack segment para stack
dw 0h,0h,0h,0h,0h,0h,0h,0h
stack ends
code segment para public 'code'
start: mov ax,data
mov ds,ax
push ds:[0]
push ds:[2]
pop ds:[2]
pop ds:[0]
mov ax,4c00h
int 21h
code ends
end start
此外,给你一句衷告,堆栈段的定义必须足够大,一定要宁大勿小,任何代码堆栈段的空间应该至少 400H。
像这样来定义stack segment para stack
dw 200h dup(00)
stack ends
|