教学提示全面而准确地理解每条指令的功能和应用,是编写汇编语言程序的关键
3.2.2 算术运算类指令
四则运算是计算机经常进行的一种操作。算术运算指令实现二进制(和十进制)数据的四则运算
请注意算术运算类指令 对标志的影响
掌握,ADD/ADC/INC,SUB/SBB/DEC/ NEG/CMP
熟悉,MUL/IMUL,DIV/IDIV
理解,CBW/CWD,DAA/DAS,AAA/
AAS/AAM/AAD
1、加法指令 ADD
ADD指令将源与目的操作数相加,结果送到目的操作数
ADD指令按状态标志的定义相应设置
ADD
ADD reg,imm/reg/mem; reg←reg + imm/reg/mem
ADD mem,imm/reg; mem←mem + imm/reg
例题 2.18
带进位加法指令 ADC
ADC指令将源与目的操作数相加,再加上进位 CF标志,结果送到目的操作数
ADC指令按状态标志的定义相应设置
ADC指令主要与 ADD配合,实现多精度加法运算
ADC
ADC reg,imm/reg/mem; reg←reg + imm/reg/mem+ CF
ADC mem,imm/reg; mem←mem + imm/reg+ CF
例题 3.19
增量指令 INC( increment)
INC指令对操作数加 1(增量)
INC指令不影响进位 CF标志,按定义设置其他状态标志
INC
INC reg/mem; reg/mem←reg/mem + 1
inc bx
inc byte ptr [bx]
2、减法指令 SUB( subtract)
SUB指令将目的操作数减去源操作数,结果送到目的操作数
SUB指令按照定义相应设置状态标志
SUB
SUB reg,imm/reg/mem; reg←reg - imm/reg/mem
SUB mem,imm/reg; mem←mem - imm/reg
例题 3.20
带借位减法指令 SBB
SBB指令将目的操作数减去源操作数,再减去借位
CF(进位),结果送到目的操作数。
SBB指令按照定义相应设置状态标志
SBB指令主要与 SUB配合,实现多精度减法运算
SBB
SBB reg,imm/reg/mem; reg←reg - imm/reg/mem- CF
SBB mem,imm/reg; mem←mem - imm/reg- CF
例题 3.21
减量指令 DEC( decrement)
DEC指令对操作数减 1(减量)
DEC指令不影响进位 CF标志,按定义设置其他状态标志
DEC
DEC reg/mem; reg/mem←reg/mem - 1
dec cx
dec word ptr [si]INC指令和 DEC指令都是单操作数指令主要用于对计数器和地址指针的调整
3、求补指令 NEG( negative)
NEG指令对操作数执行求补运算:用零减去操作数,然后结果返回操作数
求补运算也可以表达成:将操作数按位取反后加 1
NEG指令对标志的影响与用零作减法的 SUB指令一样
NEG
NEG reg/mem; reg/mem←0 - reg/mem 例题 2.22
4、比较指令 CMP( compare)
CMP指令将目的操作数减去源操作数,按照定义相应设置状态标志
CMP指令执行的功能与 SUB指令,但结果不回送目的操作数
CMP reg,imm/reg/mem; reg- imm/reg/mem
CMP mem,imm/reg; mem- imm/reg
例题 3.23
CMP
5、乘法指令
MUL r8/m8;无符号字节乘法; AX←AL × r8/m8
MUL r16/m16;无符号字乘法; DX.AX←AX × r16/m16
IMUL r8/m8;有符号字节乘法; AX←AL × r8/m8
IMUL r16/m16;有符号字乘法; DX.AX←AX × r16/m16
例题 2.24说明
6,除法指令
DIV r8/m8;无符号字节除法:
AL←AX ÷ r8/m8的商,Ah←AX ÷ r8/m8的余数
DIV r16/m16 ;无符号字除法:; AX←DX.AX ÷ r16/m16的商,DX←DX.AX ÷ r16/m16的余数
IDIV r8/m8 ;有符号字节除法:
AL←AX ÷ r8/m8的商,Ah←AX ÷ r8/m8的余数
IDIV r16/m16 ;有符号字除法:; AX←DX.AX ÷ r16/m16的商,DX←DX.AX ÷ r16/m16的余数例题 3.25
说明
7、符号扩展指令
CBW ; AL的符号扩展至 AH;如 AL的最高有效位是 0,则 AH= 00; AL的最高有效位为 1,则 AH= FFH。 AL不变
CWD ; AX的符号扩展至 DX;如 AX的最高有效位是 0,则 DX= 00; AX的最高有效位为 1,则 DX= FFFFH。 AX不变
什么是 符号扩展
符号扩展指令常用于获得倍长的数据不影响标志位例题 3.26
例题 3.27
8、十进制调整指令
压缩 BCD码就是通常的
8421码;它用 4个二进制位表示一个十进制位,一个字节可以表示两个十进制位,即 00~ 99
非压缩 BCD码用 8个二进制位表示一个十进制位,只用低 4个二进制位表示一个十进制位 0~ 9,高 4位任意,
通常默认为 0
十进制数调整指令对二进制运算的结果进行十进制调整,以得到十进制的运算结果
分成压缩 BCD码和非压缩 BCD码调整
BCD码 ( Binary Coded Decimal)
二进制编码的十进制数:一位十进制数用 4位二进制编码来表示
8086支持压缩 BCD码和非压缩 BCD码的调整运算真值 8 64
二进制编码 08H 40H
压缩 BCD码 08H 64H
非压缩 BCD码 08H 0604H
压缩 BCD码加、减调整指令
( ADD AL,i8/r8/m8)
( ADC AL,i8/r8/m8)
DAA; AL← 将 AL的加和调整为压缩 BCD码
( SUB AL,i8/r8/m8)
( SBB AL,i8/r8/m8)
DAS; AL← 将 AL的减差调整为压缩 BCD码
使用 DAA或 DAS指令前,应先执行以 AL为目的操作数的加法或减法指令
DAA和 DAS指令对 OF标志无定义,按结果影响其他标志,
例如 CF反映压缩 BCD码相加或减的进位或借位状态例题 3.28 例题 3.29
例题 3.30
非压缩 BCD码加、减调整指令
( ADD AL,i8/r8/m8)
( ADC AL,i8/r8/m8)
AAA; AL← 将 AL的加和调整为非压缩 BCD码; AH←AH +调整的进位
( SUB AL,i8/r8/m8)
( SBB AL,i8/r8/m8)
AAS; AL← 将 AL的减差调整为非压缩 BCD码; AH←AH -调整的借位
使用 AAA或 AAS指令前,应先执行以 AL为目的操作数的加法或减法指令
AAA和 AAS指令在调整中产生了进位或借位,则 AH要加上进位或减去借位,同时 CF=AF=1,否则 CF=AF=0;它们对其他标志无定义例题 3.31 例题 3.32
非压缩 BCD码乘、除调整指令
( MUL r8/m8)
AAM; AX← 将 AX的乘积调整为非压缩 BCD码
AAD; AX← 将 AX中非压缩 BCD
码扩展成二进制数
( DIV r8/m8)
AAM指令跟在字节乘 MUL之后,将乘积调整为非压缩 BCD

AAD指令跟在字节除 DIV之前,先将非压缩 BCD码的被除数调整为二进制数
AAM和 AAD指令 根据结果设置 SF,ZF和 PF,但对 OF,CF和
AF无定义例题 3.33 例题 3.34