所以我必须编写一个调用 extern C 函数的汇编程序。所以我写了一个简单的pow
函数,我用这个 C 代码编译了我的汇编程序。一切正常。但正如我从-S
command from中看到的gcc
,编译器为局部变量留出了空间。我以为会是这样的:
int func(int number)
{
int a = 10;
int b = 5;
int c = 0;
}
我们有 3 个局部变量,所以编译器会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
还是可能16
?