我是一名CS学生,使用Intelx86-64汇编语言编写代码,使用nasm编译,运行在以Ubuntu12.04为客户操作系统的酷睿i7处理器上。有谁有如何使用XSAVE和XRSTOR的例子吗?我已经多次阅读英特尔架构软件开发人员手册中有关XSAVE的章节。我尝试在C++中实现xsave,然后反汇编二进制文件以了解它在做什么。当然,我已经在互联网上搜索过这些例子。任何建议都将不胜感激。
发布于 2014-03-23 23:55:34
最后,给出这个问题的答案。感谢用户: harold,他帮我回答了这个问题。总结一下我的发现:
在.data中设置一个内存空间,并将其与64字节边界对齐。然后,您可以对该内存空间使用这些命令。如果您想使用堆栈,您应该能够以类似的方式确保堆栈是64字节对齐的,但在我看来,这种方法更容易实现这一目的。
eax: edx用于设置要保存、恢复的寄存器的标志。这个组合是64位的,并且是带有内部控制的ANDed,它知道你可以保存/恢复哪些寄存器(例如,这允许没有ymm的处理器忽略这些寄存器)我发现最简单的方法就是设置所有位并保存/恢复所有内容:
细分市场.data
align 64
regsave times 1024 dq 0细分市场.text
mov rdx, 0xFFFFFFFFFFFFFFFF
mov rax, 0xFFFFFFFFFFFFFFFF
xsave [regsave]
vzeroall
mov rdx, 0xFFFFFFFFFFFFFFFF
mov rax, 0xFFFFFFFFFFFFFFFF
xrstor [regsave]发布于 2014-03-07 07:05:59
xsave/xrstor/xsaveopt指令用于将处理器中的扩展状态完全保存/恢复到存储器或从存储器恢复。与fxsave/fxrstor类似,它可以保存/恢复st[0..7]、xmm[0..7]、mxcsr等状态。除了支持ymm[0..15]和未来的扩展(zmm[0..31])之外。保存的实际值和数据布局通过相关的cpuid叶进行枚举。一般使用的是操作系统context switching。programmer reference描述了如何正确使用它们。
对于一般的用户空间寄存器保存/恢复,汇编程序通常具有保存/恢复一组寄存器的功能。
例如..。
masm
foo PROC USES eax,ebx,ecx
xor ebx, ebx
loop:
mov eax, [esi + ebx*4]
mov [edi + ebx*4], eax
inc ebx
dec ecx
jnz loop
ret
foo ENDPyasm
%macro mpush 1-*
%rep %0
push %1
%rotate 1
%endrep
%endmacro
%macro mpop 1-*
%rep %0
%rotate -1
pop %1
%endrep
%endmacrofoo:
mpush rax,rbx,rcx
xor rbx, rbx
loop:
mov rax, [rsi + rbx*8]
mov [rdi + rbx*8], rax
inc rbx
dec rcx
jnz loop
mpop rax,rbx,rcx
ret在ia-32中,有一个用于保存所有通用寄存器的pushad,但是对于amd64,您需要为您使用的每个寄存器提供相应的push/pop对。
https://stackoverflow.com/questions/22105247
复制相似问题