实现数组元素与指定值的比较计数功能的68000汇编代码需求及调试
68000汇编数组统计问题修正与验证
我帮你仔细检查了这段68000汇编代码,发现了几个关键问题,现在给你修正后的版本,同时解释每个问题的原因和修复思路:
初始代码的核心问题
- 地址重叠冲突:你把程序和数据都指定到
ORG $2000,这会让指令和数据挤在同一块内存里,执行时肯定会出问题。 - 循环计数错误:你的数组
DATA有10个元素,但初始化D0为#9,这样会漏掉最后一个元素。 - 寄存器拼写错误:
LESS_50块里写了D01,这是无效的寄存器名,应该是D1。 - 重复标签:出现了两次
GRT_50标签,汇编器会直接报错,因为标签必须唯一。 - 缺失等于50的处理逻辑:
BEQ EQ2指向了一个不存在的标签,等于50的元素根本没被统计。 - 未保存结果:代码从头到尾没把
D1/D2/D3的统计值写到RESULT1/2/3变量里,等于白统计了。 - 循环控制逻辑不合理:用
BNE LOOP跳转只有当统计数溢出到0时才会触发,正常统计时会直接跳出循环,根本遍历不完数组。
修正后的完整代码
ORG $1000 ; 程序起始地址,和数据段分开 START: LEA DATA,A0 ; 把数组首地址加载到地址寄存器A0 MOVE.B #10,D0 ; 循环计数器:数组一共10个元素,所以设为10 CLR.B D1 ; D1负责统计小于50的元素数(对应RESULT1) CLR.B D2 ; D2负责统计等于50的元素数(对应RESULT2) CLR.B D3 ; D3负责统计大于50的元素数(对应RESULT3) LOOP: MOVE.B (A0)+,D4 ; 取出当前数组元素,同时A0自增指向下一个元素 CMP.B #50,D4 ; 把当前元素和50比较 BGT GRT_50 ; 如果大于50,跳转到GRT_50块 BLT LESS_50 ; 如果小于50,跳转到LESS_50块 ; 走到这里说明元素等于50,直接处理 EQ_50: ADD.B #1,D2 ; 等于50的计数加1 DBRA D0,LOOP ; 计数器D0减1,不为0就回到LOOP继续循环 BRA SAVE_RESULT ; 循环结束,跳去保存结果 GRT_50: ADD.B #1,D3 ; 大于50的计数加1 DBRA D0,LOOP ; 继续循环 BRA SAVE_RESULT LESS_50: ADD.B #1,D1 ; 小于50的计数加1 DBRA D0,LOOP ; 继续循环 SAVE_RESULT: MOVE.B D1,RESULT1 ; 把小于50的统计值存入RESULT1 MOVE.B D2,RESULT2 ; 把等于50的统计值存入RESULT2 MOVE.B D3,RESULT3 ; 把大于50的统计值存入RESULT3 STOP #$2700 ; 终止程序(用$2700是标准的Supervisor模式终止,避免意外) ; 数据段单独放在$2000,和程序段不重叠 ORG $2000 DATA DC.B $55,$10,$20,$30,$40,$50,$60,$65,$70,$80 ; 10个待统计元素 RESULT1 DC.B $0 ; 存储小于50的元素数量 RESULT2 DC.B $0 ; 存储等于50的元素数量 RESULT3 DC.B $0 ; 存储大于50的元素数量 END START ; 程序结束标记
修正后的逻辑说明
- 地址分离:程序放在
$1000,数据放在$2000,彻底避免内存重叠问题。 - 可靠循环:用
DBRA D0,LOOP指令控制循环——每次循环计数器D0减1,直到减到0才退出,确保10个元素都被遍历。 - 清晰的分支处理:每个条件(大于/小于/等于50)都有明确的处理块,逻辑一目了然。
- 结果存储:新增
SAVE_RESULT块,把寄存器中的统计值写入对应的变量,完全满足需求里的存储要求。
验证结果
针对你给出的DATA数组,统计结果应该是:
- 小于50的元素:
$10(16)、$20(32)、$30(48)→ 3个(存在RESULT1) - 等于50的元素:
$50(50)→ 1个(存在RESULT2) - 大于50的元素:
$55(85)、$40(64)、$60(96)、$65(101)、$70(112)、$80(128)→ 6个(存在RESULT3)
修正后的代码运行后会准确把这些值写入对应的变量。
内容的提问来源于stack exchange,提问作者amolc
相关产品推荐
相关产品推荐

