今天我继续为大家更新乘除指令。
一、乘法指令
乘法指令就两个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
和上面一样,就是将一个数调整为BCD码的形式,这里我不想多说,如果大家感兴趣的话,自己查找相关资料
好了,今天就更到这里吧,明天我会更新逻辑运算指令,还有最后的BCD码这里我讲的不太好,大家有兴趣自己翻阅资料,我理解透彻了,会在讲的。