IA-32 アセンブリ プログラミングを学習しています。そこで、アセンブリで関数を書き、C++ から呼び出したいと思います。
私がフォローしているチュートリアルは、実際には x64 アセンブリ用です。しかし、私はIA-32に取り組んでいます。x64 では、関数の引数は RCX、RDX、R8、R9 などのレジスタに格納されます。
しかし、少し調べてみると、IA-32 では引数がレジスタではなくスタックに格納されていることがわかりました。
以下は私のC++コードです:
#include <iostream>
#include <conio.h>
using namespace std;
extern "C" int PassParam(int a,int b);
int main()
{
cout << "z is " << PassParam(15,13) << endl;
_getch();
return 0;
}
以下は PassParam() 関数のアセンブリ コードです (2 つの引数を追加するだけです。これは学習目的のみです)。
アセンブリの PassParam() :
.model C,flat
.code
PassParam proc
mov eax,[ebp-212]
add eax,[ebp-216]
ret
PassParam endp
end
私のアセンブリ コードでは、最初の引数を [ebp-212] から eax に移動したことがわかります。その値は次のように取得されます。
PassParam() 関数を C++ 自体で記述し、逆アセンブルしました。次に、ebp がどこにあり、2 番目の引数がどこに格納されているかを確認します (引数は右から左に格納されます)。212 の差があることがわかったので、その値を取得しました。その後、通常どおり、最初の引数は 4 バイト後に格納されます。そして、それはうまくいきます。
質問 :
これは、アセンブリから引数にアクセスする正しい方法ですか? つまり、引数が保存されている場所は常に [ebp-212] ですか?
そうでない場合、C++ から assembly に引数を渡す正しい方法を誰かが説明できますか?
ノート :
Windows 7 マシンで Visual C++ 2010 を使用しています。