当前位置: 代码迷 >> 汇编语言 >> 关于CAll指令的一些疑点
  详细解决方案

关于CAll指令的一些疑点

热度:167   发布时间:2016-05-02 04:37:14.0
关于CAll指令的一些疑问
call 后跟的是相对地址,但是我用vc反汇编看了看,发现call后面跳转的地址不是子程序的地址,而是jmp 子程序地址的 指令地址,这是怎么回事?
00034483: jmp 00034682
00034682:这是子程序的地址

00034888: call 00034483

每次函数调用都会是这种情况,请大家帮忙。

------解决方案--------------------
这些不是普通的子程调用,而是对其它 dll 里的调用,尤其是系统 API 类函数的调用形式吧?这里涉及到外部导入函数地址,这个地址可能是会变化的,只在程序载入时对函数所在模块的导出节进行检索和实际的地址填入,所以为了简单见,采用了直接地址的形式,故而不能使用普通的 call xxxx (E8 off32) 类的指令,而是采用间接 call [xxxx] (FF 15 imm32) 指令,内存 [xxxx] 处就所调用函数的入口地址;汇编程序可能会多插入一个 jmp 指令到这个 call [xxxx] 的指令上,有些多余。
------解决方案--------------------
请阅读《程序员的自我修养》这本书,自然就明白了。

 《程序员的自我修养—链接、装载与库》
  相关解决方案