在深入理解计算机系统这本书中,根据x86架构简化后给了一个Y86架构,其中第一个就是关于指令集的解释
先给出一张图
- halt指令表示停止指令的执行
- nop指令占位符,控制时序的目的,强制内存对齐,防止流水线灾难
- rrmovq表示寄存器到寄存器的传送指令,下面几个指令同理,ir表示立即数到寄存器,rm表示寄存器到内存,mr表示内存到寄存器
- Opq指令是整数操作指令的统称,包含addq(加)、subq(减)、andq(与)和xorq(异或)
- jXX表示7个跳转指令,分别是jmp(直接跳转)、jle(小于或等于)、jl(小于)、je(相等/零)、jne(不相等\非零)、jge(大于或等于)和jg(大于)
- cmovXX表示6个条件跳转指令cmovle、cmovl、comve、comvne、comvge和comvg,后缀跟上面跳转指令相同
- call指令将返回地址入栈,然后跳转到目的地址
- pushq和popq指令实现了入栈和出栈
再来一张详细的指令码
可以看到,整数操作指令的四个指令的fn分别为0~3
example:
30f3fcffffffffffffff40630008000000000000
上面是一串机器码,我们可以看到开头为30,查上面的表可以看到是irmovq操作,f3对应后面的两位,f为无寄存器,3代表%rbx寄存器,后面的fcffffffffffffff
代表是立即数,本文采用小端法,低字节放在低字节,我们按照阅读习惯翻过来,称为fffffffffffffffc
,就可以换算成十进制-4
所以前面的30f3fcffffffffffffff
就可以转为irmovq $-4, %rbx
汇编代码
再来看后面的406300080000000000
,40根据前面表可以看出为rmmovq操作,63代表%rsi和%rbx,00080000000000
表示地址,翻转为00000000008000
最后00表示halt指令
最终整个机器码可以解析为
irmovq $-4, %rbx
rmmovq %rsi, 0x8000(%rbx)
halt