2

コンパイラの出力から少しアセンブラを学び始めたところです。

test(1);

この単純な関数呼び出しにより、次の asm 出力が作成されます (x64 でコンパイル)

000000013FFF2E76  mov         ecx,1  
000000013FFF2E7B  call        test (13FFF33C0h) 

しかし、なぜそうではないのですか:

000000013FFF2E76  push        1  
000000013FFF2E7B  call        test (13FFF33C0h) 

pushed関数パラメーターはスタックに、次に関数にあると思いましたpoped。VSが一番上のものを好む理由を誰かが説明できますか?

4

1 に答える 1

6

これは、x64 Windows の ABI であるためです。

Windows x64 では、最初の整数引数は でRCX、2 番目はRDXで、3 番目はR8で、4 番目は で渡されR9ます。5 番目以降はスタックを通過します。

関数には単一の引数があるため、のみRCXが使用されます。

ECX32 ビット レジスタへのすべての書き込みは 64 ビット レジスタの上位部分をゼロにし、32 ビットの即値は 64 ビットのものよりも明らかに短いため、コンパイラは書き込みを発行しました(命令キャッシュの誰か?)。

于 2012-05-28T13:54:50.757 に答える