cfer 发表于 2011-11-7 22:17:55

看书练习过程中发现的问题,求解释


《汇编语言》书上128页的程序6.3要求使用入栈出栈的方式实现数据的逆序存放。一共要逆序存放8个字型数据,书上的例程开辟了16个字的栈空间。我一开始觉得8个字型数据就开辟8个字型栈空间就够了呀。于是在自己编的过程中就随意开辟了10个字型栈空间(就是20个字节)。结果调试时发现运行过后最后几个数据都是错的,然后仔细看了一下自己的和书上的例子的内存使用情况,发现压栈时不止用到了8个字空间,至少要12个字空间才能完成这么个任务。可是我不理解为什么是这样,为什么压栈过程会用到12个字型空间。求高手指点。。。。
这是我一开始的程序,只有把dw后面至少再加两个0才能实现功能。大家可以运行看看。
ASSUME        CS:CODE
CODE        SEGMENT
             DW        1234H,3455H,0BD3H,259CH,2134H,1111H,25BAH,0CBCH
             DW        0,0,0,0,0,0,0,0,0,0
start:          MOV        AX,        CS
                   MOV        SS,        AX
                   MOV        SP, start
                   MOV        AX,        CS
                   MOV        DS,        AX
                   MOV        BX,        0
                   MOV        CX,        8
               
    S:                     PUSH       
                   INC        BX
                    INC        BX
                   LOOP        S
               
                   MOV        BX,        0
                   MOV        CX,        8
   S0:                  POP       
                   ADD        BX,        2
                   LOOP        S0
               
                   MOV        AX,        4C00H
                   INT        21H
             CODE        ENDS
             END        start

yipwing 发表于 2011-11-7 22:48:17

debug下..8个0没问题...

小生我怕怕 发表于 2011-11-7 22:51:18

{:5_92:}呵呵!理论来说8个是够用了,但是8086的cpu会用栈空间的来保存一些数据,用来记录现时的情况,如果你用T命令单步执行,会有其他的数据入栈,这些数据是下一条指令的段地址和偏移地址。好多人问这个问题! 呵呵

cfer 发表于 2011-11-7 23:33:01

感谢楼上的回答,确实看到了里面有下一条指令的段地址和偏移地址,不过还有其他的。看来以后用栈的时候还是把空间设大点好。

cfer 发表于 2011-11-7 23:34:36

yipwing 发表于 2011-11-7 22:48 static/image/common/back.gif
debug下..8个0没问题...

有的哦,要用栈存放些附加的东东,会使栈指针越界,覆盖原始数据的。

wxc807 发表于 2011-11-7 23:51:53

ASSUMECS:CODE
CODESEGMENT
      DW      1234H,3455H,0BD3H,259CH,2134H,1111H,25BAH,0CBCH ;8位字型数据
      DW      0,0,0,0,0,0,0,0,0,0                           ;8位字型数据加上面的字型数据也就是16进制的10H
               
start:MOV      AX,      CS         
      MOV      SS,      AX                                  ;让SS栈取得段地址
      MOV      SP,      11H                                 ;栈的顶应该是11H
      MOV      AX,      CS
      MOV      DS,      AX                                  ;让DS段寄存器取得数据的段地址
      MOV      BX,      0
      MOV      CX,      8
               
S:      PUSH                                                ;入栈DS:地址中的1234H数据放到,栈寄存器中的10H位置
      ADD      BX,      2
      LOOP      S
               
      MOV      BX,      0
      MOV      CX,      8
S0:   POP                                                    ;出栈放置DS:位置中,也就是当初的CS:0的位置
      ADD      BX,      2
      LOOP       S0
               
      MOV      AX,      4C00H
      INT      21H
CODE ENDS
END start我看了你的课题我也做了一遍。不知对不对。错误之处请各位大牛没具体指出。多多原谅。。欢迎指点。。

cfer 发表于 2011-11-7 23:59:31

楼上朋友的栈顶的sp应是24h,其实可以直接把start赋值给sp的,这样不用自己算。

wxc807 发表于 2011-11-8 00:54:19

本帖最后由 wxc807 于 2011-11-8 00:55 编辑

cfer 发表于 2011-11-7 23:59 static/image/common/back.gif
楼上朋友的栈顶的sp应是24h,其实可以直接把start赋值给sp的,这样不用自己算。SP不是偏移地址吗??

yipwing 发表于 2011-11-8 18:43:38

cfer 发表于 2011-11-7 23:34 static/image/common/back.gif
有的哦,要用栈存放些附加的东东,会使栈指针越界,覆盖原始数据的。

我用模拟器模拟的,没有越界。。
只是在执行int 21h 后会有数据覆盖。。

cfer 发表于 2011-11-9 23:15:23

有好多的问题。感觉不能太钻牛角尖,问题一大堆。。。

ever.g 发表于 2011-11-10 13:42:46

:L 原来还有这么多问题啊 了解啦
页: [1]
查看完整版本: 看书练习过程中发现的问题,求解释