簡體   English   中英

如何在沒有多條指令的情況下將匯編中的所有寄存器清零?

[英]how to zero out all the registers in assembly without multiple instructions?

我正在嘗試使用此匯編代碼清除所有寄存器:

xor eax, eax
xor ebx, ebx
xor ecx, ecx
xor edx, edx
xor esi, esi
xor edi, edi

但是有沒有其他有效的方法,比如一條指令或其他任何方法

您錯過了 8 個通用寄存器 integer 中的 ESP。

不,沒有執行此操作的指令,如果英特爾包含執行該罕見且晦澀任務的指令,那將是糟糕的設計。 它需要晶體管來解碼和微碼來實現,並用完一個本可以更好地用於其他指令或未來擴展的操作碼。

x87 堆棧寄存器有fninit ,它將它們標記為“空”,但實際上並沒有將底層寄存器清零。 XMM/YMM0..15 向量寄存器有 AVX vzeroall (不是 YMM16..31,所以對於 AVX512 它實際上不是全部)。 這是vzeroupper的合作伙伴,它的存在是為了避免 SSE/AVX 轉換處罰,否則他們不會添加它。

您希望在操作系統 kernel 中執行此操作一次或兩次(例如,在跳轉到用戶空間之前啟動進程,以避免信息泄漏),而在任何其他代碼中幾乎都不會執行此操作。

可以將rep stosdmovdqa的一些零表示到popa的堆棧中,指令可能少於 7x 異或歸零指令。 但最差的代碼大小和肯定更差的效率。 在現代 Intel CPU 上,異或歸零實際上與 nop 一樣便宜。

在 kernel 中,您可能已經有一個上下文切換 function,因此您可以通過將上下文緩沖區清零然后調用上下文切換 function 來切換到它來利用它。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM