※ ChatGPTを利用し、要約された質問です(原文:サンク(Cの関数呼び出し)について その2)
サンク(Cの関数呼び出し)について その2
このQ&Aのポイント
Cの関数呼び出しは、アセンブリとして見るとどんなコードになっているのでしょうか?
cb=(WNDPROC)VirtualAlloc(NULL,10+5 , MEM_COMMIT, PAGE_EXECUTE_READWRITE);
char *b=(char*)cb;
*b++= 0xC7; *b++= 0x05;
*((int *)b)++=(int)(&callbackSelf);
*((int *)b)++=(int)this;
*b++= 0xE9;
*((int *)b)= ((int)WndProcGate)-(4+(int)b);
リンク先の79レス目のコードを一部抜粋致しました。
おそらくMOV命令からオブジェクトアドレス代入までが実行環境の切替か調整を行ってる部分と思うのですが、これらの値を入れる事で結果どういう作用があるのでしょうか?
この疑問に関する内容の書籍なりサイトがございましたら、そちらも紹介して頂けるとありがたいです。
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命令からオブジェクトアドレス代入までが実行環境の切替か調整を行ってる部分と思うのですが、これらの値を入れる事で結果どういう作用があるのでしょうか?
また、この疑問に関する内容の書籍なりサイトがございましたら、そちらも紹介して頂けるとありがたいです。
お礼
ありがとうございます。 dumpbinとclの事は知らなかったのですが、これ本当に便利ですね。 おかげさまで疑問のほとんどがclだけで解決しました。 以下、参考にしたサイトを載せておきます。 [起動方法] http://d.hatena.ne.jp/uox/20080302/p2 [dumpbin] http://d.hatena.ne.jp/language_and_engineering/20081008/1223384382 http://www.xlsoft.com/jp/products/intel/cvf/docs/vf-html/pg/pg26_10_02.htm [cl] http://besky-works.spaces.live.com/Blog/cns!555CF2E2F9E31C71!499.entry http://msdn.microsoft.com/ja-jp/library/367y26c6(VS.80).aspx >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;
補足
改めてsalsberryさん、回答ありがとうございました。 もう新しい回答もなさそうなので、自分なりの結論を書いて締めようと思います。 マシンコードを直接打ち込む方法は面白く大変勉強になりました。 でも使う分には、やっぱり私の書いたコードで十分ですね。多分。