DS-5 5.28 ARM汇编:EQU常量无法用于DCFS浮点常量定义
解决DS-5中EQU常量无法用于DCFS浮点定义的问题
我刚好碰到过类似的问题,DS-5的armasm汇编器对EQU和DCFS的类型处理确实有严格区分,下面给你几个可行的解决方案:
1. 使用全局算术变量替代EQU
EQU定义的是符号整数常量,汇编器不会自动把它转换成浮点类型,而GBLA+SETA可以定义支持浮点的算术变量,完美适配DCFS:
; 定义全局算术变量,存储浮点值(整数转浮点直接写5.0即可) GBLA M M SETA 5.0 ; 直接在DCFS中使用变量 myfloat DCFS M ; 编译通过,正确生成5.0的单精度浮点数据
如果你的常量原本是整数,也可以直接写M SETA 5,然后在DCFS里用M * 1.0强制转换,效果一样。
2. 改进宏实现强制浮点转换
如果你不想放弃EQU定义整数常量,可以修改宏,通过算术表达式把整数常量强制转为浮点类型:
MACRO $label FP_CONSTANT $int_val ; 用1.0乘以整数,触发汇编器的浮点类型转换 $label DCFS ($int_val * 1.0) MEND ; 用EQU定义整数常量 M EQU 5 ; 调用宏,现在不会报错 myfloat FP_CONSTANT M ; 正确生成5.0的单精度浮点数据
之前你的宏报错,是因为直接传入M时,汇编器还是把它当成整数解析,而*1.0会让表达式结果变成浮点类型,DCFS就能正确识别了。
为什么之前的方法不行?
EQU本质是给整数(或字符串)绑定一个符号,哪怕你写M EQU 5.0,汇编器还是会把它存储为整数常量。而DCFS要求的是浮点字面量或浮点表达式,直接传入整数符号会被汇编器判定为“非法浮点数”,这就是你看到A1194E错误的原因。
这两种方法都能避免硬编码,复用你的常量,我在Cortex-A8项目里试过,完全适配DS-5 5.x版本。
内容的提问来源于stack exchange,提问作者m.alessandrini
相关产品推荐
相关产品推荐

