- 记录汇编语言课笔记,可能有不正确的地方,欢迎指出
- 教材《新概念汇编语言》—— 杨季文
- 这篇文章是书前四章的所有指令的总结,基本涉及到所有逻辑处理所需的指令,掌握这些之后就可以写各种嵌入式汇编程序了,这里不包括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操作指令)
〇、思维导图
- mindmaster编辑的思维导图:下载地址
一、数据传输指令组
1. 传送指令
(1)MOV(普通传送指令)
2. 交换指令
(1)XCHG(交换指令)
3. 堆栈相关指令
(1)PUSH(进栈)
- 8086汇编中,push/pop的一律是字,寄存器/存储单元/立即数参数可以直接写而不加
word ptr
前缀 - 386之后支持了双字的push/pop,如果汇编程序中加了
.386
伪指令,就会默认push/pop双字。对于存储单元/立即数最好加word ptr
/dword ptr
前缀
(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(或运算指令)
- 常用OR EAX,EAX这样的方法判断是否为0
4. XOR(异或运算指令)
5. TEST(按位测试指令)
- test指令一般用来检测指定位上字符是否都为0
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循环指令)
- 先减一比0,再比ZF。把ecx设-1,退出时
not ecx
值会比预期的小1。比如,用这个来算字符串长度,用 ‘\0’ 判断退出循环,长度会把 ‘\0’ 也算上
(4)JECXZ/JCXZ(计数器转移指令)
4. CALL(过程调用指令)
5. RET(返回指令)
- 串地址:
-
DS:ESI
指向源串
-
ES:EDI
指向目的串
- 操作方向:
-
DF=0
,低地址 → 高地址 -
DF=1
,高地址 → 低地址
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)(重复操作前缀)
- REPE(REPZ) / REPNE(REPNZ)的退出时机:以下这两组指令,当以ZF为基准退出时,会把最后使ZF改变的那次比较也计数(因为这次比较后ZF才改变)。比如,用这个来算字符串长度,用 ‘\0’ 判断退出循环,长度会把 ‘\0’ 也算上
1. 位测试指令组
(1)BT(位测试指令)
(2)BTC(位测试并取反指令)
(3)BTR(位测试并复位指令)
(4)BTS(位测试并置位指令)
2. BSF / BSR (顺向/逆向位扫描指令)
八、条件设置指令组1. SETcc(条件设置字节指令)
-
cc
的取值如下
1. LEA(取有效地址指令)
2. LAHF/SAHF(状态标志操作指令)
3. CLC / STC / CMC(进位标志CF设置指令)
4. CLD /STD(方向标志DF操作指令)