在 x86 中将单个内存单元设置为零的最快方法是什么?通常我这样做的方式是这样的:
C745D800000000 MOV [ebp-28], 0
正如您所看到的,它的编码相当粗,因为它使用了所有 4 个字节作为常量。对于普通寄存器,我可以使用更紧凑的 MVZE
,但 MVZE
不适用于内存。
我在想也许可以清除一个寄存器,然后将寄存器值MOV
到内存中。那么,这将是两条指令,但总共只有 5 个字节,而不是上面的一条 7 字节指令。遵循“如果更短,通常更快”的规则,这可能是更好的选择。
最佳答案
不幸的是,您在这里所写的是“直接”将存储单元清零的唯一方法。当然,异或寄存器然后将其移动到某个内存位置也可以,但我不知道这是否会更快。
如果您碰巧有一个寄存器的值为零并且您确定它,那么请务必使用它。否则,只需使用 mov [ebp-28], 0
即可。请记住,mem、imm
操作数是已知最慢的操作数之一:如果您分析代码并发现这是瓶颈,请尝试在函数开头将寄存器初始化为零(或其他),然后在整个代码中使用它,作为一种预定义的常量。
关于assembly - 在 x86 汇编中将单个内存单元设置为零或常量的最快方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15442958/