1
格式,INC reg/mem
功能:类似于 C语言中的 ++操作:对指定的操作数加 1
例,INC AL
INC SI
INC BYTE PTR[BX+4]
注:本指令不影响 CF标志。
3) 加 1指令 INC( 单操作数指令 )
2
ADD/ADC对 条件标志位 (CF/OF/ZF/SF)的影响:
CF位表示无符号数相加的溢出。
OF位表示带符号数相加的溢出。
1 结果为负
0 否则SF=
1 结果为 0
0 否则ZF=
1 和的最高有效位有向高位的进位
0 否则CF=
1 两个操作数符号相同,而结果符号与之相反
0 否则OF=
3
(1) 不考虑借位的减法指令 SUB
格式,SUB dest,src
操作,dest←(dest) -(src)
注,1.源和目的操作数不能同时为存储器操作数
2.立即数不能作为目的操作数指令例子:
SUB AL,60H
SUB [BX+20H],DX
SUB AX,CX
2,减法指令
4
SBB指令主要用于多字节的减法 。
格式,SBB dest,src
操作,dest←(dest) -(src)-(CF)
指令例子:
SBB AX,CX
SBB WORD PTR[SI],2080H
SBB [SI],DX
(2) 考虑借位的减法指令 SBB
5
例,x,y,z均为 32位数,分别存放在地址为 X,
X+2; Y,Y+2; Z,Z+2的存储单元中,用指令序列实现 w?x+y+24-z,结果放在 W,W+2单元中 。
MOV AX,X
MOV DX,X+2
ADD AX,Y
ADC DX,Y+2 ; x+y
ADD AX,24
ADC DX,0 ; x+y+24
SUB AX,Z
SBB DX,Z+2 ; x+y+24-z
MOV W,AX
MOV W+2,DX ; 结果存入 W,W+2单元
6
作用类似于 C语言中的,--,操作符。
格式,DEC opr
操作,opr←(opr) -1
指令例子:
DEC CL
DEC BYTE PTR[DI+2]
DEC SI
(3) 减 1指令 DEC
7
格式,NEG opr
操作,opr← 0 -(opr)
对一个操作数取补码相当于用 0减去此操作数,故利用 NEG指令可得到负数的绝对值。
例:若 (AL)=0FCH,则执行 NEG AL 后,
(AL)=04H,CF=1
本例中,0FCH为 -4的补码,执行求补指令后,
即得到 4(-4的绝对值 )。
(4) 求补指令 NEG
8
SUB/SBB对标志位 (CF/OF/ZF/SF)的影响
CF=1表示无符号数减法溢出。
OF=1表示带符号数减法溢出。
NEG指令对 CF/OF的影响:
CF:操作数为 0时,求补的结果使 CF=0,否则 CF=1。
OF:字节运算对 -128求补或字运算对 -32768求补时 OF=1,
否则 OF=0。
1 被减数的最高有效位有向高位的借位
0 否则CF=
1 两个操作数符号相反,而结果的符号与减数相同
0 否则OF=
9
格式,CMP dest,src
操作,(dest)-(src)
CMP也是执行两个操作数相减,但结果不送目标操作数,其结果只反映在标志位上。
指令例子:
CMP AL,0AH
CMP CX,SI
CMP DI,[BX+03]
(5) 比较指令 CMP
10
根据标志位来判断比较的结果
1)根据 ZF判断两个数是否相等。若 ZF=1,则两数相等。
2)若两个数不相等,则分两种情况考虑,
①比较的是两个无符号数若 CF=0,则 dest> src;
若 CF=1,则 dest< src。
②比较的是两个有符号数若 OF⊕ SF=0,则 dest> src;
若 OF⊕ SF=1,则 dest< src。
11
比较指令在使用时,一般在其后紧跟一条条件转移指令,判断比较结果的转向。
举例:比较 AL,BL,CL中带符号数的大小,将最小数放在 AL中。
程序:
CMP AL,BL ; AL和 BL比较
JNG BBB ; 若 AL≤BL,则转
XCHG AL,BL ; 若 AL> BL,则交换
BBB,CMP AL,CL ; AL和 CL比较
JNG CCC ; 若 AL≤CL,则转
XCHG AL,CL ; 若 AL> CL,则交换
CCC,HLT
12
进行乘法时,8位 *8位 →16 位乘积
16位 *16位 →32 位乘积
(1) 无符号数的乘法指令 MUL(MEM/REG)
格式,MUL src
操作:字节操作数 (AX)? (AL) × (src)
字操作数 (DX,AX)? (AX) × (src)
指令例子:
MUL BL ; (AL)× (BL),乘积在 AX中
MUL CX ; (AX)× (CX),乘积在 DX,AX中
MUL BYTE PTR[BX]
3,乘法指令
13
格式与 MUL指令类似,只是要求两操作数均为有符号数 。
指令例子:
IMUL BL ; (AX)←(AL) × (BL)
IMUL WORD PTR[SI]; (DX,AX)←(AX) × ([SI+1][SI])
(2) 有符号数乘法指令 IMUL
注意,MUL/IMUL指令中
● AL(AX)为隐含的乘数寄存器;
● AX(DX,AX)为隐含的乘积寄存器;
● SRC不能为立即数;
● 除 CF和 OF外,对 其它 标志位无定义 。
14
乘法指令对 CF/OF的影响:
00 乘积的高一半为零
11 否则MUL指令,CF/OF =
00 乘积的高一半是低一半的符号扩展
11 否则IMUL指令,CF/OF =
例,(AL) = A5H(-5B),(BL) = 11H
(1) IMUL BL ; (AX)? (AL)× (BL); A5× 11? -5B× 11=-060B?F9F5; (AX) = F9F5H CF=OF=1
(2) MUL BL ; (AX)? (AL)× (BL); A5× 11= 0AF5; (AX) = 0AF5H CF=OF=1
15
4,除法指令
进行除法时,16位 /8位 → 8位商
32位 /16位 → 16位商
对被除数、商及余数存放有如下规定:
被除数 商 余数字节除法 AX AL AH
字除法 DX:AX AX DX
16
格式,DIV src
操作:字节操作 (AL)? (AX) / (SRC) 的商
(AH)? (AX) / (SRC) 的余数字操作 (AX)? (DX,AX) / (SRC) 的商
(DX)? (DX,AX) / (SRC) 的余数指令例子:
DIV CL
DIV WORD PTR[BX]
注:若除数为零或 AL中商大于 FFH(或 AX中商大于
FFFFH),则 CPU产生一个类型 0的内部中断。
(1) 无符号数除法指令 DIV
17
(2) 有符号数除法指令 IDIV
格式,IDIV src
操作与 DIV类似 。 商及余数均为有符号数,且余数符号总是与被除数符号相同 。
注意,对于 DIV/IDIV指令
AX(DX,AX)为隐含的被除数寄存器。
AL(AX)为隐含的商寄存器。
AH(DX)为隐含的余数寄存器。
src不能为立即数。
对所有条件标志位均 无定义 。
18
除法运算要求被除数字长是除数字长的两倍,若不满足则需 对被除数进行扩展,否则产生错误。
对于无符号数除法扩展,只需将 AH或 DX清零即可。
对有符号数而言,则是符号位的扩展。可使用前面介绍过的符号扩展指令 CBW和 CWD
关于除法操作中的字长扩展问题
19
例,写出 34H÷ 25H的程序段。
MOV AL,34H
MOV BL,25H
CBW ; AL的符号扩展到 AH
IDIV BL ; 0034H÷ 25H,结果为; (AH)=0FH,(AL)=01H
20
*5.BCD码运算的十进制调整指令
专用于对 BCD码运算的结果进行调整
包括,AAA,DAA,AAS,DAS,AAM,AAD
均为隐含寻址,隐含的操作数为 AL和 AH
为何要对 BCD码的运算结果进行调整?
BCD码本质上是十进制数,即应遵循逢十进一的规则。而计算机是按二进制
(十六进制)进行运算,并未按十进制规则进行运算。
21
1)加法的十进制调整指令
(1)非压缩 BCD码加法调整 AAA
本指令对在 AL中的由两个未组合的 BCD码相加后的结果进行调正,得到一个正确的未组合的 BCD码。
AAA指令只影响 AF和 CF,其余标志无定义。
AAA指令应紧跟在 ADD或 ADC指令之后。
22
如果 AL的低 4位> 9∨ AF=1,则:
① AL←(AL)+6,(AH)←(AH)+1,AF←1
② AL←((AL)∧0FH)
③ CF←AF
否则 AL←(AL)∧0FH
AAA指令的操作如下:
23
调整原理:先看一个例子计算 8+ 9 0000 1000
见右式 +0000 1001
0001 0001 = 11
结果应为 17,而计算机相加为 11,原因在于运算过程中,如遇到低 4位往高 4位产生进位时(此时 AF=1) 是按逢十六进一的规则,但
BCD码要求逢十进一,因此只要产生进位,个位就会少 6,这就要进行加 6调正。
这个 1代表了 16,而实际上仅应为 10,即多进了 6。
24
实际上当低 4位的结果> 9(即 A~ F之间 )时,
也应进行加 6调正 (原因是逢十没有进位,故用加 6的方法强行产生进位 ) 。
如对上例的结果进行加 6:
0001 0001 11
+ 0000 0110 6
0000 0111 17
^ 0000 1111
----------------------
1 0000 1111
25
例 2:有两个字符串形式的十进制数,2658和
3619,求二者之和。即 2658+3619=?
由题意知,被加数和加数的每一位都以 ASCII
码 形式存放在内存中。
假定二数在内存中均是低位在前,高位在后,
另留出 5个单元存放相加的结果。
内存中数据存放形式见下页图。
26
36H
32H
39H
31H
STRING1
STRING2
38H
35H
36H
33H
被加数加数数据段
‘ 8’
‘ 5’
‘ 6’
‘ 2’
‘ 9’
‘ 1’
‘ 6’
‘ 3’
SUM
结果
...
...
27
程序 段为,
LEA SI,STRING1 ; STRING1偏移地址送 SI
LEA DI,STRING2 ; STRING2偏 移地 址送 DI
LEA BX,SUM ; SUM偏移地址送 BX
MOV CX,4 ; 循环 4次
CLC ; 清进位标志
AGAIN,MOV AL,[SI]
ADC AL,[DI] ; 带进位加
AAA ; 未压缩 BCD码调正
MOV [BX],AL ; 结果存入 SUM
INC SI ; 调整指针
INC DI
INC BX
DEC CX ; 循环计数器减 1
JNZ AGAIN ; 若未处理完,则转 AGAIN
28
思考题:
1.根据程序写出结果 SUM的值。
2.若最高位有进位,程序如何修改?
3.从此例不难看出,用 AAA指令也可对字符串形式的十进制数加法进行调整,所以它又被称为加法的 ASCII调正指令。为什么 AAA
指令既可对非压缩 BCD码加法进行调整,也可对 ASCII码形式的十进制数进行调整? (注意
AAA指令的第 ② 步 )
29
(2)压缩 BCD码加法调整 DAA
两个压缩 BCD码相加结果在 AL中,通过
DAA调整得到一个正确的压缩 BCD码,
指令操作 (调整方法 ):
若 AL的低 4位> 9∨ AF=1
则 (AL)←(AL)+6,AF←1
若 AL的高 4位> 9∨ CF=1
则 (AL)←(AL)+60H,CF←1
除 OF外,DAA指令影响所有其它标志。
DAA指令应紧跟在 ADD或 ADC指令之后。
30
例,0100 1000 48H
MOV AL,48H + 0111 0100 74H
MOV BL,74H 1011 1100 BCH
ADD AL,BL + 0110 0110 66H
DAA 1 0010 0010 1 22H
(进位 ) (进位 )
执行 ADD后,(AL)=BCH,高 4位低 4位均大于 9,故 DAA
指令执行加 66H调整,最后结果为:
(AL)=22H,CF=1,AF=1
31
(1)非压缩 BCD码减法的十进制调正指令 AAS
对 AL中由两个非压缩的 BCD码相减的结果进行调整。调整操作为:
若 AL的低 4位> 9或 AF=1,则:
① AL←(AL) -6,AH←(AH) -1,AF←1
② AL←(AL)∧0FH
③ CF←AF
否则,AL←(AL)∧ 0FH
2)减法的十进制调整指令
32
举例,16-8=?
MOV AX,0106H 0000 0110 06
MOV BL,08H - 0000 1000 - 08
SUB AL,BL 1111 1110 FE
AAS - 0000 0110 - 06
1111 1000 F8
∧ 0000 1111 ∧ 0F
0000 1000 08
结果为,(AL)=08H,(AH)=0,CF=AF=1
33
(2)压缩 BCD码减法的十进制调正指令 DAS
对 AL中由两个压缩 BCD码相减的结果进行调整。调整操作为:
若 AL的低 4位> 9∨AF=1,则:
AL←(AL) -6,且 AF←1
若 AL的高 4位> 9∨CF=1,则:
AL←(AL) -60H,且 CF←1
DAS对 OF无定义,但影响其余标志位。
DAS指令要求跟在减法指令之后。
34
3) 乘法的十进制调正指令 AAM
对 AX中由两个非压缩 BCD码相乘的结果进行调整。调整操作为:
(AL)/0AH,(AH)← 商,(AL)← 余数
隐含的操作寄存器为 AL和 AH;
AAM跟在 MUL指令之后使用;
影响标志位 PF,SF,ZF,其它 无定义 ;
用 AAM可实现 ≤99 的二 -十进制转换。
35
例 1:按十进制乘法计算 7× 8=?
程序段如下:
MOV AL,07H ; (AL)=07H
MOV CL,08H ; (CL)=08H
MUL CL ; (AX)=0038H
AAM ; (AH)=05H,(AL)=06H
所得结果为非压缩的 BCD码。
例 2:把 3AH转换成等值的十进制数。
MOV AL,3AH ; 58
AAM ; (AH)=05H,(AL)=08H
36
4) 除法的十进制调正指令 AAD
对非压缩 BCD除法运算进行调整。调整操作为:
(AL)← (AH)× 0AH+ (AL)
AH ← 0
隐含的操作寄存器为 AH,AL;
AAD要在 DIV指令 之前 使用;
影响标志位 PF,SF,ZF,其它 无定义 ;
用 AAD可实现 ≤99 的十 -二进制转换。
37
例 1:按十进制除法计算 55÷ 7=?
程序段如下:
MOV AX,0505H ; (AX)=55BCD
MOV CL,07H ; (CL)= 7
AAD ; (AX)=0037H
DIV CL ; (AH)=6,(AL)=7
所得结果为非压缩的 BCD码(商 7余 6)。
例 2:把 73转换成等值的二进制数。
MOV AX,0703H ; (AX)= 73BCD
AAD ; (AX)= 0049H