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:
parent
57f0de3108
commit
bdc5ed6fbe
@ -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 。
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user