4
GCC cdecl
呼び出し規約では、呼び出しが返された後に同じスタックにプッシュされた引数に依存できますか? ASMとCを混在させ、最適化(-O2
)を有効にしても?ワードでCDECL呼び出し規約では、スタックにプッシュした引数を再利用できますか?
GCC cdecl
呼び出し規約では、呼び出しが返された後に同じスタックにプッシュされた引数に依存できますか? ASMとCを混在させ、最適化(-O2
)を有効にしても?ワードでCDECL呼び出し規約では、スタックにプッシュした引数を再利用できますか?
:だからために非常に可能である
movl $5, 8(%ebp)
movl $6, 12(%ebp)
movl 8(%ebp), %edx
movl 12(%ebp), %eax
addl %edx, %eax
popl %ebp
ret
:
__cdecl int foo(int a, int b)
{
a = 5;
b = 6;
return a + b;
}
int main()
{
return foo(1, 2);
}
これは(-O0でコンパイル)このASM出力を生成した:第
このコードを検討スタック値に踏み込む__cdecl関数。
これは、インライン展開やその他の最適化の魔法の可能性を数えていません。
Cの関数がconst以外の引数を変更することはまったく問題です。 – Michael
@Michael:ABIは 'const' argsについて何も言わない。これはソースレベルのコンパイル時のもので、ABIの一部ではありません。これはやや不幸です。なぜなら、コンパイラはarg-passingスロットをスクラッチスペースとして利用することはほとんどありませんが、常にデータが壊れていると仮定しているからです。 –