You need to enable JavaScript to run this app. 基于LMC模拟器的三数升序输出程序开发(现有代码仅能输出最大值)
优惠活动
大模型
产品
解决方案
定价
更多

基于LMC模拟器的三数升序输出程序开发(现有代码仅能输出最大值)

现有LMC代码的核心问题
  • 交换逻辑存在硬伤:所有交换操作仅将较大值写入目标存储位置,未暂存被覆盖的原始数值,导致三个存储单元里的非最大值被直接覆盖丢失,最终只剩一个最大值可读
  • 输出逻辑缺失:仅对最终存最大值的位置做了单次输出,没有按排序后的顺序依次取出三个值输出
  • 跳转目标计算混乱:部分分支跳转直接跳过必要的交换步骤,逻辑链路不闭环,无法完成完整排序
  • 指令写法冗余:INP、OUT、HLT这类无地址的操作指令,额外拼接的操作数(比如INP后的901)会增加汇编识别错误的概率,按照汇编语法直接写指令助记符即可
调整实现思路

三个数升序排序不需要复杂算法,采用相邻比较交换的冒泡逻辑即可:

  1. 逐次比对,将最大值逐步交换到最高位的存储单元
  2. 再将次大值交换到中间存储单元
  3. 剩余的最低位存储单元自然就是最小值
  4. 最后按最低位→中间位→最高位的顺序依次输出,就是完整的升序结果
调整后可直接运行的完整代码

逐行对应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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.11.03 03:27:10