为什么VS2013将函数调用编译成两个指令而不是一个



下面是一个简单的程序:

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,看看是否有什么变化。

最新更新