逻辑运算指令(5条)实现与、或、非、异或、测试等逻辑运算操作数的搭配关系同算术运算除逻辑“非”指令不影响标志外,其他逻辑运算指令均影响标志SF、ZF和PF,而OF和CF一定被置0,AF不确定1、逻辑“与”指令AND格式:ANDd,s功能:(d)(d)∧(s)说明:将目的操作数d与源操作数s按位相“与”结果送回d中,常用于使某些位清0内存立即数AH,ALBH,BLCH,CLDH,DLAX,BXCX,DXSI,DIBP,SP例如:ANDAX,BXANDCL,[SI]AND[BX][DI-10H],WORDPTR80HANDCH,ALANDBX,1ANDBYTEPTR[20H],20HANDAL,30HANDBYTEPTR[DI],12HOF=CF=0,其它标志位受影响d、s必须具有相同的字长ANDAX,BLd、s不能为段寄存器ANDDS,2000Hd不能是立即数AND10H,AX【例】屏蔽AL的0,1两位。********∧11111100******00【例】将AH的高4位清0。********∧000011110000****【例】将BX的低4位清0。****************∧1111111111110000************0000ANDAL,0FCHANDAH,0FHANDBX,0FFF0H2、逻辑“或”指令OR格式:ORd,s功能:(d)(d)∨(s)说明:将目的操作数d与源操作数s按位相“或”结果送回d中,常用于使某些位置位(置1)内存立即数AH,ALBH,BLCH,CLDH,DLAX,BXCX,DXSI,DIBP,SP例如:ORAX,BXORCL,[SI]OR[BX][DI-10H],WORDPTR80HORCH,ALORBX,1ORBYTEPTR[20H],20HORAL,30HORBYTEPTR[DI],12HOF=CF=0,其它标志位受影响d、s必须具有相同的字长ORAX,BLd、s不能为段寄存器ORDS,2000Hd不能是立即数OR10H,AX【例】将AL的0,1两位置1。********∨00000011******11【例】将AH的高4位置1。********∨111100001111****【例】将BX的低4位置1。****************∨0000000000001111************1111ORAL,03HORAH,0F0HORBX,000FH3、逻辑“异或”指令XOR格式:XORd,s功能:(d)(d)⊕(s)说明:将目的操作数d与源操作数s按位相“异或”结果送回d中,常用于使某些位取反内存立即数AH,ALBH,BLCH,CLDH,DLAX,BXCX,DXSI,DIBP,SP例如:XORAX,BXXORCL,[SI]XOR[BX][DI-10H],WORDPTR80HXORCH,ALXORBX,1XORBYTEPTR[20H],20HXORAL,30HXORBYTEPTR[DI],12HOF=CF=0,其它标志位受影响d、s必须具有相同的字长XORAX,BLd、s不能为段寄存器XORDS,2000Hd不能是立即数XOR10H,AX【例】对AL的0,1两位取反。********⊕00000011******--【例】对CL的1,2,3,4,5位取反,其它位不变。********⊕00111110**-----*【例】置DX为0。XORAL,03HXORCL,3EHXORDX,DX例如:NOTAXNOTDHNOTSINOTBYTEPTR[SI]不影响标志位d不能是段寄存器、立即数NOTDSNOT10H4、逻辑“非”指令NOT格式:NOTd功能:(d)(d)说明:将目的操作数d取反后结果送回d中5、测试指令TEST格式:TESTd,s功能:(d)∧(s)说明:将目的操作数d与源操作数s按位相“与”,只影响标志位不回送结果,常用于测试某些位是0或1内存立即数AH,ALBH,BLCH,CLDH,DLAX,BXCX,DXSI,DIBP,SP例如:TESTAX,BXTESTCL,[SI]TEST[BX][DI-10H],WORDPTR80HTESTCH,ALTESTBX,1TESTBYTEPTR[20H],20HTESTAL,30HTESTBYTEPTR[DI],12HOF=CF=0,其它标志位受影响d、s必须具有相同的字长TESTAX,BLd、s不能为段寄存器TESTDS,2000Hd不能是立即数TEST10H,AX【例】测试AL的最高位是0/1?TESTAL,80HJZXXX;是0则跳转(JNZXXX;是1则跳转)【例】测试DX的低4位是0/1?TESTDX,0FHJZXXX;是0则跳转(JNZXXX;是1则跳转)移位运算指令(8条)对8位或16位的通用寄存器或存储器内容进行移位,移位次数可以为1~255若移位次数为1则可直接写在指令中,若次数为2~255则不能直接写在指令中,必须先将次数放在寄存器CL中,指令中只能写CL,移位结束后CL的值不变影响标志OF、SF、ZF、PF、CF,但AF不确定。当移位次数为1时,若移位结果使最高位符号位发生变化,则溢出标志OF=1,否则OF=0;当移位次数超过1时,OF无效6、逻辑左移指令SHL(SHiftLeft)格式:SHLd,count功能:逻辑左移说明:将目的操作数d左移count位,右边补0,左边入CF例如:SHLAX,1MOVCL,4SHLDH,CL1CLCFD7D15D00SF、ZF、PF根据移位结果设置CF=移入的数值AF无定义OF=d不能是段寄存器和立即数1count=1时,最高位的值改变0count=1时,最高位的值不变逻辑左移1位相当于无符号数乘以2!BX乘以2:SHLBX,1BX乘以3:MOVAX,BXSHLBX,1ADDBX,AXBX乘以4:MOVCL,2SHLBX,CLBX乘以5:MOVAX,BXMOVCL,2SHLBX,CLADDBX,AXBX乘以6:MOVAX,BXMOVCL,2SHLBX,CLSHLAX,1ADDBX,AXBX乘以7:MOVAX,BXMOVCL,3SHLBX,CLSUBBX,AXBX乘以8:MOVCL,3SHLBX,CLSUBBX,AXBX乘以9:MOVAX,BXMOVCL,3SHLBX,CLADDBX,AXBX乘以10:MOVAX,BXMOVCL,3SHLBX,CLSHLAX,1ADDBX,AX7、逻辑右移指令SHR(SHiftRight)格式:SHRd,count功能:逻辑右移说明:将目的操作数d右移count位,左边补0,右边入CF例如:SHRSI,1MOVCL,3SHRBYTEPTR[BX],CL1CLCFD7D15D00SF、ZF、PF根据移位结果设置CF=移入的数值AF无定义OF=d不能是段寄存器和立即数1count=1时,最高位的值改变0count=1时,最高位的值不变逻辑右移1位相当于无符号数除以2!8、算术左移指令SAL(Arithmetic)格式:SALd,count功能:同逻辑左移完全相同1CL例如:SALAX,1MOVCL,4SALDH,CLCFD7D15D009、算术右移指令SAR(Arithmetic)格式:SARd,count功能:算术右移说明:将操作数d的内容右移,左边不变,右边移入CF中例如:SARDI,1MOVCL,3SARBP,CL1CLSF不变,ZF、PF根据移位结果设置CF=移入的数值AF无定义OF=d不能是段寄存器和立即数1count=1时,最高位的值改变0count=1时,最高位的值不变算术右移1位相当于有符号数除以2!CFD7D15D0符号位不变10、循环左移指令ROL(ROtate/ROundLeft)格式:ROLd,count功能:循环左移说明:将操作数d的内容左移,最高位循环移入最低位,同时移入CF例如:ROLDI,1MOVCL,3ROLBYTEPTR[SI],CL1CLSF、ZF、PF、AF不受影响CF=移入的数值OF=d不能是段寄存器和立即数1count=1时,最高位的值改变0count=1时,最高位的值不变CFD7D15D011、循环右移指令ROR(ROtate/ROundRight)格式:RORd,count功能:循环右移说明:将操作数d的内容右移,最低位循环移入最高位,同时移入CF例如:RORSI,1MOVCL,4RORBYTEPTR[DI],CL1CLSF、ZF、PF、AF不受影响CF=移入的数值OF=d不能是段寄存器和立即数1count=1时,最高位的值改变0count=1时,最高位的值不变CFD7D15D012、带进位循环左移指令RCL(ROtate/ROundCarryLeft)格式:RCLd,count功能:带进位循环左移说明:将操作数d的内容左移,最高位循环移入CF,而CF循环移入最低位例如:RCLBH,1MOVCL,2RCLDX,CL1CLSF、ZF、PF、AF不受影响CF=移入的数值OF=d不能是段寄存器和立即数1count=1时,最高位的值改变0count=1时,最高位的值不变CFD7D15D013、带进位循环右移指令RCR(ROtate/ROundCarryRight)格式:RCRd,count功能:带进位循环右移说明:将操作数d的内容左移,最低位循环移入CF,而CF循环移入最高位例如:RCRBX,1MOVCL,4RCRWORDPTR[DI],CL1CLSF、ZF、PF、AF不受影响CF=移入的数值OF=d不能是段寄存器和立即数1count=1时,最高位的值改变0count=1时,最高位的值不变CFD7D15D0课后作业做书上:3.253.293.39交作业:3.303.323.343.37