#在GCC中内联汇编中定义

时间:2018-09-26 20:30:32

标签: c assembly embedded inline

我正在尝试在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");
}

但是,我真的不想重复该值。

1 个答案:

答案 0 :(得分:4)

使用一些预处理器魔术来在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将扩展为字符串"0xDEADBEEF",并将其与周围的字符串连接起来。

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