zhzwsaber 发表于 2022-9-14 09:07:43

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

本帖最后由 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 ,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:
      push ds:
      pop ds:
      pop ds:


      mov ax,4c00h
      int 21h
code ends
end start

debug 启动
-R
AX=FFFF   BX=0000CX=0042DX=0000SP=0000BP=0000SI=0000DI=0000
DS=075AES=075ASS=0769   CS=076CIP=0000
076C:0000 B86B07MOV 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:00080000   ADD   ,AL
-D CS:0
076C:0000 B8 6B 07 8E D0 BC 6B 07-00 00 08 00 6C 07 A3 A1
我就发现代码段后面很多值都被改变了,我很想贴图上来,但是没权限。

jackz007 发表于 2022-9-14 10:07:40

         你至少应该贴出你的全部代码,就改个 sp 而已,根本就不可能出现你说的那种情况。

zhzwsaber 发表于 2022-9-14 10:40:37

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

我想要传图的,结果不能传图,好气啊,我把完整代码写上来,并且把执行过程中我发现的被自动修改掉的内存写上来

jackz007 发表于 2022-9-14 10:43:53

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

         不要传图片,要传代码文本。

zhzwsaber 发表于 2022-9-14 10:56:23

jackz007 发表于 2022-9-14 10:43
不要传图片,要传代码文本。

大佬,我写上来了,你看看{:5_104:},我真的想不通

jackz007 发表于 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:
      push ds:
      pop ds:
      pop ds:
      mov ax,4c00h
      int 21h
code ends
end start
      此外,给你一句衷告,堆栈段的定义必须足够大,一定要宁大勿小,任何代码堆栈段的空间应该至少 400H。
      像这样来定义
stack segment para stack
    dw 200h dup(00)
stack ends

zhzwsaber 发表于 2022-9-14 11:27:42

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

哦,也就是说,尽管还没执行到push,哪怕只是移动了sp,如果超过了stack段的范围,那么后面的代码也是有可能会被改写掉的吗

jackz007 发表于 2022-9-14 11:30:35

本帖最后由 jackz007 于 2022-9-14 11:38 编辑

zhzwsaber 发表于 2022-9-14 11:27
哦,也就是说,尽管还没执行到push,哪怕只是移动了sp,如果超过了stack段的范围,那么后面的代码也是有 ...

      是的,因为堆栈空间的使用我们是无法把控到的,堆栈中,所有位于 SP 以下的数据都是危险的,随时都有可能被覆盖到。堆栈被使用过后,都会及时退栈,表面上看,SP 没有改变,但是,SP 以下的很多内容都已经发生了改变,改变区域就是堆栈曾经被使用的深度。

zhzwsaber 发表于 2022-9-14 11:36:23

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

谢谢大佬啦,我对这个危险已经入门级明白了,以后如果有深入学习肯定会首先意识到这一点了
页: [1]
查看完整版本: mov sp后整个执行代码都出错了,code段内的数据被改写