算术运算类指令
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
18
(2)有进位就有溢出,没有进位就没有溢出?
结论:
有进位不一定有溢出,没有进位不一定没有溢出。
数的表示范围:
• 8位二进制数可以表示十进制数的范围:
8位带符号十进制数的范围:-128~+127
8位无符号十进制数的范围:0~255 • 16位二进制数可以表示十进制数的范围: 16位带符号十进制数的范围:-32768~+32767
符号扩展指令: CBW、CWD
2
特点: 带符号数用补码表示 如 MOV AX, -1 等价于 MOV AX, 0FFFFh 对加、减运算,不区分无符号数、带符号数
对乘、除运算,区分无符号数、带符号数
可进行字节或字操作 影响状态标志
十进制运算方法
当数据用压缩或非压缩BCD码表示时, 为使运算的结果仍为BCD码表示,需对结果进行调整。 十进制运算 = 二进制运算 + 十进制调整
十进制运算 = 二进制运算 + 十进制调整
例
(0000 1000 ) 压缩BCD + (0000 1001) 压缩BCD = (0001 0111 ) 压缩BCD 计算机计算过程 看作压缩BCD
08 09 11
二进制运算
+
0000 1000 0000 1001 0001 0001 0000 0110 0001 0111
DATA1 F8H 60H ACH 74H 3BH ... C1H 36H 9EH D5H 20H ...
初始化,置循环次数CX 清SI、CF 取一个字节加数
取一个被加数字节 相加送内存 (SI)+1送(SI)
DATA2
(CX)-1送(CX) N
(CX)=?0 Y 结束
16
多字节数内存存放
流程图
程序:
执行后: (DX)=3241H CF=1,OF=0,SF=0, ZF=0 (注意:CF和OF的判断方法)
9
OF=1, 8位带符号数相加,和超出范围(-128~+127),
16位带符号数相加,和超出范围(-32768~+32767); 加法:两个正数相加,结果为负;或两个负数相加,结果为负。
( 两个异号数相加不可能溢出)
CF=1
0 0 0 0 0 0 1 0
258
+
2
标志
CF=1,OF=0
CF=1
OF=0 不溢出 异号数相加 不可能有溢出
22
溢出
无符号数溢出
溢出
(3) 带符号数溢出
二进制数 0 0 0 0 1 0 0 1 相 加 +
1 1 1 1 0 0 0 1 1
看作无符号数 9 + 124
看作带符号数 + 9 + +1 2 4
-121
- 11
CF=1
0 1 1 1 1 1 0 0
CF=1,OF=1
380
CF=1
-132
OF=1
标志
溢出
无符号数溢出
溢出 现结果为 124
溢出 现结果为124, 结果错
24
结论:
(1)带符号数相加溢出 根据OF= 1 ?,判断带符号数产生溢出? OF=1,同符号数相加,结果符号与其相反,产生溢出; OF=0, 同符号数相加,结果符号与其相同,不产生溢出; 异号数相加,不可能溢出。 (2)无符号数相加溢出 根据CF= 1 ?,判断无符号数产生溢出? CF=1,无符号数相加产生溢出,但结果并没有错, 只是结果放不下。
SUB、SBB、 CMP为双操作数,DEC、NEG为单操作数 SBB为带进位减法(进位是上条指令运算的进位)。 除DEC不影响CF标志外,其余指令6个状态标志均据结果臵位。 NEG求补运算,等价于用0减去操作数。 其对标志位的影响,由0减去该操作数的过程决定。 26
11
例2 加1指令 : INC AL
执行前 (AL)= FFH FFH + 01H 11 00H 执行后:
(AL)=00H
CF=不变,OF=0,ZF=1,SF=0
12
例3
value 是一个字变量 OFFSET value = 1000H (DS)=2000H,(21000H)=01FFH
执行前 value 21000H
OF DF IF TF SF ZF
AF
PF
CF
ADC带进位加法,实现字以上运算(进位是上条指令运算的进位)
8
例1 加法指令: 编程完成 CFA1H + 62A0H MOV DX,0CFA1H ADD DX,62A0H CFA1H + 62A0H 111 3241H 1100 + 0110 1 1 1 0011 1111 0010 1111 0010 1010 0001 1010 0000 1 0100 0001
1 0 0 0 0 1 0 1
133
+1 3 3
标志
CF=0,OF=1
CF=0
OF=1 溢出 结果为-123 结果错
溢出
带符号数溢出
不溢出
23
(4) 带符号数和无符号数都溢出
二进制数 看作无符号数 看作带符号数
1 0 0 0 0 1 1 1
相 加 + 1 1 1 1 0 1 0 1 +
135
245 +
0 0 0 0 1 1 1 1
15
+1
5
标志
CF=0,OF=0
CF=0
OF=0 不溢出 同符号数相加, 结果符号与其相同
。
溢出
不溢出
不溢出
21
(2) 无符号数溢出
二进制数
0 0 0 0 0 1 1 1 相 加 + 1 1 1 1 1 0 1 1 +
看作无符号数
7 251 +
看作带符号数
+ 7 - 5
第三节 8086/8088的指令系统(续)
三. 算术运算指令
1
三. 算术运算指令 指令分类:
二进制运算 加 减 乘 除 ADD, ADC, INC SUB, SBB, DEC, NEG, CMP MUL, IMUL DIV, IDIV 十进制调整 AAA, DAA AAS, DAS AAM AAD
ADD
AL, 0CH
三组机器码相同: 、、、
看 作 + 无符号数
MOV AL, 241 ADD AL, 12
B0 F1 04
、、、
第一条 指 令 第二条 指 令
(-15) 看 作 + 12 带符号数 (-3)
MOV AL, -15
ADD AL, 12
0C
三组指令执行后的结果均为: (AL)=0FDH, CF=0, OF=0, SF=1, ZF=0
十进制调整
+
17
7
1. 加法运算指令
指令格式 ADD dst, src ADC dst, src INC oprd 执 行 操 作 (dst) ← (dst) + (src) (dst) ← (dst) + (src) + CF (oprd) ← (oprd) + 1
ADD、ADC为双操作数指令 INC为单操作数指令 除INC指令不影响CF外,其余指令6个状态标志均据结果臵位
9
5
0
2
5
ASCII码是一种非压缩BCD码
数字的ASCII的高4位0011无意义;
低4位是以8421码形式表示的十进制数位。
符合非压缩BCD码高4位无意义的规定。
2的ASCII码:
0 0 1 1 0 0 1 0
高4位0011无意义
6
当数据用压缩或非压缩BCD码表示时,
为使运算的结果仍为BCD码表示,需对结果进行调整。
(1) 什么叫溢出?什么叫进位?
(2) 有进位就有溢出,没有进位就没有溢出?
(1)
溢出------是指带符号数的补码溢出。
字长为 n 位带符号数,补码运算能表示范围为: -2 n-1 ~+2 n+1 –1 如果运算结果超出该范围,叫补码溢出,简称溢出。
在溢出时,造成运算错误。
进位------是指运算结果的最高位向更高位的进位。 有进位,CF=1;无进位, CF=0
25
2. 减法运算指令
指令格式 SUB dst, src SBB dst, src DEC oprd NEG oprd CMP oprd1, oprd2 执行操作 (dst) ← (dst) - (src) (dst) ← (dst) - (src) - CF (oprd) ← (oprd) - 1 (oprd) ← 0 - (oprd) (oprd1) - (oprd2)
MOV CX, 5 MOV SI, 0 CLC MOV AL, DATA2[SI] ADC DATA1[SI],AL INC SI DEC CX JNZ LOOPER HLT
; 清SI ;清CF ;(SI)+1 (SI) ;(CX)-1 (CX) ;(CX)0转 ;停机
LOOPER:
17
问题思考:
例 48的BCD码为 ( 0100 1000)BCD
4
根据在内存的存放形式,分压缩BCD码和非压缩 BCD码
压缩BCD码(Packed BCD
format)
用4位二进制数表示一个十进制数位,一字节存放2个BCD码。 整个十进制数形式为一个顺序的4位为一组的数串。 例:9502d 的压缩BCD码应表示为:
3
BCD码( Binary Coded Deci百度文库al ) 用二进制编码表示十进制数。 常用8421 BCD码, 与十进制数码对应关系:
十进制数码 8421 BCD 码 十进制数码 8421 BCD 码 0 0000 5 0101 1 0001 6 0110 2 0010 7 0111 3 0011 8 1000 4 0100 9 1001
16位无符号十进制数的范围:0~65535
19
以8位二进制数为例分析一下数的溢出与进位情况:
下面分4种情况加以讨论: (1) 带符号数和无符号数都不溢出 (2) 无符号数溢出
(3) 带符号数溢出
(4) 带符号数和无符号数都溢出
20
(1) 带符号数和无符号数都不溢出
二进制数 0 0 0 0 0 1 0 0 相 加 + 0 0 0 0 1 0 1 1 + 看作无符号数 4 11 + +1 看作带符号数 + 4 1
FF 01
INC value
或写成: INC [value]
01FFH + 0001H 进位11 0200H 执行后 value 21000H
执行后: (21000H)=0200H CF=不变,OF=0,ZF=0,SF=0 注意: INC
00
02
value是内存单元内容加1,而非地址加1
13
例4 将buffer为首的4个字节内存内容相加,存放在AL中。 …... MOV CX, 4 LEA BX, buffer MOV AL, 0 buffer 1A exit: ADD AL, [BX] B7 INC BX C5 DEC CX D6 JNZ exit 注意若编程如下, MOV CX, 4 MOV AL, 0 exit: ADD AL, [buffer] INC buffer DEC CX JNZ exit 不能实现, 为什么? 实现的是(1A)+(1B)+(1C)+(1D) 指令INC buffer 将buffer指向的内容加1, 而不是地址buffer加1
减法: 两个异号数相减,结果与减数相同。
( 两个同号数相减不可能溢出) 运算结果错误
CF=1, 8位无符号数相加,和超过255,
16位无符号数相加,和超过65535。
运算结果准确
其他条件标志(SF,AF,PF,ZF)根据定义设定。
10
对加、减运算,CPU计算时不区分无符号数、带符号数
二进制 运 算 + F1 H 0C H FD H 241 12 253 MOV AL, 0F1H
执行完①、②:(AX)= D389H CF=1, OF=0, SF=1, ZF=0 执行完③、④:(BX)= 0008H CF=0, OF=0, SF=0, ZF=0 结果存放在: 0008 D389 (BX) (AX)
15
用途举例 计算两个多字节数相加 3B74AC60F8H+20D59E36C1H=? 两个多字节数存放在: 开始 DATA1,DATA2的开始单元。
14
例5 带进位加:两双字相加 0002F365H + 0005 E024 H = ? 分析: 8086/8088只能按字节或字相加。 位数在字以上的操作数,先加低位,再加高位, 加高位时加入从低位产生的进位。 0002 F365 H + 0005 E024 H 进位1 0008 D389 H MOV ADD MOV ADC AX,0F365H AX,0E024H BX,0002H BX,0005H ① ② ③ ④
1 0 0 1 0 1 0 1 0 0 0 0 0 0 1 0
9
5
0
2
非压缩BCD码(Unpacked BCD format)
用8位为一组表示一个十进制数位,一字节存放1个BCD码。 8位中的低4位表示8421的BCD码,而高4位没有意义。 例:9502d的非压缩BCD码则表示为:
1 0 0 1 0 1 0 1 0 0 0 0 0 0 1 0
(2)有进位就有溢出,没有进位就没有溢出?
结论:
有进位不一定有溢出,没有进位不一定没有溢出。
数的表示范围:
• 8位二进制数可以表示十进制数的范围:
8位带符号十进制数的范围:-128~+127
8位无符号十进制数的范围:0~255 • 16位二进制数可以表示十进制数的范围: 16位带符号十进制数的范围:-32768~+32767
符号扩展指令: CBW、CWD
2
特点: 带符号数用补码表示 如 MOV AX, -1 等价于 MOV AX, 0FFFFh 对加、减运算,不区分无符号数、带符号数
对乘、除运算,区分无符号数、带符号数
可进行字节或字操作 影响状态标志
十进制运算方法
当数据用压缩或非压缩BCD码表示时, 为使运算的结果仍为BCD码表示,需对结果进行调整。 十进制运算 = 二进制运算 + 十进制调整
十进制运算 = 二进制运算 + 十进制调整
例
(0000 1000 ) 压缩BCD + (0000 1001) 压缩BCD = (0001 0111 ) 压缩BCD 计算机计算过程 看作压缩BCD
08 09 11
二进制运算
+
0000 1000 0000 1001 0001 0001 0000 0110 0001 0111
DATA1 F8H 60H ACH 74H 3BH ... C1H 36H 9EH D5H 20H ...
初始化,置循环次数CX 清SI、CF 取一个字节加数
取一个被加数字节 相加送内存 (SI)+1送(SI)
DATA2
(CX)-1送(CX) N
(CX)=?0 Y 结束
16
多字节数内存存放
流程图
程序:
执行后: (DX)=3241H CF=1,OF=0,SF=0, ZF=0 (注意:CF和OF的判断方法)
9
OF=1, 8位带符号数相加,和超出范围(-128~+127),
16位带符号数相加,和超出范围(-32768~+32767); 加法:两个正数相加,结果为负;或两个负数相加,结果为负。
( 两个异号数相加不可能溢出)
CF=1
0 0 0 0 0 0 1 0
258
+
2
标志
CF=1,OF=0
CF=1
OF=0 不溢出 异号数相加 不可能有溢出
22
溢出
无符号数溢出
溢出
(3) 带符号数溢出
二进制数 0 0 0 0 1 0 0 1 相 加 +
1 1 1 1 0 0 0 1 1
看作无符号数 9 + 124
看作带符号数 + 9 + +1 2 4
-121
- 11
CF=1
0 1 1 1 1 1 0 0
CF=1,OF=1
380
CF=1
-132
OF=1
标志
溢出
无符号数溢出
溢出 现结果为 124
溢出 现结果为124, 结果错
24
结论:
(1)带符号数相加溢出 根据OF= 1 ?,判断带符号数产生溢出? OF=1,同符号数相加,结果符号与其相反,产生溢出; OF=0, 同符号数相加,结果符号与其相同,不产生溢出; 异号数相加,不可能溢出。 (2)无符号数相加溢出 根据CF= 1 ?,判断无符号数产生溢出? CF=1,无符号数相加产生溢出,但结果并没有错, 只是结果放不下。
SUB、SBB、 CMP为双操作数,DEC、NEG为单操作数 SBB为带进位减法(进位是上条指令运算的进位)。 除DEC不影响CF标志外,其余指令6个状态标志均据结果臵位。 NEG求补运算,等价于用0减去操作数。 其对标志位的影响,由0减去该操作数的过程决定。 26
11
例2 加1指令 : INC AL
执行前 (AL)= FFH FFH + 01H 11 00H 执行后:
(AL)=00H
CF=不变,OF=0,ZF=1,SF=0
12
例3
value 是一个字变量 OFFSET value = 1000H (DS)=2000H,(21000H)=01FFH
执行前 value 21000H
OF DF IF TF SF ZF
AF
PF
CF
ADC带进位加法,实现字以上运算(进位是上条指令运算的进位)
8
例1 加法指令: 编程完成 CFA1H + 62A0H MOV DX,0CFA1H ADD DX,62A0H CFA1H + 62A0H 111 3241H 1100 + 0110 1 1 1 0011 1111 0010 1111 0010 1010 0001 1010 0000 1 0100 0001
1 0 0 0 0 1 0 1
133
+1 3 3
标志
CF=0,OF=1
CF=0
OF=1 溢出 结果为-123 结果错
溢出
带符号数溢出
不溢出
23
(4) 带符号数和无符号数都溢出
二进制数 看作无符号数 看作带符号数
1 0 0 0 0 1 1 1
相 加 + 1 1 1 1 0 1 0 1 +
135
245 +
0 0 0 0 1 1 1 1
15
+1
5
标志
CF=0,OF=0
CF=0
OF=0 不溢出 同符号数相加, 结果符号与其相同
。
溢出
不溢出
不溢出
21
(2) 无符号数溢出
二进制数
0 0 0 0 0 1 1 1 相 加 + 1 1 1 1 1 0 1 1 +
看作无符号数
7 251 +
看作带符号数
+ 7 - 5
第三节 8086/8088的指令系统(续)
三. 算术运算指令
1
三. 算术运算指令 指令分类:
二进制运算 加 减 乘 除 ADD, ADC, INC SUB, SBB, DEC, NEG, CMP MUL, IMUL DIV, IDIV 十进制调整 AAA, DAA AAS, DAS AAM AAD
ADD
AL, 0CH
三组机器码相同: 、、、
看 作 + 无符号数
MOV AL, 241 ADD AL, 12
B0 F1 04
、、、
第一条 指 令 第二条 指 令
(-15) 看 作 + 12 带符号数 (-3)
MOV AL, -15
ADD AL, 12
0C
三组指令执行后的结果均为: (AL)=0FDH, CF=0, OF=0, SF=1, ZF=0
十进制调整
+
17
7
1. 加法运算指令
指令格式 ADD dst, src ADC dst, src INC oprd 执 行 操 作 (dst) ← (dst) + (src) (dst) ← (dst) + (src) + CF (oprd) ← (oprd) + 1
ADD、ADC为双操作数指令 INC为单操作数指令 除INC指令不影响CF外,其余指令6个状态标志均据结果臵位
9
5
0
2
5
ASCII码是一种非压缩BCD码
数字的ASCII的高4位0011无意义;
低4位是以8421码形式表示的十进制数位。
符合非压缩BCD码高4位无意义的规定。
2的ASCII码:
0 0 1 1 0 0 1 0
高4位0011无意义
6
当数据用压缩或非压缩BCD码表示时,
为使运算的结果仍为BCD码表示,需对结果进行调整。
(1) 什么叫溢出?什么叫进位?
(2) 有进位就有溢出,没有进位就没有溢出?
(1)
溢出------是指带符号数的补码溢出。
字长为 n 位带符号数,补码运算能表示范围为: -2 n-1 ~+2 n+1 –1 如果运算结果超出该范围,叫补码溢出,简称溢出。
在溢出时,造成运算错误。
进位------是指运算结果的最高位向更高位的进位。 有进位,CF=1;无进位, CF=0
25
2. 减法运算指令
指令格式 SUB dst, src SBB dst, src DEC oprd NEG oprd CMP oprd1, oprd2 执行操作 (dst) ← (dst) - (src) (dst) ← (dst) - (src) - CF (oprd) ← (oprd) - 1 (oprd) ← 0 - (oprd) (oprd1) - (oprd2)
MOV CX, 5 MOV SI, 0 CLC MOV AL, DATA2[SI] ADC DATA1[SI],AL INC SI DEC CX JNZ LOOPER HLT
; 清SI ;清CF ;(SI)+1 (SI) ;(CX)-1 (CX) ;(CX)0转 ;停机
LOOPER:
17
问题思考:
例 48的BCD码为 ( 0100 1000)BCD
4
根据在内存的存放形式,分压缩BCD码和非压缩 BCD码
压缩BCD码(Packed BCD
format)
用4位二进制数表示一个十进制数位,一字节存放2个BCD码。 整个十进制数形式为一个顺序的4位为一组的数串。 例:9502d 的压缩BCD码应表示为:
3
BCD码( Binary Coded Deci百度文库al ) 用二进制编码表示十进制数。 常用8421 BCD码, 与十进制数码对应关系:
十进制数码 8421 BCD 码 十进制数码 8421 BCD 码 0 0000 5 0101 1 0001 6 0110 2 0010 7 0111 3 0011 8 1000 4 0100 9 1001
16位无符号十进制数的范围:0~65535
19
以8位二进制数为例分析一下数的溢出与进位情况:
下面分4种情况加以讨论: (1) 带符号数和无符号数都不溢出 (2) 无符号数溢出
(3) 带符号数溢出
(4) 带符号数和无符号数都溢出
20
(1) 带符号数和无符号数都不溢出
二进制数 0 0 0 0 0 1 0 0 相 加 + 0 0 0 0 1 0 1 1 + 看作无符号数 4 11 + +1 看作带符号数 + 4 1
FF 01
INC value
或写成: INC [value]
01FFH + 0001H 进位11 0200H 执行后 value 21000H
执行后: (21000H)=0200H CF=不变,OF=0,ZF=0,SF=0 注意: INC
00
02
value是内存单元内容加1,而非地址加1
13
例4 将buffer为首的4个字节内存内容相加,存放在AL中。 …... MOV CX, 4 LEA BX, buffer MOV AL, 0 buffer 1A exit: ADD AL, [BX] B7 INC BX C5 DEC CX D6 JNZ exit 注意若编程如下, MOV CX, 4 MOV AL, 0 exit: ADD AL, [buffer] INC buffer DEC CX JNZ exit 不能实现, 为什么? 实现的是(1A)+(1B)+(1C)+(1D) 指令INC buffer 将buffer指向的内容加1, 而不是地址buffer加1
减法: 两个异号数相减,结果与减数相同。
( 两个同号数相减不可能溢出) 运算结果错误
CF=1, 8位无符号数相加,和超过255,
16位无符号数相加,和超过65535。
运算结果准确
其他条件标志(SF,AF,PF,ZF)根据定义设定。
10
对加、减运算,CPU计算时不区分无符号数、带符号数
二进制 运 算 + F1 H 0C H FD H 241 12 253 MOV AL, 0F1H
执行完①、②:(AX)= D389H CF=1, OF=0, SF=1, ZF=0 执行完③、④:(BX)= 0008H CF=0, OF=0, SF=0, ZF=0 结果存放在: 0008 D389 (BX) (AX)
15
用途举例 计算两个多字节数相加 3B74AC60F8H+20D59E36C1H=? 两个多字节数存放在: 开始 DATA1,DATA2的开始单元。
14
例5 带进位加:两双字相加 0002F365H + 0005 E024 H = ? 分析: 8086/8088只能按字节或字相加。 位数在字以上的操作数,先加低位,再加高位, 加高位时加入从低位产生的进位。 0002 F365 H + 0005 E024 H 进位1 0008 D389 H MOV ADD MOV ADC AX,0F365H AX,0E024H BX,0002H BX,0005H ① ② ③ ④
1 0 0 1 0 1 0 1 0 0 0 0 0 0 1 0
9
5
0
2
非压缩BCD码(Unpacked BCD format)
用8位为一组表示一个十进制数位,一字节存放1个BCD码。 8位中的低4位表示8421的BCD码,而高4位没有意义。 例:9502d的非压缩BCD码则表示为:
1 0 0 1 0 1 0 1 0 0 0 0 0 0 1 0