写一个LC-3汇编代码来计算寄存器R0中“1”位的数量,并将结果存入寄存器R5。例如,如果R0包含“0000 0001 0010 1100”,则应将结果4存储在R5中。我从各种来源获得了一些信息,但编码不适用于正确的程序,我不了解LC3足以适应它。这是我到目前为止所做的:
.ORIG x3000
AND R5, R5, #0 ; R5 will act as a mask to
AND R5, R5, #1 ; mask out the uneeded bit
AND R1, R1, #0 ; zero out the result register
AND R2, R2, #0 ; R2 will act as a counter
LD R3, NegSixt ;
MskLoop AND R4, R0, R5 ; Mask off the bit
BRz NotOne ;
NotOne ADD R1, R1, #1 ; if the bit is 0 don't increment
ADD R5, R5, R5 ; shift the mask one bit to the left
ADD R2, R2, #1 ; Increment counter tells where we are
ADD R6, R2, R3 ;
BRn MskLoop ;
ADD R6, R2, R3 ;
BRn MskLoop ; Not done yet go back and
HALT ; check the other bits
NegSixt .FILL 000000100101100 ;
.END
我试着修改一下但是我确定我搞砸了......
答案 0 :(得分:0)
我不熟悉LC3。 但要计算设置的位数,请使用右移位寄存器命令将位移入进位标志的效果。
这是一个你需要的算法:
bitSet counter = 0
loop:
if (register == 0) {
jumpto end
}
right shift register
if carry is set {
increase bitSet counter
}
jumpto loop
end:
答案 1 :(得分:0)
我建议使用第一原则,而不是仅修改整个程序的其他代码。你很容易就会在你不知道发生了什么或为什么会这样的地方结束。
这里的方法是一次查看第一位并确定它是零还是非零。所以,
0110 0110 0110 0110
&0001 &0010 &0100 &1000
===== ===== ===== =====
0000 == 0 0010 != 0 0100 != 0 0000 == 0
你可以看到有两个条目,结果不是0(因此应该增加我们的计数寄存器)。
为了概括它,我们可以循环
for each digit
if (number & mask != 0)
increment counter
move "1" in mask to the left
这里唯一“棘手”的部分是进步面具。在许多架构中,您可以使用移位指令,但这在LC3中不存在。然而,向左移动只是乘以2,而2的乘法只是为自己添加一些东西(在你粘贴的代码中看到)。