- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我有一些未知的 C++ 代码是在发布版本中编译的,因此对其进行了优化。我正在努力解决的问题是:
xor al, al
add esp, 8
cmp byte ptr [ebp+userinput], 31h
movzx eax, al
这是我的理解:
xor al, al ; set eax to 0x??????00 (clear last byte)
add esp, 8 ; for some unclear reason, set the stack pointer higher
cmp byte ptr [ebp+userinput], 31h ; set zero flag if user input was "1"
movzx eax, al ; set eax to AL and extend with zeros, so eax = 0x000000??
我不关心第 2 行和第 3 行。出于流水线的原因,它们可能按此顺序存在,恕我直言,与 EAX 无关。
但是,我不明白为什么我会先清除AL,只是为了稍后清除其余的EAX。恕我直言,结果将始终是 EAX = 0
,所以这也可能是
xor eax, eax
相反。那段代码的优势或“优化”是什么?
一些背景信息:
稍后我会拿到源码。这是一个简短的 C++ 控制台演示程序,可能只有 20 行代码,所以没有什么我称之为“复杂”的代码。 IDA 在那个程序中显示了一个循环,但没有围绕这个片段。 Stud_PE 签名扫描未发现任何内容,但可能是 Visual Studio 2013 或 2015 编译器。
最佳答案
xor al,al
在大多数 CPU 上已经比 xor eax,eax
慢。例如on Haswell/Skylake it needs an ALU uop and doesn't break the dependency on the old value of eax
/rax
。它在 AMD CPU 或 Atom/Silvermont 上同样糟糕。 (好吧,也许不一样,因为 AMD 没有在问题/重命名时消除 xor eax,eax
,但它仍然有一个错误的依赖关系,它可以使用任何使用的 eax< 序列化新的依赖关系链
最后)。
在将 al
与寄存器的其余部分分开重命名的 CPU 上(Intel pre-IvyBridge),xor al,al
可能仍被识别为 as a zeroing idiom ,但除非如果您想保留寄存器的高位字节,将 al
归零的最佳方法是 xor eax,eax
。
在此基础上执行 movzx
只会让情况变得更糟。
我猜你的编译器不知何故感到困惑并决定它需要一个 1 字节的零,但随后意识到它需要将其提升为 32 位。 xor
设置标志,因此它不能在 cmp
之后 xor
-zero ,并且它没有注意到它可能只是在 cmp
之前对 eax
进行了异或归零。
或者是 something like Jester's suggestion ,其中 movzx
是一个分支目标。即使是这种情况,xor eax,eax
仍然会更好,因为在此代码路径上无条件地遵循零扩展到 eax。
我很好奇是什么编译器从什么来源生成的。
关于c++ - XOR AL,AL + MOVZX EAX, AL 比 XOR EAX,EAX 有什么优势?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47189701/
MOVZX r32, r/m16 和 MOVZX r64, r/m16 都有操作码 0F B7,但后者有一个 REX.W 前缀。是什么让这两个指令不同?无论如何,它们都不应该将目标操作数的高 32 位
我正在尝试找到一条可以替换 MOVZX 的指令,因为我使用的是 EMU8086(它模拟不支持 MOVZX 的 8086)。 我发现的最接近的指令是CBW,它将值放入寄存器AX中,但它仅适用于带符号的值
我有以下 C 代码段: int main() { int tablica [100]; bool visited [100]; int counter; int i;
对于 asm 模拟器,我正在尝试编写将 ASM 代码转换为等效工作代码的工作代码。最好的代码是可以在一行或最多两到三行中完成的代码,不在乎关于速度。 根据我的理解。如果用 C++ 完成,MOVZX 将
我有一些未知的 C++ 代码是在发布版本中编译的,因此对其进行了优化。我正在努力解决的问题是: xor al, al add esp, 8 cmp byte ptr [ebp+
我是一名优秀的程序员,十分优秀!