【问题标题】:LC-3 Read whole string, output when enter pressedLC-3 读取整个字符串,输入时输出
【发布时间】:2014-10-23 22:17:18
【问题描述】:

我不熟悉 LC-3,遇到了一个问题。我希望能够输入整个字符串,例如“你好,我的名字是 Connor”,当我按下回车键时,它会在控制台中回显。我之前做过一个问题,我读取一个字符,然后连续回显它直到按下空格,但我不太确定如何完成一个完整的字符串,然后在输入时回显它。对我有什么帮助吗?

我最终的结果是这样的(所有 .fill 命令):

.ORIG x3000     ; specify the "origin"; i.e., where to load in memory

; machine instructions
.FILL x2006
.FILL x2206
.FILL x0403
.FILL xF021
.FILL X127F
.FILL x0FFC
.FILL xF025
.FILL x005A
.FILL x0064

.END

【问题讨论】:

  • 哦,我需要在不组装的情况下执行此操作。我只能使用 .Fill
  • 没有组装?你的意思是没有C?
  • 我想我不知道该怎么说。我需要只使用 .fill 语句(当然还有 .orig 和 .end)来制作一个 .asm 文件来组装、加载和运行,这将完成我上面描述的操作
  • 啊,你的更新解决了问题。因此,您必须手动构建二进制指令,而不是使用汇编。
  • 正确,但我不明白如何获得一堆字符,按回车键,然后一次回显所有字符。不过我可以一个字一个字地做。

标签: branch ld lc3 lc3-trap


【解决方案1】:

在您之前的问题中,您可以在从用户那里获得一个角色后为 OUT 调用一个陷阱。为了从用户那里读取整个字符串直到换行,您需要将每个字符存储在内存中,直到他们进入新行,然后为 PUTS 调用陷阱。

我不知道你是否已经深入了解你的课程,但首先,我用汇编语言编写了程序,以确保我掌握了基本概念。

MAIN
    LEA r1, INPUT       ; r1 = address of input

PROMPT
    TRAP x20            ; getc, r0 = character input
    STR r0, r1, #0      ; mem[r1 + INPUT] = r0
    ADD r1, r1, #1      ; r1 = r1 + 1
    ADD r0, r0, #-10    ; r0 = r0 - new line
    BRnp PROMPT         ; branch if r0 != 0

END
    ADD r1, r1, #-1     ; subtract one from r1
    STR r0, r1, #0      ; mem[r1 + INPUT] = r0 (which is zero)
    LEA r0, INPUT       ; r0 = address of input

    TRAP x22            ; puts, display string
    TRAP x25            ; halt

; data segment
INPUT .BLKW 64

然后,只需一行一行地手动创建二进制指令:

.ORIG x3000

; main
    1110 001 000001010      ; lea r1, INPUT

; prompt
    1111 0000 x20           ; TRAP x20, halt
    0111 000 001 000000     ; STR r0, r1, #0
    0001 001 001 1 00001    ; ADD r1, r1, #1
    0001 000 000 1 10110    ; ADD r0, r0, #-10
    0000 101 111111011      ; BRnp PROMPT (jump -5 if zero)

; end
    0001 001 001 1 11111    ; ADD r1, r1, #-1
    0111 000 001 000000     ; STR r0, r1, #0
    1110 000 000000010      ; LEA r0, input ( + 2)

    1111 0000 x22           ; TRAP x22, puts
    1111 0000 x25           ; TRAP x25, halt

.BLKW 64                    ; input
.END

最后,将它们转换为十六进制并将它们分别放在一个 .FILL 中

.ORIG x3000

; main
    .FILL xE20A

; prompt
    .FILL xF020
    .FILL x7040
    .FILL x1261
    .FILL x1036
    .FILL x0BFB

; end
    .FILL x127F
    .FILL x7040
    .FILL xE002

    .FILL xF022
    .FILL xF025

; data
.BLKW 64

.END

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-26
    • 1970-01-01
    • 1970-01-01
    • 2018-07-21
    • 1970-01-01
    • 2013-10-20
    相关资源
    最近更新 更多