首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >基于CSAPP的堆栈帧对齐方法

基于CSAPP的堆栈帧对齐方法
EN

Stack Overflow用户
提问于 2013-03-09 23:25:23
回答 1查看 379关注 0票数 0

IA32遵循的约定是确保每个堆栈帧都是16字节长的倍数。下面是一个示例函数:

代码语言:javascript
复制
char *gets( char *s ); //get String
void puts( char *s ); //put string to the screen
void echo()
{
    char buf[8];
    gets(buf);
    puts(buf);
 }

gets和puts只是函数调用,你可以不去管它们。

它的汇编代码如下:(从CSAPPcomputer系统:程序员的角度)

代码语言:javascript
复制
1 echo:
2 pushl %ebp            //Save %ebp on stack
3 movl %esp, %ebp
4 pushl %ebx            //Save %ebx
5 subl $20, %esp        //Allocate 20 bytes on stack
6 leal -12(%ebp), %ebx  //Compute buf as %ebp-12
7 movl %ebx, (%esp)     //Store buf at top of stack
8 call gets             //Call gets
9 movl %ebx, (%esp)     //Store buf at top of stack
10 call puts            //Call puts
11 addl $20, %esp       //Deallocate stack space
12 popl %ebx            //Restore %ebx
13 popl %ebp            // Restore %ebp
14 ret                  //Return

堆栈如下所示:

代码语言:javascript
复制
 ________
| old ebp|  4 bytes 
|________|
| ebx    |  4 bytes
|________|           ___
| buf[7] |            |
|________|            |
|  ...   |            |
                      |
                      |
|________|         20 bytes
| buf[0] |            |
|________|  ebp-12    |
|  ...   |            |
                      |
|________|           _|_

那么为什么编译器分配20个字节而不是24个字节呢?信标20+4+4 = 28不是16字节的倍数。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-03-10 13:13:01

不要忘记堆栈顶部的返回地址!call在跳到目标之前将当前的pc推送到堆栈上,ret弹出那台pc并跳回它。因此,堆栈更加准确

代码语言:javascript
复制
saved pc
old ebp
ebx
buf[7]
...
buf[0]
...

其总高度为32字节。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15312373

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档