资源描述
第第3 3章章第第3章:章:3.4 算术运算类指令算术运算类指令算术运算类指令用来执行二进制的算术运算:算术运算类指令用来执行二进制的算术运算:加减乘除加减乘除。二二进进制制运运算算十十进进制制调调整整加加 ADD,ADC,INC AAA,DAA减减 SUB,SBB,DEC,NEG,CMP AAS,DAS乘乘 MUL,IMUL AAM除除 DIV,IDIV AAD 符符号号扩扩展展指指令令:CBW、CWD这类指令会根据运算结果影响这类指令会根据运算结果影响状态标志状态标志,有时要,有时要利用某些标志才能得到正确的结果;使用他们时利用某些标志才能得到正确的结果;使用他们时请留心有关状态标志请留心有关状态标志 对加、减运算,不区分无符号数、带符号数对加、减运算,不区分无符号数、带符号数 对乘、除运算,区分无符号数、带符号数对乘、除运算,区分无符号数、带符号数 可进行字节或字操作可进行字节或字操作重点掌握重点掌握 加法指令:加法指令:ADD、ADC、INC 减法指令:减法指令:SUB、SBB、DEC、CMP、NEG第第3章:章:3.4.1 加法和减法指令加法和减法指令加法指令加法指令:ADD,ADC和和INC减法指令减法指令:SUB,SBB,DEC,NEG和和CMP他们分别执行字或字节的加法和减法运算,他们分别执行字或字节的加法和减法运算,除除INC和和DEC不影响不影响CF标志外,其他按定标志外,其他按定义影响全部状态标志位义影响全部状态标志位操作数组合:操作数组合:运算指令助记符运算指令助记符 reg,imm/reg/mem运算指令助记符运算指令助记符 mem,imm/reg 1.加和减指令加和减指令 ADD dest,src;加法:加法:destdestsrc;ADD指令使目的操作数加上源操作数,指令使目的操作数加上源操作数,和的结果送到目的操作数和的结果送到目的操作数SUB dest,src;减法:减法:destdestsrc;SUB指令使目的操作数减去源操作数,指令使目的操作数减去源操作数,差的结果送到目的操作数差的结果送到目的操作数第第3章:章:3.4.1 加法和减法指令加法和减法指令第第3章:例题章:例题3.7 加法加法mov ax,7348h;AX7348Hadd al,27h;AL48H27H6FH,AX736FH;OF0,SF0,ZF0,PF1,CF0add ax,3fffh;AX736FH3FFFHB36EH;OF1,SF1,ZF0,PF0,CF0第第3章:例题章:例题3.7 减法减法sub ah,0f0h;AHB3HF0HC3H,AXC36EH;OF0,SF1,ZF0,PF1,CF1mov word ptr200h,0ef00h;200HEF00H,标志不变,标志不变sub 200h,ax;200HEF00HC36EH2B92H;OF0,SF0,ZF0,PF0,CF0sub si,si;SI0;OF0,SF0,ZF1,PF1,CF0 2.带进位加和减指令带进位加和减指令 ADC dest,src;加法:;加法:destdestsrcCF;ADC指令除完成指令除完成ADD加法运算外,还要加法运算外,还要加上进位加上进位CF,结果送到目的操作数,结果送到目的操作数SBB dest,src;减法:减法:destdestsrcCF;SBB指令除完成指令除完成SUB减法运算外,还要减法运算外,还要减去借位减去借位CF,结果送到目的操作数,结果送到目的操作数第第3章:章:3.4.1 加法和减法指令加法和减法指令例:例:两双字相加两双字相加 0002F365H+0005 E024 H=?MOV AX,0F365H ADD AX,0E024H MOV BX,0002H ADC BX,0005H 00020002 F365 F365 H H+00050005 E024 E024 H H进位进位00080008 D389 D389 H H结果存放在结果存放在:0008 D389(BX)(AX)执行完执行完、:(AX)=D389H CF=1,OF=0,SF=1,ZF=0 执行完执行完、:(BX)=0008H CF=0,OF=0,SF=0,ZF=0分析分析:8086/8088只能按字节或字相加。只能按字节或字相加。位数在字以上的操作数,先加低位,再加高位,位数在字以上的操作数,先加低位,再加高位,加高位时加入从低位产生的进位。加高位时加入从低位产生的进位。第第3章:例章:例3.8 无符号双字加法和减法无符号双字加法和减法mov ax,7856h;AX7856Hmov dx,8234h;DX8234Hadd ax,8998h;AX01EEH,CF1adc dx,1234h;DX9469H,CF0sub ax,4491h;AXBD5DH,CF1sbb dx,8000h;DX1468H,CF0DX.AX8234 7856H1234 8998H8000 4491H1468 BD5DH 3.比较指令比较指令CMP(compare)CMP dest,src;做减法运算:;做减法运算:destsrc CMP指令将目的操作数减去源操作数,但差值指令将目的操作数减去源操作数,但差值不回送不回送目目的操作数的操作数 CMP指令通过减法运算影响指令通过减法运算影响状态标志状态标志,用于比较两个操,用于比较两个操作数的大小关系。作数的大小关系。CMP和和SUB指令不同之处是,不保留两数相减的差。因指令不同之处是,不保留两数相减的差。因此此CMP指令执行之后,两个操作数都不变,只根据结果指令执行之后,两个操作数都不变,只根据结果影响标志位:影响标志位:AF、CF、OF、PF、SF和和ZFCMP AL,0FFH ;AL中的至与立即数中的至与立即数FFH比较,结果影响标志位比较,结果影响标志位CMP AX,SI+50H ;AX中的值和(中的值和(SI50H)字存储单元的数相比较,)字存储单元的数相比较,结果影响标志位结果影响标志位第第3章:章:3.4.1 加法和减法指令加法和减法指令 据据ZF判断两数是否相等判断两数是否相等CMP A,BZF=1 两数相等两数相等,A=B ;ZF=0 两数不等两数不等,A B 据据ZF和和CF判断两无符号数关系判断两无符号数关系CF=1 A低于低于BCF=0 A高于高于或或等于等于BCF=1或或 ZF=1 A低于等于低于等于BCF=0且且 ZF=0 A高于高于Bl 利用利用CMP执行后的标志值,比较两操作数之间的关系执行后的标志值,比较两操作数之间的关系加加1指令(增量指令)指令(增量指令)INC 指令功能:将指定的操作数指令功能:将指定的操作数reg/memreg/mem内容内容加加1 1,结果送回,结果送回reg/memreg/mem ,即,即 reg/memreg/mem(reg/memreg/mem)1 1 INCINC指令只有一个操作数,可以在通用寄存器或存储器中,但不能是立即指令只有一个操作数,可以在通用寄存器或存储器中,但不能是立即数,数,reg/memreg/mem可以是字或字节可以是字或字节 不影响不影响CFCF标志标志 INCINC指令常用于循环结构程序中修改指针或用于循环计数指令常用于循环结构程序中修改指针或用于循环计数INC CX;将;将CX的内容加的内容加1之后再送回之后再送回CXINC BYTE PTRSI ;将;将SI所指向存储单元的内容加所指向存储单元的内容加1,结果送回该单元结果送回该单元第第3章:章:3.4.1 加法和减法指令加法和减法指令INC reg/mem ;增量(加;增量(加1)4.增量和减量指令增量和减量指令 01FFH01FFH+0001H+0001H进位进位1111 0200H 0200H 例例3 value 是一个字变量是一个字变量 OFFSET value=1000H (DS)=2000H,(,(21000H)=01FFHvalue FF21000H 01执行前执行前value 0021000H 02执行后执行后执行后:执行后:(21000H)=0200H CF=不变不变,OF=0,ZF=0,SF=0注意:注意:INC value是是内存单元内容加内存单元内容加1,而非地址加,而非地址加1INC value或写成或写成:INC valueDEC reg/mem;减量(减;减量(减1)(reg/mem)(reg/mem)1指令功能:将操作数指令功能:将操作数reg/mem 的值减的值减1,结果再送回,结果再送回reg/mem,即(,即(reg/mem)(reg/mem)1它对操作数的要求及对标志位的影响均与它对操作数的要求及对标志位的影响均与INC相同相同DEC指令常用于在循环程序中修改循环次数指令常用于在循环程序中修改循环次数减减1指令(减量指令)指令(减量指令)DECDEC AX ;(;(AX)(AX)1DEC WORD PTRBP ;将堆栈中;将堆栈中BP所指的字单元内容减所指的字单元内容减1,结果再送回该单元结果再送回该单元例例3 减减1指令:指令:value 是一个字节变量是一个字节变量 OFFSET value=1000H (DS)=2000H,(,(21000H)=00H DEC value 执行后:执行后:(21000H)=0FFH CF=不变不变,OF=0,ZF=0,SF=1注意:注意:DEC value 是内存单元内容减是内存单元内容减1,而非地址减,而非地址减1 00 H 00 H-01 H-01 H 1111 FFH FFH 注意若编程如下注意若编程如下,MOV CX,4MOV AL,0 exit:ADD AL,buffer INC buffer DEC CXJNZ exit不能实现不能实现,为什么?为什么?.MOV CX,4 LEA BX,buffer MOV AL,0exit:ADD AL,BX INC BX DEC CX JNZ exit实现的是实现的是(1A)+(1B)+(1C)+(1D)指令指令INC buffer 将将buffer指向的内容加指向的内容加1,而不是地址而不是地址buffer加加1例例 将将buffer为首的为首的4个字节内存内容相加,存放在个字节内存内容相加,存放在AL中。中。例:例:实现将实现将AREA1开始的开始的100个数据传送到个数据传送到AREA2开始的单元。开始的单元。AREA1:AREA2:分析题意:分析题意:可以用可以用200条条MOV指令来完成指令来完成100个数据传送,个数据传送,指令操作重复,每个数据传送后的地址是变化的。指令操作重复,每个数据传送后的地址是变化的。可以利用循环,可以利用循环,但每循环一次要修改地址(源地址和目的地址),但每循环一次要修改地址(源地址和目的地址),必须把地址放在寄存器当中,用必须把地址放在寄存器当中,用寄存器间接寻址来寻找操作数寄存器间接寻址来寻找操作数.得到如下程序:得到如下程序:MOV SI,AREA1 MOV DI,AREA2 MOV CX,100AGAIN:MOV AL,SIMOV DI,AL JNZ AGAIN 5.求补指令求补指令NEG(negtive)指令功能指令功能:用零减去操作数,然后结果返回操作数,用零减去操作数,然后结果返回操作数,NEGNEG指指令对操作数执行令对操作数执行求补运算求补运算 NEGNEG指令把操作数指令把操作数reg/mem视为补码表示的带符号数。之所以视为补码表示的带符号数。之所以把把NEGNEG称为求补指令,是因为对一个操作数取补码就相当于用称为求补指令,是因为对一个操作数取补码就相当于用零减去此操作数,即求补运算也可以表达成:零减去此操作数,即求补运算也可以表达成:将操作数按位将操作数按位取反后加取反后加1 1 NEGNEG指令对标志的影响与用零作减法的指令对标志的影响与用零作减法的SUB指令一样指令一样 NEGNEG指令也是一个单操作数指令指令也是一个单操作数指令第第3章:章:3.4.1 加法和减法指令加法和减法指令NEG reg/mem;(;(reg/mem)0(reg/mem)例:设(例:设(DS)6000H,(,(BX)0010H,(,(60010H)47H NEG BX执行上面的指令是,执行上面的指令是,CPU将进行如下减法运算:将进行如下减法运算:00000000 )01000111 10111001 故指令执行后(故指令执行后(60010H)B9H,相当于对,相当于对47H求补。换句话说,利用求补。换句话说,利用NEG指令可以得到一个负数的绝对值。又如,若指令可以得到一个负数的绝对值。又如,若(AL)=FFH,执行,执行NEG AL后,结果位(后,结果位(AL)1(FFH是是1的补码)。的补码)。第第3章:例题章:例题3.9 求补运算求补运算mov ax,0ff64hneg al;AL064H9CH,AXFF9CH;OF0,SF1,ZF0,PF1,CF1sub al,9dh;AL9CH9DHFFH,AXFFFFH;OF0,SF1,ZF0,PF1,CF1neg ax;AX0FFFFH0001H;OF0,SF0,ZF0,PF0,CF1dec al;AL01H10,AX0000H;OF0,SF0,ZF1,PF1,CF1neg ax;AX000;OF0,SF0,ZF1,PF1,CF0第第3章:章:3.4.2 十进制调整指令十进制调整指令 十进制数调整指令对二进制运算的结果进行十进制调十进制数调整指令对二进制运算的结果进行十进制调整,以得到十进制的运算结果,以此实现十进制整,以得到十进制的运算结果,以此实现十进制BCDBCD码运算码运算80888088指令系统支持两种指令系统支持两种BCDBCD码调整运算码调整运算q压缩压缩BCD码码就是通常的就是通常的8421码;它用码;它用4个二进制位个二进制位表示一个十进制位,一个字节可以表示两个十进表示一个十进制位,一个字节可以表示两个十进制位,即制位,即0099q非压缩非压缩BCD码码用用8个二进制位表示一个十进制位,个二进制位表示一个十进制位,只用低只用低4个二进制位表示一个十进制位个二进制位表示一个十进制位09,高,高4位任意,通常默认为位任意,通常默认为0十十进进制制数数码码012348421 BCD 码码00000001001000110100十十进进制制数数码码567898421 BCD 码码01010110011110001001BCD码码(Binary Coded Decimal)l 用二进制编码表示十进制数。用二进制编码表示十进制数。l 常用常用8421 BCD码码,与十进制数码对应关系:与十进制数码对应关系:根据在内存的存放形式,分压缩根据在内存的存放形式,分压缩BCD码和非压缩码和非压缩 BCD码码(Packed BCD format),一字节存放,一字节存放2个个BCD码。码。整个十进制数形式为一个顺序的整个十进制数形式为一个顺序的4位为一组的数串。位为一组的数串。例:例:9502d 的压缩的压缩BCD码应表示为:码应表示为:9 5 0 2(Unpacked BCD format)一字节存放一字节存放1个个BCD码。码。8位中的低位中的低4位表示位表示8421的的BCD码,码,。例:例:9502d的非压缩的非压缩BCD码则表示为:码则表示为:9 5 0 21 1 0 0 0 0 1 10 0 1 1 0 0 1 10 0 0 0 0 0 0 00 0 0 0 1 1 0 01 1 0 0 0 0 1 1 0 0 1 1 0 0 1 10 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0当数据用压缩或非压缩当数据用压缩或非压缩BCD码表示时,码表示时,为使运算的结果仍为为使运算的结果仍为BCD码表示,需对结果进行调整。码表示,需对结果进行调整。十进制运算十进制运算=二进制运算二进制运算+十进制调整十进制调整例例(0000 1000)(0000 1000)压缩压缩BCD +(0000 1001)(0000 1001)压缩压缩BCD =(0001 0111)(0001 0111)压缩压缩BCD计算机计算过程计算机计算过程 看作压缩看作压缩BCD 0000 1000 08 0000 1000 08 +0000 1001 09 +0000 1001 09 0001 0001 110001 0001 11 二进制运算二进制运算编码的比较编码的比较真值(十进制)真值(十进制)864二进制编码二进制编码08H40H压缩压缩BCD码码08H64H非压缩非压缩BCD码码08H0604HASCII码码38H3634H压缩压缩BCD码加减法调整指令码加减法调整指令DAA DAS非压缩非压缩BCD码加减乘除法调整指令码加减乘除法调整指令AAA AAS AAM AAD(1)、)、DAA(Decimal adjust for addition)加法十进制调整指令加法十进制调整指令(2)、)、DAS(Decimal adjust for subtration)减法十进制调整指令减法十进制调整指令(3)、)、AAA(ASCII adjust for addition)加法加法ASCII调整指令调整指令(4)、)、AAS(ASCII adjust for subtration)减法减法ASCII调整指令调整指令(5)、)、AAM(ASCII adjust for multiply)乘法乘法ASCII调整指令调整指令(6)、)、AAD(ASCII adjust for division)除法除法ASCII调整指令调整指令共同点:共同点:十进制调整指令隐含寄存器操作数十进制调整指令隐含寄存器操作数AL;ASCII调整指令隐含寄存器操作数调整指令隐含寄存器操作数AL或或AH。十进制调整指令对十进制调整指令对压缩压缩BCD码进行调整;码进行调整;ASCII调整指令对调整指令对非压缩非压缩BCD码进行码进行调整,调整,(Decimal adjust for addition)格式:格式:DAA条件:条件:功能:(功能:(AL)把由把由二个组合的二个组合的BCD码码相加后的结果相加后的结果(结果一定放在(结果一定放在(AL)中的),中的),调整到压缩调整到压缩BCD格式格式。DAA指令影响指令影响 标志标志:A、C、P、S、Z.而对而对O标志未作定义标志未作定义。校正操作:校正操作:应用举例:应用举例:例例1:设(设(AL)=28 H ,(,(BL)=68H ADD AL,BL ;(AL)=90H,CF=0,AF=1 DAA ;(AL)(AL)+06 ,(AL)=96H ;例例2:求两个十进制数求两个十进制数78+56的正确结果,可用以下程序段。的正确结果,可用以下程序段。MOV Al,78H ;(AL)78HADD AL,56H ;(AL)0DEHDAA ;(AL)(AL)+06+60H ;(AL)=136H 例例3:(BCD3)(BCD1)+(BCD2)1834H2789H=4623H 注意:注意:例例2中的中的。实现:实现:(BCD1+1)(BCD1)+(BCD2+1)(BCD2)(BCD3+1)(BCD3)程序程序:MOV AL,BCD1 ;(;(AL)=34ADD AL,BCD2 ;(;(AL)(AL)+(BCD2),BD=34+89,AF=0,CF=0DAA ;0BD+06+60=23,AF=1,CF=1MOV BCD3,AL ;(BCD3)=23MOV AL,BCD1+1;(AL)=18ADC AL,BCD2+1 ;40=18+27+CF(AL),AF=1,CF=0DAA ;(;(AL)+06=46(AL),CF=0,AF=1MOV BCD3+1,AL;(BCD3)=4623H ;(;(BCD3+1)(BCD3)=4623H(Decimal adjust for subtration)格式:格式:DAS 操作操作:(AL)把(把(AL)中的)中的差差调整到调整到压缩的压缩的BCD格式格式。条件:条件:DAS 影响影响 标志标志:影响影响A、C、P、S、Z.而对而对O标志未作定义。标志未作定义。校正操作:校正操作:应用举例:应用举例:例例1:设(:设(AL)=86H,(AH)=07H SUB AL,AH;(;(AL)=7FH,CF=0,AF=1 DAS ;(;(AL)=(AL)-06=79 H,例例2:设(:设(BCD1)=1234H,(,(BCD2)=4612H 试写出(试写出(BCD3)(BCD1)-(BCD2)指令序列。)指令序列。MOV AL,BCD1 ;(;(AL)=34SUB AL,BCD2 ;(;(AL)(AL)-(BCD2)=34-12=22 DAS ;(;(AL)=22,MOV BCD3,AL ;(;(BCD3)22 MOV AL,BCD1+1;(;(AL)(BCD1+1)=12SBB AL,BCD2+1 ;(;(AL)(AL)-(BCD2+1)-CF=1246=CCH,DAS ;(;(AL)(AL)-06-60=66,AF=1,CF=1MOV BCD3+1,AL;(;(BCD3+1)(AL)=666622是是-3378的十的补码(以十为模的十的补码(以十为模)结果对的结果对的(ASCII adjust for addition)格式:格式:AAA:(AL)把(把(AL)中的)中的。(AH)(AH)+调整产生的进位值。调整产生的进位值。影响影响AF、CF,其它标志位均无定义。,其它标志位均无定义。应用举例:应用举例:例例1:设设(AX)=0535H,(BL)=39H程序:程序:ADD AL,BL ;(;(AL)=6 H,AF=0,(AH)=05H ;(;(AX)=H,例例2:计算:计算 46093875?(自学)(自学)加数与被加数存放在内存情况如右图:加数与被加数存放在内存情况如右图:3939303036363434.3535373738383333.SUMSUMSTRING2STRING2STRING1STRING19900664455778833被被加加数数加加数数存存结结果果加数与被加数存放在内存情况加数与被加数存放在内存情况程序:程序:LEA SI,STRING1LEA BX,STRING2LEA DI,SUMMOV CX,4CLCNEXT:MOV AL,SIADC AL,BXMOV DI,ALINC SIINC BXINC DIDEC CXJNZ NEXTHLT流程图流程图开始开始初始化,置被加数、加数、初始化,置被加数、加数、结果的地址指针结果的地址指针置循环次数,清进位置循环次数,清进位取一个字节被加数取一个字节被加数与加数相加与加数相加AAA调整AAA调整送存送存地址指针1地址指针1循环次数1循环次数1循环次数0?循环次数0?结束结束N NY Y(ASCII adjust for subtration)格式:格式:AAS:(AL)把(把(AL)中的)中的,影响标志位:影响影响标志位:影响AF、CF,其它标志位均无定义。,其它标志位均无定义。例:例:编写程序段,实现编写程序段,实现(DX)UP1+UP2-UP325+48 -19 MOV AX,0 ;MOV AL,UP1;(AL)05H;(AL)05+08=0 H;(AL),MOV DL,AL ;(DL)03HMOV AL,UP1+1;(AL)=02 H ;(;(AL)02+04+=06+1=07,AF=0,CF=0 ;(;(AL)=07,CF=AF=0 XCHG AL,DL ;(;(DL)=07,(,(AL)=03 ;(;(AL)(AL)-(UP3)=03-09=0,;(;(AL)(AL)-=04H,XCHG AL,DL ;,(,(AL)=07H;(;(AL)07-01-1=05H,CF=AF=0 ;(;(AL)=05H,CF=AF=0MOV DH,AL ;(;(AL)所以,所以,正是十进制数正是十进制数54的非压缩的非压缩BCD格式。格式。(5)、)、AAM(ASCII adjust for multiply)乘法乘法ASCII调整指令调整指令格式:格式:AAM:(AX)把(把(AL)中的)中的积调整到非压缩的积调整到非压缩的BCD码码。条件码设置:条件码设置:根据(根据(AL)设置条件码)设置条件码SF、ZF、PF。但但 0F、CF、AF无定义。无定义。应用举例:应用举例:例例1:设设(AL)=07H(BCD),(,(BL)=09H(BCD)MOV AL,07HMOV BL,09HMUL BL ;(AX)=003FH ;(AH)=06H,(AL)=03H,SF=ZF=0,PF=1 (6)、)、AAD(ASCII adjust for division)除法除法ASCII调整指令调整指令加法、减法、乘法的加法、减法、乘法的ASCII调整指令是对二个非压缩码运调整指令是对二个非压缩码运算以后的结果进行调整。算以后的结果进行调整。除法除法ASCII调整指令调整指令AAD:将存放在(将存放在(AX)中二位非压缩)中二位非压缩BCD的的操作:(操作:(AL)(AH)0AH+(AL)(AH)0标志:对标志:对SF、ZF、PF设置设置对对OF、CF、AF无定义无定义AAD指令用法:指令用法:应用举例:应用举例:例例1:编程实现:编程实现 73/2 =?设设 (AX)=0703H,(BL)=02HMOV AX,0703HMOV BL,02HAAD;(AL)=49H (73D)DIV BL;(AL)=24H(商),商),(AH)=01H(余数)余数)AAM;(AH)=03H ,(AL)=06H第第3章:章:3.4.3 乘法和除法指令乘法和除法指令 (OPRDOPRD)(ALAL)字乘法字乘法 (DXDX:AXAX)(OPRDOPRD)(AXAX)乘法指令中,源操作数乘法指令中,源操作数OPTROPTR可以是寄存器或存储器操作数,但不能是立可以是寄存器或存储器操作数,但不能是立即数即数 。而且乘法指令要求量操作数字长相等。而且乘法指令要求量操作数字长相等。乘法指令分乘法指令分无符号无符号和和有符号有符号乘法指令乘法指令MUL reg/mem;无符号乘法;无符号乘法IMUL reg/mem;有符号乘法;有符号乘法例:例:MUL BL ;(;(AX)(AL)(BL)MUL BX ;(;(DX:AX)(AX)(BX)MUL BYTE PTRSI ;(;(AX)(AL)与)与SI间址所指的字存储间址所指的字存储 单元的内容相乘单元的内容相乘 MUL WORD PTRDI+50H ;(;(DX:AX)(AX)与()与(DI50H)字存储单元的内容相字存储单元的内容相乘乘 两个两个8位数相乘,乘积可能有位数相乘,乘积可能有16位;两个位;两个16为数相乘,乘积可能有为数相乘,乘积可能有32位。如果乘积的高半部分(在字节相乘时为位。如果乘积的高半部分(在字节相乘时为AH,在字相乘时为,在字相乘时为DX)不为零,则不为零,则CFOF1,代表,代表AH或或DX中包含乘积的有效数字。否则中包含乘积的有效数字。否则CFOF0。对其它标志无定义。对其它标志无定义。指令中的源操作数应满足无符号数的表示范围。在某些情况,可用指令中的源操作数应满足无符号数的表示范围。在某些情况,可用左移指令来代替乘法指令,以加快程序的运行速度。左移指令来代替乘法指令,以加快程序的运行速度。(2)带符号数的乘法指令)带符号数的乘法指令IMULIMUL指令在格式上和功能上都与指令在格式上和功能上都与MUL指令类似,只是有如下极点区别:指令类似,只是有如下极点区别:q 要求量乘数都虚伪有符号数。要求量乘数都虚伪有符号数。q 若乘积的高半部分是低半部分的符号为的扩展,则若乘积的高半部分是低半部分的符号为的扩展,则CFOF=0,否则,否则CFOF1。q 指令中给出的源操作数应满足带符号数的表示范围。指令中给出的源操作数应满足带符号数的表示范围。除法指令分除法指令分无符号无符号和和有符号有符号除法指令除法指令DIV reg/mem;无符号除法;无符号除法IDIV reg/mem;有符号;有符号除除法法DIV BL;AX中的中的16位数初一位数初一BL中的中的8位数,商在位数,商在AL 中,余数在中,余数在AH中中除法指令举例除法指令举例例例 (AX)=0501H,(BL)=0C6H (1)DIV BL (2)IDIV BL 看作无符号数看作无符号数 看作带符号数看作带符号数 (AL)=1281D (AL)=1281D (BL)=198D (BL)=-58D 1281/198 1281/(-58)商商=6D 商商=-22D=0EAH 余数余数=93D=5DH 余数余数=5D 执行执行DIV BL后:后:执行执行IDIV BL后:后:(AX)=5D06H (AX)=05EAH第第3章:章:3.5 位操作类指令位操作类指令 位操作类指令以位操作类指令以二进制位二进制位为基本单位进行数据的为基本单位进行数据的操作操作当需要对字节或字数据中的各个二进制位操作时,当需要对字节或字数据中的各个二进制位操作时,可以考虑采用位操作类指令可以考虑采用位操作类指令注意这些指令对标志位的影响注意这些指令对标志位的影响1.逻辑运算指令逻辑运算指令AND OR XOR NOT TEST2.移位指令移位指令SHL SHR SAR3.循环移位指令循环移位指令ROL ROR RCL RCR第第3章:章:3.5.1 逻辑运算指令逻辑运算指令双操作数逻辑指令双操作数逻辑指令AND、OR、XOR和和TEST设置设置CFOF0,根据结果设置,根据结果设置SF、ZF和和PF状态,而对状态,而对AF未定义;它们的操作未定义;它们的操作数组合与数组合与ADD、SUB等一样:等一样:运算指令助记符运算指令助记符 reg,imm/reg/mem运算指令助记符运算指令助记符 mem,imm/reg 单操作数逻辑指令单操作数逻辑指令NOT不影响标志位,操不影响标志位,操作数与作数与INC、DEC和和NEG一样:一样:NOT reg/mem 逻辑与指令逻辑与指令AND对两个操作数执行逻辑与运算,结果送目的操作数对两个操作数执行逻辑与运算,结果送目的操作数AND dest,srcAND dest,src;destdestdestdestsrcsrc 只有相只有相“与与”的两位的两位都是都是1,结果才是,结果才是1;否;否则,则,“与与”的结果为的结果为0第第3章:章:3.5.1 逻辑运算指令逻辑运算指令 逻辑或指令逻辑或指令OR对两个操作数执行逻辑或运算,结果送目的操作数对两个操作数执行逻辑或运算,结果送目的操作数OR dest,srcOR dest,src;destdestdestdestsrcsrc只要相只要相“或或”的两位的两位有一位是有一位是1,结果就是,结果就是1;否则,结果为;否则,结果为0第第3章:章:3.5.1 逻辑运算指令逻辑运算指令 逻辑异或指令逻辑异或指令XOR对两个操作数执行逻辑异或运算,结果送目的操作数对两个操作数执行逻辑异或运算,结果送目的操作数XOR dest,srcXOR dest,src;destdestdestdestsrcsrc只有相只有相“异或异或”的两的两位不相同,结果才是位不相同,结果才是1;否则,结果为否则,结果为0第第3章:章:3.5.1 逻辑运算指令逻辑运算指令 测试指令测试指令TEST对两个操作数执行逻辑与运算,结果并不送目的操对两个操作数执行逻辑与运算,结果并不送目的操作数,仅按作数,仅按AND指令影响标志。故这条指令常用于指令影响标志。故这条指令常用于在不破坏操作数内容在不破坏操作数内容 情况下检测操作数中某些位是情况下检测操作数中某些位是“1”还是还是“0”,此指令通常和条件转移指令相配合。,此指令通常和条件转移指令相配合。TEST dest,srcTEST dest,src;destdestsrcsrc AND与与TEST指令的关系,指令的关系,同同SUB与与CMP指令的关系一样指令的关系一样第第3章:章:3.5.1 逻辑运算指令逻辑运算指令TEST AL,02H ;若若AL中中D1位为位为1,则,则ZF0,否则,否则ZF1TEST AX,8000H ;若若AX中最高位为中最高位为1,则,则ZF0,否则,否则ZF1 逻辑非指令逻辑非指令NOT对一个操作数执行逻辑非运算对一个操作数执行逻辑非运算NOT reg/memNOT reg/mem;reg/memreg/memreg/memreg/mem 按位取反,原来按位取反,原来是是“0”的位变为的位变为“1”;原来是;原来是“1”的位变为的位变为“0”第第3章:章:3.5.1 逻辑运算指令逻辑运算指令第第3章:例章:例3.16 逻辑运算逻辑运算mov al,75h;AL75Hand al,32h;AL30H;CFOF0,SF0,ZF0,PF1or al,71h;AL71H;CFOF0,SF0,ZF0,PF1xor al,0f1h;AL80H;CFOF0,SF1,ZF0,PF0not al;AL7FH,标志不变,标志不变第第3章:章:例例3.17 逻辑运算指令的应用逻辑运算指令的应用and bl,11110110b;BL中中D0和和D3清清0,其余位不变,其余位不变or bl,00001001b;BL中中D0和和D3置置1,其余位不变,其余位不变xor bl,00001001b;BL中中D0和和D3求反,其余位不变求反,其余位不变 AND指令可用于复位某些位(同指令可用于复位某些位(同0相与),不影响其他位相与),不影响其他位 OR指令可用于置位某些位(同指令可用于置位某些位(同1相或),不影响其他位相或),不影响其他位 XOR指令可用于求反某些位(同指令可用于求反某些位(同1相异或),不影响其他位相异或),不影响其他位第第3章:章:3.5.2 移位指令移位指令将操作数移动一位或多位,分成逻辑移位将操作数移动一位或多位,分成逻辑移位和算术移位,分别具有左移或右移操作和算术移位,分别具有左移或右移操作移位指令的移位指令的第一个操作数第一个操作数是指定的被移位是指定的被移位的操作数,可以是寄存器或存储单元;的操作数,可以是寄存器或存储单元;后后一个操作数一个操作数表示移位位数:表示移位位数:该操作数该操作数为为1,表示移动一位,表示移动一位该操作数该操作数为为CL,CL寄存器值表示移位位数寄存器值表示移位位数(移位位数(移位位数大于大于1只能只能CL表示表示)按照移入的位设置进位标志按照移入的位设置进位标志CF,根据移位,根据移位后的结果影响后的结果影响SF、ZF、PF 逻辑左移指令逻辑左移指令SHL(shift logic left)SHL reg/mem,1/CL;reg/mem左移左移1或或CL位位;最低位补;最低位补0,最高位进入,最高位进入CF演示演示第第3章:章:3.5.2 移位指令移位指令 逻辑右移指令逻辑右移指令SHR(shift logic right)SHR reg/mem,1/CL;reg/mem右移右移1/CL位位;最高位补;最高位补0,最低位进入,最低位进入CF演示演示第第3章:章:3.5.2 移位指令移位指令 算术左移指令算术左移指令SAL(shift arithmetic left)SAL reg/mem,1/CL;与;与SHL是同一条指令是同一条指令演示演示第第3章:章:3.5.2 移位指令移位指令 算术右移指令算术右移指令SAR(shift arithmetic right)SAR reg/mem,1/CL;reg/mem右移右移1/CL位位;最高位不变,最低位进入;最高位不变,最低位进入CF演示演示第第3章:章:3.5.2 移位指令移位指令第第3章:例章:例3.18 数据移位数据移位mov dx,6075h;DX01100000 01110101Bshl dx,1;DX11000000 11101010B;CF0,SF1、ZF0、PF0sar dx,1;DX11100000 01110101B;CF0,SF1、ZF0、PF0shr dx,1;DX01110000 00111010B;CF1,SF0、ZF0、PF1mov cl,4;CL4,标志不变,标志不变sar dx,cl;DX00000111 00000011B;CF1,SF0、ZF0、PF1第第3章:例章:例3.19 将将AL寄存器中的无符号数乘以寄存器中的无符号数乘以10 xor ah,ah;实现;实现AH0,同时,同时使使CF0shl ax,1;AX2ALmov bx,ax;BXAX2ALshl ax,1;AX4ALshl ax,1;AX8ALadd ax,bx;AX8AL2AL10ALsub ah,ahand ah,0 逻辑左移一位相当于无符号数乘以逻辑左移一位相当于无符号数乘以2 逻辑右移一位相当于无符号数除以逻辑右移一位相当于无符号数除以2第第3章:章:3.5.3 循环移位指令循环移位指令循环移位指令类似移位指令,但要将从一循环移位指令类似移位指令,但要将从一端移出的位返回到另一端形成循环。分为端移出的位返回到另一端形成循环。分为:ROL reg/mem,1/CL;不带进位循环左移不带进位循环左移ROR reg/mem,1/CL;不带进位循环右移不带进位循环右移RCL reg/mem,1/CL;带进位循环左移带进位循环左移RCR reg/mem,1/CL;带进位循环右移带进位循环右移循环移位指令的操作数形式与移位指令相循环移位指令的操作数形式与移位指令相同,按指令功能设置进位标志同,按指令功能设置进位标志CF,但不影,但不影响响SF、ZF、PF、AF标志标志演示演示演示演示演示演示演示演示第第3章:章:32位数据移位位数据移位;将;将DX.AXDX.AX中中3232位数值左移一位位数值左移一位shlshl ax,1 ax,1rclrcl dx,1 dx,1DXAXCF0考虑考虑32位数据的右移等操作位数据的右移等操作第第3章:例章:例3.21 非压缩非压缩BCD码合并为压缩码合并为压缩BCD;DBCD有有2位非压缩位非压缩BCD码码mov dl,dbcd;取低字节;取低字节and dl,0fh;只要低;只要低4位位mov dh,dbcd+1;取高字节;取高字节mov cl,4shl dh,cl;低;低4位移到高位移到高4位位or dl,dh;合并到;合并到DLrol dh,clrcr dh,clSHL和和SAL指令的功能指令的功能SHR指令的功能指令的功能SAR指令的功能指令的功能ROL指令的功能指令的功能ROR指令的功能指令的功能RCL指令的功能指令的功能RCR指令的功能指令的功能
展开阅读全文