“call”指令的位置地址

时间:2015-04-01 15:00:47

标签: assembly computer-architecture instruction-set machine-instruction

我认为"打电话"指令是一种"跳跃"指令。 "跳"指令有地址去哪里。 并且"打电话"指令要么应该有目标地址。 但是当我拆解二进制文件时,"调用"指令只有一个目标函数。然后,他们怎么知道去哪儿了?换句话说,我在哪里可以找到每个函数的目标地址? x86,ARM无论如何。

1 个答案:

答案 0 :(得分:2)

汇编编程中的地址通常标有一些符号名称。这不仅适用于呼叫指令,也适用于所有其他指令。

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

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

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

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

根据可执行格式,有时转换是部分的 - 只计算相对于代码开头的偏移量。这些被称为“可重新定位的”#34;标签。

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

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