我是一名CS学生,使用英特尔x86-64程序集编写,使用nasm
进行编译,并在使用Ubuntu 12.04作为客户操作系统的Core i7处理器上运行。有没有人举例说明如何使用XSAVE
和XRSTOR
?我已多次阅读英特尔架构软件开发人员手册中有关XSAVE
的部分。我尝试在C ++中实现xsave
,然后反汇编二进制文件以了解它正在做什么。当然,我已经在互联网上搜索了一些例子。任何建议都是非常有必要的。
答案 0 :(得分:6)
最后,回答这个问题。感谢用户:哈罗德帮我回答了这个问题。我发现的内容摘要:
在.data中设置一个内存空间,并将其与64字节边界对齐。然后,您可以使用该内存空间的命令。如果你想使用堆栈,你应该能够这样做,同样确保堆栈是64字节对齐的,但这种方式对我来说似乎更容易。
eax:edx用于设置您想要保存,恢复的寄存器的标志。这个组合是64位并且与内部控制进行AND运算,内部控制知道哪些寄存器可以保存/恢复(这允许没有ymm的处理器忽略这些寄存器)我发现最简单地设置所有位打开并保存/恢复所有内容:
段.data
align 64
regsave times 1024 dq 0
segment .text
mov rdx, 0xFFFFFFFFFFFFFFFF
mov rax, 0xFFFFFFFFFFFFFFFF
xsave [regsave]
vzeroall
mov rdx, 0xFFFFFFFFFFFFFFFF
mov rax, 0xFFFFFFFFFFFFFFFF
xrstor [regsave]
答案 1 :(得分:3)
xsave
/ xrstor
/ xsaveopt
指令用于在处理器中向/从内存执行扩展状态的完全保存/恢复。与fxsave
/ fxrstor
类似,除了支持{{1}之外,它还保存/恢复fpu状态st[0..7]
,xmm[0..7]
,mxcsr
等...和未来的扩展(ymm[0..15]
)。保存的实际值和数据布局通过相关的zmm[0..31]
叶子进行枚举。该用途通常是操作系统context switching。 programmer reference描述了如何正确使用它们。
对于一般用户空间寄存器保存/恢复,汇编器通常具有保存/恢复一组寄存器的功能。
例如......
cpuid
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 ENDP
%macro mpush 1-*
%rep %0
push %1
%rotate 1
%endrep
%endmacro
%macro mpop 1-*
%rep %0
%rotate -1
pop %1
%endrep
%endmacro
在ia-32中,有一个foo:
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
来保存所有通用寄存器,但是对于amd64,你需要为每个寄存器设置相应的pushad
/ push
对使用