c - 内联汇编器: Pass a constant

标签 c gcc inline-assembly

我遇到以下问题:我想使用内联汇编器使用 C 源文件中的以下汇编器代码:

.word 1

我得到的最接近的是使用这个内联汇编代码:

asm(".word %0\n": : "i"(1));

但是,这会在生成的汇编程序文件中生成以下代码:

.word #1

所以我需要一种方法来传递编译时已知的常量,而无需在其前面添加“#”。使用内联汇编器可以实现这一点吗?

编辑:

为了更清楚地说明为什么我需要这个,这就是它的使用方式:

#define LABELS_PUT(b) asm(".word %0\n": : "i"((b)));

int func(void) {
    LABELS_PUT(1 + 2);

    return 0;
}

我不能使用“.word 1”,因为每次调用宏 LABELS_PUT 时该值都会不同。

最佳答案

您的宏末尾有一个;。所以这是一个完整的陈述,而不仅仅是一个表达式。不要这样做。

与函数代码混合的 .word 通常是非法指令,不是吗?您真的打算运行这个二进制文件吗?


您应该能够将预处理器设置为 stringify your macro parameter ,并让字符串连接将其连接起来。然后汇编器可以计算1+2

#define LABELS_PUT(b) asm(".word " #b  "\n")


LABELS_PUT(1+2);   // becomes:
asm(".word " "1+2" "\n");

还有https://gcc.gnu.org/onlinedocs/gcc/Extended-Asm.html#x86Operandmodifiers ,其中一些可能适用于其他架构:

asm (".word %c0" : : "i" (b))

关于c - 内联汇编器: Pass a constant,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35325139/

相关文章:

c - 在 Windows 中找不到 libxml/xmlversion.h 文件

c - 如何从 Swift 调用 C?

c - sqlite c api插入绑定(bind)

c++ - typedef 声明定义未命名类时链接失败

c - 访问 gcc 内联汇编中字符串的地址

c - 帮我找出错误?

c++ - makefile 不适用于 -std=c++11 选项

c - 如何设置 Docker 容器以在 Nordic nRF5 SDK 上进行开发?

c - 如何在 cython 中调用 C 内联汇编汇编?

c - 内联汇编,进入中断