Motorola 68k汇编代码优化咨询:判断A是否为B的倍数
Motorola 68k倍数判断代码优化及初学者交流渠道
代码优化及问题修正
你的代码存在两个核心问题:一是逻辑分支错误,无论余数是否为0,最终都会执行MULTIPLE标签下的move.b #1,c,导致变量C永远被设为1;二是存在冗余操作,同时除法指令的符号适配可以更精准。以下是优化后的代码及说明:
优化后的代码
ORG $8000 a dc.b 81 ; Value of A b dc.b 3 ; Value of B c dc.b 0 ; Value of C START: move.b a,d0 ; 加载A到D0低8位 ext.w d0 ; 将字节扩展为字(带符号扩展,若A为负数也适用) move.b b,d1 ; 加载B到D1低8位 ext.w d1 ; 将字节扩展为字 divu.w d1,d0 ; 无符号字除法:D0高16位存余数,低16位存商 swap d0 ; 交换D0高低16位,余数移至低16位 tst.w d0 ; 测试余数是否为0 beq.s SET_C_1 ; 余数为0,跳转设置C=1 move.b #0,c ; 余数不为0,设置C=0 bra.s END_PROC ; 跳过设置C=1的代码 SET_C_1: move.b #1,c ; 余数为0,设置C=1 END_PROC: move.b c,d2 ; 将C的值复制到D2 SIMHALT ; 模拟器暂停 END START
优化说明
- 修正分支逻辑:通过
bra.s END_PROC跳过SET_C_1代码块,确保C的值只会被正确赋值一次,不会被覆盖。 - 简化余数检查:直接用
swap d0将余数移到低16位测试,去掉了冗余的clr.w d0操作。 - 适配无符号场景:使用
divu.w(无符号字除法)适配正数判断需求,若需要支持带符号数,只需将divu.w改为divs.w即可。 - 清晰代码结构:新增
END_PROC标签统一后续操作,让代码逻辑更易读。
初学者交流求助渠道
- 汇编技术论坛分区:很多综合技术论坛的汇编/嵌入式开发板块,有不少熟悉68k的开发者愿意解答初学者问题。
- Easy68k用户社群:查找Easy68k相关的QQ、微信群,群内都是使用该模拟器的学习者,问题针对性强。
- 高校计算机社团:如果是学生,可加入本校计算机协会、嵌入式社团,学长或老师可能有68k汇编的教学经验。
- 技术博客评论区:不少分享68k汇编教程的博客开放评论区,你可以在评论里提问,博主或读者通常会回复。
- 本地技术爱好者聚会:部分城市有线下嵌入式、汇编技术交流活动,现场交流能高效解决问题。
内容的提问来源于stack exchange,提问作者Pizza
相关产品推荐
相关产品推荐

