You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Easy68K模拟器M68000代码问题:循环转大写输出为0求指导

M68000/Easy68K 转大写功能输出异常问题排查

问题描述

  • 操作流程:
    1. 输入文本如hello
    2. 选择转换选项1(大写)
    3. 循环处理文本后,预期输出HELLO,实际输出0

代码核心问题分析

  1. 字符串起始地址存储逻辑错误:
    原代码在LOOP_UPPER循环里每次执行MOVE A0, D2,会把当前A0指向的字符地址存入D2。循环结束时A0已经走到字符串的终止符位置,导致D2最终存的是终止符的地址,而非字符串起始地址。
  2. 循环终止条件冗余且顺序混乱:
    开头用CMP.B #0, (A0)检查终止符,但后续TST.B (A0)+后用BNE LOOP_UPPER跳转,最后一个字符处理完后A0指向终止符,TST结果为0直接跳出循环,此时D2已经被覆盖成终止符地址。
  3. 字符串存储类型错误:
    原代码用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 09:15:29