【发布时间】:2014-05-16 04:06:54
【问题描述】:
我正在尝试开始学习 x86(-64) 机器代码,因为将来某个时候我想编写一个编译器或 JIT 编译器(可能是后者首先)。我已经编写了一段时间的程序集,所以我不会盲目,我只是想学习 x86 指令编码/格式,因为它似乎很复杂。我看过表格并阅读文章和资料(以及一些英特尔手册(我读过的最不人道的文件))。
所以我有点开始理解它,所以我决定尝试分解一组基本指令及其产生的机器代码。该代码创建了一个(Linux/Posix)系统调用(sys_exit),因为我认为它很容易测试(继续阅读)。这是 x86-64 代码:
mov rax, 60
mov rdi, 0
syscall
我用 nasm 组装了这个:
nasm test.asm -fbin
我使用了-fbin,所以它会输出我可以轻松检查的原始二进制文件。
它输出以下字节序列:
0xB8 0x3C 0x00 0x00 0x00 0xBF 0x00 0x00 0x00 0x00 0x0F 0x05
我和几个朋友试图剖析这个以找出每个字节的含义,我们认为如下:
-
0xB8是第一条mov指令。 -
0x3C(60) 是第一个参数,移到 rax 中。 -
0x00表示 rax? (这是我们变得模糊的地方) - 接下来的两个
0x00只是多余的nasm 输出? xD -
0xBF是下一个mov -
0x00是第一个参数,0 - 对剩下的
0x00一无所知 -
0x0F系统调用? -
0x05无能。
我是一个初学者(显然),希望能帮助我分析这个机器代码。任何帮助将不胜感激,因为理解这将有助于理解 x86 指令格式,在此先感谢!
编辑:寄存器是否有可能由指令操作码指定?
【问题讨论】: