• 记录汇编语言课笔记,可能有不正确的地方,欢迎指出
  • 教材《新概念汇编语言》—— 杨季文
  • 这篇文章是书前四章的所有指令的总结,基本涉及到所有逻辑处理所需的指令,掌握这些之后就可以写各种嵌入式汇编程序了,这里不包括bios函数调用或者中断之类的指令

文章目录

  • ​​〇、思维导图​​
  • ​​一、数据传输指令组​​
  • ​​1. 传送指令​​
  • ​​(1)MOV(普通传送指令)​​
  • ​​2. 交换指令​​
  • ​​(1)XCHG(交换指令)​​
  • ​​3. 堆栈相关指令​​
  • ​​(1)PUSH(进栈)​​
  • ​​(2)POP(出栈)​​
  • ​​(3)PUSHA(16位通用寄存器全进栈指令)​​
  • ​​(4)POPA(16位通用寄存器全出栈指令)​​
  • ​​(5)PUSHAD(32位通用寄存器全进栈指令)​​
  • ​​(6)POPAD(32位通用寄存器全出栈指令)​​
  • ​​4. 符号扩展相关指令​​
  • ​​(1)CBW(字节转换为字指令)​​
  • ​​(2)CWD(字转换为双字指令)​​
  • ​​(3)CWDE(字转换为双字指令)​​
  • ​​(4)CDQ(双字转换为四字指令)​​
  • ​​5. 扩展传送相关指令​​
  • ​​(1)MOVSX(符号扩展传送)​​
  • ​​(2)MOVZX(零扩展传送)​​
  • ​​二、算数运算指令组​​
  • ​​1. NEG(取负数指令)​​
  • ​​2. CMP(比较指令)​​
  • ​​3. 加法相关指令​​
  • ​​(1)ADD(加法指令)​​
  • ​​(2)ADC(带进位加)​​
  • ​​4. 减法​​
  • ​​(1)SUB(减法指令)​​
  • ​​(2)SBB (带借位减)​​
  • ​​5. 乘法​​
  • ​​(1)无符号数乘法​​
  • ​​1. MUL(无符号乘法指令)​​
  • ​​(2)有符号数乘法​​
  • ​​1. IMUL(单操作数乘法指令)​​
  • ​​2. IMUL(双操作数乘法指令)​​
  • ​​3. IMUL(三操作数乘法指令)​​
  • ​​6. 除法​​
  • ​​(1)DIV(无符号数除法指令)​​
  • ​​(2)IDIV(有符号数除法指令)​​
  • ​​7. 加一减一​​
  • ​​(1)INC(加1指令)​​
  • ​​(2)DEC(减1指令)​​
  • ​​三、逻辑运算指令​​
  • ​​1. NOT(否运算指令)​​
  • ​​2. AND(与运算指令)​​
  • ​​3. OR(或运算指令)​​
  • ​​4. XOR(异或运算指令)​​
  • ​​5. TEST(按位测试指令)​​
  • ​​四、移位指令组​​
  • ​​1. SAL / SHL / SAR / SHR(一般移位指令)​​
  • ​​2. ROR / ROL / RCR / RCL((带进位)循环移位指令)​​
  • ​​3. SHLD / SHRD (双精度移位指令)​​
  • ​​五、转移指令组​​
  • ​​1. JMP(无条件转移)​​
  • ​​2. Jcc(条件转移)​​
  • ​​3. 循环相关指令​​
  • ​​(1)LOOP(计数循环指令)​​
  • ​​(2)LOOPE/LOOPZ(等于/全零循环指令)​​
  • ​​(3)LOOPNE/LOOPNZ(不等于/全1循环指令)​​
  • ​​(4)JECXZ/JCXZ(计数器转移指令)​​
  • ​​4. CALL(过程调用指令)​​
  • ​​5. RET(返回指令)​​
  • ​​六、字符串操作指令组​​
  • ​​1. LODSB/LODSW/LODSD(字符串装入指令)​​
  • ​​2. STOSB/STOSW/STOSD(字符串存储指令)​​
  • ​​3. MOVSB/MOVSW/MOVSD(字符串传送指令)​​
  • ​​4. SCASB / SCASW / SCASD(字符串扫描指令)​​
  • ​​5. CMPSB/ CMPSW/ CMPSD(字符串比较指令)​​
  • ​​6. REP/REPE(REPZ)/REPNE(REPNZ)(重复操作前缀)​​
  • ​​七、位操作指令组​​
  • ​​1. 位测试指令组​​
  • ​​(1)BT(位测试指令)​​
  • ​​(2)BTC(位测试并取反指令)​​
  • ​​(3)BTR(位测试并复位指令)​​
  • ​​(4)BTS(位测试并置位指令)​​
  • ​​2. BSF / BSR (顺向/逆向位扫描指令)​​
  • ​​八、条件设置指令组​​
  • ​​1. SETcc(条件设置字节指令)​​
  • ​​九、其他指令​​
  • ​​1. LEA(取有效地址指令)​​
  • ​​2. LAHF/SAHF(状态标志操作指令)​​
  • ​​3. CLC / STC / CMC(进位标志CF设置指令)​​
  • ​​4. CLD /STD(方向标志DF操作指令)​​

〇、思维导图

IA-32汇编语言笔记(14)—— IA32汇编指令小结_通用寄存器

一、数据传输指令组

1. 传送指令

(1)MOV(普通传送指令)

IA-32汇编语言笔记(14)—— IA32汇编指令小结_移位指令_02

2. 交换指令

(1)XCHG(交换指令)

IA-32汇编语言笔记(14)—— IA32汇编指令小结_操作数_03

3. 堆栈相关指令

(1)PUSH(进栈)

  • 8086汇编中,push/pop的一律是字,寄存器/存储单元/立即数参数可以直接写而不加​​word ptr​​前缀
  • 386之后支持了双字的push/pop,如果汇编程序中加了​​.386​​​伪指令,就会默认push/pop双字。对于存储单元/立即数最好加​​word ptr​​​/​​dword ptr​​前缀

IA-32汇编语言笔记(14)—— IA32汇编指令小结_通用寄存器_04

(2)POP(出栈)

IA-32汇编语言笔记(14)—— IA32汇编指令小结_通用寄存器_05

(3)PUSHA(16位通用寄存器全进栈指令)

IA-32汇编语言笔记(14)—— IA32汇编指令小结_通用寄存器_06

(4)POPA(16位通用寄存器全出栈指令)

IA-32汇编语言笔记(14)—— IA32汇编指令小结_移位指令_07

(5)PUSHAD(32位通用寄存器全进栈指令)

IA-32汇编语言笔记(14)—— IA32汇编指令小结_移位指令_08

(6)POPAD(32位通用寄存器全出栈指令)

IA-32汇编语言笔记(14)—— IA32汇编指令小结_通用寄存器_09

4. 符号扩展相关指令

(1)CBW(字节转换为字指令)

IA-32汇编语言笔记(14)—— IA32汇编指令小结_操作数_10

(2)CWD(字转换为双字指令)

IA-32汇编语言笔记(14)—— IA32汇编指令小结_通用寄存器_11

(3)CWDE(字转换为双字指令)

IA-32汇编语言笔记(14)—— IA32汇编指令小结_移位指令_12

(4)CDQ(双字转换为四字指令)

IA-32汇编语言笔记(14)—— IA32汇编指令小结_操作数_13

5. 扩展传送相关指令

(1)MOVSX(符号扩展传送)

IA-32汇编语言笔记(14)—— IA32汇编指令小结_操作数_14

(2)MOVZX(零扩展传送)

IA-32汇编语言笔记(14)—— IA32汇编指令小结_操作数_15

二、算数运算指令组

1. NEG(取负数指令)

IA-32汇编语言笔记(14)—— IA32汇编指令小结_操作数_16

2. CMP(比较指令)

IA-32汇编语言笔记(14)—— IA32汇编指令小结_操作数_17

3. 加法相关指令

(1)ADD(加法指令)

IA-32汇编语言笔记(14)—— IA32汇编指令小结_操作数_18

(2)ADC(带进位加)

IA-32汇编语言笔记(14)—— IA32汇编指令小结_操作数_19

4. 减法

(1)SUB(减法指令)

IA-32汇编语言笔记(14)—— IA32汇编指令小结_通用寄存器_20

(2)SBB (带借位减)

IA-32汇编语言笔记(14)—— IA32汇编指令小结_移位指令_21

5. 乘法

(1)无符号数乘法

1. MUL(无符号乘法指令)

IA-32汇编语言笔记(14)—— IA32汇编指令小结_移位指令_22

(2)有符号数乘法

1. IMUL(单操作数乘法指令)

IA-32汇编语言笔记(14)—— IA32汇编指令小结_移位指令_23

2. IMUL(双操作数乘法指令)
  • 双操作数和三操作数的结果可能溢出,若溢出就截掉高位

IA-32汇编语言笔记(14)—— IA32汇编指令小结_移位指令_24

3. IMUL(三操作数乘法指令)
  • 双操作数和三操作数的结果可能溢出,若溢出就截掉高位

IA-32汇编语言笔记(14)—— IA32汇编指令小结_通用寄存器_25

6. 除法

(1)DIV(无符号数除法指令)

IA-32汇编语言笔记(14)—— IA32汇编指令小结_通用寄存器_26

(2)IDIV(有符号数除法指令)

IA-32汇编语言笔记(14)—— IA32汇编指令小结_移位指令_27

7. 加一减一

(1)INC(加1指令)

IA-32汇编语言笔记(14)—— IA32汇编指令小结_移位指令_28

(2)DEC(减1指令)

IA-32汇编语言笔记(14)—— IA32汇编指令小结_移位指令_29

三、逻辑运算指令

1. NOT(否运算指令)

IA-32汇编语言笔记(14)—— IA32汇编指令小结_通用寄存器_30

2. AND(与运算指令)

IA-32汇编语言笔记(14)—— IA32汇编指令小结_移位指令_31

3. OR(或运算指令)

  • 常用OR EAX,EAX这样的方法判断是否为0

4. XOR(异或运算指令)

IA-32汇编语言笔记(14)—— IA32汇编指令小结_操作数_32

5. TEST(按位测试指令)

  • test指令一般用来检测指定位上字符是否都为0
  • IA-32汇编语言笔记(14)—— IA32汇编指令小结_移位指令_33


四、移位指令组

1. SAL / SHL / SAR / SHR(一般移位指令)

IA-32汇编语言笔记(14)—— IA32汇编指令小结_通用寄存器_34


IA-32汇编语言笔记(14)—— IA32汇编指令小结_通用寄存器_35

2. ROR / ROL / RCR / RCL((带进位)循环移位指令)

IA-32汇编语言笔记(14)—— IA32汇编指令小结_通用寄存器_36


IA-32汇编语言笔记(14)—— IA32汇编指令小结_移位指令_37

3. SHLD / SHRD (双精度移位指令)

IA-32汇编语言笔记(14)—— IA32汇编指令小结_移位指令_38


IA-32汇编语言笔记(14)—— IA32汇编指令小结_移位指令_39

五、转移指令组

1. JMP(无条件转移)

IA-32汇编语言笔记(14)—— IA32汇编指令小结_移位指令_40


IA-32汇编语言笔记(14)—— IA32汇编指令小结_移位指令_41

2. Jcc(条件转移)

IA-32汇编语言笔记(14)—— IA32汇编指令小结_通用寄存器_42

3. 循环相关指令

(1)LOOP(计数循环指令)

IA-32汇编语言笔记(14)—— IA32汇编指令小结_移位指令_43

(2)LOOPE/LOOPZ(等于/全零循环指令)

IA-32汇编语言笔记(14)—— IA32汇编指令小结_通用寄存器_44

(3)LOOPNE/LOOPNZ(不等于/全1循环指令)

  • 先减一比0,再比ZF。把ecx设-1,退出时​​not ecx​​值会比预期的小1。比如,用这个来算字符串长度,用 ‘\0’ 判断退出循环,长度会把 ‘\0’ 也算上

IA-32汇编语言笔记(14)—— IA32汇编指令小结_移位指令_45

(4)JECXZ/JCXZ(计数器转移指令)

IA-32汇编语言笔记(14)—— IA32汇编指令小结_通用寄存器_46

4. CALL(过程调用指令)

IA-32汇编语言笔记(14)—— IA32汇编指令小结_通用寄存器_47

IA-32汇编语言笔记(14)—— IA32汇编指令小结_移位指令_48

