assume cs: codes, ds: data, ss: stack
data segment
dw 0123H, 0456H, 0789H, 0abcH, 0defH, 0fedH, 0cbaH, 0987H
data ends
stack segment
dw 0, 0, 0, 0, 0, 0, 0, 0
stack ends
codes segment
start:
mov ax, stack
mov ss, ax
mov sp, 16
mov ax, data
mov ds, ax
push ds:[0]
push ds:[2]
pop ds:[0]
pop ds:[2]
mov ax, 4c00h
int 21H
codes ends
end start
用的dosbox调试的
开始前的内存
执行第一条语句正常
执行第二条语句就不理解了, 执行完 mov ss, ax就跳到mov ax, data 少了一句 mov sp, 16 但它确实把sp设置成10h
最后看下内存也变了 076b:0里面不知道为什么写了一些东西进去
第二次 push 操作时,栈溢出了。
你可以将堆栈段的大小设置为 256 字节。
这样写:
stack segment para stack
db 256 dup(?)
stack ends
修改后的代码是这样:
assume cs: codes, ds: data, ss: stack
data segment
dw 0123H, 0456H, 0789H, 0abcH, 0defH, 0fedH, 0cbaH, 0987H
data ends
stack segment para stack
db 256 dup(?)
stack ends
codes segment
start:
mov ax, stack
mov ss, ax
mov sp, 16
mov ax, data
mov ds, ax
push ds:[0]
push ds:[2]
pop ds:[0]
pop ds:[2]
mov ax, 4c00h
int 21H
codes ends
end start
我只运行了两句代码 还没到push
这段程序是汇编语言代码,目的是将数据段中的两个字存入堆栈,再将它们从堆栈中取出并存回数据段。程序执行完毕后,将会通过调用21H中断退出程序。
关于你提到的问题,可能是因为第二次执行时,寄存器SS和SP的值没有被正确设置,导致程序出现错误。
在第一次执行时,程序通过将堆栈段寄存器SS设置为堆栈段的基地址,将堆栈指针寄存器SP设置为16,以创建堆栈。在第二次执行时,堆栈已经被创建,因此不需要重新设置SS和SP寄存器。
你可以尝试将第二次执行的代码段修改为以下内容,以确保堆栈段寄存器SS和堆栈指针寄存器SP的正确设置:
start:
mov ax, data
mov ds, ax
perl
Copy code
push ds:[0]
push ds:[2]
pop ds:[0]
pop ds:[2]
mov ax, 4c00h
int 21H
这样修改后,程序应该就可以正常执行了。
是我没说清楚 我的意思是这个程序只执行了两条语句 程序没有执行两次
在我的视角 这段程序就执行了
mov ax, stack
mov ss, ax
mov sp, 16
只是设置了栈的基本地址 和sp而已 但是栈的数据被更改了 我不明白这点
程序是利用栈交换数据 最终的结果是对的
只是我不理解 中间的改变
并且我执行完第二条语句mov ss, ax就跳到mov ax, data 少了一句 mov sp, 16 但它确实把sp设置成10h