X86 有人能给这个机器代码加注释吗?
我正试图开始学习x86(-64)机器代码,因为在将来的某个时候,我想编写一个编译器或JIT编译器(可能先编写后者)。我写汇编已经有一段时间了,所以我不会盲目的,我只是想学习x86指令编码/格式,因为它看起来相当复杂。我看过表格,读过文章和东西(还有一些英特尔手册(我读过的最不人道的文档)) 所以我开始理解它,所以我决定尝试分解一组基本指令和它们产生的机器代码。代码进行(Linux/Posix)系统调用(sys_exit),因为我认为它很容易测试(继续阅读)。以下是x86-64代码:X86 有人能给这个机器代码加注释吗?,x86,x86-64,X86,X86 64,我正试图开始学习x86(-64)机器代码,因为在将来的某个时候,我想编写一个编译器或JIT编译器(可能先编写后者)。我写汇编已经有一段时间了,所以我不会盲目的,我只是想学习x86指令编码/格式,因为它看起来相当复杂。我看过表格,读过文章和东西(还有一些英特尔手册(我读过的最不人道的文档)) 所以我开始理解它,所以我决定尝试分解一组基本指令和它们产生的机器代码。代码进行(Linux/Posix)系统调用(sys_exit),因为我认为它很容易测试(继续阅读)。以下是x86-64代码: mov ra
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
(60)是第一个参数,移动到rax中0x3C
表示rax?(这就是我们变得模糊的地方)0x00
- 接下来的两个
只是多余的nasm输出?xD0x00
是下一个0xBF
mov
是第一个参数,00x00
- 剩余的
0x00
syscall0x0F
无提示0x05
编辑:寄存器是否可能由指令操作码指定?我不是专家,但作为参考,我总结了以下解释:
0xB8 - first mov
0x3C 0x00 0x00 0x00 - 32bit argument (60), little endian byte order
0xBF - second mov
0x00 0x00 0x00 0x00 - 32bit argument (0)
0x0F - 0x0F instruction prefix
0x05 - syscall in the "0x0F space"
是的,操作码字节值根据寄存器和参数类型而变化。某些类型的MOV和JMP也需要0x0F前缀。谢谢您的回答!这很有道理,我没有考虑32位参数。。。这是否意味着寄存器与操作码配对?我会进一步调查的。再次感谢您的帮助,m8.x86设计本身从一开始就相当混乱。如果我没记错的话,英特尔的文档非常善于解释操作码,以及在指定参数类型时必须处理的所有问题。ref.x86asm.net有点假设你已经意识到了这一切。哦,我明白了。。。谢谢你。在表中进一步检查后,指定了操作码所使用的寄存器,这非常有帮助。再次感谢你的帮助。