1
0
mirror of https://github.com/chai2010/advanced-go-programming-book.git synced 2025-05-24 12:32:21 +00:00

ch2-02: 增加精简后x86指令表格

This commit is contained in:
chai2010 2018-06-04 07:52:49 +08:00
parent 57f0de3108
commit bdc5ed6fbe

View File

@ -92,11 +92,37 @@ X86是一个极其复杂的系统有人统计x86-64中指令有将近一千
基础的数据传输指令有MOV、LEA、PUSH、POP等几个。其中MOV指令可以用于将字面值移动到寄存器、字面值移到内存、寄存器之间的数据传输、寄存器和内存之间的数据传输。需要注意的是MOV传输指令的内存操作数只能有一个可以通过某个临时寄存器要达到类似目的。LEA指令将标参数准格式中的内存地址加载到寄存器而不是加载内存位置的内容。PUSH和POP分别是压栈和出栈指令通用寄存器中的SP为栈指针栈是向低地址方向增长的。
| 名称 | 解释 |
| ------ | ---
| MOV | 数据转移
| LEA | 取地址
| PUSH | 压栈
| POP | 出栈
基础算术指令有ADD、SUB、MUL、DIV等指令。其中ADD、SUB、MUL、DIV用于加、减、乘、除运算最终结果存入目标寄存器。基础的逻辑运算指令有AND、OR和NOT等几个指令对应逻辑与、或和取反等几个指令。
| 名称 | 解释 |
| ------ | ---
| ADD | 加法
| SUB | 减法
| MUL | 乘法
| DIV | 除法
| AND | 逻辑与
| OR | 逻辑或
| NOT | 逻辑取反
控制流指令有CMP、JMP-if-x、JMP、CALL、RET等指令。CMP指令用于两个操作数做减法根据比较结果设置状态寄存器的符号位和零位可以用于有条件跳转的跳转条件。JMP-if-x是一组有条件跳转指令常用的有JL、JLZ、JE、JNE、JG、JGE等指令对应小于、小于等于、等于、不等于、大于和大于等于等条件时跳转。JMP指令则对应无条件跳转将要跳转的地址设置到IP指令寄存器就实现了跳转。而CALL和RET指令分别为调用函数和函数返回指令。
<!-- TODO: 指令表格 -->
| 名称 | 解释 |
| -------- | ---
| JMP | 无条件跳转
| JMP-if-x | 有条件跳转JL、JLZ、JE、JNE、JG、JGE
| CALL | 调用函数
| RET | 函数返回
为了简单我们省略了位运算指令很多高级指令。完整的X86指令在 https://github.com/golang/arch/blob/master/x86/x86.csv 文件定义。同时Go汇编还正对一些指令定义了别名具体可以参考这里 https://golang.org/src/cmd/internal/obj/x86/anames.go 。