Little Man Computer程序罗马数字转十进制出错求助
你的Little Man Computer程序的错误分析与修正
你的代码存在几个关键错误,导致无法输出正确结果,下面逐一说明并给出修正方案:
1. 核心逻辑错误:未实现系数乘法
你处理每个输入系数时,不管输入的系数是多少,都只加了一次对应数值(比如输入D=2,代码也只加一次500),但实际需求是系数 × 对应数值(比如D=2要加500×2=1000)。LMC没有乘法指令,必须用循环累加的方式实现这个逻辑。
2. 完全错误的超限判断
代码里LDA I后执行BRP EXCEEDS_LIMIT的逻辑完全偏离需求:LMC的BRP是当累加器值≥0时跳转,这意味着只要I不是负数,就会直接输出999,和“总和超过999才输出999”的要求完全不符。正确做法是计算完总和后,判断结果是否大于等于999,再决定输出内容。
3. 分支逻辑混乱
后续处理C、L等系数时,代码先加载系数再加上对应数值,得到的是「系数+数值」而非「系数×数值」,逻辑完全混乱,根本无法正确累加。
修正后的完整代码
| Input section IN | 读取500的系数D STO D IN | 读取100的系数C STO C IN | 读取50的系数L STO L IN | 读取10的系数X STO X IN | 读取5的系数V STO V IN | 读取1的系数I STO I | 初始化结果为0 LDA ZERO STO RESULT | 处理D: 累加D*500 LDA D STO COUNT D_LOOP: BRZ SKIP_D LDA RESULT ADD FIVEHUNDRED STO RESULT LDA COUNT SUB ONE STO COUNT BRA D_LOOP SKIP_D: | 处理C: 累加C*100 LDA C STO COUNT C_LOOP: BRZ SKIP_C LDA RESULT ADD HUNDRED STO RESULT LDA COUNT SUB ONE STO COUNT BRA C_LOOP SKIP_C: | 处理L: 累加L*50 LDA L STO COUNT L_LOOP: BRZ SKIP_L LDA RESULT ADD FIFTY STO RESULT LDA COUNT SUB ONE STO COUNT BRA L_LOOP SKIP_L: | 处理X: 累加X*10 LDA X STO COUNT X_LOOP: BRZ SKIP_X LDA RESULT ADD TEN STO RESULT LDA COUNT SUB ONE STO COUNT BRA X_LOOP SKIP_X: | 处理V: 累加V*5 LDA V STO COUNT V_LOOP: BRZ SKIP_V LDA RESULT ADD FIVE STO RESULT LDA COUNT SUB ONE STO COUNT BRA V_LOOP SKIP_V: | 处理I: 累加I*1 LDA I STO COUNT I_LOOP: BRZ SKIP_I LDA RESULT ADD ONE STO RESULT LDA COUNT SUB ONE STO COUNT BRA I_LOOP SKIP_I: | 判断是否超过999 LDA RESULT SUB LIMIT BRP EXCEEDS_LIMIT | 输出结果 LDA RESULT OUT HLT | 超限输出 EXCEEDS_LIMIT: LDA LIMIT OUT HLT | 数据段 D: DAT 000 C: DAT 000 L: DAT 000 X: DAT 000 V: DAT 000 I: DAT 000 RESULT: DAT 000 COUNT: DAT 000 FIVEHUNDRED: DAT 500 HUNDRED: DAT 100 FIFTY: DAT 050 TEN: DAT 010 FIVE: DAT 005 ONE: DAT 001 ZERO: DAT 000 LIMIT: DAT 999
修正说明
- 每个系数都通过循环累加实现乘法:把系数存入
COUNT,每次循环给RESULT加对应数值,COUNT减1,直到COUNT为0时跳出循环,实现「系数×数值」的效果。 - 修正了超限判断:计算完总和后,用
RESULT减去999,若结果≥0(即总和≥999),则输出999,否则输出计算结果。 - 统一初始化
RESULT为0,避免分支逻辑导致的未初始化问题。
内容的提问来源于stack exchange,提问作者user22393973
相关产品推荐
相关产品推荐

