如何编写LMC程序实现输入数列最大值统计与输入数量计数
LMC 序列最大值与计数程序实现
核心逻辑梳理
先明确执行流程,覆盖所有需求边界:
- 初始化两个存储单元:计数
COUNT(初始值0)、最大值MAX(初始值0) - 循环读取输入:
- 读取输入值存入临时单元
INPUT_VAL - 若输入值为0,直接跳转到结果输出逻辑
- 输入非0时,计数+1
- 将输入值与当前最大值对比,若输入值更大则更新最大值
- 无条件跳转回输入步骤,读取下一个值
- 读取输入值存入临时单元
- 结果输出逻辑:
- 若计数为0,说明仅输入了结束标记000,直接输出0即可终止程序
- 若计数不为0,先输出最大值,再输出总个数,之后终止程序
用到的分支指令说明
你提到的三类分支指令刚好覆盖所有判断场景:
BRZ:累加器值为0时跳转,用于判断输入是否为结束标记、计数是否为0BRP:累加器值为非负时跳转,用于数值大小比较(输入值减最大值结果非负,说明输入值更大)BR:无条件跳转,用于实现输入循环
完整可运行LMC代码(带注释)
// 初始化部分 START LDA ZERO // 累加器加载0 STA COUNT // 计数初始化为0 STA MAX // 最大值初始化为0 // 输入循环部分 INLOOP INP // 读取输入 STA INPUT_VAL // 存入临时输入单元 BRZ ENDINPUT // 输入为0,跳转到结束逻辑 LDA COUNT // 加载当前计数 ADD ONE // 计数+1 STA COUNT // 存回计数单元 LDA INPUT_VAL // 加载当前输入值 SUB MAX // 输入值减当前最大值 BRP UPDATEMAX // 结果>=0,说明输入更大,跳转到更新最大值 BR INLOOP // 否则直接跳回下一轮输入 UPDATEMAX LDA INPUT_VAL // 加载当前输入值 STA MAX // 更新最大值 BR INLOOP // 跳回下一轮输入 // 结果输出逻辑 ENDINPUT LDA COUNT // 加载计数 BRZ ONLYZERO // 计数为0,说明仅输入了0,跳转到输出0 LDA MAX // 否则先加载最大值 OUT // 输出最大值 LDA COUNT // 加载计数 OUT // 输出总个数 HLT // 终止程序 ONLYZERO LDA ZERO // 加载0 OUT // 输出0 HLT // 终止程序 // 变量定义 ONE DAT 1 // 常量1,用于计数+1 ZERO DAT 0 // 常量0 COUNT DAT 0 // 计数存储单元 MAX DAT 0 // 最大值存储单元 INPUT_VAL DAT 0 // 输入临时存储单元
测试场景验证
- 输入仅为000:输出000,符合要求
- 输入序列为3、5、2、0:依次输出5、2,符合要求
- 输入序列为9、9、9、0:依次输出9、3,符合要求
内容的提问来源于stack exchange,提问作者Asher
相关产品推荐
相关产品推荐

