2012-02-04 1 views
8

私はアセンブリ言語を学んでいます。引数のプッシュオーダーは正確に何ですか?私は引数がスタックにどのようにプッシュされるのか理解していますが、左右の部分はどういう意味ですか?何の左か右? これは、コマンドが意味的に書かれているやり方とだけ関係しています。つまり、引数プッシュオーダーとは

mov ebp、esp; espは右から左にebpに移動します。

これが正しいのですか、誰かが教えてくれますか?

多くの感謝!

答えて

11

プロセッサには「関数引数」はありません。したがって、f(a,b,c)と書く場合は、実際にはどこかの引数をプッシュする必要があります。

これは慣習です。ほとんどのx86マシンでは、関数の引数が右から左へスタックにプッシュされていることがわかります。つまり、最初にc、次にb、そして次にaを押します。

push c 
push b 
push a 
call f 

今、呼び出された関数は、bについてebx - 2およびCのためのebx - 3ためebx -1を使用することができます。

最初の2つの引数はレジスタebxecxにあり、残りはスタックにあります。呼び出し元と呼び出し先が同意する限り、あなたは大丈夫です。

7

xtoflの説明に加えて、x86 calling conventionsというこの表を見てみるといいかもしれません。引数の順序に関しては、のほとんどの場合、引数のうちが右から左にプッシュされます(右端の引数が最初にプッシュされます)。ただし、パスカルは例外です。

xtoflではレジスタ引数がありません。一部の引数では、スタック上のではなく、の引数が必要です。 x86_64システムでは、例えば、機能:

int add3(int a, int b, int c) 

は、引数を置く:

a -> rdi 
b -> rsi 
c -> rdx 

具体的には、これは(インテル構文)のようになります。

mov  rdi, [source-of-a] 
mov  rsi, [source-of-b] 
mov  rdx, [source-of-c] 
call add3 

ので、レジスタをレジスタリストの左から右へから入力してからスタックを使用する右から左

xtoflが言うように、あなたが呼び出し元と呼び出し先が同意してくださいかは重要ではありません - 呼び出し元と呼び出し先が非互換性の問題を引き起こすだろうを同意できない場合は、しかし、はっきりとこれは実際には問題になりませんアセンブラのためにだけでなく、より高水準の言語のためにも - 幸いなことに、コンパイラは主に右から左に動作します。さらに読むには、興味深いスタックの呼び出し先/呼び出し側クリーンアップがあり、x86_64の1つのメソッドにどのように標準化されていたかを確認することができます。

あなたはx86を使用しているとは言えません。あなたのアーキテクチャーには、標準の呼び出し規約がありますが、それは難しくありません。

+0

お互いに非常に感謝します。それは非常に参考になりました。おかげでミル! – Axolotl