在汇编中为局部变量创建空间

时间:2017-04-10 11:08:34

标签: c linux assembly x86-64 stack-pointer

所以我必须编写一个调用extern C函数的汇编程序。所以我写了简单的pow函数,用这个C代码编译了我的汇编程序。一切正常。但正如我从-S的{​​{1}}命令中看到的那样,编译器为局部变量创建了一个空间。我以为会是这样的:

gcc

我们有3个局部变量,因此编译器会int func(int number) { int a = 10; int b = 5; int c = 0; } 。但它适用于subl $12, %esp。即使我只在这里留下一个数字,它仍然会减少subl $16, %esp。现在我有了我的代码:

16

main.s

.section .data .XD: msg: .ascii "%d\n" msg_len = . - msg .text .globl _pow .globl main main: pushl %ebp movl %esp, %ebp movl $5, %eax #like int a = 5; pushl %eax call _pow #_pow(a); movl %eax, -8(%ebp) pushl -8(%ebp) pushl $.XD call printf #printf("%d\n", _pow(a)); movl $0, %eax leave ret

func.c

按预期工作,int _pow(int number) { return number * number; } 打印出./main。但现在,我不会25来自subl的任何事情。我的意思是我可以添加这一行,但它并没有改变任何东西。我通过互联网搜索过,我发现也许我的代码只是偶然发生,一般我应该递减%esp。所以我的问题是:我应该在%esp中减少%esp的价值?它应该是main还是12

1 个答案:

答案 0 :(得分:0)

由于您正在调用32位C函数,因此必须遵循C calling convention。与64位系统不同,没有明确的顺序来对齐堆栈。我无法找到声明何时应该进行此类对齐。堆栈可能是"未对齐"推送参数后。

如果你想对齐堆栈,你可以在保存后简单地使用AND -16(movl %esp, %ebp):

andl $-16, %esp                ; Align 16