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替换为和自定义退出字符的比较逻辑,步骤如下:
- 在数据段定义一个
EXIT_CHAR变量,存入你想要的退出字符(比如设为'q',ASCII是x71); - 输入循环中,用退出字符和输入字符做比较,判断是否相等;
- 输出循环中,同样判断读取到的字符是否等于退出字符,相等则停止输出。
修改后的代码示例:
.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
相关产品推荐
相关产品推荐

