博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
汇编除法转换
阅读量:2234 次
发布时间:2019-05-09

本文共 574 字,大约阅读时间需要 1 分钟。

今天写了个小程序,用 IDA 反汇编过来看了一下,如下一条语句:
num/= 5;
却被转化成了这种形式:
mov     ecx, eax   ;num
mov     eax, 66666667h
imul    ecx
sar     edx, 1

mov     eax, edx

最终 eax 就是 num 的值,为什么会是这种形式呢?查了一下资料:原来除法运算比较花时间,所以除法会转换成等效的乘法或移位操作。对于上述代码来说:

num/5 = num*(1/5)= (num*(2/5))/2

把 eax = 66666667h 看成小数部分,即 6/15 = 2/5,这样就对应起来了。很巧妙啊!

============================================================================

例子:

; 26   :     digit = n % 10;	mov	eax, 1717986919				; 66666667H	imul	esi	sar	edx, 2	mov	eax, edx	shr	eax, 31					; 0000001fH	add	eax, edx	mov	edx, esi	lea	ecx, DWORD PTR [eax+eax*4]	add	ecx, ecx	sub	edx, ecx

转载地址:http://kanbb.baihongyu.com/

你可能感兴趣的文章
【操作系统】大小端问题
查看>>
Git上传代码时碰到的问题及解决方法
查看>>
【Linux】vim的简单配置
查看>>
【C++】智能指针
查看>>
【C++】const修饰的成员函数
查看>>
【C++】面向对象的三大特性
查看>>
【C++】智能指针(后续)
查看>>
【C】堆区和栈区的区别
查看>>
【linux】send和recv函数解析
查看>>
【Linux】线程安全的单例模式以及计算密集型线程和IO密集型线程
查看>>
一次完整的HTTP请求是怎样的??
查看>>
【C++】常见的内存泄漏及解决方法
查看>>
【C++】const 指针与指向const的指针
查看>>
【Linux】多线程和多进程 及其应用场景
查看>>
【C++】构造函数中必须通过初始化列表来进行初始化情况
查看>>
【算法】对于大数的操作
查看>>
【操作系统】系统调用的概念
查看>>
【计算机网络】cookie和session的区别
查看>>
【C++】构造函数、析构函数抛出异常的问题
查看>>
【C++】关于vector<bool>
查看>>