我怎么写这个LC3程序?

时间:2016-03-09 14:55:31

标签: assembly lc3

写一个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

我试着修改一下但是我确定我搞砸了......

2 个答案:

答案 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的乘法只是为自己添加一些东西(在你粘贴的代码中看到)。