【问题标题】:Intel x86 using XSAVE and XRSTOR使用 XSAVE 和 XRSTOR 的英特尔 x86
【发布时间】:2014-03-23 13:48:07
【问题描述】:

本题参考:

Intel x86-64 XSAVE/XRSTOR

这个问题是关于如何使用 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],加载 edxeax 任何你想要的方式

标签: assembly x86-64 intel


【解决方案1】:

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

规格是:

XSAVE mem
XRSTOR mem

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

【讨论】:

    猜你喜欢
    • 2014-04-02
    • 1970-01-01
    • 2012-02-25
    • 1970-01-01
    • 1970-01-01
    • 2011-09-18
    • 2011-04-29
    • 2015-09-29
    • 2013-11-01
    相关资源
    最近更新 更多