-
-
[原创]【老刘谈算法004】拿目标地址传送指令进行快速运算的骚操作——字符串转双字函数分析(1)
-
发表于:
2019-3-4 13:01
4979
-
[原创]【老刘谈算法004】拿目标地址传送指令进行快速运算的骚操作——字符串转双字函数分析(1)
在编写x86汇编时,你是否有这样的苦恼?
其实,借助x86灵活的内存定位方式,以及一个被“屈才”了的汇编指令,这些操作可以在一条汇编指令中实现。
在8086汇编中,汇编指令支持简单的“地址定位公式”:
在x86中,地址定位支持了简单的乘法,寄存器的限制也变得宽松:
x86的灵活度大大提升,便利了内存的存取,也给了我们可乘之机。
说来有趣,绝大部分文档对LEA指令作用的说明中,只是将其称作有效地址传送指令,而笔者认为更贴切的说明应是“简单加乘运算指令”。
虽然在指令的实际执行中,LEA大部分情况还是被用来获得局部变量、数组元素等的地址,但cpu并不会检测所得“地址”是否可用,所以即使得到的是无效地址,指令也可以正常执行。
LEA指令在CPU内部执行的操作,便是把地址定位公式计算出来,放到目标寄存器中,由于无效地址也不影响执行,LEA便可以计算满足地址定位公式的表达式。
让我们解决刚开始提出的问题:
A.将一个寄存器(如ecx)的值放到其它寄存器(如edx)中并加一个数。
正常实现:
LEA实现:
B:进行简单的加乘运算。
1)eax*=3
正常实现:
Lea实现:
2)edx+=eax*8
正常实现:
Lea实现:
可见,进行简单加乘运算时,用Lea更明了,简洁,效率也高些。
笔者才疏学浅,若有错误疏漏,希望各路大神不吝赐教。
实例代码(出自MASM32Lib):
Mov Edx,Ecx
Add Ecx,idata
Lea Ecx,[Edx+idata]
Push Eax
Add Eax,Eax
Add Eax,[Esp]
Add Esp,4
Lea Eax,[Eax*2+Eax]
Push Eax
Push Edx
Mov Edx,8
Mul Edx
Pop Edx
Add Edx,Eax
Pop Eax
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)
最后于 2019-3-4 13:24
被老刘NoOne编辑
,原因: