Assembly 使用XSAVE和XRSTOR的英特尔x86

Assembly 使用XSAVE和XRSTOR的英特尔x86,assembly,x86-64,intel,Assembly,X86 64,Intel,这个问题是关于: 这个问题是关于如何使用XSAVE和XRSTOR的。不幸的是,由于这个网站上非常奇怪的声誉系统,我不能简单地问我的问题,我必须提出一个新的问题。一个人回答了这个问题,但没有使用英特尔x86命令XSAVE和XRSTOR。所以,真的,这个问题没有得到回答 有没有什么方法可以让任何人举一个例子来说明如何使用XSAVE和XRSTOR,这样我们就不必将每个寄存器单独复制到内存中来保存它 现在我们必须: copy xmm0 to memory, copy xmm1 to memory...

这个问题是关于:

这个问题是关于如何使用XSAVE和XRSTOR的。不幸的是,由于这个网站上非常奇怪的声誉系统,我不能简单地问我的问题,我必须提出一个新的问题。一个人回答了这个问题,但没有使用英特尔x86命令XSAVE和XRSTOR。所以,真的,这个问题没有得到回答

有没有什么方法可以让任何人举一个例子来说明如何使用XSAVE和XRSTOR,这样我们就不必将每个寄存器单独复制到内存中来保存它

现在我们必须:

copy xmm0 to memory, copy xmm1 to memory... and so on
然后:

然后:

因此,为了保存ymm寄存器,我们需要大约100个命令

那么,恢复它们也差不多

现在,似乎英特尔x86汇编有一条指令可以同时完成这一切。“英特尔x86”语法的命令是:

xsave [mem], flag

因此,我应该能够(例如)在.data段中保留内存,如下所示:

regsave times 1024 dq 0
然后说

xsave [regsave], flag
什么是国旗?在庞大的汇编手册(没有示例)中,它说任何可以保存的寄存器都将与该标志进行AND运算,以确定哪些寄存器将被保存。它说标志是32位。所以我应该说:

xsave [regsave], 0xFFFFFFFF
并让它保存所有可以保存的寄存器

不幸的是,这不起作用。代码将不会汇编并给出错误:

“错误:操作码和操作数的组合无效”


XSAVE/XRSTOR没有标志的参数,只有内存位置

规格为:

XSAVE mem
XRSTOR mem

EDX:EAX中的值指定了要保存/恢复到内存中的组件。

Linux内核使用显式字节码(x86机器码):
\uuuuuuu asm\uuuuuu volatile\uuuu(“.byte”REX\u前缀“0x0f,0xae,0x27”
这不是抱怨堆栈溢出的合适地方。如果您有不满,请将其发布在Meta上。请将此帖子切中要害。不确定您在哪里发现指令的格式是
xsave[mem],flag
,该标志是32位。事实上,如果你在指令集参考中查找相关部分,你会看到它说:
隐式EDX:EAX寄存器对指定了64位指令掩码。
什么是元?我发现不能问我的问题有点烦人,但我还想解释一下,我不是在胡思乱想复制一个现有的问题,这是有原因的。@osgx谢谢你的提示。我来看看。@C_Rod
xsave[something]
,load
edx
eax
任何你想要的方式
xsave [regsave], flag
xsave [regsave], 0xFFFFFFFF
XSAVE mem
XRSTOR mem