首页 理论教育 二进制算术运算指令

二进制算术运算指令

时间:2022-02-28 理论教育 版权反馈
【摘要】:本节讨论二进制算术运算指令。二进制算术运算指令可以实现二进制算术运算,参与运算的操作数和计算结果都是二进制数,它们可以是8位、16位的无符号数和带符号数。这类指令均不影响标志。但是可以用以下指令序列代替本程序中的DEC DI,以保证得到正确的CF值。从该例可以看出,选取合适的算法、恰当的指令、灵活的寻址方式对汇编语言程序设计人员来讲十分重要,它可以达到事半功倍的效果。

2.3.2 二进制算术运算指令

本节讨论二进制算术运算指令。对于其中的双操作数指令,其两个操作数寻址方式的限定同MOV指令,即目标操作数不允许是立即数和CS段寄存器,两个操作数不能同时为存储器操作数等。除类型转换指令外,其他指令均影响某些运算结果特征标志。

二进制算术运算指令可以实现二进制算术运算,参与运算的操作数和计算结果都是二进制数(虽然在书写源程序时可以用十进制形式表示,但经汇编后成为二进制形式),它们可以是8位、16位的无符号数和带符号数。带符号数在机器中用补码形式表示,最高位为符号位,0表示正数,1表示负数。各指令如表2-3所示。

表2-3 算术运算指令

img44

续表

img45

1.类型转换指令

这类指令实际上是把操作数的最高位进行扩展,用于处理带符号数运算的操作数类型匹配问题。这类指令均不影响标志。

(1)字节扩展成字指令CBW。

格式:CBW

功能:把AL寄存器中的符号位值扩展到AH中。

【例2-25】

MOV AL,05H

CBW;执行结果为(AX)=0005H

MOV AL,98H

CBW;执行结果为(AX)=0FF98H

(2)字扩展成双字指令CWD。

格式:CWD

功能:把AX寄存器中的符号位值扩展到DX中。

【例2-26】

MOV AX,0005H

CWD;执行结果为(DX)=0,AX值不变,即00000005H

MOV AX,9098H

CWD;执行结果(DX:AX)=0FFFF9098H

2.二进制数加法指令

这类指令中的每一条均适用于带符号数或无符号数的运算。

(1)加法指令ADD。

格式:ADD DST,SRC

功能:(DST)+(SRC)→DST

说明:对于操作数的限定同MOV指令,即源和目标均可以是8位、16位的操作数;要注意源和目标操作数的类型匹配,即它们的长度要一致;目标不能是立即数和CS段寄存器,两个操作数不能同时为存储器操作数等。

标志:影响OF、SF、ZF、AF、PF、CF标志。

【例2-27】

ADD AX,3508H

ADD CL,6

(2)带进位加法指令ADC。

格式:ADC DST,SRC

功能:(DST)+(SRC)+CF→DST

说明:除了操作时要加进位标志CF的值外,其他要求同ADD。因为它考虑CF,所以可用于数值是多字节、多字、多双字的加法程序。

标志:影响OF、SF、ZF、AF、PF、CF标志。

【例2-28】 ADC AX,3509H;执行后(AX)=(AX)+3509H+CF

(3)加1指令INC。

格式:INC DST

功能:(DST)+1→DST

说明:使用本指令可以很方便地实现地址指针或循环次数的加1修改。

标志:除了不影响CF标志外,影响其他5个算术运算结果标志。

对于两个二进制数进行加法运算,如果把数解释为无符号数,其结果可能是溢出的,而如果解释为带符号数,其结果可能是不溢出的;反之也一样。其判定条件是:无符号数相加结果若使CF置1,则表示溢出;带符号数相加结果若使OF置1,则表示溢出。一旦发生溢出,结果就不正确了。表2-4以8位数为例说明了这种情况。

表2-4 对二进制数加法结果的解释

img46

从表2-4的b种情况可以看出,最高位向前有进位,该进位记录在CF中,7加251应该等于258,但在有效的8位结果中,只看到2,这是因为丢掉了28=256,所以对于无符号数来说,通过判断CF=1,便知该结果是不正确的。对于c种情况,因为两同号数相加,和的符号却与加数符号相反,所以对于带符号数来说,该结果是不正确的,发生这种情况后系统会置OF=l,可通过OF来判断。

3.二进制数减法指令

这类指令中的每一条均适用于带符号数和无符号数运算。

(1)减法指令SUB。

格式:SUB DST,SRC

功能:(DST)-(SRC)→DST

说明:除了实现减法功能外,其他要求同ADD的要求。

标志:影响OF、SF、ZF、AF、PF、CF标志。

【例2-29】

SUB AX,0035H

SUB CL,6

(2)带借位减法指令SBB。

格式:SBB DST,SRC

