使用无零循环打印二进制数的ARM汇编问题
ARM汇编循环打印二进制数:已解决问题分析与后续排查指南
嘿,作为刚上手ARM汇编(还是第一种汇编语言)的新手,能自己定位并解决“仅显示一个1”的问题已经相当不错了!先给你拆解下为什么改cmp R6,#31为mov R6, #31能解决这个问题:
cmp是比较指令,它只会对比R6和31的大小并设置状态标志位,根本不会改变R6本身的值。如果你的R6初始值不是31,那后续循环的起始位就错了,自然只能输出最后一个1;而mov是直接给R6赋值31,让循环从32位二进制的最高位(第31位)开始逐位检查,这才符合打印完整二进制数的逻辑。
针对你提到的“仍有部分问题待排查”,我整理了几个ARM汇编循环打印二进制时的常见坑,你可以逐一核对:
- 循环终止逻辑是否匹配:如果你的逻辑是从31递减到0,那循环终止条件应该是当R6小于0时退出(比如用
blt指令)。要是你写错了终止条件(比如写成了beq或者判断R6等于0就退出),就会导致循环提前结束或者死循环。 - 位提取操作是否正确:打印每一位时,通常会用
lsl把目标位移到最高位,再用and和#1(或者#0x80000000)判断是0还是1。检查这部分代码:比如有没有把要检查的位正确移位,有没有正确区分0和1的打印逻辑。 - 寄存器被打印函数破坏:ARM汇编有寄存器调用约定(比如APCS),如果你的打印函数(比如调用系统输出字符)修改了循环中用到的寄存器(比如R6或者存二进制数的寄存器),那循环就会乱掉。记得在调用打印函数前,把需要保留的寄存器压栈保存,调用完再出栈恢复。
- 循环体是否执行了寄存器递减:确认每次循环结束后,有没有执行
sub R6, R6, #1这类指令。要是漏掉了这一步,R6的值永远不变,循环要么死循环要么只执行一次。
如果能把你的完整代码贴出来,我可以帮你更精准地定位剩余问题~
内容的提问来源于stack exchange,提问作者Burgsen
相关产品推荐
相关产品推荐

