在程序集LC-3中保存一串字符

时间:2011-11-30 02:13:22

标签: assembly lc3

我正在尝试使用LC-3架构制作一个简单的程序。 我所要做的就是从控制台读取一个字符串,以某种方式将其保存在内存中,然后将其打印出来。

这就是我的目标

; This program attemps to read a string and then output it

        .orig   x3000
        and     r1,r1,0
    lea     r0,prompt 
    puts
loop:
    getc
    putc
    add r4,r4,1
    ld      r7,nlcomp  ; check for 
    add     r7,r7,r0   ; end of line

brz finish

    st  r0,lets
    br      loop

finish:

    lea r0,lets
    puts

    halt

lets:  .blkw   20   
prompt: .stringz "Emter String"
nlcomp  .fill   xfff6        
.end

输出仅显示字符串中的最后一个字符。如果我要输入“史蒂夫”,它会打印出“e”

显然我的问题是我需要以某种方式将我读入的每个字符保存到自己的内存位置。我认为使用.blkw可以做到这一点,但显然它只会覆盖那个位置的位。

我的问题是如何将字符存储在顺序存储位置,然后将它们打印到控制台?

2 个答案:

答案 0 :(得分:3)

您需要使用STR指令,它允许您进行基址偏移寻址。 STR的语法是:

STR <src register> <base register> <immediate offset>

因此,类似下面的内容将是有效的:

    LEA R1,MEMORYSPACE ; saves the address of the storage memory block
loop:
    GETC               ; input character -> r0
    PUTC               ; r0 -> console
    STR R0,R1,#0       ; r0 -> ( memory address stored in r1 + 0 )
    ADD R1,R1,#1       ; increments the memory pointer so that it
                       ; always points at the next available block
    BR loop

MEMORYSPACE .blkw 100  ; declares empty space to store the string

答案 1 :(得分:0)

我根本不熟悉LC-3,但是当我读完你的代码时,我看到的一件事是你总是存储到'let'指向的地址而不是''指向的地址'让'加上一个偏移。由于这被标记为家庭作业,我会让你弄清楚如何做到这一点! :)