【问题标题】:Counting occurances of a negative number from a list计算列表中负数的出现次数
【发布时间】:2015-11-23 00:29:33
【问题描述】:

我正在尝试学习 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

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

【问题讨论】:

  • 该示例似乎计算单个数字中的设置位,而不是检测数组中的负数。所以它不是很有用。无论如何,添加零用于设置标志,以便您可以检查数字是否为负。 BRZP 用于跳过零或正的增量,而不是负数。它在这里用于检查最高有效位(符号位),同时将所有其他位移到该位置。

标签: assembly lc3


【解决方案1】:

我假设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 指令之一。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多