当前位置:文档之家› 第3章 80868088的指令系统(算术运算)

第3章 80868088的指令系统(算术运算)

用CF把低位部分产生的借位引入高位部 分的减法中。
减法指令
SUB与SBB 指令 • 例子 例:写指令,完成32位减法: 12345678H-0123ABCDH 参考答案: mov mov sub sbb ax, bx, ax, bx, 5678H 1234H 0ABCDH 0123H
减法指令
CMP指令 • 一些说明
DIV 和 IDIV指令

说明
• 与标志位的关系:
除法指令对标志位的影响不确定,而且这些 影响没有意义。
• 寻址方式:
DIV mem/reg IDIV mem/reg S可以是8/16位的通用寄存器或存储器操作 数,但不能为立即数或段寄存器。
除法指令
DIV 和 IDIV指令

说明
• DIV用于无符号数除法,IDIV用于有符号数除法。 • 除法是字还是字节除法,由S的宽度决定。 • 若除法运算所得的商数超出累加器的容量,则
乘法指令
MUL指令 • 说明
• 说明:
此指令为无符号数乘法指令,不能用于有符
号数相乘,否则结果可能错误。
影响标志位情况: • 若运算结果的高位字节或高位字有效,即AH0或
DX 0,则将CF和OF同时置1,其他位任意。
S可为8/16位通用寄存器或存储器操作数,不
允许为立即数。
乘法指令
ADD d, s ADC d, s INC d SUB d, s SBB d, s
减法
DEC d NEG d CMP d, s
乘法
MUL s IMUL s
无符号数乘法 字节:(AX) (AL)*(s) 带符号数乘法 字:(DX:AX) (AX)*(s)
算术运算指令
表2 算术运算类指令一览表 ( 续 )
数256 , 需要把AX中的被除数扩展为32位,为此, 只要 (DX) ← 0 即可。 但有符号数除法, 情况更复
杂一些, 扩展时必须考虑符号。

有符号数的最高位是符号位,扩展时,只需用
其填充扩展累加器的高位即可。
十进制调整指令
• 共六条:
AAA DAA AAS DAS AAM AAD
十进制 调整
AAA DAA AAS DAS AAM AAD
加法的ASCII码调整 加法的十进制调整 减法的ASCII码调整 减法的十进制调整 乘法的ASCII码调整 除法的ASCII码调整
加法指令
• 共3条:
ADD
加法
ADC
INC
带进位加法
加 1指令
加法指令
ADD 指令
• 基本格式和功能
• 例:设AL = 00000100B = +4,则执行指
令 NEG AL 后,AL = 11111100B = [-4] 补
乘法指令
• 共两条指令
MUL 无符号数乘法
IMUL
有符号数乘法
乘法指令
MUL指令 • 基本格式和功能
• 指令格式:
MUL
s
• 功能:
字节乘法:(AX)(AL)*(s) 字乘法:(DX:AX)(AX)*(s)
;高字节相加 ;高字节调整
十进制调整指令
DAS指令 • 基本格式和功能

格式:

DAS
功能:
进行压缩BCD码减法调整。
解:
乘法指令
IMUL指令 • 基本格式和功能
• 指令格式:
IMUL s
• 功能&说明:
具体功能与MUL指令类似;
但此指令为有符号数相乘指令,它完成两个带符号
的8/16位二进制数乘的功能。
除法指令
• 共4条相关指令
DIV
IDIV
无符号数除法
有符号数除法
CBW
CWD
符号扩展,字节扩展为字
DAA指令
• 例子
例:设AL=BCD 39,BL=BCD 99,求两数之和,运算过程如下:
0011 1000…..39 ADD AL,BL DAA +1001 1001…..99 1101 0010…..AF=1 +0000 0110…..加6调整>9 1101 1000…调整后高半字 节>9 +0110 0000…加60H调整 0011 1000…结果AL=BCD38 CF=1
算术运算指令
• 有5类指令:
加法指令 减法指令 乘法指令
除法指令 十进制调整指令
算术运算指令
表2 算术运算类指令一览表
指令类型
加法


指令功能
加法 (d)(d)+(s) 带进位加法 (d)(d)+(s)+CF 加1 (d)(d)+1 减法 减1 取负 比较 (d)(d)-(s) (d) (d)-1 (d) 0-(d) (d)-(s) 带借位减法 (d)(d)-(s)-CF
符号扩展,字扩展为双字

