そのため、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
ですか?