计算列表中负数的出现次数

Counting occurances of a negative number from a list

我正在尝试学习 LC-3 装配并查看以下示例:

        .orig   x3100   
        ADD R3, R0, #0  ;copy R0 into R3
        AND R1, R1, #0  ;clear count

        ADD R3, R3, #0  ;test for Neg
        BRZP NEXT       ;count if Neg
        ADD R1, R1, #1

NEXT    AND R2, R2, #0  ;check remaining 15 bits
        ADD R2, R2, #-15
LOOP    ADD R3, R3, R3  ;shift R3 left
        BRZP AGAIN      ;count if Neg
        ADD R1, R1, #1
AGAIN   ADD R2, R2, #1  ;loop until done
        BRN LOOP

有几点不太明白:

ADD R3, R3, #0 ;test for Neg

我不明白这是如何测试负值的:我正在阅读它,因为它没有向 R3 添加任何内容,即它什么都不做。下面一行也是,我不太明白它用 BRZP.

做什么

我想将此示例更改为从整数列表中检查:

INTEGERS    .fill    84
            .fill    -2
            .fill    -13
            .fill    4
            .fill    -4

上面有3个负整数,所以程序结束时计数(R1)为3。我该怎么做?

我假设 ADD R3, R3, #0 ;test for Neg 根据结果设置标志,因此条件分支将基于 ADD 存储到 R3 的结果。

正如 Jester 指出的那样,它似乎在循环计算单个整数中的设置位,使用 add r3,r3,r3 将其左移并设置标志。


我不太了解 lc3,但看起来您可以通过清除计数器并让 ADD R3, R0, #0 ;copy R0 into R3 最初负责设置标志来保存一条指令。

LC3 没有mov 说明,我接受了。您可以通过添加立即数零来复制数据,因为与 x86 不同,它使用 3 操作数指令,其中 dest 不必是 src 指令之一。