理论教育 数据加工处理类指令-微机原理与接口技术复习指导与习题解答

数据加工处理类指令-微机原理与接口技术复习指导与习题解答

时间:2023-11-04 理论教育 版权反馈
【摘要】:数据加工处理类指令包括算术运算指令与逻辑运算指令。这类指令执行后影响状态标志位。如实现不同类型数据的加法运算都使用ADD指令,对于无符号数加法结果是否溢出的判断,应检测CF标志位;而对于符号数应检测OF标志位。对于未组合的BCD码相加后要使用调整指令AAA,而对于组合的BCD码相加后要使用调整指令DAA。对于BCD码减法也有类似的调整指令。乘法调整指令在乘法指令之后,而除法调整指令必须放在除法指令之前。

数据加工处理类指令-微机原理与接口技术复习指导与习题解答

数据加工处理类指令包括算术运算指令与逻辑运算指令。

1.算术运算指令

算术运算指令包括加、减、乘、除、比较指令。这类指令执行后影响状态标志位。

(1)加法指令:ADD、ADC、INC、AAA、DAA

加法指令可以完成不带进位和带进位的加法、加1,以及各种类型的BCD数相加后的调整运算。

(2)减法指令:SUB、SBB、DEC、AAS、DAS、NEG

减法指令共有6种,前5种与加法对应,而操作是减法运算,最后一种求补指令NEG相当于用0减去源操作数,对标志位的影响与其他减法指令相同。

ADD、ADC、SUB、SBB对6个状态标志位SF、ZF、AF、PF、OF、CF全都影响;而INC、DEC只影响5个标志位,对CF标志位不影响。

加/减指令执行后对标志位的影响要注意:AF只与低4位运算有关,而与高位运算无关;PF只与低8位运算有关,而与高位运算(比如16位数加/减)无关;OF的置位则根据两操作数的符号及其变化情况来决定,只有下面几种情况会产生溢出:

·正数+正数=负数(正溢出);

·负数+负数=正数(负溢出);

·正数-负数=负数(正溢出);

·负数-正数=正数(负溢出)。

(3)乘法指令:MUL、IMUL和AAM

MUL为无符号数相乘,IMUL为符号数相乘,AAM是对未组合型BCD数乘法结果进行调整的指令。

乘法在实现两字节(8位×8位)相乘时乘积在AX中,两字(16位×16位)相乘时乘积在DX和AX中,乘法不会产生溢出和进位。乘法指令只影响CF和OF标志位,这时用CF和OF来表示乘积的有效位数。对于MUL,若运算结果乘积的高一半是0,则标志位CF=OF=0,否则,CF=OF=1;对于IMUL,若运算结果乘积的高一半是低一半符号位的扩展,则CF=OF=0,否则,CF=OF=1。

(4)除法指令:DIV、IDIV、AAD、CBW、CWD

DIV、IDIV分别为无符号数除法和带符号数除法,它们对所有的标志位均无定义。

除法指令要求被除数长度是除数长度的2倍,当被除数和除数的字长一样时,则必须用CBW和CWD指令扩展成16位或者32位。AAD是未组合BCD码除法运算调整指令,在除法运算前首先使用该指令将未组合的BCD码转换成二进制数,然后再进行除法运算。

应该注意,除法指令的被除数一定在AX(16位除以8位)或DX和AX(32位除以16位)中,而商在AL(或AX)中,余数在AH(或DX)中。

还应注意,如果除数为0,或除数相对于被除数而言,绝对值太小,例如被除数的高8位绝对值大于除数的绝对值或被除数的高16位绝对值大于除数的绝对值,商就会产生溢出,这时系统转入0型中断。(www.daowen.com)

(5)比较指令:CMP

比较指令CMP执行后只影响标志位,不改变运算结果,常用于分支程序设计中。比较后标志置位与减法一样。

两个数进行比较时,要考虑是作为无符号数进行比较还是作为符号数进行比较,因为两者判断大小的标志位(即标准)是不一样的。

当两个无符号数进行比较时,用借位标志位CF来判断,显然大数减去小数不会产生借位,CF=0,而小数减去大数就会有借位,CF=1。

当两个符号数比较大小时,将溢出标志位OF和符号标志位SF结合起来一起考虑,才能判断两数的大小。共有下面4种情况。

在没有溢出的情况下,即OF=0时,SF=0,则A>B;SF=1,则A<B。

在发生溢出的情况下,即OF=1时,SF=1,则A>B;SF=0,则A<B。

上述4种情况可以用一句话概括:OF与SF相同时,A>B;OF与SF不同时,A<B。

说明

算术运算指令可以处理无符号的二进制数、带符号的二进制数、未组合的十进制数和组合的十进制数4种类型的数据。对不同类型的数据完成相同的算术运算所用的指令基本相同,只是在这些指令后所用的判断或调整指令不同而已。如实现不同类型数据的加法运算都使用ADD指令,对于无符号数加法结果是否溢出的判断,应检测CF标志位;而对于符号数应检测OF标志位。对于未组合的BCD码相加后要使用调整指令AAA,而对于组合的BCD码相加后要使用调整指令DAA。对于BCD码减法也有类似的调整指令。

加、减、乘、除指令都是针对二进制数运算的,为了能对十进制数进行运算,算术运算指令中专门设置了各种BCD码调整指令,即加法调整指令AAA、DAA,减法调整指令AAS、DAS,乘法调整指令AAM,除法调整指令AAD。BCD码加、减调整既可以对未组合的BCD码进行,也可以对组合的BCD码进行;乘、除调整只能对未组合的BCD码进行。乘法调整指令在乘法指令之后,而除法调整指令必须放在除法指令之前。BCD码用4位二进制数表示一位十进制数,所以1010B~1111B这6个二进制数对于BCD码是非法代码。在BCD码运算中,若出现上述6个非法代码就要进行调整,如何调整请参考例3.4。未组合的BCD码是指8位二进制数中低四位是BCD码,高四位为0;组合的BCD码是指8位二进制数表示的2位BCD码,高4位表示BCD码的十位,低4位表示BCD码的个位。

2.逻辑运算指令

(1)单操作数逻辑指令

单操作数逻辑指令主要指移位和循环移位指令,包括算术左、右移(SAL、SAR),逻辑左、右移(SHL、SHR);不包括CF的小循环移位(ROL、ROR),但包括CF的大循环移位(RCL、RCR)。这些移位指令有一些共同特点,即都与标志位CF打交道;移位次数可以是1~255;当移位次数大于1时,必须将其值置入CL中。

单操作数逻辑指令对标志位的影响:CF位显然与移位结果有关,因为各种移位都是针对CF的;OF位只有当移位次数为1时才有效,移位后最高位的值改变了,则OF=1,否则OF=0,OF在这里表示该数移位前后的符号位是否相同;循环移位指令只影响CF、OF位,算术与逻辑移位则根据移位后的结果置SF、ZF、PF位,AF无定义。

NOT(逻辑非)指令是对操作数求反,对标志位无影响。

(2)双操作数逻辑指令

双操作数逻辑指令包括与(AND)、或(OR)、异或(XOR)和检测(TEST)指令。这些指令执行后,标志位CF=0,OF=0,而标志位SF、ZF、PF则根据逻辑操作结果置位,AF位无定义。

因为一个操作数与其自身异或后为0,所以常用XOR指令将寄存器或存储器单元清零。逻辑运算指令经常用来使目的操作数的某些位置1、清零或者测试某些位。一般对某些位置1用OR,清零用AND,取反用XOR。

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