首页 > 解决方案 > #define 在 GCC 的内联汇编中

问题描述

我正在尝试在 GCC 中编写内联程序集,它将 #define 中的值写入寄存器。

#define SOME_VALUE  0xDEADBEEF

void foo(void)
{
    __asm__("lis r5, SOME_VALUE@ha");
    __asm__("ori r5, r5, SOME_VALUE@l");
}

但是,编译时出现错误:

对“SOME_VALUE”的未定义引用

汇编器有没有办法#define在内联汇编中看到?

我通过执行以下操作解决了它:

#define SOME_VALUE  0xDEADBEEF
__asm__(".equ SOME_VALUE,   0xDEADBEEF");

void foo(void)
{
    __asm__("lis r5, SOME_VALUE@ha");
    __asm__("ori r5, r5, SOME_VALUE@l");
}

但是,我真的不想复制这个值。

标签: cassemblyembeddedinline

解决方案


在 C 中使用一些预处理器魔法来对值和字符串延续进行字符串化:

#define SOME_VALUE  0xDEADBEEF
#define STR(x) #x
#define XSTR(s) STR(s)

void foo(void)
{
    __asm__("lis r5, " XSTR(SOME_VALUE) "@ha");
    __asm__("ori r5, r5, " XSTR(SOME_VALUE) "@l");
}

XSTR将扩展为 string "0xDEADBEEF",它将与周围的字符串连接起来。

这是演示: https ://godbolt.org/z/2tBfoD


推荐阅读