-1

我认为“调用”指令是一种“跳转”指令。 “跳转”指令有地址去哪里。 而“call”指令应该有一个目标地址。 但是,当我拆解二进制文件时,“call”指令只具有目标函数的标签。那么,他们如何知道去哪里?换句话说,我在哪里可以找到每个函数的目标地址? x86,ARM不管。“调用”指令位置的地址

+0

_“但是当我拆开二进制文件时,”call“指令只有目标函数的标签。”_这是反汇编程序为了让拆卸更容易阅读而做的。 “call”指令的实际机器码序列将包含目标地址(可以是相对或绝对的)。 – Michael 2015-04-01 15:06:11

+0

你应该看到没有什么区别,反汇编跳转或呼叫。 – Jester 2015-04-01 15:06:41

+1

为什么不在拆解和询问这些问题之前阅读一些书 – 2015-04-01 15:53:57

回答

2

汇编程序设计中的地址通常标有一些符号名称。这不仅适用于通话指示,而且适用于所有其他指示。

这种方法有一个原因 - 地址总是取决于程序在内存中的加载位置。此外,某些指令不包含地址本身,而是包含相对于执行程序的当前地址的偏移量。

另一方面,程序员通常不关心地址的确切值。他只想知道这个地址的位置。这就是使用符号标签的原因。

使用具有有意义名称的符号标签可以提高源代码的可读性并使程序易于支持和扩展。

这些符号地址(标签)在将源代码组装到可执行二进制文件期间被转换为数字。

根据可执行的格式,有时翻译是部分的 - 只计算相对于代码开头的偏移量。这些都是所谓的“可重新定位”标签。

稍后,当操作系统将二进制文件加载到内存中的某个特定地址时,所有可重定位地址都将被固定,以便获取加载二进制文件的正确数值。

这种方法对于动态加载库(DLL)很常见,因为每次将库加载到内存中时,加载地址都是未知的(并且是不同的)。