我认为“呼叫”指令是一种“跳转”指令。“跳转”指令有去哪里的地址。“调用”指令要么应该有一个目标地址。但是当我反汇编二进制文件时,“调用”指令只有一个目标函数标签。那么,他们怎么知道去哪里呢?换句话说,我在哪里可以找到每个函数的目标地址?x86、ARM 什么的。
问问题
251 次
1 回答
3
汇编程序中的地址通常用一些符号名来标记。这不仅适用于 call 指令,而且适用于所有其他指令。
这种方法是有原因的——地址总是取决于程序在内存中的加载位置。此外,一些指令不包含地址本身,而是相对于执行程序的当前地址的偏移量。
另一方面,程序员通常不关心地址的确切值。他只想知道这个地址放在哪里。这就是使用符号标签的原因。
使用具有有意义名称的符号标签提高了源代码的可读性,并使程序易于支持和扩展。
在将源代码组装成可执行二进制文件的过程中,这些符号地址(标签)被转换为数字。
根据可执行格式,有时翻译是部分的 - 仅计算相对于代码开头的偏移量。这些就是所谓的“可重定位”标签。
稍后,当操作系统将二进制文件加载到内存中的某个特定地址时,所有可重定位地址都是固定的,以便为二进制文件的加载位置获取正确的数值。
这种方法对于动态加载库 (DLL) 很常见,因为每次将库加载到内存中时加载地址都是未知的(并且不同)。
于 2015-04-01T19:07:34.260 回答