目录
1. 加法指令
(1)ADD 指令
(2)ADC 指令
(3)INC 指令
2. 减法指令
(1)SUB 指令
(2)SBB 指令
(3)DEC 指令
(4)NEG 求补指令
(5)CMP 比较指令
3. 乘法指令
(1)MUL 无符号数乘法指令
(2)IMUL 有符号数乘法指令
4. 除法指令
1. 加法指令
源操作数:通用寄存器、存储器、立即数。
目的操作数:通用寄存器、存储器。
注意:源操作数和目的操作数不能同时是存储器操作数。
(1)ADD 指令
格式:ADD OPRD1,OPRD2
执行:OPRD1 + OPRD2 → OPRD1
ADD 指令的执行会影响全部 6 个状态标志位。
例题、 分析下列指令是否合法。
例题、分析指令执行后 6 个状态标志位的状态。
看似我们把红色标出的进位扔掉了,实则进位到了 CF 里面。
(2)ADC 指令
格式:ADD OPRD1,OPRD2
执行:OPRD1 + OPRD2 + CF → OPRD1
特点:ADC 指令主要用于多字节加法运算,高 16 位或高 8 位相加时,必须考虑低 16 位或低 8 位产生的进位。
ADC 指令的执行会影响全部 6 个状态标志位。
例、现有两个 32 位无符号数 12345678H、8765ABCDH 相加,其和仍然为一个 32 位无符号数。要求和的高 16 位送入 DX 中,和的低 16 位送入 AX 中。
在字母串前加个 0,代表这是一个数,防止混淆。
(3)INC 指令
格式:INC OPRD
执行:OPRD + 1 → OPRD
特点:是单操作数指令,其目的操作数不能是立即数。
INC 指令的执行会影响 5 个状态标志位,除了 CF 位。
2. 减法指令
源操作数:通用寄存器、存储器、立即数。
目的操作数:通用寄存器、存储器。
注意:源操作数和目的操作数不能同时是存储器操作数。
(1)SUB 指令
格式:SUB OPRD1,OPRD2
执行:OPRD1 - OPRD2 → OPRD1
SUB 指令的执行会影响全部 6 个状态标志位。
(2)SBB 指令
格式:SUB OPRD1,OPRD2
执行:OPRD1 - OPRD2 - CF → OPRD1
特点:SBB 指令主要用于多字节减法运算,高 16 位或高 8 位相减时,必须考虑低 16 位或低 8 位产生的借位。
SBB 指令的执行会影响全部 6 个状态标志位。
(3)DEC 指令
格式:DEC OPRD
执行:OPRD - 1 → OPRD
DEC 指令的执行会影响 5 个状态标志位,除了 CF 位。
因为 INC 和 DEC 均不会影响 CF 位,所以不要试图用它们判断 CF 位内容。
(4)NEG 求补指令
格式:NEG OPRD
执行:0 - OPRD → OPRD
老师举的例子:
NEG 指令的执行会影响全部 6 个状态标志位。
① 对进位标志 CF 的影响
只有当操作数为零时,进位标志 CF 被置零;其它情况进位标志 CF都被置 1,即均有借位。
② 对溢出标志 OF 的影响
当字节操作数为 -128(80H),或字操作数为 -32768(8000H)时,结果将无变化,但溢出标志 OF 被置 1。
实质:
(5)CMP 比较指令
格式:CMP OPRD1,OPRD2
执行:OPRD1 - OPRD2 (操作数本身不会发生变化哟~)
特点:用于比较两个数的大小,可以作为条件转移指令的转移条件。
说明:对 FLAGS 有影响的运算都可以作为条件转移指令的转移条件。
CMP 指令的执行会影响全部 6 个状态标志位。
表1、
表2、
(1) 比较两个无符号数的大小
当 A > B 时,A - B 不产生借位,且结果不为 0,即 CF = 0 且 ZF = 0 。
当 A = B 时,则 ZF = 1 。
当 A < B 时,A - B 产生借位,且结果不为 0,即 CF = 1 且 ZF = 0 。
(2) 比较两个有符号数的大小
当 A > B 时:
① A 和 B 都是负数。
若 A > B,那么 A - B 一定为正数,且不会发生溢出,且结果不为 0,即 SF = 0 且 OF = 0 且 ZF = 0 。
② A 和 B 都是正数。
若 A > B,那么 A - B 一定为正数,且不会发生溢出,且结果不为 0,即 SF = 0 且 OF = 0 且 ZF = 0 。
③ A 为正,B 为负。
显然 A > B 且结果不为 0 。
若不发生溢出,则 A - B 为正数。即 SF = 0 且 OF = 0 且 ZF = 0 。
若发生溢出,则 A - B 为负数。即 SF = 1 且 OF = 1 且 ZF = 0 。
综上,SF ⊕ OF = 0 且 ZF = 0 时,A > B 。
当 A < B 时:
① A 和 B 都是负数。
若 A < B,那么 A - B 一定为负数,且不会发生溢出,且结果不为 0,即 SF = 1 且 OF = 0 且 ZF = 0 。
② A 和 B 都是正数。
若 A < B,那么 A - B 一定为负数,且不会发生溢出,且结果不为 0,即 SF = 1 且 OF = 0 且 ZF = 0 。
③ A 为负,B 为正。
显然 A < B 且结果不为 0 。
若不发生溢出,则 A - B 为负数。即 SF = 1 且 OF = 0 且 ZF = 0 。
若发生溢出,则 A - B 为正数。即 SF = 0 且 OF = 1 且 ZF = 0 。
综上,SF ⊕ OF = 1 且 ZF = 0 时,A < B 。
当 A = B 时,有 ZF = 1 。
例题、在内存数据段从 DATA1 开始的存储单元存放了两个 8 位的无符号数。试比较它们的大小,并将大的数送 MAX 存储单元。
3. 乘法指令
要求:OPRD 为通用寄存器或存储器,不能为立即数。
乘法指令采用隐含寻址,隐含的是存放被乘数的累加器 AL 、 AX 及存放结果的 AX、DX。
若运算结果的高半部分(AH 或 DX)是无效数值,则 OF = CF = 0,否则 OF = CF = 1。
说人话:按理说 8 位 × 8 位得到一个 16 位,但是有些结果用 8 位就能表示,因此其高半部分是无效数值。
(1)MUL 无符号数乘法指令
格式:MUL OPRD
执行:
- 字节乘法:OPRD × AL → AX
- 字乘法:OPRD × AX → DX:AX
特点:若结果的 AH(字节运算)或 DX(字运算)为全 0,则 CF = OF = 0,否则 CF = OF = 1。
MUL 只会影响 CF 位和 OF 位。
(2)IMUL 有符号数乘法指令
格式:IMUL OPRD
执行:
- 字节乘法:OPRD × AL → AX
- 字乘法:OPRD × AX → DX:AX
特点:若结果的 AH(字节运算)或 DX(字运算)为低半部分的符号扩展,则 CF = OF = 0,否则 CF = OF = 1。
说人话:若两数同号,则高半部分为全 0;若两数异号,则高半部分为全 1 。
4. 除法指令
要求:OPRD 为通用寄存器或存储器,不能为立即数。
除法指令要求被除数的字长必须是除数的两倍;
除法指令采用隐含寻址,若除数为 8 位,则被除数为 AX;若除数为 16 位,则被除数高位在 DX 中,低位在 AX 中。
格式:
- DIV OPRD
- IDIV OPRD
执行:
- 字节乘法:AX ÷ OPRD → AL(商)AH(余数)
- 字乘法:DX:AX ÷ OPRD → AX(商)DX(余数)
除法指令对标志位均无影响。