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
相关产品推荐
相关产品推荐

