鱼C论坛

 找回密码
 立即注册
查看: 1428|回复: 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
我搞不明白
贴上完整代码
assume cs:code,ds:data,ss:stack
data segment
    dw 0123h,0456h,0789h,0abch,0defh,0fedh,0cbah,0987h
data ends
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
        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

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 编辑
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
想知道小甲鱼最近在做啥?请访问 -> 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-9-28 13:18

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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