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

