我怎样才能以不同的方式编写这条流水线?

how can I write this assembly line differently?

有没有办法只用mov指令重写下面的汇编操作

movzx   eax, WORD  [short_temp]

当然,很容易。只需将 eax 归零,然后设置 ax

XOR EAX, EAX
MOV AX, [short_temp]

如果你想从[EAX]中获取一个单词,正如你所说的,只需预先将地址存储到其他寄存器中即可:

MOV EBX, EAX
XOR EAX, EAX
MOV AX, [short_temp]

或者,如果那不可能,请按照 并使用 AND:

清除 EAX 的高 16 位
MOV AX, [EAX]
AND EAX, FFFFh

你永远不需要回避movzx。如果像 EAX 这样的 32 位寄存器可用,那么您的代码在 386 或更高版本上是 运行,因此也支持 movzx

这是迄今为止在 Intel CPU 上执行此操作的最有效方法。 movzx r32, [memory] 解码为一个加载 uop,没有 ALU 操作。延迟与正常负载(IIRC)相同,因此零扩展由负载单元免费完成。

在 AMD Bulldozer 系列 CPU 上,movzx 始终使用 ALU 端口(以及作为内存操作数时的加载端口),因此理论上 xor 可以更快- 在使用单词加载之前将 EAX 设为零(@Downvoter 的回答)。这可能会以更大的代码大小和更多的前端解码 m-ops 为代价,降低一个周期的加载使用延迟。

其他建议,例如将字加载到 AX 然后 and eax, 0xFFFF 显然更糟糕,因为在部分寄存器写入(AX)之后读取 EAX,并且因为它是一个单独的 ALU 操作,添加另一个潜伏期周期。 (,甚至在英特尔 P6 系列 CPU 上。)