0

64ビットLinuxで実行されているgnu Cコードで拡張アセンブリ最適化を行っています。アセンブリコード内からデバッグメッセージを出力したかったので、次のようになりました。この状況で私が何をすべきかを誰かが説明してくれることを願っています。

このサンプル関数を見てください:

    void test(int a, int b, int c, int d){


        __asm__ volatile (

        "movq $0, %%rax\n\t"
        "pushq %%rax\n\t"
        "popq %%rax\n\t"


        :
        :"m" (a)
        :"cc", "%rax"
        );

}

関数の 4 つの引数はクラス INTEGER であるため、レジスタを介して渡され、スタックにプッシュされます。私にとって奇妙なことは、gccが実際にどのようにそれを行うかです:

test:
        pushq   %rbp
        movq    %rsp, %rbp
        movl    %edi, -4(%rbp)
        movl    %esi, -8(%rbp)
        movl    %edx, -12(%rbp)
        movl    %ecx, -16(%rbp)

        movq $0, %rax
        pushq %rax
        popq %rax

        popq    %rbp
        ret

渡された引数はスタックにプッシュされますが、スタック ポインターはデクリメントされません。したがって、 を実行すると、とpushq %raxの値が上書きされます。私が疑問に思っていること:gccにローカルスタックを適切にセットアップするように依頼する方法はありますか? 関数呼び出しでandを使用することは想定されていませんか?abpushpop

4

1 に答える 1