鱼C论坛

 找回密码
 立即注册
查看: 4260|回复: 12

关于栈的问题

[复制链接]
发表于 2019-4-29 16:50:10 | 显示全部楼层 |阅读模式

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

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

x
当按下t 执行 mov ss,ax 后(前面已经给ax赋值stacksg的地址),栈段的值被赋值为 00  00  00  00 00 00 6e 07-00 00 08 00 6a 07 a3 01
这是为什么?这些值有什么特殊的含义吗?
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2019-4-29 17:03:12 | 显示全部楼层
本帖最后由 jackz007 于 2019-4-29 17:13 编辑

       这些数值应该是在执行
  1. mov ss,ax
复制代码

       之前就已经存在于程序的代码之中了,实际上应该就是编程者所设计的堆栈段初始化值序列,只是执行这条语句之前,并没有把这些数据归入堆栈段而已。
       为了证明这一点,可以这么做,在执行这条语句之前,记下 ax 的数值,例如:45f,那么,你可以用命令 d 45f:0 来查看这些内存,应该和执行完这条语句所看到的堆栈内容是一样的。
       需要强调的是,由于堆栈会在各种函数以及系统中断调用过程中承担参数传递及保护现场的任务,所以,任何时刻,只有从 sp 到栈顶之间的存储内容是受保护和有效的,sp 以下的堆栈段存储的内容是不靠谱的,这是正常的,有可能是之前函数或中断调用后遗留的无效数据。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-4-29 23:13:06 | 显示全部楼层
jackz007 发表于 2019-4-29 17:03
这些数值应该是在执行

       之前就已经存在于程序的代码之中了,实际上应该就是编程者所设计的 ...

还是不懂,没有在别的地方找到一样的数据
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-4-29 23:14:24 | 显示全部楼层
jackz007 发表于 2019-4-29 17:03
这些数值应该是在执行

       之前就已经存在于程序的代码之中了,实际上应该就是编程者所设计的 ...

而且我用两个不同的文件执行后都出现相同的数据
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-4-29 23:26:03 | 显示全部楼层
      你有源代码吗?把它贴出来看看。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-4-30 23:14:56 | 显示全部楼层
jackz007 发表于 2019-4-29 23:26
你有源代码吗?把它贴出来看看。

不知道怎么贴图片,就是第七章的实验六
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-4-30 23:16:20 | 显示全部楼层
Muorius 发表于 2019-4-30 23:14
不知道怎么贴图片,就是第七章的实验六

assume cs:code,ss:stack,ds:data
stack segment
dw 0,0,0,0,0,0,0,0
stack ends
data segment
db '1. display      '
db '2. brows        '
db '3. replace      '
db '4. modify       '
data ends
code segment
start:mov ax,stack
      mov ss,ax
          mov sp,16
          mov ax,data
          mov ds,ax
          mov bx,0
          mov cx,4
         s1:push cx
            mov di,0
                mov cx,4
          s2:mov al,ds:[3+di+bx]
             and al,11011111b
                 mov ds:[3+di+bx],al
                 inc di
          loop s2
           add bx,10h
           pop cx
          loop s1
     mov ax,4c00h
         int 21h
code ends
end start
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-4-30 23:17:19 | 显示全部楼层
    难道你没有把代码敲进电脑?把它贴出来,不用贴图。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-5-1 10:41:03 | 显示全部楼层
jackz007 发表于 2019-4-30 23:17
难道你没有把代码敲进电脑?把它贴出来,不用贴图。

assume cs:code,ss:stack,ds:data
stack segment
dw 0,0,0,0,0,0,0,0
stack ends
data segment
db '1. display      '
db '2. brows        '
db '3. replace      '
db '4. modify       '
data ends
code segment
start:mov ax,stack
      mov ss,ax
          mov sp,16
          mov ax,data
          mov ds,ax
          mov bx,0
          mov cx,4
         s1:push cx
            mov di,0
                mov cx,4
          s2:mov al,ds:[3+di+bx]
             and al,11011111b
                 mov ds:[3+di+bx],al
                 inc di
          loop s2
           add bx,10h
           pop cx
          loop s1
     mov ax,4c00h
         int 21h
code ends
end start
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-5-1 11:26:07 | 显示全部楼层
本帖最后由 jackz007 于 2019-5-1 11:38 编辑

    你的代码编译不通,我把它改好了
  1. stack segment stack
  2.     dw 8 dup(0)
  3. stack ends
  4. data segment
  5.     db '1. display      '
  6.     db '2. brows        '
  7.     db '3. replace      '
  8.     db '4. modify       '
  9. data ends
  10.     assume cs:code , ds:data , ss:stack
  11. code segment
  12. start: mov ax,data
  13.        mov ds,ax
  14.        mov bx,0
  15.        mov cx,4
  16.    s1: push cx
  17.        mov di,0
  18.        mov cx,4
  19.    s2: mov al,byte ptr ds:[3+di+bx]
  20.        and al,11011111b
  21.        mov byte ptr ds:[3+di+bx],al
  22.        inc di
  23.        loop s2
  24.        add bx,10h
  25.        pop cx
  26.        loop s1

  27.        mov ax,4c00h
  28.        int 21h
  29. code ends
  30. end start
复制代码

        这才是程序入口的原始堆栈,可以看到,16 个字节全是 00。
x.exe.png
        关注一下我对堆栈段定义方式的改变,因为这个改变,把你 start:代码开始处所有与堆栈相关的寄存器赋值,就是下面的 3 条语句,全部省略了,通过上面的截图可以证明,这些寄存器的值都是正确的。
  1.       mov ax,stack
  2.       mov ss,ax
  3.       mov sp,16
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-5-2 11:06:33 | 显示全部楼层
jackz007 发表于 2019-5-1 11:26
你的代码编译不通,我把它改好了

        这才是程序入口的原始堆栈,可以看到,16 个字节全是 00。 ...

我的代码自己执行没问题啊,而且是执行完mov ds,ax 堆栈才变化的
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-5-2 11:49:47 From FishC Mobile | 显示全部楼层
    那就说明是在使用 t 命令跟踪程序的时候,debug.exe使用了堆栈,你看到的是事后留下的痕迹。我前面说过,只有从当前 sp 到栈顶之间的数据属于堆栈有效数据,sp以下都是无效的,是随时准备被占用的自由空间。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-5-2 20:58:10 | 显示全部楼层
jackz007 发表于 2019-5-2 11:49
那就说明是在使用 t 命令跟踪程序的时候,debug.exe使用了堆栈,你看到的是事后留下的痕迹。我前面说过 ...

我说的确实是堆栈内的内容(sp到栈顶),没法贴图有点难说明
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-6-10 02:19

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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