LC3冒泡排序程序报错修复:获取0-100范围的8个输入值
LC3冒泡排序输入部分错误修复方案
核心报错原因
你遇到的immediate field is out of range错误,是因为LC3的ADD指令仅支持5位补码立即数,范围限制在**-16到15**,而你代码里用的#-100和#100都远超这个范围,编译器直接拒绝编译。
关键修复点
1. 替换超范围立即数
把-100、100这类大数值定义成内存常量,用LD指令加载后再进行运算,避开立即数范围限制。
2. 重构输入逻辑
原代码的输入逻辑存在多处根本性错误:
- 未初始化数组存储空间,也没设置正确的数组基址
- 单个字符转数字的逻辑错误,无法处理多位数(比如100是三位数)
- 计数器
R1仅赋值未使用,没控制只输入8个数字
修复后的完整代码
.ORIG x3000 ; 初始化数组:预留8个存储单元(x3010开始) LD R0, ARRAY_BASE ; R0 = 数组基址 ADD R1, R1, #8 ; R1 = 剩余需要输入的数字个数 LEA R2, PROMPT ; 显示输入提示 INPUT_LOOP: PUTS AND R3, R3, #0 ; R3 = 当前输入的数字,初始化为0 GET_DIGIT: GETC OUT ; 回显输入字符 ; 判断是否为数字字符 LD R4, ASCII_ZERO ADD R5, R0, R4 ; R5 = 输入字符 - '0' BRN END_INPUT ; 非数字字符,结束当前数字输入 ADD R5, R5, #-9 BRP END_INPUT ; 大于'9',结束当前数字输入 ; 计算当前数字:current = current*10 + digit ADD R3, R3, R3 ; current *=2 ADD R6, R3, R3 ; current *=4 ADD R6, R6, R6 ; current *=8 ADD R3, R3, R6 ; current *=10 ADD R3, R3, R5 ; 加上当前digit(R5=输入字符-'0') BR GET_DIGIT ; 继续输入下一位 END_INPUT: ; 检查数字范围(0-100) LD R4, NEG_100 ADD R5, R3, R4 ; num -100,若小于0则num<100 BRN CHECK_LOWER ADD R5, R3, #0 BRP INVALID_INPUT ; num>100,无效 CHECK_LOWER: ADD R5, R3, #0 BRN INVALID_INPUT ; num<0,无效 ; 存储数字到数组 STR R3, R0, #0 ADD R0, R0, #1 ; 数组指针后移 ADD R1, R1, #-1 ; 剩余输入数减1 BRP INPUT_LOOP ; 未输够8个,继续 ; 输入完成,后续可添加冒泡排序逻辑 HALT INVALID_INPUT: LEA R0, ERROR_MSG PUTS BR INPUT_LOOP ; 重新输入当前数字 ; 常量定义 ARRAY_BASE .FILL x3010 ; 数组起始地址 ASCII_ZERO .FILL x0030 ; '0'的ASCII值 NEG_100 .FILL #-100 ; -100常量 PROMPT .STRINGZ "Enter a number (0-100): " ERROR_MSG .STRINGZ "\nInvalid input! Please enter a number between 0 and 100.\n" ; 数组存储空间(8个单元) .ORIG x3010 ARRAY .BLKW 8 .END
额外说明
- 代码里添加了多位数输入处理逻辑,支持输入0-100之间的整数
- 用数组存储8个输入值,后续可以直接在
HALT前添加冒泡排序的实现 - 所有超范围的数值都改用内存常量加载,彻底解决立即数范围报错问题
内容的提问来源于stack exchange,提问作者rue02
相关产品推荐
相关产品推荐

