指令系统(二)算术运算指令

算术运算指令
涉及两种类型数据:无符号数和有符号数。对加减法指令,无符号数和有符号数可采用同一套指令,但应注意:
*参加的操作数必须都是无符号数或都是有符号数
*需使用不同的标志位来检查无符号数和有符号数的运算结果是否溢出。
两个8位数相加时有4种情况:
(1)无符号数和有符号数均不溢出
(2)无符号数溢出
(3)有符号数溢出
(4)无符号数和有符号数均溢出
上面四种情况说明,CF标志可用来表示无符号数的溢出,OF标志可用来表示有符号数的溢出。
有符号数的溢出是一种出错状态,在运算过程中应当避免。
1.加法指令
共有3条
(1)不带进位的加法指令ADD
格式ADD acc,data
    ADD mem/reg,data
    Add mem/reg1,mem/reg2
ADD指令对标志位都有影响
(2)带进位位的加法指令ADC
ADC指令在形式上和功能上都与ADD类似,只是相加时换药包括进位标志CF的内容
ADC指令主要用于多字节加法运算中
(3)加1指令INC(单操作数指令)
格式 INC reg/mem
SF=1 结果为负 SF=0 else
ZF=1 结果为0  ZF=0 else
CF=1 和的最高位有效位向高位的进位 CF=0 else
OF=1 两个操作数符号相同,而结果符号与之相反 OF=0 else 
2.减法指令
(1)不考虑借位的减法指令SUB
格式:SUB dest,src
操作:dest<--(dest)-(src)
注意:*源和目的操作数不能同时为存储器操作数
      *立即数不能为目的操作数
(2)考虑借位的减法指令SBB
SBB多用于多字节的减法
格式:SBB dest,src
操作:dest<---(dest)-(src)-(CF)
(3)减1指令DEC
格式:DEC opr
操作:opr<-(opr)-1
(4)求补指令NEG
格式:NEG opr
操作:opr<--0-(opr)
对一个操作数取补码相当于用0减去此操作数,故利用NEG可得到负数的绝对值
CF=1表示无符号数减法溢出
OF=1表示带符号数减法溢出
NEG指令对CF/OF的影响
CF:操作数为0时,求补的结果使CF=0,否则CF=1.
OF:字节运算对-128求补或字运算对-32768求补时OF=1,否则OF=0
(5)比较指令CMP
格式 CMP dest,src
操作:(dest)-(src)
CMP也是两个操作数相减,但结果不送目标操作数,其结果只反映在标志位上
比较指令在使用时,一般在其后紧跟一条条件转移指令,判断比较结果的转向
根据ZF判断是否相等
若不等
*比较的是两个无符号数
若CF=0,则dest>src
若CF=1,则dest<src
*比较的是两个有符号数
若OF异或SF=0则dest>=src
若OF异或SF=1则dest=<src
3.乘法指令
进行乘法时:8位*8位-->16位乘积
            16位*16位-->32位乘积
(1)无符号数的惩罚指令MUL(MEM/REG)
格式:MUL src
操作:字节操作数(AX)<-(AL)*(src)
      字操作数 (DX,AX)<-(AX)*(src)
(2)有符号数乘法指令IMUL
格式与MUL指令类似,只是要求两操作数均为有符号数
注意:AL(AX)为隐含的乘数寄存器
AX(DX,AX)为隐含的乘积寄存器
SRC不能为立即数
除CF和OF外,对其他标志位无定义
乘法指令对CF/OF的影响
MUL指令:CF/OF=00 乘积的高一半为0 else 11
IMUL指令:CF/OF=00 乘积的高一半是低一半的符号扩展 else 11
4.除法指令
进行除法时:16位/8位-->8位商
            32位/16位-->16位商
对被除数、商及余数存放有如下规定
            被除数         商余数
字节除法    AX              AL AH
字除法      DX:AX          AX DX
(1)无符号数除法指令
格式:DIV SRC
字节操作  (AL)  (AX) / (SRC) 的商
          (AH)  (AX) / (SRC) 的余数
字操作   (AX)  (DX, AX) / (SRC) 的商
         (DX)  (DX, AX) / (SRC) 的余数
(2)有符号数除法指令IDIV
格式:IDIV SRC
注意:
AX(DX,AX)为隐含的被除数寄存器
AL(AX)为隐含的商寄存器
AH(DX)为隐含的余数寄存器
SRC不能为立即数


关于除法中字长扩展问题

*除法运算要求被除数字长是除数字长的两倍,若不满足则需对被除数进行扩展,否则产生错误
*对于无符号数除法扩展,只需将AH或DX清零即可
*对于有符号数而言,则是符号位的扩展。可使用符号扩展指令CBW和CBD

5.BCD码运算的十进制调整指令
专用于对BCD码运算的结果进行调整
包括:AAA,DAA,AAS,DAS,AAM,AAD
均为隐含寻址,隐含的操作数为AL和AH
(1)加法的十进制调整指令
AAA:对AL中非压缩BCD码求和的结果进行调整
如果AL的低4位>9或者AF=1,则
AL<---(AL)+6  (AH)<--(AH)+1 AF<--1
CF<--AF
DAA:压缩BCD码加法调整
两个压缩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之后
(2)减法的十进制调整指令
AAS:对AL中非压缩BCD码求差的结果进行调整
DAS:压缩BCD码减法的十进制调整指令
(3)乘法的十进制调整指令AAM
(4)除法的十进制调整指令AAD

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值