欢迎来到 嗅灵易学

零基础也能上手的脚本技术课,一对一答疑带你入门

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

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

快速运算与x86内存定位公式

在编写x86汇编时,你是否有这样的苦恼?

  • 做简单的乘法运算,都需要写很多行,还要将寄存器中的数据导来导去。
  • 将寄存器放到其它寄存器中并加减一个数,都要写mov,add两条指令。

其实,借助x86灵活的内存定位方式,以及一个被“屈才”了的汇编指令,这些操作可以在一条汇编指令中实现

地址定位公式

在8086汇编中,汇编指令支持简单的“地址定位公式”:

  1. [bx]
  2. [bx+立即数]
  3. [si/di+bx+立即数]
  4. ...

在x86中,地址定位支持了简单的乘法,寄存器的限制也变得宽松:

  1. [立即数]
  2. [寄存器] (可以是8个(32位)通用寄存器中的任意一个)
  3. [寄存器+立即数]
  4. [寄存器1*{2,4,6,8}+寄存器2]
  5. [寄存器1*{2,4,6,8}+寄存器2+立即数]

x86的灵活度大大提升,便利了内存的存取,也给了我们可乘之机。

LEA指令

说来有趣,绝大部分文档对LEA指令作用的说明中,只是将其称作有效地址传送指令,而笔者认为更贴切的说明应是“简单加乘运算指令”。
虽然在指令的实际执行中,LEA大部分情况还是被用来获得局部变量、数组元素等的地址,但cpu并不会检测所得“地址”是否可用,所以即使得到的是无效地址,指令也可以正常执行。
LEA指令在CPU内部执行的操作,便是把地址定位公式计算出来,放到目标寄存器中,由于无效地址也不影响执行,LEA便可以计算满足地址定位公式的表达式

注意:上传附件及图片大小不得大于30M。

⚠️ 版权声明:
本博客所有内容(含教程、源码、工具)仅供个人技术学习与研究交流使用,严禁商用、倒卖、二次分发及非法用途
未经作者书面授权,任何组织或个人不得转载、复制或用于其他平台,违者将追究相关责任。

0 0 0 举报
复制成功