4.2 Y86-64指令集详解
指令编码结构
Y86-64 的每条指令编码由指令字节和可选的操作数字节组成。指令字节包含两个 4 位部分:
- 指令码(icode):高位 4 位,标识指令类型(如 halt、nop、rrmovq、irmovq 等)
- 功能码(ifun):低位 4 位,在同一条指令码下区分不同操作(如条件传送的不同条件)
例如,rrmovq(寄存器到寄存器传送)的 icode 为 2,而 cmovle、cmovl、cmove 等条件传送通过 ifun 来区分。
指令格式一览
| 指令 | icode | ifun | 附加字节 |
|---|---|---|---|
| halt | 0 | 0 | 无 |
| nop | 1 | 0 | 无 |
| rrmovq | 2 | 条件码 | rA:rB |
| irmovq | 3 | 0 | rA:rB + valC(8字节) |
| rmmovq | 4 | 0 | rA:rB + valC(8字节) |
| mrmovq | 5 | 0 | rA:rB + valC(8字节) |
| OPl(addq, subq, andq, xorq) | 6 | 功能码 | rA:rB |
| jXX(jmp, jle, jl, je, jne, jge, jg) | 7 | 条件码 | valC(8字节) |
| call | 8 | 0 | valC(8字节) |
| ret | 9 | 0 | 无 |
| pushq | A | 0 | rA:rB |
| popq | B | 0 | rA:rB |
寄存器编号
Y86-64 使用 4 位二进制数编码 16 个程序寄存器(实际上只用了 15 个,r15 保留未用):
| 编号 | 名称 |
|---|---|
| 0 | %rax |
| 1 | %rcx |
| 2 | %rdx |
| 3 | %rbx |
| 4 | %rsp |
| 5 | %rbp |
| 6 | %rsi |
| 7 | %rdi |
| 8~14 | %r8 ~ %r14 |
| 15 | (无) |
寄存器编号 0xF(15)表示”无寄存器”,用于指令中不需要寄存器操作数的场合。
相关笔记
链接到
- 上一个知识点:4.1 指令集体系结构
- 下一个知识点:4.3 逻辑设计与HCL