Easy68K模拟器M68000代码问题:循环转大写输出为0求指导
M68000/Easy68K 转大写功能输出异常问题排查
问题描述
- 操作流程:
- 输入文本如
hello - 选择转换选项1(大写)
- 循环处理文本后,预期输出
HELLO,实际输出0
- 输入文本如
代码核心问题分析
- 字符串起始地址存储逻辑错误:
原代码在LOOP_UPPER循环里每次执行MOVE A0, D2,会把当前A0指向的字符地址存入D2。循环结束时A0已经走到字符串的终止符位置,导致D2最终存的是终止符的地址,而非字符串起始地址。 - 循环终止条件冗余且顺序混乱:
开头用CMP.B #0, (A0)检查终止符,但后续TST.B (A0)+后用BNE LOOP_UPPER跳转,最后一个字符处理完后A0指向终止符,TST结果为0直接跳出循环,此时D2已经被覆盖成终止符地址。 - 字符串存储类型错误:
原代码用DC.W定义字符串,M68000的字符串通常以字节(DC.B)存储,DC.W会把每个字符存成16位字,导致字符处理和终止符判断逻辑混乱。
修正后的代码
CR EQU $0D LF EQU $0A START: ORG $1000 * 加载输入提示到内存 LEA WRITE,A1 MOVE #0,D2 ; 初始化D2,后续存储字符串起始地址 * 显示输入提示 MOVE #14,D0 TRAP #15 * 读取输入字符串 MOVE #2,D0 ; 读取用户输入的字符串 TRAP #15 MOVE A1,A0 MOVE A0,D2 ; 提前保存字符串起始地址到D2,避免循环中被覆盖 * 显示转换选择提示 SR_CHOOSE: LEA CHOOSE,A1 MOVE #14,D0 TRAP #15 * 读取选择的数字 MOVE #4,D0 ; 读取用户输入的数字选项 TRAP #15 CMP.B #1,D1 BEQ LOOP_UPPER BGE SR_CHOOSE ; 输入非1时回到选择界面 LOOP_UPPER: TST.B (A0) ; 检查当前字符是否为终止符 BEQ FINISHED SUB.B #32, (A0) ; 转换为大写(仅对小写字母有效,可加范围判断优化) ADDQ.L #1,A0 ; 移动到下一个字符 BRA LOOP_UPPER * 显示转换后的文本 FINISHED: MOVE D2,A1 ; 将A1设置为字符串起始地址 MOVE #14,D0 TRAP #15 SIMHALT * 提示信息 WRITE: DC.B 'ESCRIBE ALGO: ',CR,LF,0 ; 改用DC.B存储字节型字符串 CHOOSE: DC.B 'Transforma a 1-MAYUSCULAS, 2-MINUSCULAS: ',CR,LF,0 END START
关键修正说明
- 读取输入后立即把字符串起始地址存入
D2,避免循环中覆盖成当前字符地址 - 简化循环逻辑:先判断终止符,处理字符后移动指针,直接跳转循环
- 将字符串定义从
DC.W改为DC.B,符合M68000字符串的字节存储规范 - 修正选择分支的跳转逻辑,确保输入非1时回到选择界面
内容的提问来源于stack exchange,提问作者Anatheme
相关产品推荐
相关产品推荐

