6

私は 32 ビット マシンを研究しました。サブ $12、%esp は pop %eax と mov $0、%eax の 3 回と同じです。

しかし、x86-64 マシンで add $18, %rsp を start プロシージャ コールで使用したり、sub $18, %rsp start をプロシージャ コールで使用したりする理由がわかりません。

コンパイラがプロシージャ呼び出しにこの規則を使用するのはなぜですか? 引数のルール?

0x0000000000400df3 <main+191>:  mov    $0x402227,%edi
0x0000000000400df8 <main+196>:  callq  0x400ab8 <puts@plt>
0x0000000000400dfd <main+201>:  callq  0x4014c0 <read_line>
0x0000000000400e02 <main+206>:  mov    %rax,%rdi
0x0000000000400e05 <main+209>:  callq  0x401139 <phase_3>

-----------------------------------------------------------------------
example:

0x0000000000401139 <example+0>: sub    $0x18,%rsp
0x000000000040113d <example+4>: lea    0x8(%rsp),%rcx
0x0000000000401142 <example+9>: lea    0xc(%rsp),%rdx
0x0000000000401147 <example+14>:        mov    $0x40248a,%esi
0x000000000040114c <example+19>:        mov    $0x0,%eax
0x0000000000401151 <example+24>:        callq  0x400ac8 <__isoc99_sscanf@plt>
0x0000000000401156 <example+29>:        cmp    $0x1,%eax
4

1 に答える 1

11

「私は3回と同じくらい知ってsub $12, %espいます。」あなたは間違っていることを知っています。ポップしたり、0 を移動したりしても、は変化しません。pop %eaxmov $0, %eaxsub $12, %espeax

のようなものを使用する主な/直接的な理由はsub $12, %esp、スタックにスペースを確保することです。これは、サブルーチンのローカル変数にスペースを与えるために使用できます。パフォーマンスやその他の理由で望ましい場合は、これを使用してスタック ポインターを整列させることもできます。

add $18, %rsp逆に、以前にスタックに割り当てられたスペースを解放します。これは、ローカル変数、または以前に別のサブルーチンに渡され、スタック上で不要になったパラメーターによって占められていたスペースを解放するために使用できます。

于 2012-09-28T08:03:05.807 に答える