assembly - 编译器生成的程序集中的除法运算
问题描述
我只是在了解代码的实际工作方式。我是汇编初学者,C语言平庸,仅此而已。我读到存在加法,减法,乘法和除法的指令。我很好奇,做了一些简单的算术 C 并转换为汇编。结果让我大吃一惊。
加减法直接转换。但是对于乘法,只要乘数是 2 的幂,它就会移动到左“幂”次。例如x*4
-> sal x, 2
(可以理解为换档更快)。在其他情况下,对于 x*y,它只是有效地添加了 x y 次!
令人困惑的一点(这篇文章的原因)是除法。我在 C 中做过,val/5
(val=45)。编译器将其转换为
mov ecx, DWORD PTR v[rip]
mov edx, 1717986919
mov eax, ecx
imul edx
sar edx
mov eax, ecx
sar eax, 31
sub edx, eax
mov eax, edx
我耐心地手动完成了它,是的,它会在 eax 上产生 9 作为结果。(我假设sar edx
为sar edx, 1
)。但它在做什么?它是如何获得 1717986919 的?当两个值都未知时,编译器必须并以正常方式进行。但是这是一种什么样的优化呢?(我的编译器是gcc-7.5.0)
解决方案
推荐阅读
- mysql - macOS 上的 mysql 设置
- twitter-bootstrap - 在 scala-js 应用程序中使用 bootstraptoggle 的 onclick 事件
- c# - 将列表中的某些元素求和,该列表由 C# 中的字符串组成
- javascript - 在 React Konva 中使用 globalCompositeOperation 来掩盖形状组
- asynchronous - ASP.NET Core,过度杀伤 Task.Run()?
- node.js - 节点 child_process execSync 与 xclip 一起挂起
- r - R 3.5 包“lattice”由具有不同内部结构的 R 版本安装
- angular - 在 DataTable Angular 中排序格式化日期
- ms-access - 搜索访问多值字段
- git - git:cherry-pick 兄弟提交列表