月下孤井 发表于 2022-6-5 08:06:19

为什么在栈段里定义好值后debug里面的值跟定义的不一样

assume cs:code,ss:stack

stack segment stack
dw 8 dup(0)
stack ends

code segment
start:
        mov ax,stack
        mov ss,ax
        mov sp,16
       
        mov ax,4c00h
        int 21h
       
code ends
end start
-----------------------------------------------------------
代码在栈段定义了前16个字节是0, 代码在debug执行完int 21h最后一句后输入d ss:0查看栈里的值为什么是
04B0:0000 00 00 00 00 00 00 00 00-00 00 0D 00 B1 04 02 01不应该全都是0吗,为什么最后几个字节不是0
在栈里压入值后最后两个字节的值是压入后的数据,是没问题的,可是前面几个字节的值依然不是0, 是masm或debug的
版本原因还是本来汇编语言就会忽略在栈段里定义的值只会关心栈顶指针sp的值呢

jackz007 发表于 2022-6-5 10:05:18

本帖最后由 jackz007 于 2022-6-5 10:40 编辑

      你的代码有很多没有必要的成分,写成下面这样完全等效
assume cs:code

stack segment stack
      dw 8 dup(0)
stack ends

code segment
start:
      mov ax,4c00h
      int 21h
code ends
end start
      exe 文件中固定有初始 CS:IP 和 SS:SP 的信息,这些信息会由编译程序搞定,完全不需要我们在代码中指定和初始化。我们需要做到的是让汇编程序能够识别出堆栈段就足够了。剩下的工作编译程序会为我们规划得非常完美。
      至于堆栈数据,你为什么不在代码入口,而一定要等到程序执行完毕后才进行观察?你究竟想落实什么猜测?要知道,进程结束后,所有的程序数据都会失效,你的追溯毫无意义。
      假如一定要追溯,那就把
      int 21h
         改为
      int 03h

月下孤井 发表于 2022-6-5 10:39:41

jackz007 发表于 2022-6-5 10:05
你的代码有很多没有必要的成分,写成下面这样完全等效

      exe 文件中固定有初始 CS:IP 和 SS ...

我从程序入口每执行一步都会查看一下栈里面的值,在入口处栈里面的值最后面两个字节都是FF,前面的都是0,执行一步以后值就更不正常了,入口处的数据最后两个字节也不对啊

jackz007 发表于 2022-6-5 10:47:00

本帖最后由 jackz007 于 2022-6-5 10:49 编辑

月下孤井 发表于 2022-6-5 10:39
我从程序入口每执行一步都会查看一下栈里面的值,在入口处栈里面的值最后面两个字节都是FF,前面的都是0,执 ...

      对于堆栈而言,只要能保证你的压栈数据正确就可以了,所以,你应该关心的是 sp 往上到栈顶之间的数据,至于 sp 往下到栈底则完全没必要关心。

月下孤井 发表于 2022-6-5 16:26:54

jackz007 发表于 2022-6-5 10:47
对于堆栈而言,只要能保证你的压栈数据正确就可以了,所以,你应该关心的是 sp 往上到栈顶之间 ...

好的,谢谢
页: [1]
查看完整版本: 为什么在栈段里定义好值后debug里面的值跟定义的不一样