首页
社区
课程
招聘
[原创]【老刘谈算法004】拿目标地址传送指令进行快速运算的骚操作——字符串转双字函数分析(1)
发表于: 2019-3-4 13:01 4979

[原创]【老刘谈算法004】拿目标地址传送指令进行快速运算的骚操作——字符串转双字函数分析(1)

2019-3-4 13:01
4979

在编写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编辑 ,原因:
收藏
免费 4
支持
分享
最新回复 (2)
雪    币: 123
活跃值: (1675)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
2019-3-5 10:38
0
雪    币: 42
活跃值: (5259)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
wsc
3
666
2019-3-6 10:06
0
游客
登录 | 注册 方可回帖
返回
//