如何移除ARM GCC内联汇编.set指令中VALUE前的#号?
解决ARM平台GCC生成.set指令时VALUE前的#号问题
问题根源是GCC的ARM后端处理"i"约束的立即数时,会自动添加ARM汇编的立即数前缀#,但.set作为伪指令不需要这个前缀。可以通过以下两种方法解决:
方法一:利用C宏字符串化直接拼接数值
借助C语言的字符串化特性,直接将VALUE的数值嵌入汇编指令中,避免GCC自动添加前缀:#define VALUE 0x1234 __asm__ (".globl SYMBOL"); __asm__ (".set SYMBOL, " #VALUE);预编译后生成的汇编代码会直接是:
.globl SYMBOL .set SYMBOL, 0x1234方法二:使用
"n"约束替代"i"约束
部分版本的GCC ARM后端支持"n"约束,代表“裸数值”,不会为其添加#前缀:#define VALUE 0x1234 __asm__ (".globl SYMBOL"); __asm__ (".set SYMBOL, %0" :: "n" (VALUE));注意需确认你的GCC版本对ARM目标支持该约束。
内容的提问来源于stack exchange,提问作者KentH
相关产品推荐
相关产品推荐

