汇编语言 明明定义了栈仍然no stack segment 以及栈空间数据被篡改问题

明明定义了栈仍然no stack segment的解决方案

参考原博客:https://blog.csdn.net/sxhelijian/article/details/69338661 这篇写的很好,可以看看

在连接过程中,连接器并未因为有“stacksg segment”,和assume了“ss:stacksg”就认为设置了堆栈段。
  怎样做才能被承认呢?
  找度娘,说是将段定义写成下面的形式:

stacksg segment stack
      ……
stacksg ends

于是整段代码改为
在这里插入图片描述
完美运行,没有warning: no stack segment
在这里插入图片描述

但是…仍然只有11个0放进了栈空间中

栈空间数据被篡改问题 原因分析

循环执行之前↓
在这里插入图片描述
循环执行一次↓
在这里插入图片描述

我自己的解释…
为了测试,加长0的个数(50个数据)
在这里插入图片描述
执行循环之前
在这里插入图片描述
执行一次循环之后
在这里插入图片描述
其他位置的内存空间均能正常赋值为0,黄色框内部分却总是 6B 07 … A3 01猜测这段数据和栈顶指向的位置有关,为了测试,控制其他不变,尝试修改栈顶位置(原来SP是20,这次测试将SP改为30),如下:在这里插入图片描述
debug单步执行,执行mov sp,30h指令之前,数据没有被改动,看SP指向的位置076b:0064 ,可以看到,6A 07 ... A3 01这一段数据被存在了这里 而且是6A开头 不是6B
在这里插入图片描述
果然,执行mov sp,30h指令之后,076b:0064处的数据也被改动了
在这里插入图片描述
结论:栈中数据并未按照定义的那样存储。栈顶指针SP所在空间被(不知道为什么)修改为其他数据。

猜你喜欢

转载自blog.csdn.net/sinat_42483341/article/details/88665331