assembly - 在 x86 汇编中将单个内存单元设置为零或常量的最快方法?

标签 assembly x86 x86-64 zero micro-optimization

在 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/

相关文章:

c - 将内联汇编片段合并在一起

assembly - 机器指令和汇编指令有什么区别?

程序集执行具有不同语法的偏移量的长跳转

c++ - g++ ld 找不到 x86_64 架构的 RInside 符号

assembly - armv7-m 裸机 ldr/str 符号内存

从程序集调用 main

assembly - x86硬件如何检测并设置溢出寄存器标志

qt - x86 Qt应用程序在Mac OS 10.7(Lion)上崩溃

c++ - AVX2 中排序数组的高效稳定总和

assembly - 处理器是否将数据从 'L1 code' 缓存切换到 'L1 data' 缓存?