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)