功能:(DST)-(SRC)-CF→DST

说明:除了操作时要减进位标志CF的值外,其他要求同ADC的要求。因为考虑CF,所以可用于数值是多字节、多字的减法程序。

标志:影响OF、SF、ZF、AF、PF、CF标志。

【例2-30】 SBB AX,0035H;执行后(AX)=(AX)-0035H-CF

(3)减1指令DEC。

格式:DEC DST

功能:(DST)-1→DST

说明:使用本指令可以很方便地实现地址指针或循环次数的减1修改。

标志:除了不影响CF标志外,影响其他5个算术运算结果标志。

【例2-31】 DEC BX

(4)比较指令CMP。

格式:CMP DST,SRC

功能:(DST)-(SRC),影响标志位。

说明:这条指令执行相减操作后只根据结果设置标志位,并不改变两个操作数的原值。其他要求同SUB的要求。CMP指令常用于比较两个数的大小。

标志:影响OF、SF、ZF、AF、PF、CF标志。

(5)求补指令NEG。

格式:NEG DST

功能:对目标操作数(含符号位)求反加1,并且把结果送回目标,即实现0-(DST)→DST

说明:利用NEG指令可实现求一个数的相反数。

标志:影响OF、SF、ZF、AF、PF、CF标志。其中对CF和OF的影响如下:

①对操作数所能表示的最小负数(例如操作数是8位时则为-128)求补,原操作数不变,但OF被置1。

②当操作数为0时,CF清0。

③对非0操作数求补后,CF置1。

【例2-32】 实现0-(AL)的运算。

NEG AL

由于以上减法指令适用于带符号数和无符号数两种运算,它们与加法指令一样,也存在判断结果正确性的问题。若指令执行后使CF=1,则对无符号数而言发生了溢出;若指令执行后使OF=1,则对带符号数而言发生了溢出。具体情况请读者自己分析。

【例2-33】 试编写两个3字节长的二进制数加法程序,加数FIRST、SECOND与和SUM的分配情况如图2-14所示。

img47

图2-14 3字节长加法程序示意图

分析:为便于理解和方便讨论,设(FIRST)=112233H,(SECOND)=445566H,存放顺序如图2-14所示。因为是3字节数据,所以操作数用字节表示。算法类似于手工计算,从最低字节数据开始加起,计算高字节时要考虑低字节的进位问题。为了简化讨论,假设和不会超过3字节,即最高位不会有进位产生。为了最大限度地用到所学的指令和寻址方式,本程序不使用循环结构,不考虑优化问题。经过分析,编程如下:

LEA DI,SUM;建立和的地址指针DI

ADD DI,2;DI指向和的低字节

MOV BX,2

MOV AL,FIRST[BX];取FIRST的低字节(本例为33H)

ADD AL,SECOND+2;两个低字节相加,和①在AL中,进位反映在CF中

MOV[DI],AL;把低字节和存到DI指向的单元(本例为SUM+2单元)

DEC DI;修改和指针,使其指向中字节

DEC BX;修改加数指针,使其指向中字节

MOV AL,FIRST[BX];取FIRST的中字节(本例为22H)

ADC AL,SECOND+1;两个中字节相加且加CF,和②在AL中,进位反映在CF中

MOV[DI],AL;把中字节和存到DI指向的单元(本例为SUM+1单元)

DEC DI;修改和指针,使其指向高字节

DEC BX;修改加数指针,使其指向高字节

MOV AL,FIRST[BX];取FIRST的高字节(本例为11H)

ADC AL,SECOND;两个高字节相加且加CF,和③在AL中,进位反映在CF中

MOV[DI],AL;把高字节和存到DI指向的单元(本例为SUM单元)

说明:程序中用到的形如SECOND+2的寻址方式也是直接寻址方式,SECOND+2单元中存放66H。程序中的注释以分号开始。

①两个ADC指令能否换为ADD?答案是否定的,因为在对高字节计算时要考虑到低字节的进位,这个进位在执行上一条加法指令时已反映在CF中。

②DEC DI和SUB DI,1指令的功能从表面上看是等价的,是否可以互换?在本程序中答案是否定的,因为上一条加法指令对CF的影响后边要用到,所以不能破坏CF值,使用DEC指令正好不影响CF。但是可以用以下指令序列代替本程序中的DEC DI,以保证得到正确的CF值。

PUSHF;保存包括CF的FLAG S值

SUB DI,1;修改DI

POPF;恢复原FLAG S值

③多字节或多字加减时,CF始终有意义(前边的反映进/借位,最后一次反映溢出情况),而OF只有最后一次的才有意义。

④溢出情况判断。若是两个无符号数相加,则当最后一次的CF被置1时,表示溢出,结果不正确;若是两个带符号数相加,则当最后一次的OF被置1时,表示溢出,结果不正确。

