JMP间接是什么意思

时间:2013-12-02 13:22:47

标签: c++ assembly compiler-construction compiler-optimization

我发现当我在调试模式下用VS2010(我还没有检查过其他编译器)编译我的C / C ++程序时,当我查看反汇编,所有函数调用,是否为库函数,我自己的函数,类会员功能等都有两步通话。实际的函数调用被转换为call指令到地址 A 。当我去地址 A 时,我发现它是某种大型的jmp指令列表,每个指令都有不同的功能。它的(小)部分可能看起来像这样

fooFunc:
08CB1776  jmp         fooFunc (8D11F60h) 
barFunc:
08CB177B  jmp         barFunc (8D25240h) 
std::allocator<unsigned int>::max_size:
08CB1780  jmp         std::allocator<unsigned int>::max_size (8CE3D00h) 
std::_Copy_backward_opt<int *,int *>:
08CB1785  jmp         std::_Copy_backward_opt<int *,int *> (8D325D0h) 
std::_Checked_base<int *>:
08CB178A  jmp         std::_Checked_base<int *> (8D32360h) 
@ILT+1950(_foobarFunc):
08CB17A3  jmp         foobarFunc (8F31450h) 
@ILT+1955(_anotherFunc):
08CB17A8  jmp         anotherFunc (8E4BD20h) 
std::vector<unsigned short,std::allocator<unsigned short> >::capacity:
08CB17B2  jmp         std::vector<unsigned short,std::allocator<unsigned short> >::capacity (8D8AAF0h) 
yetAnother:
08CB17B7  jmp         yetAnother (8D18630h) 
@ILT+1975(_f):
08CB17BC  jmp         f (8E4FC50h) 
std::_Debug_range<char *>:
08CB17C6  jmp         std::_Debug_range<char *> (8D32480h) 
std::_Vector_const_iterator<MyClass *,std::allocator<MyClass *> >::operator+=:
08CB17CB  jmp         std::_Vector_const_iterator<MyClass *,std::allocator<MyClass *> >::operator+= (8D64C80h) 

这些jmp指令依次转到实际的函数体。这仅在调试模式下进行编译时。在Release中,函数调用被编译为对函数体的直接调用。

这种间接函数调用有什么意义?

1 个答案:

答案 0 :(得分:0)

以下是@RaptorFactor的回答:

这是由“增量链接”引起的。如果在编译器/链接器设置中禁用它,则跳转将消失。

http://msdn.microsoft.com/en-us/library/4khtbfyf(VS.80).aspx