这个问题参考:
这个问题是关于如何使用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
什么是国旗?在庞大的装配手册(没有示例)中,它表示可以保存的任何寄存器将与标志进行AND运算,以确定将保存哪些寄存器。它说标志是32位。所以我应该只能说:
xsave [regsave], 0xFFFFFFFF
并保存它可以保存的任何寄存器。
遗憾的是,这并不奏效。代码不会汇编并给出错误:
"错误:操作码和操作数的组合无效"
答案 0 :(得分:1)
XSAVE / XRSTOR没有标志参数,只有内存位置,
规范是:
XSAVE mem
XRSTOR mem
EDX中的值:EAX指定要保存/恢复到内存的组件。