为什么反汇编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 展开
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 展开
展开全部
这个jmp指令的跳转目的地址,就是这些函数的入口地址。用户call函数时,call的目的地址就是表中对应的项的地址这张表被称为ILT-Incremental Link Table。这样,当执行call指令时,先会跳到ILT的某个表项,然后再跳到具体的函数执行这样一来,当加长函数而导致要移动另一个函数的机器码时,只需要修改ILT中的对应表项,而不需要修改别处调用另一个函数的地方。时间复杂度变为O(1),链接器的工作效率极大提高。
但还需注意,ILT表只会在debug模式下生成,在release下不会生成表项,原因你具体查查debug和release的区别就知道了,也就明白为什么call指令会调用两回。我在这里就不多说了!
还有小建议,一般的书本都不会讲得很深奥,建议你可以看看《老码识途》-韩宏,李林著。里面有很多反汇编和程序习惯的思想,可以对自己的代码能力提高很多!
但还需注意,ILT表只会在debug模式下生成,在release下不会生成表项,原因你具体查查debug和release的区别就知道了,也就明白为什么call指令会调用两回。我在这里就不多说了!
还有小建议,一般的书本都不会讲得很深奥,建议你可以看看《老码识途》-韩宏,李林著。里面有很多反汇编和程序习惯的思想,可以对自己的代码能力提高很多!
展开全部
你好,你的问题很有深度啊,我也不会,不过,我可以帮你问问我的老师,他教单片机的时候汇编语言也讲,知道后我会回复你的。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
它直接跳转到push ebp了就没有问题吧,jmp有可能是花指令吧,反正没有影响程序的执行
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
616C17BE call ff (616C120Dh)
616C120D jmp ff (616C1770h)
这两次函数调用的地址不一样,是不是不是同一个函数?
616C120D jmp ff (616C1770h)
这两次函数调用的地址不一样,是不是不是同一个函数?
本回答被网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询