そのため、extern C 関数を呼び出すアセンブリ プログラムを作成する必要があります。そこで、単純なpow関数を作成し、この C コードでアセンブリ プログラムをコンパイルしました。すべてが機能します。-Sしかし、 のコマンドから見たようgccに、コンパイラはローカル変数用のスペースを作成します。私はそれが次のようになると思いました:
int func(int number)
{
int a = 10;
int b = 5;
int c = 0;
}
3 つのローカル変数があるため、コンパイラはsubl $12, %esp. しかし、それはうまくいきsubl $16, %espます。ここに数字を 1 つだけ残したとしても、 だけ減少し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ですか?