下面是一个简单的程序:
void func()
{
printf("hello");
}
int main()
{
printf("%p",func);
func();
return 0;
}
跨过printf("%p",func)
行,我在控制台上得到00F811AE
。
拆解func()
线,得到call _func (0F811AEh)
-到目前为止一切顺利。
但是反汇编func
的内容,第一条指令出现在地址00F813C0
。
所以我"去看"地址00F811AE
上有什么,在那里我找到了jmp func (0F813C0h)
。
call _func (0F811AEh)
jmp func (0F813C0h)
为什么VS2013编译器使用两个指令而不是一个?
似乎一个jmp
就能完成这项工作。我之所以问这个问题,是因为我有一种感觉,其他编译器也以类似的方式做这件事(当然,这取决于底层的硬件架构)。
谢谢
了解"思考":http://en.wikipedia.org/wiki/Thunk
在你的例子中,"思考"的一个好处是,你的代码的其余部分将总是调用func,但是执行相同角色的任何函数都可以在地址0x00F811AE注入调用。试着把func变成static,看看是否有什么变化。