美文网首页
11-07除法

11-07除法

作者: 五行猫 | 来源:发表于2017-11-08 00:33 被阅读0次

代码分析:分段,以块为单位看代码,逐个击破

流水线优化:在不影响结果的前提下,排列指令顺序,提高并行程度


除法

变化一

     如果除数是变量,只能使用除法指令,有符号是idiv,无符号是div

这是经过数学论证的,当除数位置是没有优化的余地的

变化二

     除数不是变量,且除数是2的幂

1.在无符号的情况下,采取向下取整的除法,,一般直接使用右移指令


图片.png

2.有符号的情况下,需要经过数学推导:

IMG_2861.JPG

数学除法会产生小数,C语言计算产生的误差只要在0- |1/b| 之间的范围,可以利用这个推导来忽略误差

IMG_2862.JPG

由以上推导,处理有符号数的时候,例如

图片.png

编译器的优化过程以推导7作为基础

IMG_2863.JPG

可是,如何将 n > 0 和 n < 0 这两个分支优化,编译器采取的思路是利用cdq配合and指令

cdq                         ;符号拓展,将eax的符号拓展到edx,edx要么位0xffffffff要么为0
and         edx,7           ;利用与运算,若n > 0 ,edx = 0,   n < 0, edx = 7
add         eax,edx
sar         eax,3

定式:

cdq
and edx, immA
add eax, edx
sar eax, immB

验证:

(2^immB) -1 = immA
若不相等,则可能是作者内联汇编挖的坑,因为c语言语法是不会产生cdq指令的

还原:

eax / (2^immB)

     除数不是变量,且除数不是2的幂

Debug:不做有优化
Release:

推导:

IMG_2864.JPG

m = 2^n / c
n由编译器决定,一般16位环境从16开始,32位环境从32开始,以此类推。
所以2^n为常量
c为常量
n的取值由c决定,需要满足误差小于1/c
所以m为常量,又称为MagicNumber,这个值由编译器编译时产生

又因为 a*m = edx. eax
有可能直接使用edx,那么这就是结果 >>32 位
所以最后的结果需要以edx做移位,
所以edx的移位位数需要加上32

定式

mov eax, MagicNumber
imul ....
sar edx, ...
mov reg, edx
shr reg, 1fh
add edx, reg

还原

o = 2^n / c
n从右移的次数得到,MagicNumber作为c,代入公式求解到除数近似值,还原除法原型

相关文章

  • 11-07除法

    代码分析:分段,以块为单位看代码,逐个击破 流水线优化:在不影响结果的前提下,排列指令顺序,提高并行程度 除法 变...

  • 「苏楠楠万词课」学习笔记11-07

    「苏楠楠万词课」学习笔记11-07 ~ It is the fresh fruit that tempts me ...

  • 11-07

    1.整理要带到公司的东西 √ 2.发布公众号文章 √ 3.审核视频 √ 4.改稿子 √

  • Python学习笔记(二)几种除法的比较

    传统除法(' /')、真除法、floor除法(' // ') ·传统除法和真除法:在Python2.7之前,对整数...

  • python tricks

    除法 精确除法

  • 2021.10.28

    02:16-02:35 07:11-07:25 10:39-10:48 15:06-15:16 17:21-17:...

  • Python里的除法

    python里有三种除法: 传统除法如果是整数除法,执行地板除。如果是浮点数除法,则执行精确除法。 地板除用 //...

  • 11-07,想

    越发觉得自己不成熟,想到什么就是社么,却忘了有时候现实是如此残酷。我们总是过于欢喜于自己当时所想的某些,比如我这两...

  • 11-07 梦

    梦是私人化的体验,是一些逻辑混乱的片段。这会是一篇意识流短文,也许零碎但是,回忆起来都很美。 1.我快跑几步,奋力...

  • 算法-辗转相除法

    算法:辗转相除法(欧几里得算法) GCD递归定理 辗转相除法算法概述 辗转相除法伪代码 辗转相除法代码实现 对于两...

网友评论

      本文标题:11-07除法

      本文链接:https://www.haomeiwen.com/subject/tmpsmxtx.html