Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/64.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 内联汇编操作数约束_C++_C_Gcc_Assembly - Fatal编程技术网

C++ 内联汇编操作数约束

C++ 内联汇编操作数约束,c++,c,gcc,assembly,C++,C,Gcc,Assembly,我有一些关于我试图理解的一段代码的问题。我读过。但它似乎并没有解释或回答这里使用的所有技巧 代码如下: #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 ass

我有一些关于我试图理解的一段代码的问题。我读过。但它似乎并没有解释或回答这里使用的所有技巧

代码如下:

#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"
    );
}
我对以下一些约束条件/选项的用法有很大的猜测。但我觉得最好还是向其他人确认一下(或者获得一些详细手册的链接)

  • %“%c6(%5)”和“%c7(%5)”中的c
  • %“%q0”和“%q2”中的q
  • %“%b3”中的b
  • %“%w1”中的w
  • “(%4)”中的括号
  • “i”表示两个输入参数
  • “1”和“2”表示两个输入参数

谢谢你的帮助

%c
强制输出为一个常量地址,这里它用于摆脱at&t语法模式下通常发出的即时消息的
$
(即
i
约束所暗示的)

%b
%w
%l
%q
是大小覆盖修饰符,它们强制操作数使用大小合适的寄存器(即字节、字、长或四元)

括号只是日常at&t风格的有效地址语法的一部分

i
是一个立即整数操作数(具有常量值的操作数)


“1”
“2”
是匹配约束,即将它们放置在与指示的其他操作数相同的位置。

远离技巧。坚持简单明了。不管怎样,事情可能会变得很棘手。谢谢你的评论。关于%c,理解“%c6(%5)”==%5和%6的值之和并将其用作内存中只能读取而不能写入的恒定地址是否正确?否,地址是恒定的,而不是值。这是一个
foo*const
而不是
const foo*