问个关于powerpc的问题
关于堆栈powerpc是怎么处理的?r1寄存器指向栈顶(类似以前的esp)?还是栈底?
以前的x86有两个寄存器,esp,ebp,ppc只用一个寄存器是怎么实现定位堆栈位置的?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
关于堆栈powerpc是怎么处理的?r1寄存器指向栈顶(类似以前的esp)?还是栈底?
以前的x86有两个寄存器,esp,ebp,ppc只用一个寄存器是怎么实现定位堆栈位置的?
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
接受
或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
发布评论
评论(5)
PowerPC不熟悉,只能一般地说说。
栈是单端伸缩的表,因此,从原理上说,只要有一个栈顶指针就可以操作堆栈了。X86里的EBP起辅助作用,使栈在函数调用中的应用更方便,更高效。
栈底是固定不变的。你只要存一个数来指示栈底。
对大多数CPU内置的硬件栈来说,栈底都是全1(可寻址空间的最高地址)。当栈空时,你还要做弹出,状态寄存器的溢出位也可以用来指示栈溢出。因此,甚至根本不需要保存栈底。
一个栈指针寄存器完全够用了,实际上大部分架构都用一个寄存器。
x86上ebp也不是必须的,你在编译的时候加上-fomit-frame-pointer参数,ebp就不用了,只用esp。这样lz可以看看x86里如何用一个寄存器操作栈的。
如果不保存栈底的指针,那不是很容易溢出,因为sp指针跑到栈底指针以后,cpu都不知道。。。
cpu不需要知道,操作系统知道就可以了。溢出后会产生page fault,操作系统只需要在这个时候判断访问的时候是非法地址就可以产生segfault终止程序。
实际上某些cpu也有硬件的检查机制,例如x86段中的limit。
哦
多谢,以后还请两位大侠多多指教。。。。