3-3算术运算指令
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
第三章 指令系统(3)
20
(2) 有符号数乘法指令IMUL
格式与MUL指令类似,只是要求两操作数均为有符号数。 指令例子: IMUL BL ;(AX)←(AL)×(BL) IMUL WORD PTR[SI] ;(DX,AX)←(AX)×([SI+1][SI])
注意:MUL/IMUL指令中 ● AL(AX)为隐含的乘数寄存器; ● AX(DX,AX)为隐含的乘积寄存器;
第三章 指令系统(3)
4
1. 加法指令 共有5条:
(1) 不带进位的加法指令ADD
格式: ADD ADD 例: ADD ADD acc,data mem/reg,data AL,30H AX,[BX+20H]
ADD mem/reg1,mem/reg2
ADD
ADD
CX,SI
[DI],200H
ADD指令对标志位(指状态标志)都有影响。
XCHG AL, BL ;若AL>BL,则交换
XCHG AL,CL ;若AL>CL,则交换
第三章 指令系统(3)
19
3. 乘法指令 进行乘法时:8位*8位→16位乘积 16位*16位→32位乘积 (1) 无符号数的乘法指令MUL(MEM/REG) 格式: MUL src 操作:字节操作数 (AX) (AL) × (src) 字操作数 指令例子: MUL BL ;(AL)×(BL),乘积在AX中 MUL CX ;(AX)×(CX),乘积在DX,AX中 MUL BYTE PTR[BX] (DX, AX) (AX) × (src)
OF=
CF 位表示无符号数相加的溢出。
OF位表示带符号数相加的溢出。
第三章 指令系统(3)
10
2. 减法指令 (1) 不考虑借位的减法指令SUB 格式: SUB dest, src 操作: dest←(dest)-(src)
注:1.源和目的操作数不能同时为存储器操作数
2.立即数不能作为目的操作数
指令例子:
; (AX) = F9F5H
; A5×11= 0AF5
CF=OF=1
(2) MUL BL ; (AX) (AL)×(BL)
; (AX) = 0AF5H CF=OF=1
第三章 指令系统(3) 22
4. 除法指令 进行除法时:16位/8位→8位商 32位/16位→16位商
对被除数、商及余数存放有如下规定: 被除数 商 余数 字节除法 AX AL AH 字除法 DX:AX AX DX
第三章 指令系统(3)
27
*5.BCD码运算的十进制调整指令 • 专用于对BCD码运算的结果进行调整 • 包括:AAA、DAA、AAS、DAS、AAM、AAD • 均为隐含寻址,隐含的操作数为AL和AH
• 为何要对BCD码的运算结果进行调整?
BCD码本质上是十进制数,即应遵循逢十进一的规则。而计算
● SRC不能为立即数;
● 除CF和OF外,对其它标志位无定义。
第三章 指令系统(3)
21
乘法指令对CF/OF的影响: MUL指令: CF/OF = 00 乘积的高一半为零 11 否 00 乘积的高一半是低一半的符号扩展 11 否
IMUL指令: CF/OF =
例:(AL) = A5H(-5B),(BL) = 11H (1) IMUL BL ; (AX) (AL)×(BL) ; A5×11 -5B×11=-060B F9F5
ADC DX, 0
SUB AX, Z SBB DX, Z+2 MOV W, AX MOV W+2, DX
; x+y+24
; x+y+24-z ; 结果存入W, W+2单元
第三章 指令系统(3)
13
(3) 减1指令DEC 作用类似于C语言中的”--”操作符。
格式:DEC opr
操作:opr←(opr)-1 指令例子: DEC CL DEC BYTE PTR[DI+2] DEC SI
3.2.2 算术运算指令
涉及两种类型数据: 无符号数和有符号数。对加减法指 令,无符号和有符号数可采用同一套指令,但应注意: 参加的操作数必须都是无符号数或都是有符号数。 需使用不同的标志位来检查无符号数和有符号数的运算结 果是否溢出。
第三章 指令系统(3)
1
• 两个8位数相加时有4种情况: ①无符号数和有符号数均不溢出 二进制相加 0000 1000 +0001 1110 0010 0110 结果38 无符号数加 有符号数加 8 +8 + 30 + (+30) 38 +38 CF=0 OF=0
第三章 指令系统(3)
14
(4) 求补指令NEG
格式: NEG opr
操作: opr← 0-(opr)
对一个操作数取补码相当于用0减去此操作数,故利用NEG指令可得 到负数的绝对值。
例:若(AL)=0FCH,则执行 NEG AL 后,
(AL)=04H,CF=1
本例中,0FCH为- 4的补码,执行求补指令后,即得到4(- 4的绝对值)。
例: INC AL INC SI
INC BYTE PTR[BX+4]
注:本指令不影响CF标志。
第三章 指令系统(3)
9
ADD/ADC对条件标志位(CF/OF/ZF/SF)的影响:
1 0 1 0 1 0 结果为负 非负 1 0 结果为0 非零
SF=
ZF=
CF=
和的最高有效位有向高位的进位 无进位 两个操作数符号相同,而结果符号与之相反 无溢出
指令例子: DIV CL
DIV WORD PTR[BX]
注:若除数为零或AL中商大于FFH(或AX中商大于FFFFH),则CPU产 生一个类型0的内部中断。
第三章 指令系统(3) 24
(2) 有符号数除法指令IDIV
格式: IDIV src 操作与 DIV类似。商及余数均为有符号数 ,且余数符号总是与被除数 符号相同。
第三章 指令系统(3)
15
SUB/SBB对标志位(CF/OF/ZF/SF)的影响 CF= 1 0 被减数的最高有效位有向高位的借位 无借位
OF=
1 0
两个操作数符号相反,而结果的符号与减数相同 否
CF=1表示无符号数减法溢出。 OF=1表示带符号数减法溢出。 NEG指令对CF/OF的影响: CF:操作数为0时,求补的结果使CF=0,否则CF=1。 OF:字节运算对-128求补或字运算对-32768求补时OF=1,否则OF=0。
第三章 指令系统(3)
3
④ 无符号数和有符号数均溢出 1000 1000 136 -120 +1111 0111 +247 +(-9) 10111 1111 383 -129 结果127 CF=1 OF=1 上面四种情况说明,CF标志可用来表示无符号数的 溢出,OF标志可用来表示有符号数的溢出。 有符号数的溢出是一种出错状态,在运算过程中应 当避免。
第三章 指令系统(3)
5
(2) 带进位位的加法指令ADC ADC指令在形式上和功能上都有与ADD类似,只是相加时 还要包括进位标志CF的内容,例如: ADC AL,68H ;AL←(AL)+68H+(CF) ADC AX,CX ;AX←(AX)+(CX)+(CF) ADC BX,[DI] ;BX←(BX)+[DI+1][DI]+(CF)
• 对有符号数而言,则是符号位的扩展。可使用前面介绍过的符号扩展 指令CBW和CWD
第三章 指令系统(3)
26
例: 写出34H÷25H的程序段。
MOV AL,34H
MOV BL,25H
CBW ; AL的符号扩展到AH IDIV BL ; 0034H÷25H,结果为
; (AH)=0FH, (AL)=01H
SBB [SI],DX
第三章 指令系统(3)
12
例:x、y、z均为32位数,分别存放在地址为X, X+2;Y,Y+2;Z,Z+2 的存储单元中,用指令序列实现wx+y+24-z,结果放在 W, W+2单 元中。 MOV AX, X MOV DX, X+2
ADD AX, Y
ADC DX, Y+2 ADD AX, 24 ; x+y
机是按二进制(十六进制)进行运算,并未按十进制规则进行运 算。
第三章 指令系统(3)
28
1)加法的十进制调整指令 (1)非压缩BCD码加法调整AAA 本指令对在AL中的由两个未组合的BCD码相加后的结果进行调正, 得到一个正确的未组合的BCD码。 •AAA指令只影响AF和CF,其余标志无定义。 •AAA指令应紧跟在ADD或ADC指令之后。
BUFFER1
ACH F8H 56H
被 加 数
数 据 段
2CH
BUFFER2
BEH 47H 9EH 30H ... 加 数
多字节加法示意图
第三章 指令系统(3) 7
程序段如下:
MOV CX,4 ;置循环次数 MOV SI,0 ;置SI初值为零
CLC
LL:
;清进位标志CF
MOV AL,BUFFER2[SI]
注意: 对于DIV/IDIV指令
• AX(DX,AX)为隐含的被除数寄存器。 • AL(AX)为隐含的商寄存器。
5/(-3) = -1 …...2
(-5)/3 = -1……-2
• AH(DX)为隐含的余数寄存器。
• src不能为立即数。 • 对所有条件标志位均无定义。
第三章 指令系统(3)
25
关于除法操作中的字长扩展问题 • 除法运算要求被除数字长是除数字长的两倍,若不满足则需对被除数 进行扩展,否则产生错误。 • 对于无符号数除法扩展,只需将AH或DX清零即可。
第三章 指令系统(3)
23
(1) 无符号数除法指令DIV 格式: DIV src 操作:字节操作: (AL) (AX) / (SRC) 的商 (AH) (AX) / (SRC) 的余数 字操作: (AX) (DX, AX) / (SRC) 的商
(DX) (DX, AX) / (SRC) 的余数
SUB AL,60H SUB [BX+20H],DX
SUB AX,CX
第三章 指令系统(3)
11
(2) 考虑借位的减法指令SBB SBB指令主要用于多字节的减法。 格式: SBB dest, src 操作: dest←(dest)-(src)-(CF) 指令例子: SBB AX,CX
SBB WORD PTR[SI],2080H
17
根据标志位来判断比较的结果 1) 根据ZF判断两个数是否相等。若ZF=1,则两数相等。 2) 若两个数不相等,则分两种情况考虑: ①比较的是两个无符号数
若CF=0,则dest>src;
若CF=1,则dest<src。 ②比较的是两个有符号数
若OF⊕SF=0,则dest>src;
若OF
⊕SF=1,则dest<src。
第三章 指令系统(3) 18
比较指令在使用时,一般在其后紧跟一条条件转移指令,根据结 果决定程序的流向。 举例:比较AL、BL、CL中带符号数的大小,将最小数放在AL中。 程序: CMP AL, BL JNG BBB BBB: CMP AL, CL JNG CCC CCC: HLT ;AL和BL比较 ;若AL≤BL,则转 ;AL和CL比较 ;若AL≤CL,则转
第三章 指令系统(3)
16
(5) 比较指令CMP 格式: CMP dest, src 操作: (dest)-(src) CMP也是执行两个操作数相减,但结果不送目标操作数,其结果只反映在 标志位上。 指令例子:
CMP AL,0AH
CMP CX,SI CMP DI,[BX+03]
第三章 指令系统(3)
第三章 指令系统(3)
6
ADC指令主要用于多字 节加法运算中 例:有两个4字节的无符号数 相加: 2C56F8AC+309E47BE=? 设被加数、加数分别存 放在BUFFER1及BUFFER2 开始的两个存储区内,结果 放回BUFFER1存储区,如下 页图所示。 因CPU只能进行8位或16 位的加法运算,为此可将加 法分4次或2次进行。
ADC BUFFER1[SI],AL ;带进位加
INC SI DEC CX JNZ LL ;(SI)+1 ;(CX)-1 ;若(CX)0,则转LL
思考:若最高位有进位,如何改?
第三章 指令系统(3)
8
3) 加1指令INC(单操作数指令) 格式:INC reg/mem
ຫໍສະໝຸດ Baidu
功能:类似于C语言中的++操作:对指定的操作数加1
第三章 指令系统(3)
2
② 无符号数溢出 0000 1000 8 +1111 1101 +253 10000 0101 261 结果为5 CF=1
+8 +(-3) +5 OF=0
③ 有符号数溢出 0000 1000 8 +8 +0111 1101 +125 +(+125) 1000 0101 133 +133 结果为-123 CF=0 OF=1 (补码表示)