鱼C论坛

 找回密码
 立即注册
查看: 1619|回复: 6

求助:关于实例程序中的栈操作的问题

[复制链接]
发表于 2014-3-23 12:56:03 | 显示全部楼层 |阅读模式

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

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

x
QQ截图20140323125058.jpg
大神,我想问下,红圈圈里面的栈操作命令。

示例程序中并没有定义过栈,那么这几个栈命令操作的栈空间是要在调用程序里面定义么,可是调用程序里面没有定义栈,貌似也没问题啊。还有,iret指令进行的也是栈操作,它操作的栈是哪里呢?我们始终没有声明过栈。

麻烦大神能帮忙解答下。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2014-3-24 02:10:19 | 显示全部楼层
可能大神们都觉得我这个问题过于弱智吧,没有人回答。但是我真的是目前没有相通,为什么没有声明栈,却依然可以用呢,是因为计算机有什么其他约定,还是其他原因。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-3-24 19:26:27 | 显示全部楼层
本帖最后由 oggplay 于 2014-3-24 19:28 编辑

因为不需要你定义 。8086一个段最大64K ,你给出的小程序堆栈不需要那么大,才2个push指令,占32个字节,所以不需要定义了,当然你也可以自己定义。
另外80386以上更不需要你操心了,寻址空间4G ,你的小程序堆栈就更不需要了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-3-25 00:50:12 | 显示全部楼层

这位大神,谢谢你。我貌似明白了你的意思。就是说初始化的时候分配的栈段足够大,足够应付这种小程序对栈的要求,哪怕是不自己定义,程序也会按照初始化的栈地址就行工作。我是这么理解的,你应该是这个意思吧。

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

使用道具 举报

发表于 2014-3-25 02:29:21 | 显示全部楼层
oggplay 发表于 2014-3-24 19:26
因为不需要你定义 。8086一个段最大64K ,你给出的小程序堆栈不需要那么大,才2个push指令,占32个字节,所 ...

是的,其实栈段,数据段,代码段都是我们自己定义的,计算机根本就不认识。在汇编中,定义数据段,代码段,是为了告诉编译器。其实栈段也可以是数据段,就看你怎么去定义。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-3-25 19:04:59 | 显示全部楼层
本帖最后由 oggplay 于 2014-3-25 19:21 编辑
unicn 发表于 2014-3-25 00:50
这位大神,谢谢你。我貌似明白了你的意思。就是说初始化的时候分配的栈段足够大,足够应付这种小程序对栈 ...

你可以debug一下,程序启动后,ds es ss cs gs fs 都是同一个值(前提是你没自己定义这些段),但是sp的值是指向高地址的(如果不是,赋值高地址给sp。其他指针都在低地址)。只要你的压栈数据不覆盖你的其他数据即可,不要忘了,如果自己不定义这些段,最大段内偏移地址FFFF,最小偏移地址是0。0~FFFF=64K。
最后说一句  :  定义这些段靠你把握、调试 ,不要 指望 系统  。32位系统不用你操心了 ,百度平坦内存模式。      
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-3-25 20:40:54 | 显示全部楼层
有默认的栈:big:big
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-12-27 15:30

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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