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

时间:2015-12-04 19:22:58

标签: assembly compilation x86 memory-address

如果你编译,链接并运行这样的东西:

global _start

section .text

_start:
jmp message

proc:
...

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

section .data
  1. 机器如何知道他需要跳的位置?我猜“消息:”和“proc:”被翻译成地址。
  2. “message:”和“proc:”有绝对或相对地址吗?
  3. 如果我在我的电脑上编译程序并在另一台电脑上执行它,它怎么能在另一台机器上运行?我的意思是关于“message:”和“proc:”的地址。它会永远是一个不同的地址吗?

1 个答案:

答案 0 :(得分:4)

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

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

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

    • 相同的架构(PC通常意味着x86)
    • 使用相同可执行格式/目标文件格式的操作系统
  4. 1 从技术上讲,这不是真的。图片可能为relocated at load time