【问题标题】:LC-3 Iterating Through Memory BlockLC-3 遍历内存块
【发布时间】:2016-06-16 03:27:04
【问题描述】:

我有一个基本循环,要求用户输入一个值,然后将其打印到屏幕上。当用户点击回车时,程序停止循环。我还想将其他输入保存到内存块中以备后用。从我的简单理解来看,我认为我只是将值存储在第一个内存槽中,并且每次用户输入一个值时我都会覆盖该内存槽。如何遍历内存块?

谢谢

.ORIG x3000

        LEA R0, memSpace
LOOP    GETC
        ADD R3, R0, #-13
        BRz DONE
        OUT
        STR R2, R0, #0
        ADD R2, R2, #1
        ADD R1, R1, #-1
        BRnzp LOOP
        memSpace .BLKW 30
        LEA R3, memSpace
        PUTS
DONE    HALT

.END

【问题讨论】:

    标签: arrays memory assembly ascii lc3


    【解决方案1】:

    好的,所以我们这里有一些问题......

    1. memSpace .BLKW 30 应该在之后 HALT 以避免覆盖指令。
    2. GETC 将字符复制到 R0,因此您丢失了 memSpace 寄存器。将数组指针放在R2 中;您已经根据需要递增 R2
    3. 现在,您需要STR R0, R2, #0
    4. ADD R1, R1, #-1 没有任何用处。
    5. 13是回车的ASCII码;您可能希望将其更改为 10 以进行换行。

    还有其他几点值得讨论。不使用BRnzp LOOP,而是使用BR LOOP 无条件分支。此外,分支和停止之间的LEAPUTS 指令是不可达的;我假设您将它们放在那里是出于调试目的。虽然您可能打算将 memSpace 的内容写入控制台显示,但PUTS 不一定会这样做。它将在一个空格处终止(或者,也许永远不会)。在任何情况下,您都需要在PUTS 之前使用LEA R0, memSpace1

    固定版本:

    .ORIG x3000
    
            LEA R2, memSpace
    LOOP    GETC
            ADD R3, R0, #-10
            BRz DONE
            OUT
            STR R0, R2, #0
            ADD R2, R2, #1
            BRnzp LOOP
    DONE    HALT
    
    memSpace .BLKW 30
    
    .END
    

    【讨论】:

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