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

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指令的规范,修正后的宏需遵循以下要点:

  1. 偏移量计算:目标地址与当前宏位置的差值需减去4(BL执行时PC指向宏结束后4字节位置),再右移1位(Thumb指令以2字节为单位对齐)
  2. 半字前缀:第一半字前缀为0xF000,第二半字前缀为0xF800(原宏错误使用0x0F000,超出16位存储范围)
  3. 位段分配:偏移量的高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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 16:25:21