Intel x86-64 XSAVE/XRSTOR

cod*_*ris 8 assembly x86-64

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

C_R*_*Rod 6

最后,回答这个问题.感谢用户:哈罗德帮我回答了这个问题.我发现的内容摘要:

在.data中设置一个内存空间,并将其对齐在64字节的边界上.然后,您可以使用该内存空间的命令.如果你想使用堆栈,你应该能够这样做,同样确保堆栈是64字节对齐的,但这种方式对我来说似乎更容易.

eax:edx用于设置要保存,恢复的寄存器的标志.这个组合是64位并且与内部控制进行AND运算,内部控制知道哪些寄存器可以保存/恢复(这允许没有ymm的处理器忽略这些寄存器)我发现最简单的方法是设置所有位和保存/恢复所有内容:

段.data

align   64
regsave times 1024 dq 0
Run Code Online (Sandbox Code Playgroud)

段.text

mov     rdx, 0xFFFFFFFFFFFFFFFF
mov     rax, 0xFFFFFFFFFFFFFFFF
xsave   [regsave]

vzeroall

mov     rdx, 0xFFFFFFFFFFFFFFFF
mov     rax, 0xFFFFFFFFFFFFFFFF
xrstor  [regsave]
Run Code Online (Sandbox Code Playgroud)


Jas*_*son 5

xsave//指令用于执行处理器中扩展状态到内存的完整保存/恢复xrstorxsaveoptfxsave/类似,除了支持和未来的扩展 ( )之外fxrstor,它还保存/恢复 fpu 状态st[0..7]xmm[0..7]、等。保存的实际值和数据布局通过相关叶子枚举。一般的用途是操作系统上下文切换。程序员参考描述了如何正确使用它们。mxcsrymm[0..15]zmm[0..31]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
Run Code Online (Sandbox Code Playgroud)

亚斯姆

%macro  mpush 1-*

  %rep  %0
        push    %1
  %rotate 1
  %endrep

%endmacro

%macro  mpop 1-*

  %rep %0
  %rotate -1
        pop     %1
  %endrep

%endmacro
Run Code Online (Sandbox Code Playgroud)


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
Run Code Online (Sandbox Code Playgroud)

在 ia-32 中,有一个pushad用于保存所有通用寄存器,但对于 amd64,您需要为您使用的每个寄存器都有相应的push/对。pop