0%

X86指令体系中的逻辑运算指令

前言:学习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
2
AND BL,11110110B  ;将BL中的D0和D3位清零,其他位不变
AND AL,0FH ;屏蔽AL高四位,保留低四位(常用)

OR指令可用于置某些位为1

1
2
3
or BL,00001001B   ;将BL中的D3和D0位置1
or AX,AX ;置标志位,这一条指令没有改变AX的值,但是改变了标志
;寄存器的值,可以反应出AX的标志状态,在程序中经常使用

TEST测试某位是否为0

1
2
mov AL,0EFH
TEST AL,40H

测试AL寄存器中的D6位是否为0。40H的D6位为1,其余各位为0。指令TEST做相与运算,如果AL的D6位为0,结果一定为0

指令TEST执行后可根据状态位ZF的状态来判断AL寄存器的D6位是否为0,但没有改变AL寄存器的内容

对指定位求反

1
2
XOR BL,0FH  ;BL高四位不变,低四位求反
XOR AL,55H ;AL偶数位不变,奇数位求反

清除寄存器及CF(常用指令)

1
XOR AX,AX  ;AX = 0,CF = 0