这是一个简单的程序:
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
可以胜任这项工作。我甚至都在问这个问题,因为我觉得其他编译器也是这样做的(当然,取决于底层的硬件架构)。
由于
答案 0 :(得分:6)
了解" thunking":http://en.wikipedia.org/wiki/Thunk
" thunking"在您的示例中,代码的其余部分将始终调用 func ,但执行相同角色的任何函数都可以注入到地址0x00F811AE的调用中。
尝试 func 静态,并查看是否有任何更改。