#define во встроенной сборке в GCC - PullRequest
0 голосов
/ 26 сентября 2018

Я пытаюсь записать встроенную сборку в 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 голосов
/ 26 сентября 2018

Используйте некоторую магию препроцессора для строкового значения и продолжения строки в 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

...