LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 1359|回复: 4

汇编里的subl $x, %esp的$x大小在gcc是如何确定的?

[复制链接]
发表于 2005-6-17 23:43:21 | 显示全部楼层 |阅读模式
$cat test.c

int main(int argc, char** argv)
{
        int a = 1;
        int b = 2;
        int c = 3;
        return 0;
}

$cc -S test.c
$cat test.s

        .file        "test.c"
        .text
.globl main
        .type        main, @function
main:
        pushl        %ebp
        movl        %esp, %ebp
        subl        $24, %esp
        andl        $-16, %esp
        movl        $0, %eax
        subl        %eax, %esp
        movl        $1, -4(%ebp)
        movl        $2, -8(%ebp)
        movl        $3, -12(%ebp)
        movl        $0, %eax
        leave
        ret
        .size        main, .-main
        .section        .note.GNU-stack,"",@progbits

;--------------------------------------------------

在main: 里subl $24, %esp
这里的%esp为什么要减去24 ?  我的理解是%esp里面的栈地址的下面应该是局部变量
的存储位置, 那么我上面的3个int32的变量只有12个bytes, 就算要对齐, 为什么是24?
而且我的main程序里没有牵扯到临时变量和函数调用, 所以也没有理由这里用24啊?

%esp的对齐有什么特别的要求吗?
发表于 2005-6-18 02:26:06 | 显示全部楼层
没有必要理会编译器在想什么。后面那句andl $-16, %esp还更奇怪。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-6-18 10:59:20 | 显示全部楼层
andl $-16, $esp;

就是andl $0xfffffff0, $esp; 我认我这里才是真正的对齐, 就是不能理解为什么要
subl $24, $esp
回复 支持 反对

使用道具 举报

发表于 2005-6-18 11:22:33 | 显示全部楼层
是按8字节对齐的吧
回复 支持 反对

使用道具 举报

发表于 2005-6-18 17:37:42 | 显示全部楼层
回复 支持 反对

使用道具 举报

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

本版积分规则

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