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
- 机器怎么知道他需要跳到哪里?我猜 "message:" 和 "proc:" 被翻译成地址。
- "message:"和"proc:"有绝对地址还是相对地址?
- 如果我在我的PC上编译程序,然后在另一台PC上执行,它如何在另一台机器上运行?我的意思是关于 "message:" 和 "proc:" 的地址。会一直是不同的地址吗?
是的,它们被翻译成地址。相对或绝对跳转或远或近跳转有不同的 jmp
指令。汇编程序将选择其中之一(例如,最短的一个)并将助记符(jmp
)翻译成相应的机器代码。
他们有相对地址。汇编程序生成目标文件,其中包含 可重定位代码和数据 。它可以通过链接器与其他目标文件组合,最终生成可执行文件。最后的可执行文件有绝对地址1.
没有。每个进程都有自己的虚拟地址space,所以每个进程的首地址都是0x00
。可执行文件中使用的地址也是虚拟地址,因此它们映射到任意物理地址。
此外,显然要求PC具有
- 相同架构(PC通常是指x86)
- 使用相同可执行文件的操作系统 format/object 文件格式
1 从技术上讲,这不是真的。图片可能是relocated at load time.
如果编译,link 和 运行 是这样的:
global _start
section .text
_start:
jmp message
proc:
...
message:
call proc
msg db " y0u sp34k 1337 ? "
section .data
- 机器怎么知道他需要跳到哪里?我猜 "message:" 和 "proc:" 被翻译成地址。
- "message:"和"proc:"有绝对地址还是相对地址?
- 如果我在我的PC上编译程序,然后在另一台PC上执行,它如何在另一台机器上运行?我的意思是关于 "message:" 和 "proc:" 的地址。会一直是不同的地址吗?
是的,它们被翻译成地址。相对或绝对跳转或远或近跳转有不同的
jmp
指令。汇编程序将选择其中之一(例如,最短的一个)并将助记符(jmp
)翻译成相应的机器代码。他们有相对地址。汇编程序生成目标文件,其中包含 可重定位代码和数据 。它可以通过链接器与其他目标文件组合,最终生成可执行文件。最后的可执行文件有绝对地址1.
没有。每个进程都有自己的虚拟地址space,所以每个进程的首地址都是
0x00
。可执行文件中使用的地址也是虚拟地址,因此它们映射到任意物理地址。
此外,显然要求PC具有- 相同架构(PC通常是指x86)
- 使用相同可执行文件的操作系统 format/object 文件格式
1 从技术上讲,这不是真的。图片可能是relocated at load time.