You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用无零循环打印二进制数的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 10:18:48