所以我必須編寫一個調用extern C函數的彙編程序。所以我寫了簡單的pow
函數,我用這個C代碼編譯我的彙編程序。一切正常。但正如我從gcc
的-S
命令看到的那樣,編譯器爲局部變量創建了一個空間。我認爲它會是這樣的:爲程序集中的局部變量創建空間
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
。但是現在,我沒有任何東西從%esp
。我的意思是我可以添加這一行,但它不會改變任何東西。我通過互聯網搜索,發現也許我的代碼只是偶然的工作,通常我應該遞減%esp
。所以我的問題在於:通過main
,我應該減少%esp
的值?應該是12
還是16
?
採用'16'很可能保持一致堆棧16字節。 – unwind
我想你是對的,但是我應該讓它總是16字節對齊,還是應該subl特定值? – Frynio
該要求可能在平臺的應用程序二進制接口(ABI)文檔中指定。既然它是一個規範,你應該遵循它以便能夠與其他代碼交互。 – unwind