【问题标题】:Inline assembler: Pass a constant内联汇编器:传递一个常量
【发布时间】:2016-02-10 20:21:32
【问题描述】:

我有以下问题:我想使用内联汇编程序从我的 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 时值都会不同。

【问题讨论】:

  • RTFM。 asm(".word 1\n": : :); 有什么问题?请阅读文档和/或教程。
  • 那是给 ARM 的?这是您无法使用单独编译的 .s 更轻松地完成的事情吗?
  • 我已经编辑了问题以明确为什么我不能使用“.word 1”
  • 您不能通过内联.word 指令来传递常量。您只是在函数中插入无效指令。你到底想完成什么?

标签: c gcc inline-assembly


【解决方案1】:

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

.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))

【讨论】:

  • 非常感谢,这看起来很有希望。我会研究这两个选项。
【解决方案2】:

在 GCC 中你可以这样做:

asm __volatile__ (".word 0x1");

如果您使用的是 Visual Studio,那么您可以尝试:

some_word: _asm{_emit 1000b}

它会传入码字常量 1000b

您可以使用标签 some_word 获得访问权限

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-23
  • 2019-05-11
  • 2010-11-26
  • 1970-01-01
  • 2012-10-20
  • 2015-04-23
相关资源
最近更新 更多