DLLエントリポイント - 実験1
本当はアセンブラで書いてアセンブルしてバイナリ列を該当部に使って終わりなのですが寄り道。
引数で受け取ったアドレスの関数を call する関数を書いてアセンブリのコードを眺めます。
unsined int なのはお行儀が良くないですが気にしないでください。
void call_func(unsigned int func) { ((void(*)(void))func)(); }
これを -S でアセンブラにすると核心部分
.globl _Z9call_funcj .type _Z9call_funcj, @function _Z9call_funcj: .LFB2: push %ebp .LCFI0: mov %ebp, %esp .LCFI1: sub %esp, 8 .LCFI2: mov %eax, DWORD PTR [%ebp+8] call %eax leave ret
予想通りスタックに引数を積んで、eaxに入れて call して戻ってます。
つまり動的にアドレスを渡されて、それを call したければ eax にでもアドレスを入れて call すれば良いということが分かります。(周り道だなw)