如何使用汇编语言编写一条指令,清除AL寄存器中的0和1位?
假设采用MASM格式,则将AL和11111100b进行逻辑与操作。
for each bit index `i`
result[i] = boolean_and(first[i], second[i])
.--------- commonly associated symbol for the operation
|
& 1 0 <- first argument
-------
1 | 1 0 <- result
0 | 0 0
^--------- second argument
一个字节的例子:
00101100
00111010
&
00101000
因此,您可以使用此操作来屏蔽和翻转寄存器中的位区域。将常量作为第二个参数传递,其中翻转了要保留的位。
x86 mnemonic: AND a, b
operation: a = a & b
AND eax, 0xfffffffc
AL是EAX寄存器的最低字节,所以您可以这样做。
下面是二进制转十六进制的转换表:
0000 | 0
0001 | 1
0010 | 2
0011 | 3
0100 | 4
0101 | 5
0110 | 6
0111 | 7
1000 | 8
1001 | 9
1010 | a
1011 | b
1100 | c
1101 | d
1110 | e
1111 | f
如果你想成为一个有自尊心的汇编语言程序员,那么你应该记住这个。
还要阅读关于OR和XOR位运算的相关内容。
AL是AX寄存器的低字节,因此您应该能够使用AND AL 0xFC来屏蔽低位。
AND AL,0xfc
还有另一种方法可以使用 xor
例子:
mov al, ff
xor al, 00000011b
al = fc because we cleared bit 0 and 1
and al, 0xFD
根据你使用的汇编器进行适应:gas、nasm、masm等。
编辑:实际上是and al, 0xFC
,但你明白我的意思。
将其归零?
例如:
mov al,00000000
ax=16位 al=8位
现在,如果任何东西与al进行或运算,答案将与所进行的或运算相同
但是
如果任何东西与al进行与运算,答案将为“0”
因此,我想用全1或全0清除它取决于您的工作以及您希望如何识别寄存器中没有任何内容。