Intel指令包含了AND,OR,XOR,NOT,TEST指令,它们能直接在二进制位上实现布尔操作。其中TEST不会改变数据的AND指令,但会改变CPU标志位。
部分布尔指令 | |
---|---|
AND | AND 指令在两个操作数的对应位之间进行按位逻辑与操作,并将结果存放在目标操作数中。操作数可以是 8、16、32、64 位,但是两个操作数必须是同样大小。 |
OR | 或 |
XOR | 异或 |
NOT | 非 |
TEST | 与,但不改变内存数据,只改变CPU状态位。 |
AND指令
X | Y | and的结果 | 备注 |
0 | 0 | 0 | 0 0 得 0 |
0 | 1 | 0 | 0 1 得 0 |
1 | 0 | 0 | 1 0 得 0 |
1 | 1 | 1 | 1 1 得 1 |
下列是被允许的操作数组合,但是立即操作数不能超过 32 位:
AND reg, reg
AND reg, mem
AND reg, imm
AND mem, reg
AND mem, imm
AND 指令可以清除一个操作数中的 1 个位或多个位,同时又不影响其他位。这个技术就称为位屏蔽,就像在粉刷房子时,用遮盖胶带把不用粉刷的地方(如窗户)盖起来。目标数的哪个位想要设计为0,操作数的对应位就写0然后其它位写1。
mov al, 10101110b
and al, 11110110b ;AL 中的结果 = 1010 0110
AND 指令提供了一种简单的方法将字符从小写转换为大写。如果对比大写 A 和小写 a 的 ASCII 码,就会发现只有第5位不同:
0 1 1 0 0 0 0 1 = 61h ('a')
0 1 0 0 0 0 0 1 = 41h ('A')
其他的字母字符也是同样的关系。下例中,数组中所有字符都转换为大写:
.data
array BYTE 50 DUP(?)
.code
mov ecx,LENGTHOF array
mov esi,OFFSET array
L1: and BYTE PTR [esi], 11011111b ;清除位 5
inc esi
loop L1