如何在不更改ONE指令中的其他位的情况下清除寄存器中的特定位?

时间:2014-10-08 21:04:32

标签: hex bit cpu-registers lc3

例如,让我们说寄存器4(R4)的值为0001110010101111.如何将第5位(0001110010> 1 < 01111)更改为0(即使它已经0)没有移动或更改单个十六进制指令中的其他位

所以0001110010 1 01111 - > 0001110010的 0 01111

1 个答案:

答案 0 :(得分:0)

你想要AND它。由于AND的立即值是5位并且它使用符号扩展,所以如果它是四个最低有效位之一,则只能清除一个位。否则,您需要执行另一条指令将掩码加载到寄存器中。我会举两个例子。

在第5位的情况下,掩码该位的数字为0b1111111111011111。在十进制中,这是#65503#-33。由于它太大而不适合立即指令,因此您无法在单个指令中执行此操作。您需要在程序的数据段中声明它并将掩码加载到寄存器中。然后,您可以ANDR4进行; 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

0b1111111111110111

在第3位的情况下,掩码该位的数字为#65527。在十进制中,这是#-9AND。这将符合; assuming R4 = 0001110010101111 AND R4, R4, #-9 ; set R4 = R4 AND #-9 ; R4 will now have the bit cleared 的直接值,因此您可以在一条指令中执行它:

{{1}}