我怎样才能以不同的方式编写这条流水线?
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 上。)
有没有办法只用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 操作,添加另一个潜伏期周期。 (