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を使用することは想定されていませんか?a
b
push
pop