为什么反汇编call 不能直接跳转到函数 30

我调试进入反汇编里,当调用一个函数时,汇编代码是616C17BEcallff(616C120Dh)接着就跳转到616C120Djmpff(616C1770h)//为什么要... 我调试进入反汇编里,当调用一个函数时,汇编代码是
616C17BE call ff (616C120Dh)
接着就跳转到
616C120D jmp ff (616C1770h) //为什么要添加这一行呢? 谢谢!
再到
void ff()
{
616C1770 push ebp
616C1771 mov ebp,esp
616C1773 sub esp,0C0h
616C1779 push ebx
616C177A push esi
616C177B push edi
616C177C lea edi,[ebp-0C0h]
616C1782 mov ecx,30h
616C1787 mov eax,0CCCCCCCCh
616C178C rep stos dword ptr es:[edi]
}

请问为什么不直接跳转到函数的地址,要加个中间的jmp
展开
 我来答
skysoon007
2014-11-06
知道答主
回答量:1
采纳率:0%
帮助的人:1324
展开全部
这个jmp指令的跳转目的地址,就是这些函数的入口地址。用户call函数时,call的目的地址就是表中对应的项的地址这张表被称为ILT-Incremental Link Table。这样,当执行call指令时,先会跳到ILT的某个表项,然后再跳到具体的函数执行这样一来,当加长函数而导致要移动另一个函数的机器码时,只需要修改ILT中的对应表项,而不需要修改别处调用另一个函数的地方。时间复杂度变为O(1),链接器的工作效率极大提高。
但还需注意,ILT表只会在debug模式下生成,在release下不会生成表项,原因你具体查查debug和release的区别就知道了,也就明白为什么call指令会调用两回。我在这里就不多说了!

还有小建议,一般的书本都不会讲得很深奥,建议你可以看看《老码识途》-韩宏,李林著。里面有很多反汇编和程序习惯的思想,可以对自己的代码能力提高很多!
零度聚阵2
2014-01-11
知道答主
回答量:27
采纳率:0%
帮助的人:13.2万
展开全部
你好,你的问题很有深度啊,我也不会,不过,我可以帮你问问我的老师,他教单片机的时候汇编语言也讲,知道后我会回复你的。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
情娃学久忠9717
2014-01-20
知道答主
回答量:2
采纳率:0%
帮助的人:2812
展开全部
它直接跳转到push ebp了就没有问题吧,jmp有可能是花指令吧,反正没有影响程序的执行
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
蟑螂111119e0b6da
2014-01-12 · TA获得超过220个赞
知道答主
回答量:138
采纳率:0%
帮助的人:38.9万
展开全部
  616C17BE call ff (616C120Dh)
616C120D jmp ff (616C1770h)
这两次函数调用的地址不一样,是不是不是同一个函数?
本回答被网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(2)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式