鱼C论坛

 找回密码
 立即注册
查看: 1897|回复: 7

关于栈的问题

[复制链接]
发表于 2012-9-18 13:06:25 | 显示全部楼层 |阅读模式

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

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

x
例如这段代码:
assume cs:code
code segment
        dw 0123h,0456h,0789h,0abch,0defh,0fedh,0cbah,0987h
        dw 0,0,0,0,0,0,0,0
       
start:
        mov ax,cs
        mov ss,ax
        mov sp,32
        mov bx,0
        mov cx,8
        s:push cs:[bx]
          add bx,2
          loop s
          
          mov bx,0
          mov cx,8
        s0:pop cs:[bx]
           add bx,2
           loop s0
          
           mov ax,4c00h
           int 21h
code ends
end start
实际运行后 ss地址是在ds末尾,也就是说这两个段是连续的,好,那么问题来了,我每次往ss段push的时候都有其他数据产生在sp前面,也就是当我push到第6、7个的时候,所谓的(其他数据)已经把我之前ds段末的数据给覆盖掉了,而后面再push的话不能push正确的值。
求教大虾能帮忙解惑,为什么每次push之后都有所谓的“其他数据”在sp的前面呢?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2012-9-18 13:30:47 | 显示全部楼层
呵呵   楼主好~

问题:

为什么每次push之后都有所谓的“其他数据”在sp的前面呢?

分析:   首先,  你要看看这个是个特殊的列子。   

              1,  你要清楚,  ds  与  ss的  区别,
       ds 是 数据段,是存放程序的要用到的数据的段地址,    ss 是 栈段。  是存放栈的段地址
              
              2,(假设)  ds,里有8个数据。分别是 00h,11h,22h....  77h  (十六进制)     那现在看看  ds 和  ss ,如果在一个段中。   sp执行 77h 的下个内存单元地址,   每次 push  一次,  那会怎么样呢   ?    呵呵,  那当然是把原来的 ds 数据给覆盖了
               
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2012-9-18 13:31:52 | 显示全部楼层
这样就会错误了 。

希望能帮助你   bye~
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2012-9-18 13:48:34 | 显示全部楼层
1.LZ为什么知道每次push的时候sp前面都有其它数据呢?显然LZ用了单步调试
2.单步调试为什么执行完一条命令会停下来不继续往下执行?因为单步调式执行完一条命令后调用了一段中断处理子程序
3.被调用的这个 中断处理子程序里使用到了堆栈,当然,push了几次就pop了几次
4.这样,push进去的值破坏了原先的数据.但是pop后并不会恢复原先的值,仅仅是修正了sp
5.LZ知道为什么了吧
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
 楼主| 发表于 2012-9-18 14:27:40 | 显示全部楼层

你理解错了,我ds和ss只是连续的,但并不是相等的,我所说的每次push之后都会有莫名其妙的“其他数据”在我push地址的前面,也就是说我还没push完就把之前准备要push的值给覆盖掉了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
 楼主| 发表于 2012-9-18 14:30:59 | 显示全部楼层
仰望天上的光 发表于 2012-9-18 13:48
1.LZ为什么知道每次push的时候sp前面都有其它数据呢?显然LZ用了单步调试
2.单步调试为什么执行完一条命令会 ...

额,我还没学到中断处理子程序那里,不过听你的理解是指我sp前面的“其他数据”实际上是中断处理子程序吧?也就是说我若不用单步调试的话,sp前面就不会出现所谓的"其他数据"?被调用的中断处理子程序使用的栈一定是我ss这个栈么?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2012-9-18 16:03:49 | 显示全部楼层
鱼C版主果然是高手。学习了。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2012-9-18 18:33:54 | 显示全部楼层
忏悔 发表于 2012-9-18 14:30
额,我还没学到中断处理子程序那里,不过听你的理解是指我sp前面的“其他数据”实际上是中断处理子程序吧 ...

是中断处理子程序。就算你没学过也用该知道,程序能够停在那边不往下执行一定是 调用某些代码了 ,这些代码将使用堆栈,从而破快你 原来的数据。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2024-11-18 17:40

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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