在学习王爽的《汇编语言第三版》时,有个示例要求利用栈将程序中的数据逆序存放;无论是作者的例子,还是我稍微修改后的程序运行结果都没有问题,但是不知道为什么栈内的内容总是和预期的不一致,请大家帮我解答一下。
作者的例子如下:
我觉得既然只是逆序存放 8 个字型数据,那就用 dw 定义 8 个字型数据就行了,无需 16 个;然后我就重新只定义了 8 个字型数据,同时将初始的栈顶偏移地址改为了 20H 。
然后用 DEBUG 进行调试,跳转到第一次循环结束的地方,入栈的结果 076A:10 1F
是正常的,但是原数据的后四个
076A:8 F
被改写了。
再次跳转到程序结尾部分,逆序存放的结果 076A:0 F
是正确的,但是栈的后四位 076A:18 1F
又被改写了。
用 DEBUG 调试了一下作者的示例程序,发现也存在这样的情况,不仅栈的后四位 076A:28 2F
被改写了,就连没有使用的 076A:1A 1F
也被改写了。究竟是什么原因导致这些地方总是被改写了呢?
1
dic 2021-07-18 17:26:20 +08:00
我看的是 《汇编语言第四版》,在学习过程中也发现了这个情况,不过书上说是由于中断导致的,让先不用管这种情况后续内容中会有说明。
|
3
senghoo 2021-07-18 19:32:14 +08:00
好久没看汇编了。仅仅猜测哈。
这应该是传说中的 Stack overflow 吧。sp 寄存器下面(小于此地址的内存,stack 来说是上方)的空间被认为是空闲空间,中断处理程序什么的有可能用到空间。 第一次循环结束时 sp=0x10,这时候其实栈已经满了(再往下走就是原始数据了),如果这个时候中断处理程序介入,就会覆盖原始数据。第二次循环结束时同理,你已经释放了栈空间( sp=20),如果这时候中断来,数据有可能改写。 盲猜,要是有大佬请指正哈~~ |