当前位置:
文档之家› 第三章2 8086指令系统(算术逻辑移位)
第三章2 8086指令系统(算术逻辑移位)
乘法例: 设(AL) = FAH(-06H=-6),(BL) = 11H(+11H=+17)
看成补码的值 看成补码的值
(1)
IMUL BL
(2)
MUL BL
; (AX) (AL)×(BL) ; FAH×11 H -6×+17=-102 FF9AH ; 结果 (AX) = FF9AH CF=OF=0 ; (AX) (AL)×(BL) ; FAH×11 H 250×17= 425 01A9H ;结果(AX) = 01A9H CF=OF=1
ADD (02H),(00H) ADD (02H),(01H) MOV AL,[00H] ADD AL,[01H]
MOV [02H],AL
问题: ADD AL,1 与 INC AL指令有何异同点? 同:都是AL内容加1,除CF外对其他的标志影响相同。 异:ADD 对CF有影响,指令代码长、执行慢,可产生进位; 而INC 对CF没影响,指令代码短、执行快,适合循环计数。
p.88 [例](6条加指令样例)→
Increment 增量、增加;
[3.3.2]
1. 加法指令
[例]: • ADD AX , 500H • ADD [BX+SI] ,AX • ADC AX , BX • ADC DX,[BX] • INC BX • INC BYTE PTR [BX]
执行后,AH及有关标志是什么?
; 取 Z ;扩展 Z →(DX,AX) ; (x*y)+z →(BX,CX) ;
CX, AX BX, DX
CX, 540 ; (x*y+z)-540 →(BX,CX) BX, 0
IDIV
X
; (x*y+z-540)/x→(AX) 余数→(DX)
[3.3.2]
5. 十进制调整指令 •对于BCD码采用二进制运算存在每四位间逢十进一 与逢十六进一的差异,需要进行调整后才能得到规格 相同的BCD码结果
汇编 功能说明 格式 DAA 对AL中压缩BCD码加法结果调整,最高位进位记CF DAS 对AL中压缩BCD码减法结果调整,最高位借位记CF AAA 对AL中非压缩BCD码加法结果调整,D3进位对AH加1 AAS 对AL中非压缩BCD码减法结果调整,D3借位对AH减1 AAM 对AL中非压缩BCD码乘法结果调整,十位送AH 二进制积拆成字 AAD 对AX中非压缩BCD码被除数调整为二进制,再DIV得00~09 •参算的BCD码规格必须相同,且运算结果为字节在AL中; •运算与调整指令之间状态标志不得被改变; •由于数字0~9的ASCII码可按非压缩BCD码运算调整
Divide 除
算术运算综合例: x , y , z 均为16位带符号数,计算(x*y + z – 540 ) / x
MOV IMUL AX, X Y ; x*y →(DX,AX) ;
MOV MOV
MOV CWD ADD ADC SUB SBB
CX, AX BX, DX
AX, Z
;部分积→(BX,CX)
BCD码调整原理:
0000 +0000 0001 这个1代表了16, +0000 而实际上仅应为 10,即多进了6, 0001
应该补6。
计算8+9 见右式
1000 计算8+4 1001 0001 = 11? 0110 0111 = 17
0000 +0000 0000 +0000 0001
1000 0100 1100 加6促其 0110 逢10进一 0010 =12
加法例3:将7000H:10H与7000H:20H中的连续四个单元 中的四字节数内容相加存放到7000H:30H起始的单元中。 MOV AX,7000H ;设数据段寄存器 MOV DS,AX MOV BX,10H ;设地址指针 MOV SI,20H MOV DI,30H MOV AX,[BX] ;低二字节相加并保存 ADD AX,[SI] MOV [DI],AX MOV AX,[BX+2] ;高二字节及低字的进位相加并保存 ADC AX,[SI+2] MOV [DI+2],AX MOV AX ,0 ADC AX , 0 MOV [DI+4],AX ;获得最高位的进位并保存于第五单元
3.3 8086指令系统
—— 3.3.2 算术运算指令
加、减、乘、除四种及相 关调整指令
3.3.2 算术运算指令
1. 加法指令(加、带进位加、加1)
ADD、 ADC 、INC
2. 减法指令(减、带进位减、减1 )
SUB、SUBB、DEC、NEG、CMP
3. 乘法指令(无符号数、带符号数乘法)
MUL、IMUL
乘法指令对CF/OF的影响:(表征有效乘积超半长)
( 对其余状态位的影响不确定)
MUL指令: CF/OF =
0/0 1/1
乘积的高一半为零 否则(无符号数的积超半长) 乘积的高一半是低一半的符号扩展 否则(补码的积超半长)
0/0 IMUL指令: CF/OF = 1/1
Multiplication 乘法、相乘
;
;
(x+y+24)-z
结果存入W, W+2字单元
[3.3.2]
3.乘法指令
;字节则 (AX)(AL)×(SRC) ;字则 (DX, AX) (AX)×(SRC) MUL imm/mem/reg 隐含操作数
无符号数乘法: MUL SRC
带符号数乘法: IMUL SRC ; (同MUL) (补码乘法) IMUL imm/ mem/reg
例: 08 × 09 ÷4= MOV AL,08H MOV BL,09H MUL BL ; (AX)=(AL)×(BL)=08 × 09=72=48H AAM ; (AL)/0AH= 48H /0AH→ 07H余02H MOV BL,4 AAD ; (AX) →(AH) ×0AH+(AL)=48H DIV BL ; (AL) = (AX)/(BL)=48H/4=12H ;超单字节非压缩的BCD码,商为二进制 AAM ; 利用AAM调整得双字节非压缩的BCD码 ;(AL)/0AH=12H/0AH=01H余08H
BCD码调整规则: BCD码加/减运算某四位组结果 出现A~F或向上有进/借位 则应对该四位组进行加/减6调整
p.94-96 [例]X4 1、3 简
BCD调整例1: 实现ASCII码相加:‘5’+‘9’ 程序段如下: MOV AH,0 ;(AH)=00H MOV AL, ‘5’ ;(AL)=35H ADD AL,‘9’ ;(AL)=35H+39H=6EH,AF=0 AAA ;调整(AH)=01H,(AL)=04H
4. 除法指令(无符号数、带符号数除法,补码扩展)
DIV、IDIV、CBW、CWD
5. 十进制调整指令(BCD码加法、减法结果调整)
DAA、DAS,AAA、AAS、AAM、AAD
(3-1)
(3-2)
(3-3)
[3.3.2]
1. 加法指令
加法:ADD DST, SRC ;(DST) (DST) + (SRC) ADD acc , imm ADD mem/reg , imm ADD mem/reg1 , reg2 / mem 带进位加:ADC DST, SRC ; (DST) (DST) + (SRC) + CF (类同ADD) 加最低位 加1指令: INC OPR ; (OPR) (OPR) + 1 (增量指令) INC mem/reg •除INC指令不影响CF标志外,均对状态标志位有影响; •可8位或16位运算,两操作数类型要匹配。
[3.3.2]
2. 减法指令
减法:SUB DST, SRC ;(DST) (DST) - (SRC) SUB acc , imm SUB mem/reg , imm SUB mem/reg1, reg2 / mem 减借位加:SBB DST, SRC ; (DST) (DST) - (SRC) - CF (类同SUB) 最低位减 减 1 指令:DEC OPR ; (OPR) (OPR) - 1 (减量指令) DEC mem/reg 求补指令: NEG OPR ; (OPR) 0 - (OPR) (求反加一) NEG mem/reg 比较指令: CMP DST, SRC ;(DST) - (SRC),不存,只产生标志 (类同SUB) •除INC指令不影响CF标志,两操作数类型(8b/16b)要匹配。 •对字节-128求补或对字-32768求补时OF=1,否则OF=0。
3.3.3-3.3.4 逻辑运算和移位指令
1. 逻辑运算指令(按位逻辑运算)
AND、 OR 、NOT、XOR、TEST 逻辑运算指令用于测试并判断数据位的情况。
无符号数除法: DIV SRC
带符号数除法: IDIV SRC ; (同DIV) (补码除法) IDIV imm/ mem/reg
字节补码扩展: CBW 字补码扩展: CWD ; AL符号扩展到AH ; AX符号扩展到DX
•若除数为零或AL中商大于FFH(或AX中商大于FFFFH),则 CPU产生一个类型0的内部中断(Divide overflow ) ; •除法指令对所有状态标志位均无定义。
例:把3AH转换成等值的非压缩的BCD码。 MOV AL,3AH ;58 AAM ;调整:58/10=05余08 ;结果(AH)=05H,(AL)=08H
ห้องสมุดไป่ตู้
BCD调整例3:按十进制除法计算55÷7=? 程序段如下: MOV AX, 0505H ;(AX)=55BCD MOV CL, 07H ;(CL)= 7 AAD ;(AX)=0037H(调整成二进制于AL) DIV CL ;余数(AH)=6,商(AL)=7 所得结果为非压缩的BCD码(商7余6)。