例如,当一条指令访问寄存器的一部分时,它如何影响其他部分?
典型的情况是什么?优化程序使用的指令或指令序列可能会编码一些不明显的内容(例如,将其自身与寄存器异或以将其设置为零)?
#1 楼
并不是真正的优化,但是从x86发出时必须要注意的一个陷阱是:对32位寄存器进行的任何操作都会使64位寄存器的上半部分清零
例如:
mov eax, 3
实际上等效于:
mov rax, 3
这也适用于新的寄存器
r8
-r15
,例如:inc r8d
也将
r8
的上半部分清零。寄存器的8位和16位部分不能那样工作,即对它们的操作仅会修改寄存器的那部分。
评论
这个问题太广泛了。这将导致轶事列表,而不是完整的答案。它应该更加集中,至少应限于特定主题,最好仅限于特定的编译器或平台(例如Visual C ++中的堆栈操作)。因为已经有一个答案,所以我提出了一个针对该答案主题的编辑:注册操作。感谢您编辑@Gilles。当我问这个问题时,我知道这个问题太笼统了,但是我无法以仍能传达我想要的方式来重新表述它。
我希望这个问题仍然可以解决您感兴趣的问题。我确实鼓励您提出一个有关使用VC ++进行堆栈操作的单独问题,我会对此问题进行编辑以专注于此问题,但是我认为容纳现有答案对我来说将更有用。