资源描述
第第3 3章章 80 80 x86x86的指令系统和寻址方式的指令系统和寻址方式第三章第三章 80 x86的的指令系统指令系统(二二)返回目录返回目录二、算术运算类指令二、算术运算类指令p36第第3 3章章 80 80 x86x86的指令系统和寻址方式的指令系统和寻址方式二二算术运算类指令算术运算类指令1.加法指令加法指令2.减法指令减法指令3.乘法指令乘法指令4.除法指令除法指令5.十进制调整指令十进制调整指令返回本节首页返回本节首页算术指令的寻址方式:算术指令的寻址方式:p36双操作数指令双操作数指令的两个操作数中除源操作数为立即数的的两个操作数中除源操作数为立即数的情况外,情况外,必须有一个操作数在寄存器中。必须有一个操作数在寄存器中。单操作数指令不允许使用立即数方式。单操作数指令不允许使用立即数方式。第第3 3章章 80 80 x86x86的指令系统和寻址方式的指令系统和寻址方式1.加法运算指令加法运算指令p36(1)加指令)加指令ADD(add)(2)带进位加指令带进位加指令ADC(addwithcarry)(3)非压缩十进制数的加法校正指令非压缩十进制数的加法校正指令AAAAAA(4)加法十进制校正指令加法十进制校正指令DAA(5)加加1指令指令INC(increment)(6)交交换并相加换并相加XADD(exchangeandadd)返回本节首页返回本节首页第第3 3章章 80 80 x86x86的指令系统和寻址方式的指令系统和寻址方式1加法加法(1)加法指令的一般格式)加法指令的一般格式ADDdst,src功能功能:dstdst+src该指令对源操作数和目的操作数的内容执行一个字节或该指令对源操作数和目的操作数的内容执行一个字节或字的加法,并把结果放回原来存放目的操作数的地方。字的加法,并把结果放回原来存放目的操作数的地方。源操作数可以是立即数、寄存器或存储单元。目的操作源操作数可以是立即数、寄存器或存储单元。目的操作数可以是寄存器或存储单元。数可以是寄存器或存储单元。例如:例如:ADDAL,30H;AL内容加立即数内容加立即数30H,结果存回到结果存回到AL中中ADDAX,SI;AX和和SI两寄存器内容相加,结果存回到两寄存器内容相加,结果存回到AX中中ADDBX+DI,AX;BX+DI和和BX+DI+1两存储单元内容和两存储单元内容和AX内容相加,内容相加,结果存回到上述两存储单元中结果存回到上述两存储单元中第第3 3章章 80 80 x86x86的指令系统和寻址方式的指令系统和寻址方式(2)带进位加法指令的一般格式带进位加法指令的一般格式ADC dst,src ADC dst,src 功能:功能:dstdstdst+src+CFdst+src+CF 该指令和该指令和ADDADD指令类似,只是在两个操作数指令类似,只是在两个操作数相加时,要把标志寄存器中进位标志相加时,要把标志寄存器中进位标志CF CF 的当的当前值加上去,结果放回原来存放目的操作数前值加上去,结果放回原来存放目的操作数的地方。的地方。该该指指令令主主要要用用于于多多字字节节运运算算中中。例例如如,见下页:见下页:第第3 3章章 80 80 x86x86的指令系统和寻址方式的指令系统和寻址方式例如,有两个四字节的数相加,例如,有两个四字节的数相加,加法要分两次进行,加法要分两次进行,先进行低两字节数相加,先进行低两字节数相加,然后再做高两字节数相加,然后再做高两字节数相加,在高两字节数相加时,要把前两字在高两字节数相加时,要把前两字节相加以后的进位考虑进去,就要用节相加以后的进位考虑进去,就要用到带进位加法指令。到带进位加法指令。第第3 3章章 80 80 x86x86的指令系统和寻址方式的指令系统和寻址方式【例【例1 1】无符号双字加法运算。无符号双字加法运算。0234 4657H+0F0F 0F0FH 0234 4657H+0F0F 0F0FHMOVMOV AXAX,4652H 4652H;(AXAX)=4652H =4652H 送低字送低字MOVMOV DXDX,0234H 0234H;(DXDX)=0234H =0234H 送高字送高字ADDADD AXAX,0F0F0H 0F0F0H;(AXAX)=3742H=3742H,CF=1 CF=1 加低字加低字ADCADC DXDX,0F0F0H0F0F0H;(DXDX)=0F325H=0F325H,CF=0 CF=0 加高字和进位加高字和进位第第3 3章章 80 80 x86x86的指令系统和寻址方式的指令系统和寻址方式【例【例2 2】无符号双字加法运算无符号双字加法运算若两个四字节的无符号数,分别存放在首址为若两个四字节的无符号数,分别存放在首址为2000H和和3000H的存储单元内,低位在前,高位在后,要求两数相加,结果存放的存储单元内,低位在前,高位在后,要求两数相加,结果存放在首址为在首址为2000H的单元中,可用如下程序段实现:的单元中,可用如下程序段实现:MOVSI,2000H;第一个数首址送第一个数首址送SIMOVAX,SI;第一个数低第一个数低16位送位送AXMOVDI,3000H;第二个数首址送第二个数首址送DIADDAX,DI;两数低两数低16位相加位相加MOVSI,AX;低低16位数相加后的和存入位数相加后的和存入2000H和和2001H两存两存储单元中储单元中MOVAX,SI+2;第一个数高第一个数高16位送位送AXADCAX,DI+2,;两数高两数高16位带进位加位带进位加MOVSI+2,AX;两高两高16位数带进位相加后的和存入位数带进位相加后的和存入2002H和和2003H两单元两单元第第3 3章章 80 80 x86x86的指令系统和寻址方式的指令系统和寻址方式(3)非压缩十进制数的加法校正指令非压缩十进制数的加法校正指令 所谓非压缩十进制数,就是把数字所谓非压缩十进制数,就是把数字0 9的的ASCII码的高码的高四位置四位置0以后形成的数码,如以后形成的数码,如6为为00000110,9为为00001001。两非压缩十进制数相加,要得到正确结果仍为非压缩十两非压缩十进制数相加,要得到正确结果仍为非压缩十进制数,必须用进制数,必须用AAAAAA指令校正,结果存在指令校正,结果存在AXAX中。中。AAA AAA指令指令(ASCII Ajust for Addition)ASCII Ajust for Addition)是对两个非压是对两个非压缩的十进制数相加后缩的十进制数相加后ALAL的和进行校正的和进行校正。第第3 3章章 80 80 x86x86的指令系统和寻址方式的指令系统和寻址方式校正方法校正方法 如果如果AL的低的低4位大于位大于9或(或(AF)=1,应校正:在应校正:在AXAX寄存器内容寄存器内容上加上加106106H H,标志位标志位AFAF和和CFCF置置1 1,并且,并且ALAL高四位置高四位置0 0。即:。即:(AL)=(AL)+6(AH)=(AH)+1(AF)=(CF)=1且且AL高高4位清零。位清零。否则:(否则:(CF)=(AF)=0,AL高高4位清零。位清零。如在如在ALAL和和BLBL中,如各存有一个非压缩中,如各存有一个非压缩BCDBCD数相加,其和存在数相加,其和存在ALAL中也是非压缩中也是非压缩BCDBCD数,可用如下程序段:数,可用如下程序段:MOV ALMOV AL,09H 09H ;非压缩非压缩BCD数表示为数表示为00001001 MOV BL MOV BL,06H 06H ;非压缩非压缩BCD数表示为数表示为00000110 ADD AL,BL ADD AL,BL ;两数相加两数相加,结果为,结果为00001111,不是非压缩,不是非压缩BCD数数 AAA AAA ;必须用必须用AAA指令进行指令进行校正,最后校正,最后结果为(结果为(AH)=00000001,(AL)=00000101,(,(AF)=(CF)=1第第3 3章章 80 80 x86x86的指令系统和寻址方式的指令系统和寻址方式(4)加法十进制校正指令加法十进制校正指令DAA 所谓压缩十进制数,就是把数字所谓压缩十进制数,就是把数字0 9的的ASCII码的低四码的低四位分别放在一个字节的高低四位后形成的数码,如位分别放在一个字节的高低四位后形成的数码,如63为为01100011,3 39为为00111001。DAA DAA指令指令(Decimal Adjust for Addition)Decimal Adjust for Addition)是压缩型十是压缩型十进制数的加法校正指令,即进制数的加法校正指令,即ALAL存两位存两位BCDBCD数,数,DAADAA指令的校指令的校正和正和AAAAAA指令类似,它必须考虑两位指令类似,它必须考虑两位BCDBCD数。数。方法是:如果方法是:如果ALAL的低四位所存值大于的低四位所存值大于9 9,或标志位,或标志位AFAF为为1 1,则把,则把ALAL加上加上6 6,并置标志位,并置标志位AFAF为为1 1;如果;如果ALAL的高四位所存的高四位所存值大于值大于9 9,或标志位,或标志位CFCF为为1 1,则把,则把ALAL加上加上6060H H,并置标志位并置标志位CFCF为为1 1。MOV AL MOV AL,37H 37H ;压缩十进制数压缩十进制数37+49=8637+49=86 ADD AL,49H ADD AL,49H ;压缩十进制数应为压缩十进制数应为8686,但结果,但结果8080H H DAA DAA ;校正后校正后ALAL中得正确十进制数的结果中得正确十进制数的结果8686 第第3 3章章 80 80 x86x86的指令系统和寻址方式的指令系统和寻址方式【例【例2 2】压缩】压缩BCDBCD码的加法运算。码的加法运算。MOV ALMOV AL,68H68H;(ALAL)=68H=68H,表示压缩表示压缩BCDBCD码码6868MOV BLMOV BL,28H28H;(BLBL)=28H=28H,表示压缩表示压缩BCDBCD码码2828ADD ALADD AL,BLBL;(ALAL)=68H+28H=90H=68H+28H=90HDAADAA ;十进制调整:十进制调整:(ALAL)=96H=96H ;实现压缩实现压缩BCDBCD码加法:码加法:68+28=9668+28=96第第3 3章章 80 80 x86x86的指令系统和寻址方式的指令系统和寻址方式(5 5)加)加1 1指令指令 INCINCINCdst功能:功能:dstdst+1这条指令完成对指定的操作数加这条指令完成对指定的操作数加1,然后返回该操作,然后返回该操作数。数。此指令主要用于在循环程序中修改地址指针和循环此指令主要用于在循环程序中修改地址指针和循环次数等。可用这条指令对字或字节内容加次数等。可用这条指令对字或字节内容加1。例如:例如:INCCX;寄存器中字加寄存器中字加1,即(,即(CX)+1CX。INCAL;寄存器中字节加寄存器中字节加1,即(即(AL)+1AL。INCBYTEPTRBX+DI+10H;BX+DI+10H所指的所指的存储单元中字节加存储单元中字节加1第第3 3章章 80 80 x86x86的指令系统和寻址方式的指令系统和寻址方式(6)XADD交换并相加指令(交换并相加指令(386后)后)语句格式:语句格式:XADD DSTXADD DST,SRCSRC功能:功能:TEMP (DSTDST)+(SRCSRC)(SRCSRC)(DSTDST)(DSTDST)TEMP源操作数只能用寄存器寻址方式,源操作数只能用寄存器寻址方式,目的操作数则可用寄存器或任一种存储器寻址方式。目的操作数则可用寄存器或任一种存储器寻址方式。例例3.47XADDBL,DL如指令执行前如指令执行前(BL)=12H,(DL)=02H则指令执行后则指令执行后(BL)=14H,(DL)=12H第第3 3章章 80 80 x86x86的指令系统和寻址方式的指令系统和寻址方式加法指令总结加法指令总结1、三条加法指令都可作字或字节运算;、三条加法指令都可作字或字节运算;2、除、除INC指令不影响指令不影响CF标志标志外,它外,它们都影响条件标志位;们都影响条件标志位;3、条件标志位的影响见下:条件标志位的影响见下:返回本节首页返回本节首页第第3 3章章 80 80 x86x86的指令系统和寻址方式的指令系统和寻址方式条件标志位的条件标志位的影响影响3、条件标志位最主要的是条件标志位最主要的是CF、ZF、SF、OF运算结果为零,则运算结果为零,则ZF=1,否则否则ZF=0;运算结果为负,则运算结果为负,则SF=1,否则否则SF=0;运算有进位时,运算有进位时,CF=1,否则否则CF=0;两操作数的符号相同,而结果的符号与之两操作数的符号相同,而结果的符号与之相反时,相反时,OF=1(有溢出),其余情况有溢出),其余情况OF=0。下面举例说明下面举例说明CF、OF的设置情况。的设置情况。第第3 3章章 80 80 x86x86的指令系统和寻址方式的指令系统和寻址方式数的溢出数的溢出CF位则可用来表示无符号数的溢出,位则可用来表示无符号数的溢出,OF位可以用来表示带符号数的溢出位可以用来表示带符号数的溢出。(1)带符号数和无符号数都不溢出 二进制加法 看作无符号数 看作带符号数 0000 0100 4 +4+0000 1011 +11 +(+11)0000 1111 15 +15 CF=0 OF=0(2)无符号数溢出 二进制加法 看作无符号数 看作带符号数 0000 0111 7 +7 +1111 1011 +251 +(-5)0000 0010=+2 258 +2(结果对)1 CF=1 OF=0两个正数相加,应为正数+258(大于+255,有进位,CF=1),现为+2,结果错第第3 3章章 80 80 x86x86的指令系统和寻址方式的指令系统和寻址方式(3)带符号数溢出(OF位可以用来表示带符号数的溢出,OF=1)二进制加法 看作无符号数 看作带符号数 0000 1001 9 +9+0111 1100 +124 +(+124)1000 0101 133 +133 CF=0 OF=1 两个正数相加,应为正数+133(大于+127,所以OF=1),现为-123,结果错(4)带符号数和无符号数都溢出(CF位和OF位均为1)二进制加法 看作无符号数 看作带符号数 1000 0111 135 (-121)+1111 0101 +245 +(-11)0111 1100=(124D)380 -132 1 CF=1 OF=1 两个负数相加,应为负数-132(小于-128,所以OF=1),现为+124,结果错第第3 3章章 80 80 x86x86的指令系统和寻址方式的指令系统和寻址方式例例ADDDX,0F0F0H如指令执行前如指令执行前(DX)=4652H则则46520100011001010010+F0F0+111100001111000000110111010000101指令执行后(指令执行后(DX)=3742H,ZF=0,SF=0,CF=1,OF=0第第3 3章章 80 80 x86x86的指令系统和寻址方式的指令系统和寻址方式例例3.46例例3.46ADDAX,CX;两个双精度数的加法。两个双精度数的加法。ADCDX,BX;(AX)=0F365H1111001101100101(CX)=0E024H+1110000000100100(AX)=0D389H1101001110001001CF=1则第一条指令执行后(则第一条指令执行后(AX)=0D389H,SF=1,ZF=0,CF=1,OF=0(BX)=0005H0000000000000101(DX)=0E024H0000000000000010CF=+1(DX)=00080000000000001000第二条指令执行后(第二条指令执行后(DX)=0008H,SF=0,ZF=0,CF=0,OF=0因此该指令系列执行后(因此该指令系列执行后(DX)=0008H,(AX)=0D389H结果正确结果正确第第3 3章章 80 80 x86x86的指令系统和寻址方式的指令系统和寻址方式2.减法运算指令减法运算指令(1)减指令)减指令SUB(2)带借位减指令)带借位减指令SBB(3)非压缩十进制减法校正指令非压缩十进制减法校正指令AAS(4)减法十进制校正指令减法十进制校正指令DAS(5)减)减1指令指令DEC(6)求补指令求补指令NEG(7)比较指令比较指令CMP返回本节首页返回本节首页第第3 3章章 80 80 x86x86的指令系统和寻址方式的指令系统和寻址方式(1)(1)减法指令减法指令SUBSUB语句格式:语句格式:SUB DSTSUB DST,SRCSRC功功能能:目目的的操操作作数数减减源源操操作作数数,结结果果存存于于目目的地址,源地址内容不变。的地址,源地址内容不变。即即(DST)(DST)(DSTDST)()(SRCSRC)这这条条指指令令可可完完成成两两个个操操作作数数的的字字节节或或字字相减。具体说,相减。具体说,可以从累加器中减去立即数,可以从累加器中减去立即数,或从寄存器减去立即数,或从寄存器减去立即数,或从内存操作数中减去立即数,或从内存操作数中减去立即数,或从寄存器中减去寄存器或内存操作数等或从寄存器中减去寄存器或内存操作数等,或从寄存器中减去内存操作数等或从寄存器中减去内存操作数等.第第3 3章章 80 80 x86x86的指令系统和寻址方式的指令系统和寻址方式【例】例】减法运算。减法运算。SUB AL,10 SUB AL,10 ;AL;AL中数减去立即数中数减去立即数1010,结果存回,结果存回ALAL中中SUB SI,1000H SUB SI,1000H ;SI;SI数减去立即数数减去立即数10001000H H,结果存回结果存回SISI中中SUB WORD PTRDI,1000H;SUB WORD PTRDI,1000H;DIDI和和DI+1DI+1所指的两单元所指的两单元中数减去立即数中数减去立即数10001000H H,结果送回上述两单元中结果送回上述两单元中MOVMOV AX AX,5678H5678H;(;(AXAX)=5678H=5678HSUBSUB AX AX,1234H1234H;(;(AXAX)=4444H=4444HMOVMOV BX BX,3354H3354H;(;(BXBX)=3354H=3354HSUBSUB BX BX,3340H3340H;(;(BXBX)=0014H=0014H第第3 3章章 80 80 x86x86的指令系统和寻址方式的指令系统和寻址方式(2)(2)带借位减指令带借位减指令 SBBSBB语句格式:语句格式:SBB DST SBB DST,SRCSRC功功能能:目目的的操操作作数数减减源源操操作作数数再再减减低低位借位位借位CFCF,结果送目的地址。结果送目的地址。即(即(DSTDST)(DSTDST)(SRCSRC)CFCF该指令主要用于多字节操作数相减。该指令主要用于多字节操作数相减。第第3 3章章 80 80 x86x86的指令系统和寻址方式的指令系统和寻址方式(3)(3)非压缩十进制减法校正指令非压缩十进制减法校正指令AASAAS AASAAS指指令令(ASCII ASCII Adjust Adjust for for Subtruction)Subtruction)与与AAAAAA指指令令类类似似,能能把把在在ALAL中中的的由由两两个个非非压压缩缩十十进进制制数数相相减减的的结结果果进进行行校校正正,在在ALAL中产生一个正确的非压缩十进制数差。中产生一个正确的非压缩十进制数差。功能:如果功能:如果ALAL的低的低4 4位大于位大于9 9或(或(AFAF)=1=1,则:则:(ALAL)=(ALAL)6 6(AHAH)=(AHAH)1 1(AFAF)=(CFCF)=1=1ALAL高高4 4位清零。位清零。否则:(否则:(CFCF)=(AFAF)=0=0 AL AL高高4 4位清零。位清零。其他标志位其他标志位OFOF、PFPF、SFSF、ZFZF不确定。不确定。例例 SUB AL,BL ;SUB AL,BL ;ALAL和和BLBL中,各存有一个非压缩中,各存有一个非压缩BCDBCD数相减数相减 AAS AAS ;差存在差存在ALAL中也是非压缩中也是非压缩BCDBCD数数 第第3 3章章 80 80 x86x86的指令系统和寻址方式的指令系统和寻址方式(4 4)减法的十进制校正指令减法的十进制校正指令DAS P40 DAS P40 DASDAS指指令令(Decimal Decimal Adjust Adjust for for Subtraction)Subtraction)是是压压缩缩十十进进制制数数的的减减法法校校正正指指令令,它它与与DAADAA类类似似,能能对对在在ALAL中中的的由由两两个个压压缩缩十十进进制制数数相相减减以以后后的的结结果果进进行行校校正正,以以得得到到正正确确的的压缩型十进制数差压缩型十进制数差.校正方法:校正方法:如果(如果(AFAF)=1=1或或ALAL寄存器中低寄存器中低4 4位大于位大于9 9,则,则(ALAL)=(ALAL)6 6且(且(AFAF)=1=1;如果(如果(ALAL)=0A0H=0A0H或(或(CFCF)=1=1,则则(ALAL)=(ALAL)60H60H且(且(CFCF)=1=1。同时同时SFSF、ZFZF、PFPF均受影响。均受影响。例如,例如,SUB AL,BLSUB AL,BL;在在ALAL和和BLBL中中,分别存一个压缩分别存一个压缩BCDBCD数数,现进行现进行BCDBCD数相减数相减 DAS DAS ;其差应为其差应为BCDBCD数数第第3 3章章 80 80 x86x86的指令系统和寻址方式的指令系统和寻址方式(5)(5)减减1 1指令指令DECDEC语句格式:语句格式:DEC OPR DEC OPR 功能:将目的操作数减功能:将目的操作数减1 1,结果送目的地址。,结果送目的地址。即(即(DSTDST)(DSTDST)1 1。DECDEC指令是一个单操作数指令,操作数可以是寄存器或指令是一个单操作数指令,操作数可以是寄存器或存储器操作数。存储器操作数。如:如:DECCX;CX内容减内容减1再送回再送回CX中中DECAL;AL内容减内容减1再送回再送回AL中中DECBYTEPTRDI+10H;DI+10H所指内存单所指内存单元内容减元内容减1,结果再送回该单元内,结果再送回该单元内减减1指令指令DEC也一般用于对计数器和地址指针的调整。也一般用于对计数器和地址指针的调整。第第3 3章章 80 80 x86x86的指令系统和寻址方式的指令系统和寻址方式(6)(6)求补指令求补指令NEGNEG语句格式:语句格式:NEG OPR NEG OPR ;(DSTDST)0-(DSTDST)功功能能:将将目目的的操操作作数数(字字或或字字节节)的的每每一一位位求求反反(包包括括符符号号位位)后后末末位加位加1 1,结果送目的地址。,结果送目的地址。(这样就形成了指定操作数这样就形成了指定操作数2 2的补码的补码)即(即(OPROPR)0FFFFH-(OPROPR)+1+1注意注意:求补指令求补指令NEG NEG 相应于相应于减法运算减法运算,0FFFFH-(OPROPR)每一位求反每一位求反 0FFFFH+1+1相应于向高位相应于向高位借位,借位,对对CF、OF标志的设置与标志的设置与减法相同。减法相同。如果要想从一个立即数中减去一个如果要想从一个立即数中减去一个寄存器或存储单元寄存器或存储单元内的值,内的值,用用NEG指令是很方便的。例如,要从指令是很方便的。例如,要从100内减去内减去AL寄存器中的值,寄存器中的值,不能用不能用SUB100,AL,因为立即数不能作为减法指令的目的操作数,因为立即数不能作为减法指令的目的操作数,但可用如下两条指令代替:但可用如下两条指令代替:NEGALADDAL,100第第3 3章章 80 80 x86x86的指令系统和寻址方式的指令系统和寻址方式【例】例】求补运算。求补运算。MOVMOVALAL,64H ;(AL)=0110 0100B64H ;(AL)=0110 0100BNEGNEGALAL;(;(AL)=1001 1101B CF=1 AL)=1001 1101B CF=1 为什么?为什么?因为求补时借位因为求补时借位MOVMOVALAL,00H00H;(;(AL)=0000 0000BAL)=0000 0000BNEGNEGALAL;(;(AL)=0000 0000B CF=0 AL)=0000 0000B CF=0 为什么?为什么?因为求补时不借位因为求补时不借位MOVMOVALAL,80H80H;(;(AL)=1000 0000B=-128DAL)=1000 0000B=-128DNEGNEGALAL;(;(AL)=1000 0000B OF=1 AL)=1000 0000B OF=1 为什么?为什么?因为求补时因为求补时结果的符号与减数(结果的符号与减数(-128)相同,溢出。相同,溢出。MOV ALMOV AL,85H 85H;(;(AL)=1000 0101B=-123DAL)=1000 0101B=-123DNEG AL NEG AL ;(;(AL)=0111 1011B=123D OF=0 AL)=0111 1011B=123D OF=0 为什么?为什么?因为求补时因为求补时结果的符号与减数(结果的符号与减数(-123)不同,不溢出。不同,不溢出。第第3 3章章 80 80 x86x86的指令系统和寻址方式的指令系统和寻址方式(7)(7)比较指令比较指令 CMPCMP语句格式:语句格式:CMP DSTCMP DST,SRCSRC功功能能:目目的的操操作作数数减减源源操操作作数数,结结果果只只影影响响标标志志位位,不不送送入目的地址。入目的地址。即(即(DSTDST)()(SRCSRC)。)。【例】比较【例】比较ALAL的内容数值大小。的内容数值大小。CMP CMPALAL,5050;(;(ALAL)5050 JB JBBELOWBELOW ;(;(ALAL)50=50=50,(,(AL AL)50AL50AL INC INCAHAH;(;(AHAH)+1AH+1AHBELOWBELOW:第第3 3章章 80 80 x86x86的指令系统和寻址方式的指令系统和寻址方式比较指令的比较指令的源操作数可以是立即数、累加器、寄存器或内存操作源操作数可以是立即数、累加器、寄存器或内存操作数;数;目的操作数可以是累加器、寄存器或内存操作数。通目的操作数可以是累加器、寄存器或内存操作数。通常源操作数和目的操作数的类型(字或字节)要相同,常源操作数和目的操作数的类型(字或字节)要相同,例如:例如:CMPAL,100;AL中数与中数与100比较比较CMPAX,2000H;AX中数与中数与2000H比较比较CMPDX,DI;DX与与DI内容比较内容比较CMPAX,BX+DI+100;AX中数与中数与BX+DI+100和和BX+DI+101所指的两单元中数相比较所指的两单元中数相比较只有立即数字或字节与内存的字或字节比较例外。例只有立即数字或字节与内存的字或字节比较例外。例如:如:CMPBX,100是错误的。是错误的。第第3 3章章 80 80 x86x86的指令系统和寻址方式的指令系统和寻址方式两个数的比较两个数的比较 比较指令主要用于比较两个数之间的关系,即两个比较指令主要用于比较两个数之间的关系,即两个数是相等还是哪一个数大。然后在比较指令之后紧跟一数是相等还是哪一个数大。然后在比较指令之后紧跟一条转移指令,由标志位决定转移条件。表条转移指令,由标志位决定转移条件。表3.5列出了不列出了不同操作数用比较指令时,对不同标志位的影响。同操作数用比较指令时,对不同标志位的影响。表表3-5CMP指令运算结果指令运算结果目目的的操操作作数数和和源源操操作作数数关系关系OFSFZFCF目的操作数和源操作数目的操作数和源操作数关系关系OFSFZFCF无符号操作数无符号操作数Dstsrc*01*10*00带符号操作数带符号操作数dst=srcdstsrcdstsrc001*010*000*100*110*第第3 3章章 80 80 x86x86的指令系统和寻址方式的指令系统和寻址方式 从表中可以得知:从表中可以得知:用用Z标志位可以判断两数是否相等,若两标志位可以判断两数是否相等,若两数相等,数相等,Z标志位为标志位为1,否则为,否则为0;若两数不相等,判断哪一个数大,则要若两数不相等,判断哪一个数大,则要用其他标志来判断。用其他标志来判断。若两数为无符号数,确定两者大小,应若两数为无符号数,确定两者大小,应该用借位标志位该用借位标志位CF,因为大数减去小数,因为大数减去小数,不会产生借位,所以不会产生借位,所以CF为为0;而小数减去大;而小数减去大数,就有借位,所以数,就有借位,所以CF为为1。第第3 3章章 80 80 x86x86的指令系统和寻址方式的指令系统和寻址方式 若两数(设目的操作数为若两数(设目的操作数为A,源操作数为源操作数为B)为带符号数,又为带符号数,又如何来判断两数的大小呢?如何来判断两数的大小呢?首先判断是否有溢出,然后再用符号位判断,来确定两数的首先判断是否有溢出,然后再用符号位判断,来确定两数的大小。大小。在没有溢出(在没有溢出(OF=0)情况下,当情况下,当SF=0时,则时,则A B;当当SF=1时,时,A B.在有溢出(在有溢出(OF=1)情况下,当情况下,当SF=0时,则时,则A B;当当SF=1时,时,A B。例例1:1:A=-80,B=5,A-B=-80-5=-85,(A=-80,B=5,A-B=-80-5=-85,(|-85|-128|)没有溢出(没有溢出(OF=0),SF=1时,时,A B.例例2:2:A=-121,B=11,A-B=-121-11=-132,A=-121,B=11,A-B=-121-11=-132,-12110000111-11+11110101-13201111100有溢出(有溢出(OF=1),SF=0(?)(?),A B.第第3 3章章 80 80 x86x86的指令系统和寻址方式的指令系统和寻址方式例,从例,从BLOCK开始的内存缓冲区中,存有开始的内存缓冲区中,存有100个个16位带符号数,位带符号数,找出其中最大值存入找出其中最大值存入MAX单元中,编出满足要求的程序段:单元中,编出满足要求的程序段:MOVBX,OFFSETBLOCK;BLOCK的偏移地址送的偏移地址送BXMOVAX,BX;取第一个数送取第一个数送AXINCBXINCBX;偏移地址加偏移地址加2MOVCX,99;还有还有99个个16位带符号数位带符号数AGAIN:CMPAX,BX;将将AX中的数与下一个数比较中的数与下一个数比较JGNEXT;AXBX转转nextMOVAX,BX;AX=BX,取下一个数送取下一个数送AXNEXT:INCBXINCBX;偏移地址加偏移地址加2DECCX;数的个数数的个数减减1 1JNZAGAIN;数的个数不为数的个数不为0,转,转AGAIN继续比较继续比较MOVMAX,AX;数的个数为数的个数为0,比较结束,存比较结束,存最大值最大值HLT;暂停机暂停机第第3 3章章 80 80 x86x86的指令系统和寻址方式的指令系统和寻址方式(8)(8)CMPXCHG比较并交换指令比较并交换指令 语句格式:语句格式:CMPXCHG DSTCMPXCHG DST,SRC ;486SRC ;486以上。以上。SRC SRC只能用只能用8 8位、位、1616位或位或3232位寄存器。位寄存器。DST DST则可用寄存器或任一种存储器寻址方式。则可用寄存器或任一种存储器寻址方式。功能:累加器(功能:累加器(ALAL、AXAX、或或EAXEAX)与与DSTDST比较,比较,如如 (ACAC)=(DSTDST)则则 ZF 1ZF 1,(DSTDST)(SRCSRC)否则,否则,ZF 0ZF 0,(ACAC)(SRCSRC)结果影响其他标志位与结果影响其他标志位与CMPCMP指令相同。指令相同。例例3.51CMPXCHGCX,DX如指令执行前:如指令执行前:(AX)=2300H,(,(CX)=2300H,(,(DX)=2400H则指令执行后:则指令执行后:因(因(CX)=(AX),),故(故(CX)=2400H,ZF=1如指令执行前:如指令执行前:(AX)=2500H,(,(CX)=2300H,(,(DX)=2400H则指令执行后:则指令执行后:因(因(CX)(AX),),故(故(AX)=2300H,ZF=0第第3 3章章 80 80 x86x86的指令系统和寻址方式的指令系统和寻址方式(9)CMPXCHG8B比较并交换比较并交换8字节指令字节指令语句格式:语句格式:CMPXCHG8B DST ;PentiumCMPXCHG8B DST ;Pentium以上以上 源操作数为存放于源操作数为存放于EDXEDX,EAXEAX中的中的6464位字,位字,目的操作数可用存储器寻址方式确定一个目的操作数可用存储器寻址方式确定一个6464位字。位字。功能:功能:EDXEDX,EAXEAX与与DSTDST相比较,相比较,如如 (EDXEDX,EAXEAX)=(DSTDST)则则 ZF 1ZF 1,(DSTDST)(ECXECX,EBXEBX)否则,否则,ZF 0ZF 0,(EDXEDX,EAXEAX)(DSTDST)结果只影响结果只影响ZFZF,不影响其他标志位。不影响其他标志位。第第3 3章章 80 80 x86x86的指令系统和寻址方式的指令系统和寻址方式减法指令总结减法指令总结1、前六条减法指令都可作字或字节、前六条减法指令都可作字或字节运算;运算;386以上还可作双字运算。以上还可作双字运算。2、除、除DEC指令不影响指令不影响CF标志标志外,它外,它们都影响条件标志位;们都影响条件标志位;返回本节首页返回本节首页第第3 3章章 80 80 x86x86的指令系统和寻址方式的指令系统和寻址方式3、条件标志位、条件标志位3、条件标志位最主要的是、条件标志位最主要的是CF、ZF、SF、OFZF、SF的设置与加法相同;的设置与加法相同;运算有借位时,运算有借位时,CF=1,否则否则CF=0;两操作数的符号相反,而结果的符号与减两操作数的符号相反,而结果的符号与减数相同时,数相同时,OF=1,其余情况其余情况OF=0;为什么为什么?注意:两操作数的符号相同,相减的结果肯注意:两操作数的符号相同,相减的结果肯定不溢出,定不溢出,OF=0。第第3 3章章 80 80 x86x86的指令系统和寻址方式的指令系统和寻址方式4、NEG指令对指令对CF、OF标志的设置标志的设置NEG指令的指令的CF、OF标志按标志按求补后的结果求补后的结果设置,所以设置,所以只有对只有对0求补时,求补时,CF=0,其余情况其余情况CF=1;为什么?为什么?见见NEG指令,指令,对对0求补时不用借位,求补时不用借位,CF=0;其余情况要借位,其余情况要借位,CF=1;只有对只有对-128(字节)或(字节)或-32768(字)求补时,(字)求补时,OF=1,其余情况其余情况OF=0。为什么?为什么?见见NEG指令,指令,对对-128求补时,结果的符号与减数(求补时,结果的符号与减数(-128)相同相同,OF=1;其余情况,结果的符号与减数其余情况,结果的符号与减数不同不同,OF=0;第第3 3章章 80 80 x86x86的指令系统和寻址方式的指令系统和寻址方式例例3.48SUBWORDPTRSI+14H,0136H如指令执行前(D
展开阅读全文