【发布时间】:2014-03-23 13:48:07
【问题描述】:
本题参考:
这个问题是关于如何使用 XSAVE 和 XRSTOR。不幸的是,由于这个站点上非常奇怪的声誉系统,我不能简单地在那个线程上问我的问题,我必须提出一个新问题。有人回答了这个问题,但没有使用 Intel x86 命令 XSAVE 和 XRSTOR。所以,真的,这个问题没有得到回答。
有没有办法让任何人都可以举一个例子来说明如何使用 XSAVE 和 XRSTOR,这样我们就不必将每个寄存器单独复制到内存中来保存它。
现在我们必须:
copy xmm0 to memory, copy xmm1 to memory... and so on
然后:
right shift ymm0 64 bytes, right shift ymm1 64 bytes... and so on
然后:
repeat 3 times.
所以要保存 ymm 寄存器,我们需要大约 100 条命令。
那么恢复它们就差不多了。
现在,Intel x86 程序集似乎有一条指令可以一次性完成所有操作。 Intel x86 语法中的命令是:
xsave [mem], flag
和
xrstor [mem], flag
所以,我应该能够(例如)像这样在 .data 段中保留内存:
regsave times 1024 dq 0
然后说
xsave [regsave], flag
什么是标志?在巨大的汇编手册(没有示例)中,它说任何可以保存的寄存器都将与标志进行“与”运算,以确定哪些寄存器将被保存。它说标志是32位。所以我应该只能说:
xsave [regsave], 0xFFFFFFFF
并让它保存它可以保存的所有寄存器。
不幸的是,这不起作用。代码不会汇编并给出错误:
“错误:操作码和操作数的组合无效”
【问题讨论】:
-
Linux内核使用显式字节码(x86机器码):lwn.net/Articles/281921
__asm__ __volatile__(".byte " REX_PREFIX "0x0f,0xae,0x27" -
这里不适合抱怨 Stack Overflow。如果您有任何不满,请在 Meta 上发布。保持这篇文章的重点。
-
不知道你在哪里发现指令的格式是
xsave [mem], flag,并且那个标志是32位的。事实上,如果你在指令集参考中查找相关部分,你可以看到它说:The implicit EDX:EAX register pair specifies a 64-bit instruction mask. -
什么是元?我发现无法问我的问题有点烦人,但我也想解释一下,我不是盲目地复制现有问题,也就是说,这是有原因的。 @osgx 感谢您的提示。我去看看。
-
@C_Rod
xsave [something],加载edx和eax任何你想要的方式