【问题标题】:How do JMP and CALL work in assembler?JMP 和 CALL 在汇编程序中如何工作?
【发布时间】:2015-12-04 19:22:58
【问题描述】:

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

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:”的地址。是否总是不同的地址?

【问题讨论】:

    标签: assembly compilation x86 memory-address


    【解决方案1】:
    1. 是的,它们被转换为地址。对于相对或绝对跳转或远或近跳转,有不同的jmp 指令。汇编程序将选择其中之一(例如最短的一个)并将助记符(jmp)翻译成相应的机器码。

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

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-05-11
      • 2011-02-18
      • 2019-01-20
      • 2015-02-17
      • 2021-11-07
      • 2016-11-23
      • 1970-01-01
      相关资源
      最近更新 更多