例如,假设寄存器 4 (R4) 的值为 0001110010101111。如何在不移动或更改单个十六进制指令中的其他位的情况下将位 5 (0001110010 > 1 < 01111) 更改为 0(即使它已经是 0)?
所以 0001110010 1 01111 -> 0001110010 0 01111
例如,假设寄存器 4 (R4) 的值为 0001110010101111。如何在不移动或更改单个十六进制指令中的其他位的情况下将位 5 (0001110010 > 1 < 01111) 更改为 0(即使它已经是 0)?
所以 0001110010 1 01111 -> 0001110010 0 01111
你会想要的AND
。由于 for 的立即值为AND
5 位并且它使用符号扩展,因此您只能清除一个位,如果它是四个最低有效位之一。否则,您将需要执行另一条指令将掩码加载到寄存器中。我会做一个两者的例子。
在第 5 位的情况下,将屏蔽该位的数字是0b1111111111011111
。在十进制中,这是#65503
or #-33
。由于这太大而无法放入立即指令中,因此您将无法在单个指令中完成。您需要在程序的数据段中声明它并将掩码加载到寄存器中。然后,您可以AND
使用R4
.
; assuming R4 = 0001110010101111
LD R5, MASK_5 ; load the mask into R5
AND R4, R4, R5 ; set R4 = R4 AND R5
; R4 will now have the bit cleared
; data segment
MASK_5 .FILL #65503
在第 3 位的情况下,将屏蔽该位的数字是0b1111111111110111
。在十进制中,这是#65527
or #-9
。这将适合 的立即值AND
,因此您可以在一条指令中执行它:
; assuming R4 = 0001110010101111
AND R4, R4, #-9 ; set R4 = R4 AND #-9
; R4 will now have the bit cleared