我是一名CS学生,用英特尔x86-64程序集编写nasm,使用Ubuntu 12.04作为客户操作系统,在Core i7处理器上进行编译和运行.有没有人有一个如何使用的例子XSAVE和XRSTOR?我已XSAVE多次阅读英特尔架构软件开发人员手册中的相关部分.我试图xsave用C++ 实现,然后反汇编二进制文件以了解它正在做什么.当然,我已经在互联网上搜索了一些例子.任何建议都是非常有必要的.
最后,回答这个问题.感谢用户:哈罗德帮我回答了这个问题.我发现的内容摘要:
在.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)
xsave//指令用于执行处理器中扩展状态到内存的完整保存/恢复xrstor。xsaveopt与fxsave/类似,除了支持和未来的扩展 ( )之外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
| 归档时间: |
|
| 查看次数: |
7295 次 |
| 最近记录: |