如何在没有多条指令的情况下将汇编中的所有寄存器清零?
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 个通用整数寄存器中的 ESP。
不,没有执行此操作的指令,如果英特尔 包含一条只执行该罕见且晦涩任务的指令,那将是糟糕的设计。 需要晶体管解码和微代码实现,并用完本可以更好地用于其他指令或未来的操作码 extension.something
XMM/YMM0..15 向量寄存器有 fninit
for the x87 stack registers which marks them as "empty" but doesn't actually zero the underlying regs. And there's AVX vzeroall
(不是 YMM16..31,所以对于 AVX512 它实际上不是全部)。这是 vzeroupper
的合作伙伴,它的存在是为了避免 SSE/AVX 过渡惩罚,否则他们不会添加它。
你想在 OS 内核中执行一次或两次(例如,在跳转到用户 space 之前启动进程,以避免信息泄漏),并且几乎永远不会在任何其他代码。
您 可以 rep stosd
或 movdqa
一些零到堆栈上 popa
,可能指令少于 7x 异或归零指令.但最差的代码大小和肯定更差的效率。在现代英特尔 CPU 上,异或归零实际上与 nop 一样便宜。
在内核中,您可能已经有了上下文切换函数,因此您可以通过将上下文缓冲区清零然后调用上下文切换函数来切换到它来利用它。
我正在尝试使用此汇编代码清除所有寄存器:
xor eax, eax
xor ebx, ebx
xor ecx, ecx
xor edx, edx
xor esi, esi
xor edi, edi
但是有没有其他有效的方法,比如一条指令或其他任何方法
您错过了 8 个通用整数寄存器中的 ESP。
不,没有执行此操作的指令,如果英特尔 包含一条只执行该罕见且晦涩任务的指令,那将是糟糕的设计。 需要晶体管解码和微代码实现,并用完本可以更好地用于其他指令或未来的操作码 extension.something
XMM/YMM0..15 向量寄存器有 fninit
for the x87 stack registers which marks them as "empty" but doesn't actually zero the underlying regs. And there's AVX vzeroall
(不是 YMM16..31,所以对于 AVX512 它实际上不是全部)。这是 vzeroupper
的合作伙伴,它的存在是为了避免 SSE/AVX 过渡惩罚,否则他们不会添加它。
你想在 OS 内核中执行一次或两次(例如,在跳转到用户 space 之前启动进程,以避免信息泄漏),并且几乎永远不会在任何其他代码。
您 可以 rep stosd
或 movdqa
一些零到堆栈上 popa
,可能指令少于 7x 异或归零指令.但最差的代码大小和肯定更差的效率。在现代英特尔 CPU 上,异或归零实际上与 nop 一样便宜。
在内核中,您可能已经有了上下文切换函数,因此您可以通过将上下文缓冲区清零然后调用上下文切换函数来切换到它来利用它。