STM32 Cortex-M4 FPU:GCC汇编直接加载浮点字面量的方法
实现ARM GCC汇编内联加载FPU浮点字面量
GCC ARM汇编器确实不支持vldr.f32 s0,=3.14159这种直接的内联浮点字面量加载伪指令,但可以通过以下两种方式实现类似ldr r0,=15的便捷内联加载效果:
方法1:PC相对寻址+内联.float伪指令
这种方式直接在指令后紧跟浮点常量,通过PC相对偏移加载,无需单独定义全局标签:
@ 加载3.14159到s0寄存器 vldr s0, [pc, #-4] @ PC指向当前指令+8,偏移-4定位到下一行的.float数据 .float 3.14159
注意:必须保证.float伪指令紧跟在vldr之后,中间不能插入其他4字节指令,否则需要调整偏移值(每多一条指令,偏移加-4)。
方法2:通用寄存器中转+GCC常量表达式
利用GCC对通用寄存器ldr =xxx的支持,结合浮点转整数的常量表达式,实现直接写入浮点数值的内联加载:
@ 加载3.14159到s0寄存器 ldr r0, =(unsigned int)(3.14159f) @ GCC自动计算单精度浮点的IEEE十六进制表示,写入字面量池 vmov s0, r0 @ 将通用寄存器的值转移到FPU单精度寄存器
这种方式无需手动计算浮点的十六进制编码,GCC会在汇编阶段完成转换,和ldr r0,=15的原理一致,且更易维护。
关键说明
GCC ARM汇编器的=立即数加载伪指令仅针对通用寄存器的ldr指令设计,FPU的vldr指令不支持该语法,因此需要通过上述两种间接方式实现内联加载需求。
内容的提问来源于stack exchange,提问作者Jeff Casey
相关产品推荐
相关产品推荐

