基于LMC模拟器的三数升序输出程序开发(现有代码仅能输出最大值)
现有LMC代码的核心问题
- 交换逻辑存在硬伤:所有交换操作仅将较大值写入目标存储位置,未暂存被覆盖的原始数值,导致三个存储单元里的非最大值被直接覆盖丢失,最终只剩一个最大值可读
- 输出逻辑缺失:仅对最终存最大值的位置做了单次输出,没有按排序后的顺序依次取出三个值输出
- 跳转目标计算混乱:部分分支跳转直接跳过必要的交换步骤,逻辑链路不闭环,无法完成完整排序
- 指令写法冗余:INP、OUT、HLT这类无地址的操作指令,额外拼接的操作数(比如INP后的901)会增加汇编识别错误的概率,按照汇编语法直接写指令助记符即可
调整实现思路
三个数升序排序不需要复杂算法,采用相邻比较交换的冒泡逻辑即可:
- 逐次比对,将最大值逐步交换到最高位的存储单元
- 再将次大值交换到中间存储单元
- 剩余的最低位存储单元自然就是最小值
- 最后按最低位→中间位→最高位的顺序依次输出,就是完整的升序结果
调整后可直接运行的完整代码
逐行对应LMC模拟器的内存地址从00开始排布,无需额外配置即可运行:
00 INP 读取第一个输入值 01 STA 18 存入18号单元(作为变量a) 02 INP 读取第二个输入值 03 STA 19 存入19号单元(作为变量b) 04 INP 读取第三个输入值 05 STA 20 存入20号单元(作为变量c) # 第一步:确保c >= b 06 LDA 20 取出c到累加器 07 SUB 19 计算c - b 08 BRP 14 如果差值非负(c更大),直接跳转到下一步比较 # 差值为负,交换b和c的值,用21号空闲单元做临时存储 09 LDA 19 10 STA 21 暂存b到临时单元 11 LDA 20 12 STA 19 将原c写入19号单元 13 LDA 21 14 STA 20 将暂存的b写入20号单元 # 第二步:确保c是三个数的全局最大值 15 LDA 20 取出当前c 16 SUB 18 计算c - a 17 BRP 23 如果差值非负(c更大),直接跳转到下一步比较 # 差值为负,交换a和c的值 18 LDA 18 19 STA 21 暂存a到临时单元 20 LDA 20 21 STA 18 将原c写入18号单元 22 LDA 21 23 STA 20 将暂存的a写入20号单元 # 第三步:确保b >= a,剩余a就是最小值 24 LDA 19 取出b 25 SUB 18 计算b - a 26 BRP 30 如果差值非负(b更大),直接跳转到输出环节 # 差值为负,交换a和b的值 27 LDA 18 28 STA 21 暂存a到临时单元 29 LDA 19 30 STA 18 将原b写入18号单元 31 LDA 21 32 STA 19 将暂存的a写入19号单元 # 按升序顺序依次输出三个值 33 LDA 18 取出最小值 34 OUT 输出最小值 35 LDA 19 取出中间值 36 OUT 输出中间值 37 LDA 20 取出最大值 38 OUT 输出最大值 39 HLT 程序停止 # 预留存储单元定义 18 DAT 19 DAT 20 DAT 21 DAT 交换过程用的临时存储单元
调试注意点
- LMC的指令地址是从00开始逐行累加的,写跳转指令前一定要数准目标地址,避免跳错位置
- 交换两个存储位置的值时,一定要用空闲单元做临时暂存,不能直接覆盖写入,否则会丢失原始数据
- 输出环节必须逐次加载三个排好序的存储单元的值调用OUT指令,仅输出最大值无法满足全序列升序输出的要求
内容的提问来源于stack exchange,提问作者Shangkari Sha
相关产品推荐
相关产品推荐

