2016-08-09 5 views
4

GCC cdecl呼び出し規約では、呼び出しが返された後に同じスタックにプッシュされた引数に依存できますか? ASMとCを混在させ、最適化(-O2)を有効にしても?ワードでCDECL呼び出し規約では、スタックにプッシュした引数を再利用できますか?

+0

Cの関数がconst以外の引数を変更することはまったく問題です。 – Michael

+0

@Michael:ABIは 'const' argsについて何も言わない。これはソースレベルのコンパイル時のもので、ABIの一部ではありません。これはやや不幸です。なぜなら、コンパイラはarg-passingスロットをスクラッチスペースとして利用することはほとんどありませんが、常にデータが壊れていると仮定しているからです。 –

答えて

4

:だからために非常に可能である

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関数。

これは、インライン展開やその他の最適化の魔法の可能性を数えていません。

関連する問題