内联汇编器:传递常量
Inline assembler: Pass a constant
我遇到以下问题:我想使用内联汇编程序从我的 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 时值都会不同。
您的宏末尾有一个 ;
。所以它是一个完整的语句,而不仅仅是一个表达式。不要那样做。
A .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))
在 GCC 中你可以这样做:
asm __volatile__ (".word 0x1");
如果您正在使用 Visual Studio 那么您可以尝试:
some_word: _asm{_emit 1000b}
会传入码字常量1000b
您可以使用标签 some_word
获取访问权限
我遇到以下问题:我想使用内联汇编程序从我的 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 时值都会不同。
您的宏末尾有一个 ;
。所以它是一个完整的语句,而不仅仅是一个表达式。不要那样做。
A .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))
在 GCC 中你可以这样做:
asm __volatile__ (".word 0x1");
如果您正在使用 Visual Studio 那么您可以尝试:
some_word: _asm{_emit 1000b}
会传入码字常量1000b
您可以使用标签 some_word
获取访问权限