鱼C论坛

 找回密码
 立即注册
查看: 1088|回复: 8

[已解决]mov sp后整个执行代码都出错了,code段内的数据被改写

[复制链接]
发表于 2022-9-14 09:07:43 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 zhzwsaber 于 2022-9-14 11:07 编辑

汇编第6章实验5的第一题进行sp改动后code全部出错了,书本上面是mov sp,16,我改成mov sp,20H。

进入程序直接 -u cs:0查看整个程序的代码都是正常的

然后开始执行,前面两步都是正常的。
mov ax,stack
mov ss,ax

第三步原本应该是
mov sp,0020
却会变成
add [BX+SI],AL
我搞不明白
贴上完整代码
  1. assume cs:code,ds:data,ss:stack
  2. data segment
  3.     dw 0123h,0456h,0789h,0abch,0defh,0fedh,0cbah,0987h
  4. data ends
  5. stack segment
  6.     dw 0h,0h,0h,0h,0h,0h,0h,0h
  7. stack ends
  8. code segment
  9. start:  mov ax,stack
  10.         mov ss,ax
  11.         mov sp,20h
  12.         mov ax,data
  13.         mov ds,ax
  14.         push ds:[0]
  15.         push ds:[2]
  16.         pop ds:[2]
  17.         pop ds:[0]


  18.         mov ax,4c00h
  19.         int 21h
  20. code ends
  21. end start
复制代码


debug 启动
-R
AX=FFFF   BX=0000  CX=0042  DX=0000  SP=0000  BP=0000  SI=0000  DI=0000
DS=075A  ES=075A  SS=0769   CS=076C  IP=0000
076C:0000 B86B07  MOV AX,076B
-D cs:0
076C:0000 B8 6B 07 8E D0 BC 20 00-B8 6A 07 8E D8 FF 36 00
注意重点来了,执行两步以后20 00这个数据会被改变成6B 07
-T
省略寄存器信息
076C:0003 8ED0    MOV SS,AX
-T
省寄存器信息
076C:0008  0000   ADD   [BX+SI],AL
-D CS:0
076C:0000 B8 6B 07 8E D0 BC 6B 07-00 00 08 00 6C 07 A3 A1
我就发现代码段后面很多值都被改变了,我很想贴图上来,但是没权限。
最佳答案
2022-9-14 11:30:35
本帖最后由 jackz007 于 2022-9-14 11:38 编辑
zhzwsaber 发表于 2022-9-14 11:27
哦,也就是说,尽管还没执行到push,哪怕只是移动了sp,如果超过了stack段的范围,那么后面的代码也是有 ...


        是的,因为堆栈空间的使用我们是无法把控到的,堆栈中,所有位于 SP 以下的数据都是危险的,随时都有可能被覆盖到。堆栈被使用过后,都会及时退栈,表面上看,SP 没有改变,但是,SP 以下的很多内容都已经发生了改变,改变区域就是堆栈曾经被使用的深度。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-9-14 10:07:40 | 显示全部楼层
           你至少应该贴出你的全部代码,就改个 sp 而已,根本就不可能出现你说的那种情况。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-9-14 10:40:37 | 显示全部楼层
jackz007 发表于 2022-9-14 10:07
你至少应该贴出你的全部代码,就改个 sp 而已,根本就不可能出现你说的那种情况。

我想要传图的,结果不能传图,好气啊,我把完整代码写上来,并且把执行过程中我发现的被自动修改掉的内存写上来
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-9-14 10:43:53 | 显示全部楼层
zhzwsaber 发表于 2022-9-14 10:40
我想要传图的,结果不能传图,好气啊,我把完整代码写上来,并且把执行过程中我发现的被自动修改掉的内存 ...

         不要传图片,要传代码文本。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-9-14 10:56:23 | 显示全部楼层
jackz007 发表于 2022-9-14 10:43
不要传图片,要传代码文本。

大佬,我写上来了,你看看,我真的想不通
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-9-14 11:21:15 | 显示全部楼层
本帖最后由 jackz007 于 2022-9-14 11:27 编辑
  1. stack segment
  2.     dw 0h,0h,0h,0h,0h,0h,0h,0h
  3. stack ends
  4. code segment
  5. start:  mov ax,stack
  6.         mov ss,ax
  7.         mov sp,20h
复制代码

        你定义了 10h 字节的堆栈空间,却实际使用了 20h,那么,堆栈的上半部空间(10h)就会落入代码段,就是说,代码段前 10h 字节同时属于堆栈段,堆栈一旦开始使用,位于代码开始处的这 10h 字节就随时都有可能被堆栈数据所覆盖,你在调试中所发现的代码被意外改变的现象,其实,应该就是代码中的两个 push 操作所导致。

         代码像下面这样写,你就完全不用操心堆栈段的事情了,因为,编译程序会为你搞定一切的。
  1. assume cs:code,ds:data,ss:stack
  2. data segment para public 'data'
  3.     dw 0123h,0456h,0789h,0abch,0defh,0fedh,0cbah,0987h
  4. data ends
  5. stack segment para stack
  6.     dw 0h,0h,0h,0h,0h,0h,0h,0h
  7. stack ends
  8. code segment para public 'code'
  9. start:  mov ax,data
  10.         mov ds,ax
  11.         push ds:[0]
  12.         push ds:[2]
  13.         pop ds:[2]
  14.         pop ds:[0]
  15.         mov ax,4c00h
  16.         int 21h
  17. code ends
  18. end start
复制代码

        此外,给你一句衷告,堆栈段的定义必须足够大,一定要宁大勿小,任何代码堆栈段的空间应该至少 400H。
        像这样来定义
  1. stack segment para stack
  2.     dw 200h dup(00)
  3. stack ends
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-9-14 11:27:42 | 显示全部楼层
jackz007 发表于 2022-9-14 11:21
你定义了 10h 字节的堆栈空间,却想使用 20h,那么,堆栈的上半部空间(10h)就会落入代码段,就 ...

哦,也就是说,尽管还没执行到push,哪怕只是移动了sp,如果超过了stack段的范围,那么后面的代码也是有可能会被改写掉的吗
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-9-14 11:30:35 | 显示全部楼层    本楼为最佳答案   
本帖最后由 jackz007 于 2022-9-14 11:38 编辑
zhzwsaber 发表于 2022-9-14 11:27
哦,也就是说,尽管还没执行到push,哪怕只是移动了sp,如果超过了stack段的范围,那么后面的代码也是有 ...


        是的,因为堆栈空间的使用我们是无法把控到的,堆栈中,所有位于 SP 以下的数据都是危险的,随时都有可能被覆盖到。堆栈被使用过后,都会及时退栈,表面上看,SP 没有改变,但是,SP 以下的很多内容都已经发生了改变,改变区域就是堆栈曾经被使用的深度。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-9-14 11:36:23 | 显示全部楼层
jackz007 发表于 2022-9-14 11:30
是的,因为堆栈空间的使用我们是无法把控到的,堆栈中,所有位于 SP 以下的数据都是危险的,随 ...

谢谢大佬啦,我对这个危险已经入门级明白了,以后如果有深入学习肯定会首先意识到这一点了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-4-26 14:53

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表