相关疑难解决方法(0)

在x86汇编中将寄存器设置为零的最佳方法是什么:xor,mov或?

以下所有说明都做同样的事情:设置%eax为零.哪种方式最佳(需要最少的机器周期)?

xorl   %eax, %eax
mov    $0, %eax
andl   $0, %eax
Run Code Online (Sandbox Code Playgroud)

optimization performance x86 assembly micro-optimization

109
推荐指数
1
解决办法
4万
查看次数

使一个寄存器依赖于另一个寄存器而不改变其值

考虑以下 x86 程序集:

; something that sets rax
mov rcx, [rdi]
xor rax, rcx
xor rax, rcx
Run Code Online (Sandbox Code Playgroud)

在序列末尾,rax的值与进入时的值相同,但从 CPU 的角度来看,它的值取决于从内存加载到 的值rcx。特别是,rax在该加载和两条指令完成之前,后续的使用不会开始xor

有没有什么方法可以比双xor序列更有效地实现这种效果,例如,使用单个单微指令单周期延迟指令?如果某个常量值需要在序列之前设置一次(例如,有一个归零的寄存器),这是可以的。

performance x86 assembly micro-optimization microbenchmark

3
推荐指数
1
解决办法
355
查看次数