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

How do JMP and CALL work in assembler?

如果编译,link 和 运行 是这样的:

global _start

section .text

_start:
jmp message

proc:
...

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

section .data
  1. 机器怎么知道他需要跳到哪里?我猜 "message:" 和 "proc:" 被翻译成地址。
  2. "message:"和"proc:"有绝对地址还是相对地址?
  3. 如果我在我的PC上编译程序,然后在另一台PC上执行,它如何在另一台机器上运行?我的意思是关于 "message:" 和 "proc:" 的地址。会一直是不同的地址吗?
  1. 是的,它们被翻译成地址。相对或绝对跳转或远或近跳转有不同的 jmp 指令。汇编程序将选择其中之一(例如,最短的一个)并将助记符(jmp)翻译成相应的机器代码。

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

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

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

1 从技术上讲,这不是真的。图片可能是relocated at load time.