c - #define 在 GCC 中的内联汇编

标签 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");
}

但是,我在编译时遇到错误:

undefined reference to `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");
}

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

最佳答案

在 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

关于c - #define 在 GCC 中的内联汇编,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52525630/

相关文章:

c++ - 从文件中读取最后两次出现

c++ - 使用可变宏时获取 "Error: #28: expression must have a constant value "

assembly - 可以使用哪些方法/技术来减少汇编代码中的分支数量?

c - Tiva 上的 I2C 接口(interface)

embedded - ARM TrustZone 开发

c - Sparkfun SC16IS750 不适用于 Raspberry Pi

assembly - x86-64下汇编指令switch case部分疑惑

c++ - 有没有可能不用暴力破解这个方程式?

qt - Qt 桌面和嵌入式应用程序中的文本大小和样式不同

在 OS X El Capitan 上使用 libssl 编译 C 程序?