You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

LC-3汇编哨兵循环疑问:回车结束原理及自定义结束字符方法

LC-3汇编数组与循环问题解答

问题1:程序如何检测回车,思路是否正确?

你的思路是对的,原程序的回车检测逻辑可以拆解为:

  • 回车的ASCII码是十进制10(x0A),每次输入字符后执行ADD R0,R0,#-10,本质是计算输入字符与回车的差值。
  • 后续的BRp DO_WHILE_LOOP是结果为正时跳回循环:
    • 如果输入的是普通可打印字符(ASCII值>10,比如'a'是97),差值为正,继续循环;
    • 如果输入的是回车,差值为0,不满足BRp的跳转条件,退出输入循环。

不过有个小细节:如果输入ASCII值小于10的控制字符(比如退格x08),差值会为负,同样会退出循环,这是原逻辑的小瑕疵,但如果只考虑正常输入可打印字符+回车的场景,你的思路完全可行。

问题2:修改代码支持任意退出字符

要实现任意退出字符,只需要把固定的#-10替换为和自定义退出字符的比较逻辑,步骤如下:

  1. 在数据段定义一个EXIT_CHAR变量,存入你想要的退出字符(比如设为'q',ASCII是x71);
  2. 输入循环中,用退出字符和输入字符做比较,判断是否相等;
  3. 输出循环中,同样判断读取到的字符是否等于退出字符,相等则停止输出。

修改后的代码示例:

.orig x3000
LD R1,DATA_PTR  ; 加载数组起始地址到R1
LD R3,EXIT_CHAR ; 加载退出字符到R3,用于后续比较

DO_WHILE_LOOP
    GETC        ; 读取字符到R0
    OUT         ; 回显字符
    STR R0,R1, #0   ; 存入数组
    
    ADD R1,R1, #1   ; 移动到下一个数组位置
    NOT R2,R3       ; 取退出字符的反码
    ADD R2,R2, #1   ; 转为补码(即-EXIT_CHAR)
    ADD R2,R0,R2    ; 计算输入字符 - 退出字符,结果为0则相等
BRnp DO_WHILE_LOOP ; 结果不为0则继续循环(输入不是退出字符)

LD R0,newline
OUT

LD R1,DATA_PTR
LD R3,EXIT_CHAR ; 重新加载退出字符

DO_WHILE_LOOP2
    LDR R0,R1,#0    ; 从数组读取字符到R0
    NOT R2,R3
    ADD R2,R2, #1
    ADD R2,R0,R2    ; 比较当前字符是否等于退出字符
BRz END_PRINT       ; 相等则退出输出循环
    OUT             ; 打印字符
    LD R0,newline   ; 打印换行
    OUT
    ADD R1,R1,#1    ; 移动到下一个数组位置
    BR DO_WHILE_LOOP2

END_PRINT
HALT

; 数据段
DATA_PTR .FILL ARRAY ; 数组起始地址
newline .FILL x0A   
EXIT_CHAR .FILL x71 ; 这里设退出字符为'q',可改为任意ASCII值
ARRAY .BLKW #100
.END

关键修改说明:

  • 用NOT+ADD #1计算退出字符的补码,再和输入字符相加,结果为0时说明两者相等;
  • 输入循环用BRnp(结果不为0则跳转),只要输入不是退出字符就继续;
  • 输出循环遇到退出字符时,直接跳转到END_PRINT停止输出,避免打印退出字符本身。

内容的提问来源于stack exchange,提问作者henrypham

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 15:25:14