我有以下问题:我希望使用内联汇编程序使用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时,值都会有所不同。
发布于 2016-02-10 20:42:04
宏的末尾有一个;。所以这是一个完整的陈述,而不仅仅是一个表达。别干那事。
与函数的代码混合在一起的.word通常是非法的指令,不是吗?你真的打算运行这个二进制文件吗?
您应该能够将预处理器连接到调整宏参数,并让字符串连接起来。然后汇编程序可以对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))发布于 2016-02-10 20:54:14
在GCC里,你可以这样做:
asm __volatile__ (".word 0x1");如果使用的是,则可以尝试:
some_word: _asm{_emit 1000b}它将传递到代码word常量1000 b。
您可以使用标签some_word访问
https://stackoverflow.com/questions/35325139
复制相似问题