鱼C论坛

 找回密码
 立即注册
查看: 2826|回复: 10

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

[复制链接]
发表于 2011-11-7 22:17:55 | 显示全部楼层 |阅读模式

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

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

x

《汇编语言》书上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        [BX]
                   INC        BX
                    INC        BX
                   LOOP        S
               
                   MOV        BX,        0
                   MOV        CX,        8
   S0:                    POP        [BX]
                   ADD        BX,        2
                   LOOP        S0
               
                   MOV        AX,        4C00H
                   INT        21H
             CODE        ENDS
             END        start
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2011-11-7 22:48:17 | 显示全部楼层
debug下..8个0没问题...
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2011-11-7 22:51:18 | 显示全部楼层
呵呵!理论来说8个是够用了,但是8086的cpu会用栈空间的来保存一些数据,用来记录现时的情况,如果你用T命令单步执行,会有其他的数据入栈,这些数据是下一条指令的段地址和偏移地址。好多人问这个问题! 呵呵
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
 楼主| 发表于 2011-11-7 23:33:01 | 显示全部楼层
感谢楼上的回答,确实看到了里面有下一条指令的段地址和偏移地址,不过还有其他的。看来以后用栈的时候还是把空间设大点好。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
 楼主| 发表于 2011-11-7 23:34:36 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2011-11-7 23:51:53 | 显示全部楼层
ASSUME  CS:CODE
CODE  SEGMENT
        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      [BX]                                            ;入栈DS:[BX]地址中的1234H数据放到,栈寄存器中的10H位置
        ADD        BX,        2
        LOOP        S
                
        MOV        BX,        0
        MOV        CX,        8
S0:     POP       [BX]                                             ;出栈放置DS:[BX]位置中,也就是当初的CS:0的位置
        ADD        BX,        2
        LOOP       S0
                
        MOV        AX,        4C00H
        INT        21H
CODE ENDS
END start
我看了你的课题我也做了一遍。不知对不对。错误之处请各位大牛没具体指出。多多原谅。。欢迎指点。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
 楼主| 发表于 2011-11-7 23:59:31 | 显示全部楼层
楼上朋友的栈顶的sp应是24h,其实可以直接把start赋值给sp的,这样不用自己算。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2011-11-8 00:54:19 | 显示全部楼层
本帖最后由 wxc807 于 2011-11-8 00:55 编辑
cfer 发表于 2011-11-7 23:59
楼上朋友的栈顶的sp应是24h,其实可以直接把start赋值给sp的,这样不用自己算。
SP不是偏移地址吗??

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2011-11-8 18:43:38 | 显示全部楼层
cfer 发表于 2011-11-7 23:34
有的哦,要用栈存放些附加的东东,会使栈指针越界,覆盖原始数据的。

我用模拟器模拟的,没有越界。。
  只是在执行int 21h 后会有数据覆盖。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
 楼主| 发表于 2011-11-9 23:15:23 | 显示全部楼层
有好多的问题。感觉不能太钻牛角尖,问题一大堆。。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2011-11-10 13:42:46 | 显示全部楼层
:L 原来还有这么多问题啊 了解啦
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2024-11-19 10:26

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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