- 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/
首先对WCF与WebService的定义进行概括,接着介绍了WCF的优势,最后就是对WCF与WebService两者的根本区别进行比较,具体内容如下 1、定义 1.WebService:严格来
关闭。这个问题是opinion-based .它目前不接受答案。 想改善这个问题吗?更新问题,以便可以通过 editing this post 用事实和引文回答问题. 5年前关闭。 Improve t
关闭。这个问题是opinion-based .它目前不接受答案。 想要改进这个问题? 更新问题,以便 editing this post 可以用事实和引用来回答它. 关闭 8 年前。 Improve
谁能告诉我将下一个脚本标记放在 元素之后和将它放在 元素之前有什么好处? (function (){ var script = document.createElement("script"); s
我最近遇到了一个 JavaScript 脚本,其中作者似乎试图避免在代码中使用字符串并将所有内容都分配给一个变量。 所以代替 document.addEventListener('click', (e
Scott Meyers 在“Effective Modern C++”中说表达式 Matrix sum = m1 + m2 + m3 + m4 (其中所有对象的类型均为 Matrix)“如果 ope
按照目前的情况,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the
免责声明:我是网络开发的新手,所以请多多包涵... 堆栈:Angular 前端,后端的 Tornado(基于 python)网络服务器 我一直在使用 RxJs 和 WebSocket 成功地与后端通信
我一直在调查我的 Flutter 应用程序的 JSON 解析,并且有一个关于我无法解决的工厂构造函数的问题。我试图了解使用工厂构造函数与普通构造函数的优势。例如,我看到很多 JSON 解析示例,它们使
添加 SQL 后尝试打开 TadsQuery 时出现 5400 AE_INTERNAL_ERROR。当我将相同的 SQL 直接放在 TadsQuery 中时,没有错误。您的帮助文件指示我联系 Adva
关闭。这个问题是opinion-based .它目前不接受答案。 想改进这个问题?更新问题,以便 editing this post 可以用事实和引用来回答它. 8年前关闭。 Improve this
关闭。这个问题是opinion-based .它目前不接受答案。 想要改进这个问题? 更新问题,以便 editing this post 可以用事实和引用来回答它. 关闭 9 年前。 Improv
我想定义一个函数,当给定一个整数时,它将返回一个字符串。像这样: # Pseudocode function get_string(i) return my_string_array[i] end
我曾尝试在 Linux 和 Windows 上使用 DBD::Advantage,但没有成功。 Windows 版本附带了一个看似完整的安装程序,但它留下了 DBD-Advantage-8.10.ta
为什么说 NoSQL 在结构上比某些 SQL 数据库更快?假设我在某个 SQL 表的列上添加了一些索引。有人可以提供某种更快的查询吗? 我正在阅读有关 redis 的内容。 class User <
我的问题很简单:如果接口(interface)由单个类实现,那么使用接口(interface)有什么好处吗? 我一直认为只有当该接口(interface)有多个实现时,接口(interface)才是好
考虑这些(或多或少)等价的类型签名: f1 :: [a] -> Int -> a f2 :: Integral b => [a] -> b -> a f2 比 f1 更通用,这是一个很大的优势,但是
我们在 Scala 中部分应用了函数- def sum(a:Int,b:Int,c:Int) = a+b+c val partial1 = sum(1,_:Int,8) 我想知道使用部分应用函数的优点
你看下面的代码,我是如何使用 session 变量的;所以这三个问题是: 它们存放在哪里? (服务器或客户端) 它们对于每个网页访问者来说都是独一无二的吗? 我可以在完成工作后使用 ajax 或简单的
我知道这是一个常见问题,互联网上有关于此主题的资源,但我想从这个社区了解每个人在部署博客时对子域与子文件夹的想法(SEO 优势)。 谢谢。 最佳答案 我研究过一次,根据社区反馈以及权衡利弊,我会说去一
我是一名优秀的程序员,十分优秀!