首页 > 解决方案 > 使用 gcc 内联汇编可以将 %r# 寄存器设置为输入约束吗?

问题描述

我有这个功能:

#include <cstdint>

using ::std::intptr_t;

struct syscall_param {
   syscall_param(intptr_t v) : value(v) { }
   syscall_param(void *v) : value(reinterpret_cast<::std::intptr_t>(v)) { }
   intptr_t value;
};

inline intptr_t do_syscall(syscall_param const &callnum,
                           syscall_param const &p1,
                           syscall_param const &p2,
                           syscall_param const &p3,
                           syscall_param const &p4,
                           syscall_param const &p5,
                           syscall_param const &p6)
{
   intptr_t retval;
   asm volatile (
      "movq %5, %%r10\n\t"
      "movq %6, %%r8\n\t"
      "movq %7, %%r9\n\t"
      "syscall\n\t"
       :"=a"(retval)
       :"a"(callnum.value), "D"(p1.value), "S"(p2.value), "d"(p3.value), "g"(p4.value), "g"(p5.value), "g"(p6.value)
       :"%rcx", "%r11", "%r10", "%r8", "%r9"
      );
   return retval;
}

我真的很想通过使用约束来摆脱movq指令。虽然我可以使用约束将内容放入raxediesirdx寄存器中,但似乎没有任何约束可以让我将内容放入r10r8r9寄存器中。似乎应该有一个约束,可以让我将东西放入任意r#寄存器。我错过了什么吗?有没有更好的方法来做我想做的事?

标签: c++gccx86-64inline-assembly

解决方案


推荐阅读