ARM Thumb模式下BL <target>指令手动汇编宏的修正请求
手动实现Thumb模式BL指令汇编宏的问题
我需要为ARM系列处理器手动实现Thumb模式下的BL macro_bl,当前在树莓派3+上测试,最终将应用于Cortex M0+(Pico)平台。参考ARM架构手册A7.1.17章节编写的宏生成指令与汇编器自动生成的正确指令存在差异:
- 调用
macro_bl before生成0xFFF1F2FF,预期为0xFFF4F9FF - 调用
macro_bl after生成0x00F606F8,预期为0x00F303F8
尝试调整移位参数仅部分场景有效,请求协助编写正确的宏实现。
测试代码(asmtests.s)
.syntax unified .thumb_func .text .global _start .macro macro_bl target .hword (((\target - . - 4) >> 11) & 0x07ff) | 0x0f000 .hword (((\target - . - 2)) & 0x07ff) | 0x0f800 .endm .align 2 before: nop .skip 0x00300000 _start: bl before bl before macro_bl before bl before bl after bl after macro_bl after bl after .align 2 .skip 0x00300000 after: nop
汇编命令
as -al asmtests.s -o asmtests.o
汇编列表关键差异
- 第19行:
30000a FFF1F2FF macro_bl before(预期为30000a FFF4F9FF) - 第24行:
30001a 00F606F8 macro_bl after(预期为30001a 00F303F8)
正确的macro_bl宏实现
原宏的核心问题是编码规则不符合Thumb BL指令的规范,修正后的宏需遵循以下要点:
- 偏移量计算:目标地址与当前宏位置的差值需减去4(BL执行时PC指向宏结束后4字节位置),再右移1位(Thumb指令以2字节为单位对齐)
- 半字前缀:第一半字前缀为
0xF000,第二半字前缀为0xF800(原宏错误使用0x0F000,超出16位存储范围) - 位段分配:偏移量的高11位分配给第一半字,低11位分配给第二半字
修正后的宏代码:
.macro macro_bl target .set offset, (\target - . - 4) >> 1 @ 计算以2字节为单位的偏移量 .hword ((offset >> 11) & 0x07FF) | 0xF000 @ 第一半字:高11位 + 0xF000前缀 .hword (offset & 0x07FF) | 0xF800 @ 第二半字:低11位 + 0xF800前缀 .endm
替换原宏后重新汇编,生成的指令将与汇编器自动生成的bl指令完全一致,可在Cortex M0+平台正常工作。
内容的提问来源于stack exchange,提问作者Shripathi Kamath
相关产品推荐
相关产品推荐

