Xcode 4 で gcc コンパイラを使用してインテル スタイルのインライン アセンブリ コードを作成しています。インライン アセンブリ コードの一部を以下に示します。
_asm
{
mov eax, esp
sub esp, 116
and esp, ~15
mov [esp+112], eax
}
シップ モードでは、GCC は上記の 4 行の asm コードを次のようにコンパイルします。
mov %esp,%eax
sub $0x74,%esp
and $0xfffffff0,%esp
mov %eax,0x70(%esp)
まさに私が欲しいものです。ただし、デバッグモードでは、GCC はそのコードをコンパイルして
mov %esp,%eax
mov %eax,%esp
mov %esp,%eax
mov %eax,-0x28(%ebp)
mov %esp,%eax
mov %eax,%esp
sub $0x74,%esp
mov %esp,%eax
mov %eax,-0x24(%ebp)
mov %esp,%eax
mov %eax,%esp
**and $0xfffffff0,%esp**
**mov %esp,%eax** **//changing the value of “eax”**
mov %eax,-0x24(%ebp)
mov %esp,%ecx
mov %ecx,%esp
**mov %eax,0x70(%esp)** **//store a “dirty” value to address 0x70(%esp), which is not we want**
上記の問題を解決する 1 つの方法は、AT&T スタイルの命令を使用してインライン asm コードを書き直し、レジスターを clobbered リストに追加することです。しかし、書き直すコードが長すぎるので、この方法では非常に手間がかかります。
問題を解決するための他の効率的な方法はありますか? レジスタ「eax」を予約する必要があることを gcc コンパイラに認識させるには?