2

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

4

1 に答える 1