5. RET(返回指令)

IA-32汇编语言笔记(14)—— IA32汇编指令小结_通用寄存器_49


IA-32汇编语言笔记(14)—— IA32汇编指令小结_操作数_50

六、字符串操作指令组
  1. 串地址:
    1. ​DS:ESI​​指向​​源串​
    2. ​ES:EDI​​指向​​目的串​
  2. 操作方向:
    1. ​DF=0​​,低地址 → 高地址
    2. ​DF=1​​,高地址 → 低地址

1. LODSB/LODSW/LODSD(字符串装入指令)

IA-32汇编语言笔记(14)—— IA32汇编指令小结_操作数_51


IA-32汇编语言笔记(14)—— IA32汇编指令小结_移位指令_52


IA-32汇编语言笔记(14)—— IA32汇编指令小结_移位指令_53

2. STOSB/STOSW/STOSD(字符串存储指令)

IA-32汇编语言笔记(14)—— IA32汇编指令小结_通用寄存器_54


IA-32汇编语言笔记(14)—— IA32汇编指令小结_通用寄存器_55


IA-32汇编语言笔记(14)—— IA32汇编指令小结_通用寄存器_56

3. MOVSB/MOVSW/MOVSD(字符串传送指令)

IA-32汇编语言笔记(14)—— IA32汇编指令小结_操作数_57

IA-32汇编语言笔记(14)—— IA32汇编指令小结_通用寄存器_58

IA-32汇编语言笔记(14)—— IA32汇编指令小结_移位指令_59

4. SCASB / SCASW / SCASD(字符串扫描指令)

IA-32汇编语言笔记(14)—— IA32汇编指令小结_移位指令_60

5. CMPSB/ CMPSW/ CMPSD(字符串比较指令)

IA-32汇编语言笔记(14)—— IA32汇编指令小结_通用寄存器_61

6. REP/REPE(REPZ)/REPNE(REPNZ)(重复操作前缀)

IA-32汇编语言笔记(14)—— IA32汇编指令小结_通用寄存器_62

  • REPE(REPZ) / REPNE(REPNZ)的退出时机:以下这两组指令,当以ZF为基准退出时,会把最后使ZF改变的那次比较也计数(因为这次比较后ZF才改变)。比如,用这个来算字符串长度,用 ‘\0’ 判断退出循环,长度会把 ‘\0’ 也算上

IA-32汇编语言笔记(14)—— IA32汇编指令小结_通用寄存器_63


IA-32汇编语言笔记(14)—— IA32汇编指令小结_通用寄存器_64

七、位操作指令组

1. 位测试指令组

(1)BT(位测试指令)

IA-32汇编语言笔记(14)—— IA32汇编指令小结_通用寄存器_65

(2)BTC(位测试并取反指令)

IA-32汇编语言笔记(14)—— IA32汇编指令小结_操作数_66

(3)BTR(位测试并复位指令)

IA-32汇编语言笔记(14)—— IA32汇编指令小结_移位指令_67

(4)BTS(位测试并置位指令)

IA-32汇编语言笔记(14)—— IA32汇编指令小结_移位指令_68

2. BSF / BSR (顺向/逆向位扫描指令)

IA-32汇编语言笔记(14)—— IA32汇编指令小结_操作数_69

八、条件设置指令组

1. SETcc(条件设置字节指令)

IA-32汇编语言笔记(14)—— IA32汇编指令小结_移位指令_70

  • ​cc​​的取值如下
  • IA-32汇编语言笔记(14)—— IA32汇编指令小结_操作数_71


九、其他指令

1. LEA(取有效地址指令)

IA-32汇编语言笔记(14)—— IA32汇编指令小结_移位指令_72

2. LAHF/SAHF(状态标志操作指令)

IA-32汇编语言笔记(14)—— IA32汇编指令小结_操作数_73

3. CLC / STC / CMC(进位标志CF设置指令)

IA-32汇编语言笔记(14)—— IA32汇编指令小结_移位指令_74

4. CLD /STD(方向标志DF操作指令)

IA-32汇编语言笔记(14)—— IA32汇编指令小结_操作数_75


IA-32汇编语言笔记(14)—— IA32汇编指令小结_移位指令_76