Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cocoa/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
X86 有人能给这个机器代码加注释吗?_X86_X86 64 - Fatal编程技术网

X86 有人能给这个机器代码加注释吗?

X86 有人能给这个机器代码加注释吗?,x86,x86-64,X86,X86 64,我正试图开始学习x86(-64)机器代码,因为在将来的某个时候,我想编写一个编译器或JIT编译器(可能先编写后者)。我写汇编已经有一段时间了,所以我不会盲目的,我只是想学习x86指令编码/格式,因为它看起来相当复杂。我看过表格,读过文章和东西(还有一些英特尔手册(我读过的最不人道的文档)) 所以我开始理解它,所以我决定尝试分解一组基本指令和它们产生的机器代码。代码进行(Linux/Posix)系统调用(sys_exit),因为我认为它很容易测试(继续阅读)。以下是x86-64代码: mov ra

我正试图开始学习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
    syscall
  • 0x05
    无提示
我是一个初学者(显然),如果能帮助我剖析这段机器代码,我将不胜感激。任何帮助都将不胜感激,因为理解这一点将有助于理解x86指令格式,提前感谢


编辑:寄存器是否可能由指令操作码指定?

我不是专家,但作为参考,我总结了以下解释:

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有点假设你已经意识到了这一切。哦,我明白了。。。谢谢你。在表中进一步检查后,指定了操作码所使用的寄存器,这非常有帮助。再次感谢你的帮助。