LC-3迭代内存块

时间:2016-03-03 01:23:09

标签: arrays memory assembly ascii lc3

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

由于

.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

1 个答案:

答案 0 :(得分: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以换行。
  6. 还有一些值得解决的问题。而不是使用BRnzp LOOP,无条件地使用BR LOOP分支。此外,分支和暂停之间的LEAPUTS指令无法访问;我假设你把它们放在那里用于调试目的。虽然您可能打算将memSpace的内容写入控制台显示,但PUTS不一定会这样做。它将终止于一个空间(或者,也许,永远不会)。无论如何,在LEA R0, memSpace1之前您需要PUTS

    修正版:

    .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