From bdc5ed6fbec3b7b16d2b9adbfa9025f719ae9f53 Mon Sep 17 00:00:00 2001 From: chai2010 Date: Mon, 4 Jun 2018 07:52:49 +0800 Subject: [PATCH] =?UTF-8?q?ch2-02:=20=E5=A2=9E=E5=8A=A0=E7=B2=BE=E7=AE=80?= =?UTF-8?q?=E5=90=8Ex86=E6=8C=87=E4=BB=A4=E8=A1=A8=E6=A0=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ch3-asm/ch3-02-arch.md | 28 +++++++++++++++++++++++++++- 1 file changed, 27 insertions(+), 1 deletion(-) diff --git a/ch3-asm/ch3-02-arch.md b/ch3-asm/ch3-02-arch.md index d41b90d..829a8c5 100644 --- a/ch3-asm/ch3-02-arch.md +++ b/ch3-asm/ch3-02-arch.md @@ -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指令分别为调用函数和函数返回指令。 - + +| 名称 | 解释 | +| -------- | --- +| 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 。