从该例可以看出,选取合适的算法、恰当的指令、灵活的寻址方式对汇编语言程序设计人员来讲十分重要,它可以达到事半功倍的效果。

4.二进制数乘法指令

指令系统对无符号数和带符号数分别提供了二进制乘法指令。

(1)无符号数乘法指令MUL。

格式:MULSRC

功能:实现两个无符号二进制数乘法。

说明:该指令只含一个源操作数,必须注意这个源操作数只能是寄存器(REG)或存储器(MEM)操作数,不能是立即数。另一个乘数必须事前放在累加器中。可以实现8位、16位无符号数乘法。若源操作数是8位的,则与AL中的内容相乘,乘积在AX中;若源操作数是16位的,则与AX中的内容相乘,乘积在DX:AX这一对寄存器中。

具体操作如下:

①字节型乘法:(AL)×(SRC)8→AX

②字型乘法:(AX)×(SRC)16→DX:AX

标志:影响CF、OF、SF、ZF、AF、PF,而只有CF、OF有意义,其他标志不确定。对CF和OF的影响是:若乘积的高半部分(例如字节型乘法结果的AH)为0,则对CF和OF清0;否则置CF和OF为1。

【例2-34】

MOV AL,08H

MULBL;(AL)×(BL),结果在AX中

MOV AX,1234H

MULWORD PTR[BX];(AX)×([BX]),结果在DX:AX中

MOV AL,98H

SUB AH,AH;AH清0

MULBX;(AX)×(BX),结果在DX:AX中

(2)带符号数乘法指令IMUL。

功能:实现两个带符号二进制数乘法。

格式:IMULSRC

说明:这种格式的指令除了实现两个带符号数相乘且结果为带符号数外,其他与MUL指令相同。所有的80x86CPU都支持这种格式。

具体操作如下。

①字节型乘法:(AL)×(SRC)8→AX

②字型乘法:(AX)×(SRC)16→DX:AX

标志:影响CF、OF、SF、ZF、AF、PF,而只有CF、OF有意义,其他标志不确定。对CF和OF的影响是:若乘积的高半部分(例如字节型乘法结果的AH)为低半部分的符号扩展,则对CF和OF清0;否则置CF和OF为1。

【例2-35】

MOV AL,08H

IMULBL;(AL)×(BL),结果在AX中

MOV AX,1234H

IMULWORD PTR[BX];(AX)×([BX]),结果在DX:AX中MOV AL,98H

CBW;AL中的符号扩展至字

IMULBX;(AX)×(BX),结果在DX:AX中

5.二进制数除法指令

指令系统对无符号数和带符号数分别提供了二进制除法指令。

注意:若除数为0或商超出操作数所表示的范围(例如字节型除法的商超出8位、字型除法的商超出16位等)会产生除法错中断,此时系统直接进入0号中断处理程序,为避免出现这种情况,必要时在程序中应事先对操作数进行判断。

(1)无符号数除法指令DIV。

格式:DIV SRC

功能:实现两个无符号二进制数除法。

说明:该指令只含一个源操作数,该操作数作为除数使用。注意它只能是寄存器或存储器操作数,不能是立即数,被除数必须事前放在隐含的寄存器中。可以实现8位、16位无符号数除法。若源操作数是8位的,则被除数在AX中,商在AL中,余数在AH中;若源操作数是16位的,则被除数在DX:AX一对寄存器中,商在AX中,余数在DX中。具体操作如下:

img48

img49

标志:不确定。

【例2-36】 实现500÷25的无符号数除法。

MOV AX,500

MOV BL,25

DIV BL;(AX)÷(BL),商在AL中,余数在AH中

【例2-37】 实现1234÷512的无符号数除法。

MOV AX,1234

SUB DX,DX;DX清0

MOV BX,512

DIV BX;(DX:AX)÷(BX),商在AX中,余数在DX中

(2)带符号数除法指令IDIV。

格式:IDIV SRC

功能:实现两个带符号二进制数除法。

说明:除了实现两个带符号数相除且商和余数均为带符号数,余数符号与被除数相同外,其他与DIV指令相同。

具体操作如下:

img50

img51

标志:不确定。

【例2-38】 实现(-1000)÷(+25)的带符号数除法。

MOV AX,-1000

MOV BL,25

IDIV BL;(AX)÷(BL),商在AL中,余数在AH中

【例2-39】 实现1000÷(-512)的带符号数除法。

MOV AX,1000

CWD;AX的符号扩展到DX

MOV BX,-512

IDIV BX;(DX:AX)÷(BX),商在AX中,余数在DX中

6.十进制调整指令

在第1章曾经讲过BCD码的概念,本节主要介绍十进制数的加减法运算调整问题。

(1)压缩BCD码调整指令。

