为什么intel规定，对通用寄存器低32位操作会导致高32位清零，对低16位、8位操作则对高位无影响？这样的规定到底基于什么考虑，有什么意义吗？
自从 CPU 有了流水线、并行执行、乱序执行这些东西以后，正经的指令集都会设计成清零。

x86-64 除了 32 位通用寄存器指令清零以外，还有比如 GPR 到 SSE 的 MOVD/MOVQ，内存到 SSE 的MOVSS/MOVSD，以及所有的 AVX 指令，都设计为对高位清零。

高位清零可以帮助打破指令之间的依赖关系，有助于获得更高的并发度。

首先 x86-64 有一个假设，虽然是 64 位处理器，但 32 位计算仍然非常普遍的，在大量场合 32 位整数是够用的，代码里会出现大量目标操作数为 32位寄存器的指令。

如果不设计为高位清零，所有 32 位指令都会额外增加一个对目标寄存器的向前依赖。

举个例子：

            MOV   RAX, [RSP]    MOV   [RSP + 16], RAX    MOV   EAX, [RSP+8]    MOV   [RSP + 24], EAX

不管清不清零，这几条指令的效果都是一样的。

第 3 条指令若不清零，第 1 条必须先执行，然后第 2、3 条可以同时执行，其中第 3 条在执行的时候需要合并旧值和新值，最后执行第 4 条。

第 3 条指令设计为清零，现代 CPU 可以同时执行第 1、3 条指令（虽然都用到了RAX，但是因为有清零语义，打破了依赖链，故而可以使用两个物理寄存器来分别承载），然后再同时执行第 2、4 条。最后让 RAX「指向」第 3、4条指令实际使用的那个物理寄存器。（现代 CPU 里 RAX、RBX等并不是对应一个真实的物理寄存器，它们只是给汇编程序员看的，它和真正的物理寄存器之间还有一层「映射」关系，是 CPU 内部管理的。）

表达不是太严谨，但差不多就是这么个意思。

为什么 16 位、8 位操作不清零？很简单，那些指令是 80 年代甚至更早设计的。流水线、微指令、寄存器重命名、超标量等等等等技术都是 90年代以后才有的。

虽然 16 位、8 位指令因为兼容原因不清零，但是 Intel 明确建议尽量使用 MOVZX/MOVSX 代替 16 位 / 8 位的 MOV指令。原因也是一样的，打破寄存器的依赖关系。

最后挑一个刺，「对通用寄存器低32位操作会导致高32位清零」不是 Intel 规定的，是 AMD 规定的。x86-64 指令集是 AMD 设计的，当时叫AMD64，后来 Intel 抄过去了。 为什么 Intel 不自己设计，因为 Intel 当时押宝 IA64（即安腾 Itanium），后来眼看安腾要死了Intel 又才匆忙把 AMD64 抄过来。