c++ - 使用 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
指令。虽然我可以使用约束将内容放入rax
、edi
、esi
和rdx
寄存器中,但似乎没有任何约束可以让我将内容放入r10
、r8
和r9
寄存器中。似乎应该有一个约束,可以让我将东西放入任意r#
寄存器。我错过了什么吗?有没有更好的方法来做我想做的事?
解决方案
推荐阅读
- regex - 多次转换 sed 中的匹配组
- javascript - 如果滚动窗口大小增加,如何查看按钮,如果滚动窗口大小减小,如何隐藏按钮
- python-3.x - 令人困惑的 Python 函数!看起来很简单,但答案不是我所期望的
- git - 修复 git 存储库中从树到 blob 的断开链接
- selenium - 如何使用 xpath Selenium 和 Python 查找包含特定文本的所有元素
- react-native - Expo:来自 JS 的格式错误的调用:字段大小不同
- gstreamer - 将 v4l2loopback 和 GStreamer 与 MJPEG 相机一起使用
- jquery - 通过复选框对选择选项进行单次和多次检查
- cassandra - Cassandra 插入时读取超时异常
- python - 天蓝色函数应用程序错误:“AI:本地存储访问已导致错误”