英特尔x86使用XSAVE和XRSTOR

3
这个问题与以下内容相关: 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

并让它保存它可以保存的所有寄存器。
不幸的是,这样做行不通。该代码无法汇编,并显示以下错误:
“error: invalid combination of opcode and operands”

Linux内核使用显式的字节码(x86机器码):http://lwn.net/Articles/281921/ __asm__ __volatile__(".byte " REX_PREFIX "0x0f,0xae,0x27" - osgx
4
这不是抱怨 Stack Overflow 的合适地方。如果你有怨言,请在 Meta 上发布。请简明扼要地表述问题。 - Kerrek SB
@Jester,是的,我确实在第13节看到了那个。而且实际上,我认为那就是格式所在的地方。我已经寻找这个答案好几天了。数小时的搜索给了我一些提示,但是获取关于汇编的信息有多么困难令人惊讶。那么您的意思是说我可以将rdx:rax的低位组合起来以设置标志。那么命令是什么? - C_Rod
2
@C_Rod xsave [something],任意加载edxeax - harold
@harold 非常感谢您的帮助,这个方法完美地解决了我的问题。如果您愿意将这些信息整理成答案,我会为您点赞的。 :-) - C_Rod
显示剩余5条评论
1个回答

1

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

规范如下:

XSAVE mem
XRSTOR mem

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接