关于我试图理解的一段代码,我有几个问题。我读过the manual here .但它似乎并没有解释或回答这里使用的所有技巧。
代码如下:
#define SAMPLE_OFFSET1 0
#define SAMPLE_OFFSET2 100
#define SAMPLE_OFFSET1 1000
#define STRINGIFY(s) #s
struct data {
int m1;
int m2;
const uint *m3;
const uint *m4;
};
#define assembly_function(param1, ... param15) \
... body \
... body \
... body \
... body
void testFunction (data* c, uint *const sample) {
int bat, tmp;
__asm__ volatile(
assembly_function("%0", "%q0", "(%4)", "%1", "%w1",
"%2", "%q2", "%3", "%b3",
"%c6(%5)", "%c7(%5)",
STRINGIFY(SAMPLE_OFFSET1),
STRINGIFY(SAMPLE_OFFSET2),
STRINGIFY(SAMPLE_OFFSET3),
"%8")
: "=&r"(bat), "=&r"(c->m1), "=&r"(c->m2), "=&q"(tmp)
: "r"(sample), "r"(c),
"i"(offsetof(data, m3)),
"i"(offsetof(data, m4)),
"1"(c->m1), "2"(c->m2)
: "%rcx", "memory"
);
}
我对以下某些约束/选项的用法进行了大胆的猜测。但我觉得最好从其他人那里确认(或获得一些详细手册的链接)。
- %c 在“%c6(%5)”和“%c7(%5)”
- %q 在“%q0”和“%q2”中,
- %b 在“%b3”中
- %w 在“%w1”中
- “(%4)”中的括号
- “i”代表两个输入参数。
- “1”和“2”用于两个输入参数。
感谢您的帮助。
最佳答案
%c
强制输出为常量地址,这里它用于摆脱通常在 at&t 语法模式中为立即数发出的 $
(即 i
约束暗示)。
%b
、%w
、%l
和 %q
是大小覆盖修饰符,它们强制操作数的适当大小的寄存器(即字节、字、长或四)。
括号只是您日常 at&t 风格的有效地址语法的一部分。
i
是一个立即整数操作数(一个具有常量值的操作数)。
"1"
和 "2"
是匹配约束,即将它们放置在与指示的其他操作数相同的位置。
关于c++ - 内联汇编操作数约束,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28590730/