前言:学习X86指令体系中的逻辑运算指令
逻辑运算指令分为单操作数指令,也有双操作数指令。操作数可为8位或16位二进制数。双操作数指令不允许两个操作数都是存储器操作数,目的操作数不能是立即数。两个操作数的位数要一样
逻辑与运算指令AND
指令格式:AND OPD,OPS
指令功能:对两个操作数执行 逻辑与运算,结果送到目的操作数,即OPD&&OPS ➡ OPD
对标志位的影响:设置CF = OF = 0,根据结果确定SF、ZF和PF状态,而对AF未定义
逻辑或运算OR
指令格式:OR OPD,OPS
指令功能:对两个操作数进行逻辑或运算,结果送到目的操作数,即OPD || OPS ➡ OPD
对标志位的影响同AND
逻辑非指令NOT
指令格式:NOT OPD
指令功能:对一个操作数执行逻辑非运算。不影响标志位
逻辑异或运算XOR
指令格式:XOR OPD,OPS
指令功能:对两个操作数执行逻辑异或运算,结果送到目的操作数。对标志位的影响同AND指令
测试指令TEST
指令格式:TEST OPD,OPS
指令功能:对两个操作数执行逻辑与运算,结果不回送到目的操作数。OPD&&OPS,结果不回送OPD,仅建立结果状态标志
TEST指令可用于检测一些条件是否满足,但又不会改变原操作数的内容
逻辑运算指令的应用
AND指令可用于屏蔽某些位
1 | AND BL,11110110B ;将BL中的D0和D3位清零,其他位不变 |
OR指令可用于置某些位为1
1 | or BL,00001001B ;将BL中的D3和D0位置1 |
TEST测试某位是否为0
1 | mov AL,0EFH |
测试AL寄存器中的D6位是否为0。40H的D6位为1,其余各位为0。指令TEST做相与运算,如果AL的D6位为0,结果一定为0
指令TEST执行后可根据状态位ZF的状态来判断AL寄存器的D6位是否为0,但没有改变AL寄存器的内容
对指定位求反
1 | XOR BL,0FH ;BL高四位不变,低四位求反 |
清除寄存器及CF(常用指令)
1 | XOR AX,AX ;AX = 0,CF = 0 |