除法指令
DIV 和 IDIV指令

基本格式和功能 S S
• 指令格式:

DIV IDIV 执行的操作:
字节 字
(AL) (AX)/(S) 的商 (AH) (AX)/(S) 的余数 (AX) (DX:AX)/(S) 的商
(DX) (DX:AX)/(S) 的余数
除法指令
DST, SRC
(DST) ←(DST)+(SRC)+CF

寻址方式:
ADC mem/reg, mem/reg/data
加法指令
ADC 指令
• 说明
• 与ADD指令一样,ADC同样影响 6个状
态标志位。
• 其中CF在指令中参与计算,计算后根据
结果重新设置CF的值。
加法指令
ADC指令 • 用途
• ADC指令常用在多字节数相加的场合,
INC dest
• 执行的操作:
(dest)←(dest)+1
• 寻址方式:
INC mem/reg
加法指令
INC指令
• 基本格式和功能
• 目的操作数dest可以是8位或16位通用寄
存器或存储单元,但不能为立即数。
• 指令执行时把操作数看成是无符号数,
加1后设置PF,AF,ZF,SF和OF,但特
别要注意,INC指令不影响CF。
• 格式:
CBW CWD
• 功能:
CBW: 将AL中的符号位扩展到AH
CWD: 将AX中的符号位扩展到DX
除法指令 • 符号扩展指令
CBW 和 CWD指令
• 说明
• •
除法指令的被除数的数据宽度应该是除数的2倍。
当被除数宽度不够时,必须进行扩展,
例如:要用存放在 AX中的数65535除以存放BX中的
系统将其当作除数为0处理,自动产生类型0中
断,CPU转去执行类型0中断服务程序作适当处
理,此时所得商数和余数均无效。
除法指令
DIV 和 IDIV指令 指令。 解: MOV AX,00C8H MOV BL,11H DIV BL

例子
• 例:进行无符号数除法:20017,写出
除法指令
DIV 和 IDIV指令
• CMP指令执行后,d与s均保持不变; • CMP指令常用于判断2个数的大小;进行大小比
较时,无符号数与有符号数有不同的判断依据:
减法指令
DEC指令 • 基本格式和功能
• 指令格式:
DEC d
• 执行的操作:
(d)←(d)-1
• 影响标志位:
与INC指令一样,不影响CF标志,但影响其 它5个状态标志。

例子
• 例:进行有符号数除法:(-3200)(+269),
写出指令。
解: MOV NEG MOV MOV IDIV AX,3200 AX ; MOV AX,F380H也可以 DX,0FFFFH ;用CWD指令更准确 BX,010DH BX
除法指令 • 符号扩展指令
CBW 和 CWD指令
• 基本格式和功能

寻址方式: SUB(SBB,CMP) SUB(SBB,CMP) mem/reg, mem/reg mem/reg, data

说明:
d和s不能同为存储器操作数 d不能为立即数。
减法指令
SUB, SBB 和 CMP指令
• 一些说明
• 这三条指令均可进行字节或字的减法运
算;
• 均影响所有6个状态标志位; • SBB指令主要用于大于16位的减法,利
加法的ASCII调整
加法十进制调整
减法的ASCII调整
减法十进制调整
乘法的ASCII调整(分离BCD码)
除法的ASCII调整(分离BCD码)
十进制调整指令
DAA指令 • 基本格式和功能
• •
格式:
DAA
功能:
进行压缩BCD码加法调整。
十进制调整指令
DAA指令 • 说明

DAA指令对AL中的压缩型BCD码(1个字节2 个码)进行调整(仅对AL进行调整)
加法指令
ADD 指令

例子
例1:指令举例: ADD AX,0FF00H ADD BYTE PTR [SI],13H ADD AX,BX 例2:错误的指令: ADD AX,BL ADD [SI+3],[BX][DI] ADD DS,DX
加法指令
ADC 指令
• 基本格式和功能


指令格式:
ADC
执行的操作:
十进制调整指令
DAA指令
• 例子
例:设AX=6698H,BX=2877H,它们均为压缩型BCD码。 请写出能正确实现AX+BX的指令序列。(运算结果放回 AX中。)
相关主题