Intel x86-64 XSAVE / XRSTOR

时间:2014-02-28 20:32:37

标签: assembly x86-64

我是一名CS学生,使用英特尔x86-64程序集编写,使用nasm进行编译,并在使用Ubuntu 12.04作为客户操作系统的Core i7处理器上运行。有没有人举例说明如何使用XSAVEXRSTOR?我已多次阅读英特尔架构软件开发人员手册中有关XSAVE的部分。我尝试在C ++中实现xsave,然后反汇编二进制文件以了解它正在做什么。当然,我已经在互联网上搜索了一些例子。任何建议都是非常有必要的。

2 个答案:

答案 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 switchingprogrammer reference描述了如何正确使用它们。

对于一般用户空间寄存器保存/恢复,汇编器通常具有保存/恢复一组寄存器的功能。

例如......

MASM

cpuid

YASM

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对使用