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

问题描述 投票:0回答:1

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

global _start

section .text

_start:
jmp message

proc:
...

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

section .data
  1. 机器如何知道他需要跳到哪里?我猜“消息:”和“proc:”被翻译成地址。
  2. “消息:”和“proc:”有绝对或相对地址吗?
  3. 如果我在我的电脑上编译程序并在另一台PC上执行它,它怎么能在另一台机器上运行?我的意思是关于“message:”和“proc:”的地址。它总是一个不同的地址吗?
assembly compilation x86 memory-address
1个回答
4
投票
  1. 是的,它们被翻译成地址。对于相对或绝对跳跃或远或近跳跃有不同的jmp指令。汇编程序将选择其中一个(例如,最短的一个)并将助记符(jmp)转换为相应的机器代码。
  2. 他们有相对的地址。汇编程序生成一个目标文件,其中包含可重定位的代码和数据。它可以通过链接器与其他目标文件组合,最终生成可执行文件。最后的可执行文件具有绝对地址1。
  3. 不。每个进程都有自己的虚拟地址空间,因此每个进程的第一个地址是0x00。可执行文件中使用的地址也是虚拟的,因此它们映射到任意物理地址。 此外,显然要求PC有 相同的架构(PC通常意味着x86) 使用相同可执行格式/目标文件格式的操作系统

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

© www.soinside.com 2019 - 2024. All rights reserved.