可以一次访问8、16、32或64位AMD64(aka x86-64或x64)寄存器。当阅读反汇编清单时,哪些寄存器操作不是很简单?

例如,当一条指令访问寄存器的一部分时,它如何影响其他部分?

典型的情况是什么?优化程序使用的指令或指令序列可能会编码一些不明显的内容(例如,将其自身与寄存器异或以将其设置为零)?

评论

这个问题太广泛了。这将导致轶事列表,而不是完整的答案。它应该更加集中,至少应限于特定主题,最好仅限于特定的编译器或平台(例如Visual C ++中的堆栈操作)。因为已经有一个答案,所以我提出了一个针对该答案主题的编辑:注册操作。

感谢您编辑@Gilles。当我问这个问题时,我知道这个问题太笼统了,但是我无法以仍能传达我想要的方式来重新表述它。

我希望这个问题仍然可以解决您感兴趣的问题。我确实鼓励您提出一个有关使用VC ++进行堆栈操作的单独问题,我会对此问题进行编辑以专注于此问题,但是我认为容纳现有答案对我来说将更有用。

#1 楼

并不是真正的优化,但是从x86发出时必须要注意的一个陷阱是:

对32位寄存器进行的任何操作都会使64位寄存器的上半部分清零

例如:

mov eax, 3


实际上等效于:

mov rax, 3


这也适用于新的寄存器r8-r15,例如:

inc r8d


也将r8的上半部分清零。

寄存器的8位和16位部分不能那样工作,即对它们的操作仅会修改寄存器的那部分。