鱼C论坛

 找回密码
 立即注册
查看: 1681|回复: 4

第三章 栈寄存器SP=2,push ax 程序出错

[复制链接]
发表于 2014-2-9 07:54:14 | 显示全部楼层 |阅读模式

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

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

x
本帖最后由 春卷の爱 于 2014-2-9 08:32 编辑

PUSH指令的执行,由两步完成:1. SP=SP-2
2. push reg

运行DEBUG
设置SP=0000,PUSH AX,SP变为FFFE
设置SP=0002,PUSH AX,结果程序出错,请问这是为什么?在真实的汇编环境下,SP=2运行PUSH指令,会在栈的段地址内循环吗(SS不变,SP=0002 -> SP=0000 -> SP=FFFE)?
捕获1.PNG

补充:设置SP=0001,PUSH AX,也会出错:
捕获.PNG
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2014-2-9 11:08:43 | 显示全部楼层
不懂的,等待高手吧
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-2-9 14:15:33 | 显示全部楼层
本帖最后由 春卷の爱 于 2014-2-9 14:34 编辑

郁闷了,做到问题3.10的时候,设置SP=2,一PUSH就死机。
按照问题3.12后面的分析: PUSH, POP指令在执行的时候只修改SP,所以栈顶的变化范围是0-FFFFH,从栈空的时候SP=0,一直压栈,到栈满时SP=FFFE ->SP=0000,栈顶将环绕,覆盖了原来的内容。

所以一个栈的数据不会溢出到其他段,而是反复更新64KB范围内栈段的数据。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-2-9 15:30:23 | 显示全部楼层
本帖最后由 oggplay 于 2014-2-9 15:47 编辑

pushw  %ax #等于sp-4好么?所以当sp=0说明堆栈满了,再push一次就溢出了,你手动赋值就应该是:
       movw    $0xffff,  %bx
       movw    %bx,   %sp
       pushw     %ax
或者 addw    $8,  %sp
       pushw    %ax
这样就不会出错了
(请不要在意我的汇编写法,理解意思是主要的)

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-2-9 23:25:31 | 显示全部楼层

谢谢回复,代码不太看得懂,但你的意思我大概理解了。

我想请问一下堆栈溢出为什么会有错误提示。

问题3.12的分析部分说,“PUSH POP指令只修改SP,所以栈顶的变化范围是0-FFFFH,栈空的时候SP=0,一直PUSH,知道栈满时SP=0,如果再次PUSH,栈顶将环绕,覆盖了原来栈中的内容”

按照书上的说法是堆栈溢出以后SP会环绕,但不会报错。但我的SP PUSH到底以后出错了。不知道是不是DEBUG环境下特有的问题。我想学到后面我应该可以在真实程序里验证一下。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-9-28 09:23

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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