内联汇编程序:传递常量

时间:2016-02-10 20:21:32

标签: c gcc inline-assembly

我有以下问题:我想使用内联汇编程序从我的C源文件中使用以下汇编程序代码:

paintComponent(Graphics g)

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

.word 1

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

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

所以我需要一种方法来传递一个在编译时已知的常量而不在它前面添加'#'。这是否可以使用内联汇编程序?

修改

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

.word #1

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

2 个答案:

答案 0 :(得分: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))

答案 1 :(得分:0)

在GCC中你可以这样做:

asm __volatile__ (".word 0x1");

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

some_word: _asm{_emit 1000b}

它将传入代码字常量1000b

您可以使用标签some_word

进行访问