JMP 和 CALL 如何在汇编程序中工作?

Joe*_*oey 0 x86 assembly compilation memory-address

如果你编译、链接和运行这样的东西:

global _start

section .text

_start:
jmp message

proc:
...

message:
    call proc
    msg db " y0u sp34k 1337 ? "

section .data
Run Code Online (Sandbox Code Playgroud)
  1. 机器如何知道他需要跳到哪里?我猜“消息:”和“过程:”被翻译成地址。
  2. "message:" 和 "proc:" 有绝对地址还是相对地址?
  3. 如果我在我的 PC 上编译程序并在另一台 PC 上执行它,它如何在另一台机器上运行?我的意思是关于“消息:”和“过程:”的地址。它会永远是一个不同的地址吗?

cad*_*luk 5

  1. 是的,它们被转换为地址。jmp相对或绝对跳跃或远或近跳跃有不同的指令。汇编器将选择其中之一(例如,最短的)并将助记符 ( jmp) 转换为相应的机器代码。

  2. 他们有相对地址。汇编器生成一个目标文件,其中包含可重定位的代码和数据。它可以通过链接器与其他目标文件结合以最终产生可执行文件。最终的可执行文件具有绝对地址1

  3. 不。每个进程都有自己的虚拟地址空间,所以每个进程的第一个地址是0x00. 可执行文件中使用的地址也是虚拟的,因此它们映射到任意物理地址。
    此外,显然要求 PC 具有

    • 相同的架构(PC通常是指x86)
    • 使用相同的可执行格式/目标文件格式的操作系统

1从技术上讲,这不是真的。图像可能会在加载时重新定位