dポイントプレゼントキャンペーン実施中!

1.
Cの関数呼び出しは、アセンブリとして見るとどんなコードになっているのでしょうか?

2.
http://oshiete1.goo.ne.jp/qa5750174.html
すみませんが、上記質問「サンク方式について」の続きとして質問させて頂きます。

http://mentai.2ch.net/prog/kako/957/957341074.html
cb=(WNDPROC)VirtualAlloc(NULL,10+5 , MEM_COMMIT, PAGE_EXECUTE_READWRITE);
char *b=(char*)cb;            //コールバックゲートをこしらえる
*b++= 0xC7; *b++= 0x05;       //MOV [adr],xxxx
*((int *)b)++=(int)(&callbackSelf); //メモリアドレス
*((int *)b)++=(int)this;       //オブジェクトアドレス
*b++= 0xE9;             //jump long xxxx
*((int *)b)= ((int)WndProcGate)-(4+(int)b);//ジャンプ先
リンク先の79レス目のコードを一部抜粋致しました。

おそらくMOV命令からオブジェクトアドレス代入までが実行環境の切替か調整を行ってる部分と思うのですが、これらの値を入れる事で結果どういう作用があるのでしょうか?


また、この疑問に関する内容の書籍なりサイトがございましたら、そちらも紹介して頂けるとありがたいです。

A 回答 (1件)

1. 適当なCのプログラムを逆アセンブルしてみるなり、Cコンパイラからアセンブリ言語のファイルを出力させたりして、ご自分で見てみればいいのでは?


Windows用のVisualC++を使っている場合は
> dumpbin /disasm FILENAME.obj
とか
> cl /FA /FaFILENAME.asm /c FILENAME.c
とか。

2. そのcbから始まるアドレスに書き込まれたコードでやっていることは、
 Win構造体のcallbackSelfメンバーに、thisオブジェクトのポインタを書き込む
 WndProcGate関数へジャンプする
の2つです。
この状態でcbのアドレスを呼び出すと、WndProcGateを経由してWndProc関数が呼び出されます。

> これらの値を入れる事で結果どういう作用があるのでしょうか?

makeClass()を呼んだときのthisによって、コールバックのときに実行されるWndProc()を切り替えられるようにしています。Winを継承してWndProc()をオーバーライドできるようにするための仕掛けのようです。
オブジェクト指向とかウィンドウプログラミングの知識がないと何のことだか分からないでしょう。

この回答への補足

改めてsalsberryさん、回答ありがとうございました。
もう新しい回答もなさそうなので、自分なりの結論を書いて締めようと思います。

マシンコードを直接打ち込む方法は面白く大変勉強になりました。
でも使う分には、やっぱり私の書いたコードで十分ですね。多分。

補足日時:2010/03/23 03:22
    • good
    • 0
この回答へのお礼

ありがとうございます。
dumpbinとclの事は知らなかったのですが、これ本当に便利ですね。
おかげさまで疑問のほとんどがclだけで解決しました。

以下、参考にしたサイトを載せておきます。
[起動方法]
http://d.hatena.ne.jp/uox/20080302/p2
[dumpbin]
http://d.hatena.ne.jp/language_and_engineering/2 …
http://www.xlsoft.com/jp/products/intel/cvf/docs …
[cl]
http://besky-works.spaces.live.com/Blog/cns!555C …
http://msdn.microsoft.com/ja-jp/library/367y26c6 …


>makeClass()を呼んだときのthisによって、コールバックのときに実行されるWndProc()を切り替えられるようにしています。Winを継承してWndProc()をオーバーライドできるようにするための仕掛けのようです。
ところで、これってサンクを応用しなくても以下のコードで十分なような気がします。
makeClass()のような実装にするのは、何か意味があるのでしょうか?

class A{
public:
A(){
callback = this;
}
virtual void CallBack(){
cout << "A" << endl;
}
static void CallBackGate(){
callback->CallBack();
}
static A* callback;
};
A* A::callback;

お礼日時:2010/03/17 00:48

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!