如何在没有多条指令的情况下将汇编中的所有寄存器清零



im试图使用以下汇编代码清除所有寄存器:

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

但是还有其他有效的方法吗,比如一条指令或其他任何

您错过了8个通用整数寄存器中的ESP。

不,没有这样做的指令,如果英特尔包含的指令只执行罕见且晦涩的任务,那将是糟糕的设计需要晶体管进行解码和微码实现,并耗尽本可以更好地用于其他指令或未来扩展的操作码

存在用于x87堆栈寄存器的CCD_ 1;"空";但实际上并没有将潜在的regs归零。XMM/YMM0..15矢量寄存器有AVXvzeroall(不是YMM16..31,所以AVX512实际上并不是全部(。这是vzeroupper的合作伙伴,它的存在是为了避免SSE/AVX过渡处罚,否则他们不会添加它。

您可能希望在操作系统内核中这样做一两次(例如,在跳转到用户空间之前启动进程,以避免信息泄露(,而在任何其他代码中几乎都不会这样做。

可以rep stosdmovdqapopa的堆栈上加一些零,可能在比7xxor归零指令更少的指令中。但代码大小最差,当然效率也更差。xor调零实际上和现代英特尔CPU上的nop一样便宜。

在内核中,您可能已经有了上下文切换函数,因此您可以通过将上下文缓冲区清零,然后调用上下文切换函数来切换到它来利用它

相关内容

  • 没有找到相关文章

最新更新