回答
如果你想保存XMM/YMM寄存器來存儲你有2種選擇:
答:使用(F)XSAVE/(F)XRSTOR,請參閱:Intel x86-64 XSAVE/XRSTOR
你需要最新的CPU爲了這。
;save: mov rdx, -1 mov rax, -1 ;save all possible regs xsave [location] ...some code that alters the registers ;restore: mov rdx, -1 mov rax, -1 xrstor [location]
B:手動的REG保存到存儲器
另一種選擇是簡單地將寄存器的內容保存在存儲器中。 假設您想要將數據存儲在堆棧中。
這種方法可以在任何CPU上工作,並且更加便攜,在未來的十年中,至少這將是我最喜歡的方法。
快速和骯髒的對齊保存
;push xmm0
lea rsp,[rsp-16*numOfRegsToSave] ;reserve space on the stack
vmovdqu [rsp+16*0],xmm0 ;push a register (note unaligned!
寫) vmovdqu [RSP + 16 * 1],XMM0;繼續推動
;pop xmm0
.......
vmovdqu xmm1,[rsp+16*1] ;pop registers in reverse order
vmovdqu xmm0,[rsp+16*0] ;first 'pop' the register
lea rsp,[rsp+16*numOfRegsToSave] ;then update the stack.
如果你有大量的寄存器保存,你需要在32字節邊界上對齊堆棧:
稍快的代碼(在第一個修飾寄存器電子成本)
mov rbp,rsp ;save the stack pointer
and rsp,-32 ;align on a 32 byte boundary
;push ymm0
lea rsp,[rsp-32*numOfRegsToSave] ;reserve space on the stack
vmovdqa [rsp+32],ymm0 ;push a register (note aligned! write)
.......
;pop ymm0
....
vmovdqa ymm0,[rsp+32]
mov rsp,rbp
始終推第一任何ymm寄存器和任何其它寄存器以後(按遞減的尺寸的順序),這樣,在堆棧將總是被最佳比對。請注意0不再支持x64。
您遺漏了找出XSAVE緩衝區大小的部分,給它64字節對齊並初始化XSAVE標題。還有,爲什麼在問題只問如何保存XMM寄存器時保存所有內容?只保存SSE狀態意味着您可以使用固定大小的緩衝區,因爲您只使用XSAVE緩衝區的傳統部分,因此不需要在運行時計算其大小。 –
@Johan 嘿。要麼我填補了剩餘的抵消錯誤,要麼在您的實施中存在一些小錯誤。在我的例子中,我想存儲xmm0,xmm1,xmm2,xmm3。我sub rsp 16 * 4。現在,如果我從vmovdqu [rsp + 16 * 1]開始將寄存器內容移動到堆棧上,xmm0,那麼我最終將執行覆蓋以前堆棧內容的rsp + 16 * 4。我相信這應該是vmovdqu [rsp + 16 * 0],xmm0 vmovdqu [rsp + 16 * 1],xmm1等 –
- 1. XMM寄存器值
- 2. XMM寄存器存儲
- 3. xmm寄存器的乘法
- 4. 彙編器反轉XMM寄存器
- 5. 在函數調用之前保存XMM寄存器
- 6. 使用xmm寄存器保存通用目錄是否安全?
- 7. 檢查所有零的XMM寄存器
- 8. 將XMM寄存器推入堆棧
- 9. XMM寄存器0未被使用
- 10. XMM寄存器按位取反
- 11. 按字節填充xmm寄存器
- 12. 將兩個x86 32位寄存器存儲到128位xmm寄存器中
- 13. X86操作碼將xmm寄存器移動到通用寄存器
- 14. 如何將XMM 128位寄存器分成兩個64位整數寄存器?
- 15. 如何在XMM寄存器之間移動128位值?
- 16. 在x86中向xmm寄存器添加恆定值
- 17. MIPS寄存器保存
- 18. Verilog:將值保存在寄存器中(分配給相同的寄存器)
- 19. 在彙編器中調試xmm寄存器
- 20. 在氣體宏自動生成XMM寄存器的名字嗎?
- 21. 如何轉儲gdb中的所有XMM寄存器?
- 22. 混淆關於XMM寄存器的位圖
- 23. 有沒有辦法利用所有的XMM寄存器?
- 24. 寄存器值8086
- 25. 彙編保持寄存器值?
- 26. 將xmm寄存器轉換爲uint8_t數組[16]
- 27. 從xmm寄存器提取數據到「標準」變量,固有
- 28. XMM寄存器總數或每個內核
- 29. C:試圖將變量存儲在特定的XMM寄存器中
- 30. 的x86寄存器值
這不像它沒有被寫入指令集引用...請參閱'FXSAVE'。 PS:'pusha/popa'在64位模式下不再可用。 – Jester
嘗試'fxsave'或更新的'xsave'。 – fuz
@fuz寫道,['XSAVE'](http://www.felixcloutier.com/x86/XSAVE.html)可能對您有所幫助,因爲它確實可以將幾乎所有寄存器保存到內存區域 - 非常類似於' PUSHA',但更廣泛。 – zx485