1复习:算术运算指令比较指令CMP加/减1指令INC,DEC不带进位的加/减法指令ADD,SUB带进位的加/减法指令ADC,SBB23.4逻辑运算指令●运算规则:按位操作,无进/借位,包括以下两类:•逻辑位运算•移位、循环移位CFOFSFZFPFAF00***无定义根据运算结果设置●对标志位的影响(除NOT指令外):31、逻辑运算指令有5条指令。(1)“与”运算指令AND(2)“或”运算指令OR(3)“异或”运算指令XOR(4)“非”运算指令NOT(5)测试指令TEST4(1)逻辑”与”AND对两个操作数进行按位逻辑“与”操作。格式:ANDdst,src功能:(dst)∧(src)→(dst)用途:保留操作数的某几位,其他位清零。例1:ANDAL,0FH若执行前:(AL)=35H(即‘5’:字符5的ASCII码值)执行:0011010100001111分离了AL后4位00000101例:ANDDX,0FF00H;分离DX内容的高8位ANDAL,0F0H;分离AL内容的高4位执行后:(AL)=05H(保留AL中低4位,高4位清0)即:ANDAL,0FHSUBAL,30H6例2:AL中有字符’a’~’z’,将其转换成大写。;’a’~’z’=61H~7AH;’A’~’Z’=41H~5AH;’a’-’A’=20H……’z’-’Z’=20HANDAL,11011111B7例3:测试AL的bit7,bit5,bit2是否都是1。ANDAL,10100100BCMPAL,10100100BJZYESnotall1……YES:8对两个操作数进行按位逻辑”或”操作。格式:ORdst,src功能:(dst)∨(src)→(dst)用途:对操作数的某几位置1;对两操作数进行组合。(2)逻辑“或”OR9例1:把AL的第5位置为1。ORAL,00100000B例2:把AL中的非压缩BCD码变成相应十进制数的ASCII码。(求数字0~9的ASCII码)ORAL,30H;’0’~’9’=30H~39H10对操作数进行按位逻辑”非”操作。格式:NOTmem/reg(3)逻辑“非”(取反)NOT按位取反,原来是“0”的位变为“1”;原来是“1”的位变为“0”例:已知CX=00110101B=35HNOTCX;CX=11001010B=0CAH11对两个操作数按位进行”异或”操作。格式:XORdst,src功能:(dst)⊕(src)→(dst)用途:对reg清零(自身异或)把reg/mem的某几位变反(与’1’异或)(4)逻辑”异或”XOR例1:把AX寄存器清零。例2:把DH的bit4,3变反①MOVAX,0②XORAX,AX③ANDAX,0④SUBAX,AXXORDH,18H12三种运算指令的操作数通用寄存器通用寄存器立即数存储器∧∨⊕立即数通用寄存器∧∨⊕存储器目的操作数源操作数13三种运算指令的主要作用指令作用举例AND使目的操作数某些位不变,某些位变成0保留AX的最后4位不变,其余清0ORXOR使目的操作数某些位不变,某些位变成1想把BX的低8位置1,其余不变可以将目的操作数中的某些位取反;还可以将通用寄存器清0想把CX的内容清015操作与AND指令类似,但不将”与”的结果送回,只影响标志位。TEST指令常用于位测试,与条件转移指令一起用。(5)测试指令TEST类似CMP例:测试AL的内容是否为负数。TESTAL,80H;检查AL中D7=1?JNZMINUS;是1(负数),转MINUS……;否则为正数MINUS:162、移位指令(1)逻辑移位指令(2)算术移位指令(3)循环移位指令(4)带进位位循环移位指令目的操作数可以是字节或字;以CL为源操作数的移位指令执行以后,CL的值不变。有8条指令,分为以下四类。1CL,存储器通用寄存器目的操作数源操作数17逻辑左移指令SHL(ShiftLeft)逻辑右移指令SHR(ShiftRight)算术左移指令SAL(ShiftArithmeticLeft)算术右移指令SAR(ShiftArithmeticRight)这4条指令的格式相同,以SAL为例:(1)非循环移位指令CL;移位位数大于1时1;移位位数等于1时SALmem/reg,18逻辑左移指令SHL(ShiftlogicalLeft)格式:SHLdst,count功能:将dst中的8位或16位数向左移动count次,最后移出的位进入CF,右边的count位移入0。移动次数count只能为1或CL。如:SHLAX,1SHLAL,CLCFdstD2D4D6D0D1D3D5D7“0”D7D1D3D50D0D2D4D619逻辑右移指令SHR(ShiftlogicalRight)格式:SHRdst,count功能:特点是移出的位进入进位位CF,空出的位用“0”填入。dstCFD7D6D5D4D3D2D1D0D0“0”D3D5D7D1D2D4D60算术左移指令SAL(ShiftArithmeticLeft)dstCFD2D4D6D0D1D3D5D7格式:SARdst,count功能:将dst中的8位或16位数向右移动count次,最后移出的位进入CF,最左边的位既向右移又保持不变。算术右移指令SAR(ShiftArithmeticRight)格式:SALdst,count功能:与逻辑左移指令功能完全相同。D7D0D3D5D7D1D2D4D621非循环移位指令功能示意图最低位最高位CF0(a)算术/逻辑左移SAL/SHL最低位最高位CF(b)算术右移SAR最低位最高位CF(c)逻辑右移SHR0算术/逻辑左移SHL/SAL指令算术右移SAR指令逻辑右移SHR指令25movCL,4movAL,11110000B;AL=F0HSHLAL,1;AL=E0H;CF=1,SF=1、ZF=0、PF=0,OF=0SHRAL,1;AL=70H;CF=0,SF=0、ZF=0、PF=0、OF=1SARAL,1;AL=38H;CF=0,SF=0、ZF=0、PF=0、OF=0SARAL,CL;AL=03h;CF=1,SF=0、ZF=0、PF=126算术移位——把操作数看做有符号数;逻辑移位——把操作数看做无符号数。移位位数放在CL寄存器中,如果只移1位,也可以直接写在指令中。例如:MOVCL,4SHRAL,CL;AL中的内容右移4位影响C,P,S,Z,O标志。结果未溢出时:左移1位≡操作数*2右移1位≡操作数/227例:把AL中的数x乘10因为10=8+2=23+21,所以可用移位实现乘10操作。程序如下:MOVCL,3SALAL,1;2xMOVAH,ALSALAL,1;4xSALAL,1;8xADDAL,AH;8x+2x=10x28用移位操作代替乘除法可提高运算速度例:前例中计算x*10。(1)采用乘法指令:MOVBL,10MULBL共需70~77个T周期。(2)采用移位和加法指令:SALAL,1;2TMOVAH,AL;2TSALAL,1;2TSALAL,1;2TADDAL,AH;3T只需11个T周期,仅相当于乘法的1/7。29不含进位位的循环左移指令ROL不含进位位的循环右移指令ROR含进位位的循环左移指令RCL含进位位的循环右移指令RCR(2)循环移位指令格式同非循环移位指令。移位位数放在CL寄存器中,如果只移1位,也可以直接写在指令中。循环移位指令只影响标志位CF和OF。30循环左移指令ROL(RotateLeft)格式:ROLdst,count功能:循环右移指令ROR(RotateRight)格式:RORdst,count功能:D0CFD0D3D5D7D1D2D4D6D7CFD7D1D3D5D0D2D4D6CF带进位位循环左移指令(RotateLeftthroughCarry)格式:RCLdst,count功能:CFD7D1D3D5D0D2D4D6带进位位循环右移指令(RotateRightthroughCarry)格式:RCRdst,count功能:CFCFD0D3D5D7D1D2D4D632(a)ROL最低位最高位CF(c)RCL最低位最高位CF(b)ROR最低位最高位CF(d)RCR最低位最高位CF循环移位指令功能示意图ROL指令ROR指令RCL指令RCR指令37循环移位举例:例1:将AL的高4位与低4位互换。MOVCL,4ROLAL,CL38DXAXCF0SHLAX,1例:将DX.AX中32位数值左移一位RCLDX,141移位指令小结指令主要作用逻辑左移指令SHL逻辑右移指令SHR将操作数乘以2的CL次。将操作数除以2的CL次。算术左移指令SAL算术右移指令SAR将操作数乘以2的CL次。将补码数除以2的CL次。循环左移指令ROL循环右移指令ROR将操作数的高低4位或8位(字节)数据相交换。带进位位循环左移指令RCL带进位位循环右移指令RCR保存其它指令移入CF的值42例题1、以下指令序列,请问实现了什么功能?MOVAL,08HSALAL,1MOVBL,ALMOVCL,2SALAL,CLADDAL,BL;08H→AL;AL算术左移一位,AL=10H,;相当于AL×2;AL→BL;2→CL;AL算术再左移两位,AL=40H,;相当于AL×4;AL+BL→AL整个过程相当于AL×10,AL=50H2、试分析下面的程序段完成什么功能?MOVCL,04HSHLDX,CLMOVBL,AHSHLAX,CLSHRBL,CLORDL,BL;04H→CL;DX逻辑左移4位,相当于DX;低4位清零,DX=×××0H;AH→BL;AX逻辑左移4位,相当于AX低4位;清零,AX=×××0H;BL逻辑右移4位,相当于AH=0×H;现DL的高4位是原来DL的低4位,;现DL的低4位是原AH的高4位所以,完成将DX,AX组成的双字逻辑左移4位。