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

EASY68K中循环输出向量MIXED各单词的代码故障求助

EASY68K汇编:循环打印字符串中单词的问题

我在EASY68K中编写了一段汇编代码,期望实现循环打印向量MIXED中的每个单词,每次循环输出下一个单词。我尝试通过判断逗号(作为单词分隔符)来截取单词,但代码无法正常运行。

原代码

ORG $1000
START:
    MOVE.L #MIXED, A0
    MOVE.L #BUFFER, A1  
    
    MOVE.L #14, D0
    MOVE.L #MSG, A1
    TRAP #15
    
    MOVE.B (A0),D0   

LOOP:
    MOVE.B D0,(A1)+
    CMP.B #0,D0
    BEQ FINAL
    CMP.B  #',',(A0)    
    BEQ    PRINT        
    CMP.B  #0,(A0)    
    BEQ    PRINT      
    MOVE.B (A0)+,(A1)+ 
    BRA    LOOP  

PRINT:
    CLR.B  (A1)    
    LEA    BUFFER,A1   
    JSR    PRTSTR    

    MOVE.B #0,(A0)
    MOVE.L #14, D0
    MOVE.L #MIXED,A1
    TRAP #15 
    BRA LOOP

FINAL 
    MOVE.L #11,D0
    MOVE.W #$0101,D1
    TRAP #15
   
    SIMHALT 
    
    ORG $2000
    
MSG DC.B 'The word is:',0
MIXED DC.B 'ATPLANO, NAMZANA, ERSFA, ERCZAE',0
BUFFER DS.B 20

PRTSTR:
    MOVE.B (A1)+,D0 
    BEQ    DONE  
    TRAP   #15  
    BRA    PRTSTR
DONE:
    RTS 
    
    END START

问题分析

原代码存在几个关键问题导致无法正常运行:

  • 逻辑混乱:初始将(A0)读入D0后直接写入BUFFER,后续又重复执行MOVE.B (A0)+,(A1)+,导致字符重复存储,BUFFER内容混乱
  • 破坏原字符串:PRINT块中执行MOVE.B #0,(A0)会把逗号位置改成结束符,后续循环无法找到下一个单词
  • 未处理分隔符后的空格:逗号后面的空格会被带入BUFFER,导致打印结果包含多余空格
  • 语法错误:FINAL标签后缺少冒号,属于汇编语法错误
  • BUFFER指针未重置:打印完成后没有将A1重新指向BUFFER起始位置,下次存储会从BUFFER的末尾继续写入

修改后的代码

ORG $1000
START:
    MOVE.L #MIXED, A0       ; 指向源字符串起始
    LEA    BUFFER, A1       ; 指向BUFFER起始

PRINT_MSG:
    MOVE.L #14, D0          ; TRAP #15功能14:打印字符串
    LEA    MSG, A1
    TRAP #15
    LEA    BUFFER, A1       ; 恢复BUFFER指针

LOOP:
    MOVE.B (A0), D0
    BEQ    FINAL            ; 遇到字符串结束符,退出循环
    
    CMP.B  #',', D0         ; 遇到逗号,触发打印
    BEQ    PRINT_WORD
    
    MOVE.B D0, (A1)+        ; 不是逗号/结束符,存入BUFFER
    ADDQ.L #1, A0           ; 移动源指针
    BRA    LOOP

PRINT_WORD:
    CLR.B  (A1)             ; 给BUFFER加结束符
    LEA    BUFFER, A1
    JSR    PRTSTR           ; 打印当前单词
    
    ; 跳过逗号和后面的空格
    ADDQ.L #1, A0           ; 跳过逗号
SKIP_SPACE:
    MOVE.B (A0), D0
    CMP.B  #' ', D0
    BEQ    SKIP_SPACE_NEXT
    BRA    RESET_BUFFER
SKIP_SPACE_NEXT:
    ADDQ.L #1, A0
    BRA    SKIP_SPACE

RESET_BUFFER:
    LEA    BUFFER, A1       ; 重置BUFFER指针
    BRA    PRINT_MSG        ; 重新打印提示信息,进入下一轮循环

FINAL:
    ; 打印最后一个单词(因为字符串末尾没有逗号)
    CLR.B  (A1)
    LEA    BUFFER, A1
    JSR    PRTSTR
    
    MOVE.L #11, D0          ; TRAP #15功能11:退出程序
    MOVE.W #$0101, D1
    TRAP #15
   
    SIMHALT 
    
    ORG $2000
    
MSG DC.B 'The word is: ',0  ; 加空格让提示更美观
MIXED DC.B 'ATPLANO, NAMZANA, ERSFA, ERCZAE',0
BUFFER DS.B 20              ; 足够存储最长单词

PRTSTR:
    ; 打印以0结尾的字符串,使用TRAP #15功能3:打印字符
PRINT_CHAR:
    MOVE.B (A1)+, D0
    BEQ    DONE_PRINT
    MOVE.L #3, D0
    TRAP #15
    BRA    PRINT_CHAR
DONE_PRINT:
    ; 打印换行,优化输出格式
    MOVE.B #10, D0
    MOVE.L #3, D0
    TRAP #15
    RTS 
    
    END START

修改说明

  1. 修正FINAL标签的语法错误,添加冒号
  2. 重构循环逻辑:逐个读取源字符串字符,仅将非分隔符字符存入BUFFER,遇到逗号或结束符时触发打印
  3. 打印完成后跳过逗号和后续空格,避免干扰下一个单词的读取,且不修改原字符串内容
  4. 每次循环前重置BUFFER指针,确保每次存储都从BUFFER起始位置开始
  5. 优化PRTSTR函数,添加换行输出让结果更清晰,同时修正TRAP功能号(打印单个字符用功能3,原代码误用了功能14的参数)
  6. 处理字符串末尾的最后一个单词(原代码会遗漏,因为末尾没有逗号)

内容的提问来源于stack exchange,提问作者newyorkbaby55

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 15:48:10