Muorius 发表于 2019-4-29 16:50:10

关于栈的问题

当按下t 执行 mov ss,ax 后(前面已经给ax赋值stacksg的地址),栈段的值被赋值为 00000000 00 00 6e 07-00 00 08 00 6a 07 a3 01
这是为什么?这些值有什么特殊的含义吗?

jackz007 发表于 2019-4-29 17:03:12

本帖最后由 jackz007 于 2019-4-29 17:13 编辑

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

Muorius 发表于 2019-4-29 23:13:06

jackz007 发表于 2019-4-29 17:03
这些数值应该是在执行

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

还是不懂,没有在别的地方找到一样的数据

Muorius 发表于 2019-4-29 23:14:24

jackz007 发表于 2019-4-29 17:03
这些数值应该是在执行

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

而且我用两个不同的文件执行后都出现相同的数据

jackz007 发表于 2019-4-29 23:26:03

      你有源代码吗?把它贴出来看看。

Muorius 发表于 2019-4-30 23:14:56

jackz007 发表于 2019-4-29 23:26
你有源代码吗?把它贴出来看看。

不知道怎么贴图片,就是第七章的实验六

Muorius 发表于 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:
             and al,11011111b
               mov ds:,al
               inc di
          loop s2
           add bx,10h
           pop cx
          loop s1
   mov ax,4c00h
       int 21h
code ends
end start

jackz007 发表于 2019-4-30 23:17:19

    难道你没有把代码敲进电脑?把它贴出来,不用贴图。

Muorius 发表于 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:
             and al,11011111b
               mov ds:,al
               inc di
          loop s2
         add bx,10h
         pop cx
          loop s1
   mov ax,4c00h
         int 21h
code ends
end start

jackz007 发表于 2019-5-1 11:26:07

本帖最后由 jackz007 于 2019-5-1 11:38 编辑

    你的代码编译不通,我把它改好了
stack segment stack
    dw 8 dup(0)
stack ends
data segment
    db '1. display      '
    db '2. brows      '
    db '3. replace      '
    db '4. modify       '
data ends
    assume cs:code , ds:data , ss:stack
code segment
start: mov ax,data
       mov ds,ax
       mov bx,0
       mov cx,4
   s1: push cx
       mov di,0
       mov cx,4
   s2: mov al,byte ptr ds:
       and al,11011111b
       mov byte ptr ds:,al
       inc di
       loop s2
       add bx,10h
       pop cx
       loop s1

       mov ax,4c00h
       int 21h
code ends
end start
      这才是程序入口的原始堆栈,可以看到,16 个字节全是 00。

      关注一下我对堆栈段定义方式的改变,因为这个改变,把你 start:代码开始处所有与堆栈相关的寄存器赋值,就是下面的 3 条语句,全部省略了,通过上面的截图可以证明,这些寄存器的值都是正确的。
      mov ax,stack
      mov ss,ax
      mov sp,16

Muorius 发表于 2019-5-2 11:06:33

jackz007 发表于 2019-5-1 11:26
你的代码编译不通,我把它改好了

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

我的代码自己执行没问题啊,而且是执行完mov ds,ax 堆栈才变化的

jackz007 发表于 2019-5-2 11:49:47

    那就说明是在使用 t 命令跟踪程序的时候,debug.exe使用了堆栈,你看到的是事后留下的痕迹。我前面说过,只有从当前 sp 到栈顶之间的数据属于堆栈有效数据,sp以下都是无效的,是随时准备被占用的自由空间。

Muorius 发表于 2019-5-2 20:58:10

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

我说的确实是堆栈内的内容(sp到栈顶),没法贴图有点难说明
页: [1]
查看完整版本: 关于栈的问题