c++ - 内联汇编操作数约束

标签 c++ c gcc assembly

关于我试图理解的一段代码,我有几个问题。我读过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/

相关文章:

c++ - GCC 和 Clang 不在 C++17 中编译 std::hash<std::nullptr_t>

c++ - 将 std::string 写入可比较的 *time* 解析器,这可能会失败

c++ - OpenCV中数据库视频匹配的实现帮助

c++ - 嵌套 map ,访问内部 map 值

c - 嵌入式定时器包装

c - 系统头文件和普通头文件 gcc

gcc ld : symbol(s) not found for architecture x86_64

c++ - 访问包含它的 vector 元素时,类对象的运算符重载不起作用?

c - h_errno 总是打印 "unknown host"

c - 最短的C程序,仍然会导致段错误