压缩BCD码调整指令包括DAA(Decimal Adj ust after Addition,加法的压缩BCD码调整)和DAS(Decimal Adj ust after Subtraction,减法的压缩BCD码调整)。

①压缩BCD码加法调整指令的语法格式为:

DAA;调整AL中的和为压缩BCD码

使用DAA指令时,通常先执行ADD/ADC指令,将两个压缩BCD码相加,结果存放在AL中,然后使用该指令将AL调整为压缩BCD码格式。

DAA的调整算法如下:

if (AL低4位>9或AF=1)then

AL=AL+6;

AF=1;

endif

if (AL高4位>9或CF=1)then

AL=AL+60H;CF=1;

endif

②压缩BCD码减法调整指令的语法格式为:

DAS;调整AL中的差为压缩BCD码

使用DAS指令时,通常先执行SUB/SBB指令,将两个压缩BCD码相减,结果存放在AL中,然后使用该指令将AL调整为压缩BCD码格式。

DAS的调整算法如下:

if (AL低4位>9或AF=1)then

AL=AL-6;

AF=1;

endif

if (AL高4位>9或CF=1)th en

AL=AL-60H;

CF=1;

endif

对标志位的影响:OF不确定;CF反映压缩BCD码相加(或相减)的进位(或借位)状态;按一般规则影响SF和ZF。

说明:若使用DAA或DAS指令,则参加加法或减法运算的操作数应该是压缩BCD码。如果将任意两个二进制数相加/减,然后调整,将得不到正确结果。

(2)非压缩BCD码调整指令。

非压缩BCD码调整指令包括AAA(ASCII Adj ust after Addition,加法的非压缩BCD码调整)、AAS(ASCII Adj ust after Subtraction,减法的非压缩BCD码调整)、AAM(ASCII Adj ust after Multip lication,乘法的非压缩BCD码调整)和AAD(ASCIIAdj ust before Dividion,除法的非压缩BCD码调整)。

非压缩BCD码调整指令的语法格式为:

AAA;调整AL中的和为非压缩BCD码;调整后,AL高4位等于0,AH=AH+产生的CF

AAS;调整AL中的差为非压缩BCD码;调整后,AL高4位等于0,AH=AH-产生的CF

AAM;AH=AX div 10,AL=AX mod 10

AAD;AL=AH×10+AL,AH=0

①使用AAA指令时,通常先执行ADD/ADC指令,以AL为目标操作数,将两个非压缩BCD码(与高4位无关)相加;然后使用AAA将AL调整为非压缩BCD码格式,且高4位等于0,同时将调整产生的进位加到AH中。

②使用AAS指令时,通常先执行SUB/SBB指令,以AL为目标操作数,将两个非压缩BCD码(与高4位无关)相减;然后使用AAS将AL调整为非压缩BCD码格式,且高4位等于0,同时将调整产生的借位从AH中减去。

③使用AAM指令时,通常先执行MUL/IMUL指令,将两个一字节非压缩BCD码(高4位必须为0)相乘,结果存入AX;然后使用AAM指令将AX(AH=0)调整为两字节的非压缩BCD码格式。

④使用AAD指令时,通常先执行该指令,将AX中的两字节非压缩BCD码(AH与AL的高4位必须均为0)调整为相应的二进制表示;然后使用DIV/IDIV指令,除以一个一字节的非压缩BCD码(高4为必须为0),可得到非压缩BCD码的除法结果。

AAA的调整算法如下:

if (AL低4位大于9或AF=1)then

AL=AL+6;

AH=AH+1;

AF=1;

CF=1;

else

AF=0;

CF=0;

endif

AL=ALAND 0FH;;AL高4位清0

AAS的调整算法如下:

if (AL低4位大于9或AF=1)th en

AL=AL-6;

AH=AH-1;

AF=1;

CF=1;

else

AF=0;

CF=0;

endif

AL=ALAND 0FH;;AL高4位清0

对标志位的影响:

①AAA与AAS指令中,CF反映非压缩BCD码加(或减)的进位(或借位),OF、SF和ZF不确定。

②AAM与AAD指令中,根据AL的结果设置ZF和SF,CF和OF不确定。

说明:

①AAA和AAS要求参加加法或减法运算的操作数是非压缩BCD码,并且与高4位无关。如果将任意两个二进制数相加或减,然后调整,将得不到正确结果。

②由于ASCII码是一种特殊的非压缩BCD码,而且常常用于AAA和AAS,因此,这组指令的助记符为“ASCII调整”。当然,称为“非压缩BCD码调整”更恰当些。

③在使用AAA或AAS调整后,AL高4位为0。

④AAD与其他调整指令不同,要用在除法指令之前。

⑤参加非压缩BCD码乘法或除法的操作数的高4位必须为0。

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

我要反馈