首页 > 解决方案 > 编译器生成的程序集中的除法运算

问题描述

我只是在了解代码的实际工作方式。我是汇编初学者,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 edxsar edx, 1)。但它在做什么?它是如何获得 1717986919 的?当两个值都未知时,编译器必须并以正常方式进行。但是这是一种什么样的优化呢?(我的编译器是gcc-7.5.0)

标签: assemblygccx86compiler-optimization

解决方案


推荐阅读