MARIE程序逻辑错误排查:输入任意分数均输出F级问题
MARIE分数等级程序修复方案
核心错误解析
- 字符串输出未指定地址:开头的
OUTPUT指令没有指向Grade字符串的起始地址,MARIE默认会输出AC寄存器的值,而非你定义的"Grade "字符串,必须写成OUTPUT Grade才能正确输出目标字符串。 - 比较逻辑与SKIPCOND指令完全不匹配:
你想实现「分数<60则输出F」,但代码中SKIPCOND 400仅在AC=0(即分数=60)时跳过JUMP OutputF,其余所有情况(不管分数是50还是80)都会执行JUMP OutputF,直接输出F,这是导致所有输入都显示F的关键原因。
修正后的代码(附注释)
ORG 100 Start, OUTPUT Grade / 指定字符串起始地址,输出"Grade " INPUT / 读取用户输入的十进制分数 STORE Score / 存储分数到Score变量 / 从最低等级开始判断:先判断是否<60 → F LOAD Score SUBT Sixty / 计算 Score - 60 SKIPCOND 000 / 当AC>0(Score>60)时,跳过下一条JUMP指令 SKIPCOND 400 / 当AC=0(Score=60)时,也跳过下一条JUMP指令 JUMP OutputF / 只有当AC<0(Score<60)时,才执行跳转输出F / 判断是否<70 → D(此时分数已>=60) LOAD Score SUBT Seventy / 计算 Score -70 SKIPCOND 000 / Score>70则跳过跳转 SKIPCOND 400 / Score=70则跳过跳转 JUMP OutputD / Score<70且>=60时,跳转输出D / 判断是否<80 → C(分数>=70) LOAD Score SUBT Eighty SKIPCOND 000 SKIPCOND 400 JUMP OutputC / 判断是否<90 → B(分数>=80) LOAD Score SUBT Ninety SKIPCOND 000 SKIPCOND 400 JUMP OutputB / 剩下的情况分数>=90 → A JUMP OutputA OutputA, LOAD LetterA STORE OutputChar JUMP PrintGrade OutputB, LOAD LetterB STORE OutputChar JUMP PrintGrade OutputC, LOAD LetterC STORE OutputChar JUMP PrintGrade OutputD, LOAD LetterD STORE OutputChar JUMP PrintGrade OutputF, LOAD LetterF STORE OutputChar PrintGrade, LOAD OutputChar OUTPUT / 输出等级字母,追加到"Grade "后 HALT / 变量定义 Score, DEC 0 Ninety, DEC 90 Eighty, DEC 80 Seventy, DEC 70 Sixty, DEC 60 LetterA, HEX 41 / ASCII 'A' LetterB, HEX 42 / ASCII 'B' LetterC, HEX 43 / ASCII 'C' LetterD, HEX 44 / ASCII 'D' LetterF, HEX 46 / ASCII 'F' OutputChar, DEC 0 / "Grade "字符串(以NULL结尾) Grade, HEX 47 / 'G' HEX 72 / 'r' HEX 61 / 'a' HEX 64 / 'd' HEX 65 / 'e' HEX 20 / ' ' HEX 00 / 字符串终止符 END
模拟器配置要求
确保MARIE模拟器的设置符合需求:
- 输入框设置为Dec模式
- 输出框设置为No Linefeeds(并勾选清除选项)
配置完成后,输入79时,程序会先输出"Grade ",再追加输出C,最终显示"Grade C"。
内容的提问来源于stack exchange,提问作者Lemons34
相关产品推荐
相关产品推荐

