"call" 指令位置的地址
The address of the "call" instruction's location
我认为 "call" 指令是一种 "jump" 指令。
"jump"指令有去向的地址。
而 "call" 指令要么应该有一个目标地址。
但是当我反汇编二进制文件时,"call" 指令只有一个目标函数标签。那么,他们怎么知道去哪里呢?换句话说,我在哪里可以找到每个函数的目标地址?
x86,ARM 什么的。
汇编程序中的地址通常都标有一些符号名称。这不仅适用于 call 指令,也适用于所有其他指令。
采用这种方法是有原因的 - 地址始终取决于程序在内存中的加载位置。此外,有些指令包含的不是地址本身,而是相对于程序执行的当前地址的偏移量。
另一方面,程序员通常不关心地址的确切值。他只想知道这个地址放在哪里。这就是使用符号标签的原因。
使用具有有意义名称的符号标签提高了源代码的可读性,使程序易于支持和扩展。
这些符号地址(标签)在将源代码组装为可执行二进制文件的过程中被转换为数字。
根据可执行格式,有时翻译是部分的——只计算相对于代码开头的偏移量。这些就是所谓的 "relocatable" 标签。
稍后,当 OS 将二进制文件加载到内存中的某个特定地址时,所有可重定位地址都是固定的,以便为二进制文件的加载位置获取正确的数值。
这种方法对于动态加载库 (DLL) 很常见,因为每次将库加载到内存时加载地址都是未知的(并且不同)。
我认为 "call" 指令是一种 "jump" 指令。 "jump"指令有去向的地址。 而 "call" 指令要么应该有一个目标地址。 但是当我反汇编二进制文件时,"call" 指令只有一个目标函数标签。那么,他们怎么知道去哪里呢?换句话说,我在哪里可以找到每个函数的目标地址? x86,ARM 什么的。
汇编程序中的地址通常都标有一些符号名称。这不仅适用于 call 指令,也适用于所有其他指令。
采用这种方法是有原因的 - 地址始终取决于程序在内存中的加载位置。此外,有些指令包含的不是地址本身,而是相对于程序执行的当前地址的偏移量。
另一方面,程序员通常不关心地址的确切值。他只想知道这个地址放在哪里。这就是使用符号标签的原因。
使用具有有意义名称的符号标签提高了源代码的可读性,使程序易于支持和扩展。
这些符号地址(标签)在将源代码组装为可执行二进制文件的过程中被转换为数字。
根据可执行格式,有时翻译是部分的——只计算相对于代码开头的偏移量。这些就是所谓的 "relocatable" 标签。
稍后,当 OS 将二进制文件加载到内存中的某个特定地址时,所有可重定位地址都是固定的,以便为二进制文件的加载位置获取正确的数值。
这种方法对于动态加载库 (DLL) 很常见,因为每次将库加载到内存时加载地址都是未知的(并且不同)。