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

BCM2835裸机汇编读取二进制文件字节异常排查

问题排查与修复

核心错误:位操作方向搞反了

你修改后的代码里,取出高4位后用了左移(lsl),完全搞反了逻辑:

  • 拿第一个字节0x12举例:and r0,#0x00f0得到0x10,执行lsl r0,#4后结果变成0x100,加48后是0x130——这个值远超标准ASCII字符的范围(0~127),DrawCharacter函数无法处理这种非法字符,自然不会有任何显示。
  • 正确操作应该是右移4位(lsr r0,#4),把高4位移到低4位的位置:
and r0,#0x00f0  ; 提取字节的高4位,比如0x12得到0x10
lsr r0,#4       ; 右移4位,将0x10转为0x1
add r0,#48      ; 得到ASCII字符'1'的编码0x31

额外问题:循环没推进读取指针

你的fileLoop循环里没有递增file指针,会一直重复读取vectors.bin的第一个字节:

  • 原代码每次循环都读同一个地址的字节,哪怕位操作逻辑正确,也只会重复显示同一个字符。
  • 必须在循环末尾添加指针移动和循环跳转:
add file,#1     ; 移动到下一个字节
b fileLoop      ; 继续循环

对齐与字节读取的排除

  • .align 1是2字节对齐,但ldrb是单字节读取指令,不受内存对齐限制,所以不存在对齐失效或字节读取错误的问题。
  • vectors.bin的十六进制内容12345678900000000对应的字节序列是0x12, 0x34, 0x56, 0x78, 0x90, 0x00, 0x00, 0x00, 0x00,ldrb能正确读取每个字节。

内容的提问来源于stack exchange,提问作者Xander

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.12 02:43:10