Motorola68k模拟器中多BCD数链表求和汇编实现问询
Motorola 68k 单字节BCD链表累加修正方案
问题分析
你的代码核心问题在于过度复杂化了单字节BCD的累加逻辑,同时链表遍历的元素定位有误,且错误地将BCD值当作二进制数进行加法,导致结果不符合BCD编码规则。
修正思路
- 简化BCD累加:每个链表元素是单字节BCD,直接将其加到D6的低字节,用
DAA指令调整为BCD格式(自动处理进位) - 正确遍历链表:每个元素结构为
[4字节下元素长地址][1字节BCD数],当前元素的BCD数在A0+4位置,下一个元素地址直接取(A0)的长地址 - 修正内存布局:$6000地址(LIST)需存放首元素地址、链表长度、结果,因此ORG应指向LIST而非LISTA
- 移除冗余临时存储:无需NUM1、NUM2等中间变量,直接操作寄存器即可
修正后的代码
DATA: EQU $1500 PROG: EQU $1000 LIST: EQU $6000 ; 任务要求的$6000地址 ORG LIST ; 定位到$6000存储首地址、长度、结果 FIRST DS.L 1 ; 链表首元素长地址 LENGTH DS.W 1 ; 链表长度(字) RESULT DS.W 1 ; 结果存储位(字) ORG PROG START: MOVE.L FIRST, A0 ; A0指向当前链表元素 MOVE.W LENGTH, D1 ; D1存储剩余遍历次数 MOVEQ #0, D6 ; D6初始化为0,用于累加BCD结果 CLR.W RESULT ; 初始化结果存储单元 CLR.CC ; 清除进位标志,确保初始累加正确 SUM_LOOP: CMP.W #0, D1 BEQ DONE ; 遍历完成,跳转到结束 ; 取出当前元素的BCD数(元素结构:4字节下地址 + 1字节BCD) MOVE.B 4(A0), D0 ; D0 = 当前元素的BCD字节 ADD.B D0, D6 ; 将BCD字节加到D6低字节 DAA ; 调整D6低字节为BCD格式(处理进位) ; 移动到下一个元素 MOVE.L (A0), A0 ; A0 = 当前元素指向的下一个元素地址 SUBQ.W #1, D1 ; 剩余次数减1 BRA SUM_LOOP DONE: MOVE.W D6, RESULT ; 将累加的BCD结果存入RESULT MOVE.B #9, D0 TRAP #15 ; 暂停模拟器 END START
关键细节说明
- DAA指令:用于将二进制加法结果调整为BCD格式,必须在字节加法后立即使用,会根据进位标志和寄存器低4位的值自动调整,确保结果符合0-9的BCD编码规则
- 链表元素定位:
4(A0)指向当前元素的BCD字节,因为前4字节是下一个元素的长地址 - 进位处理:初始清除进位标志,每次
ADD.B后DAA会自动将进位传递到D6的高字节,最终D6的16位会存储符合要求的BCD累加结果,适配RESULT的字存储需求
内容的提问来源于stack exchange,提问作者Muchacho
相关产品推荐
相关产品推荐

