8086指令(II)

算术运算指令

①加法类指令

②减法类指令

③乘法指令

④除法指令

⑤BCD吗指令


一、加法类指令

首先我么们先看加法类指令三个(add,adc,inc)

1)不带进位位的加法指令ADD

add用来执行2个字节或2个字的相加操作,运算时不考虑CF位


ADD DST,SRC   ;DST<--(DST)+(SRC)


ADD影响OF,SF,ZF,AF,PF,CF标志


2)带进位位的加法指令ADC

ADC在功能上和ADD类似,只是有一点区别,即执行ADC指令时,将进位标志CF的值加进和中。

ADC DST,SRC         ;DST<--(DST)+(SRC)+CF


ADC指令多用于多字节相加运算,如进行两个8字节(64位)数据相加,应先用ADD指令将低32位相加,再用ADC指令将高32位相加,此时会把低位字节产生的进位传递到高位字节运算中。


ADC影响OF,SF,ZF,AF,PF,CF.标志位


3)增量指令INC

INC指令只有一个操作数,指令执行时,将操作数内容加1,


INC指令影响AF,OF,PF,SF,ZF.

注意:INC指令不影响进位标志CF


二、减法类指令(SUB,SBB,CMP,DEC,NEG)

1)比考虑借位的减法指令SUB

SUB和上面的加法类似,也是不带借位的减

SUB [BP+2],CL               ;将ss段中的BP+2所指的单元中的值减去CL中的值,结果在BP+2所指堆栈单元中


SUB影响的标志位OF,ZF,AF,SF,PF,CF



2)考虑借位的减法指令SBB

和上面的ADC类似,就是SBB在执行减法运算时还要减去CF的值。


SBB AX,2530H       ;将AX中的内容减去2530H,并减去进位位CF的值

和上面类似,这里不在重复


3)减量指令DEC

这又和上面的INC类似,就是将操作数减一,同样不会影响CF,只是执行减一而已。

和上面都一样,这里不在重复。


4)求补指令NEC

其实我更喜欢叫它求负指令,它就是对给出的操作数求一个负,然后回送,可是机器内部是以补码的形式存储的,所以就是求补指令啦。


NEG影响的标志位AF,CF,ZF,PF,SF,OF'


注意:①如果操作数的值为80H、8000H、80000000H,那么执行求补指令会溢出,结果没有变化,但溢出标志OF置1

②此指令执行时,通常使CF为1,只有当操作数为0时,CF才为0,因为此指令是用0减去某个操作数,所以除非为0,通常都会产生借位。


5)比较指令CMP

cmp也是执行两个数相减操作,但不送回相减结果,会影响标志位

此指令会影响标志位AF,CF,OF,PF,SF,ZF


那么如果判断比较结果呢?

答:如果比较的两个操作数相等的话,ZF = 1,根据ZF就可判断两数是否相等


①两个无符号比较

无符号相减时CF,就是借位标志,如果CF为0,表示无借位,则被减数大,若果,CF为1,则表示有借位,则减数大


②两个有符号数比较

看符号标志SF,而符号标志SF总是和结果的最高位相同,如果SF为0,表示被减数大,如果SF为1,则表示减数大


一、乘法指令

乘法指令就两个MUL,IMUL

①无符号乘法指令MUL


无符号字节乘法:AX <-- (AL) * (SRC)

无符号字乘法:  DX.AX <-- (AX) * (SRC)




例如:

MUL CX        ;ax 和 cx 中连个16位相乘,结果在dx 和 ax中,dx放高位,ax放低位


对标志位的影响:若乘积的高一半(AH/DX)为0,则OF = CF = 0,否则 OF=CF=1;



②有符号的乘法指令IMUL


有符号字节乘法:AX <-- (AL) * (SRC)

有符号字乘法 : DX.AX <-- (AX) * (SRC)


例如:

IMUL CL          ;AL中与CL中的两个8位有符号数相乘,结果在AX中


对标志位的影响:若乘积的高一半是低一半的符号扩展,则OF=CF=0;否则均为1.


乘法指令对其它标志位没有定义,不知到到底什么值。


二、除法指令DIV,IDIV


①无符号除法DIV


无符号字节除法(AX)/(SRC)    AL←商,AH←余数
无符号字除法(DX.AX)/(SRC)    AX←商,DX←余数


例如:

DIV CL        ;AX中的数据除以CL中的数据,商在AL中,余数在AH中


②有符号除法IDIV

有符号字节除法(AX)/(SRC)           AL←商,AH←余数
有符号字除法(DX.AX)/(SRC)         AX←商,DX←余数


说明:除法运算时,要求被除数的数位是除数的2倍,否则就必须将被除数进行扩展

除法运算对AF,CF,OF,PF,SF,ZF都是不确定的。


三、类型转换指令CBW/CWD

C:convert(转换)  B:byte(字节)   W:word(字)      D:double(双字)     自己理解的哈!如果不对,谢谢指出

功能:就是符号扩展,将字节扩展为字,将字扩展为双字,以适应除法运算的要求


四、BCD码指令

实际应该叫BCD吗调整指令,它其实就是对数据的一种调整。

可用四位2进制码表示1个十进制码,这个就叫做BCD码。

BCD码有两类:1.组合的BCD码(一个字节表示2位BCD码,就是通常的8421码),2.非组合BCD码(1个字节只用低4位来表示BCD码,高四位为0)。


①组合BCD加法调整指令DAA

比如:8+7 = 15

   0000 1000

+ 0000 0111

——————

    0000 1111

显然不对,所以进行调整 ,+6,(即加上110)


9+9 = 18

   0000 1001

+ 0000 1001

——————

   0001 0010

不对,低四位向高四位进位时,内部机器是逢16进1,而BCD码要求是逢十进一,就必须调整加上011,这是辅助进位标志AF就有用了,它如果为1,就表示有进位,这是加011,就可以调整过来了

调整:4位二进制码对应的BCD码大于9时,则加6调整,低四位往高四位进位时,加6调整


②组合BCD码减法指令DAS


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值