[英]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 stosd
或movdqa
的一些零表示到popa
的堆棧中,指令可能少於 7x 異或歸零指令。 但最差的代碼大小和肯定更差的效率。 在現代 Intel CPU 上,異或歸零實際上與 nop 一樣便宜。
在 kernel 中,您可能已經有一個上下文切換 function,因此您可以通過將上下文緩沖區清零然后調用上下文切換 function 來切換到它來利用它。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.