乘以 3 或 5

背景

要获得寄存器和常量的乘积并将其存储在另一个寄存器中,天真的方法是这样做:

    imul ecx, 3      ; Set ecx to 5 times its previous value
    imul edx, eax, 5 ; Store 5 times the contend of eax in edx

使用 lea

乘法是昂贵的操作。使用移位和添加组合更快。对于将 32 或 64 位寄存器(不是 esprsp)乘以 3 或 5 的特定情况,可以使用 lea 指令。这使用地址计算电路快速计算产品。

    lea ecx, [2*ecx+ecx] ; Load 2*ecx+ecx = 3*ecx into ecx
    lea edx, [4*edx+edx] ; Load 4*edx+edx = 5*edx into edx

许多装配工也会理解

    lea ecx, [3*ecx]
    lea edx, [5*edx]

对于所有可能的被乘数,除了 ebprbp 之外,得到的指令长度与使用 imul 相同。

优点

  • 执行得更快

缺点

  • 如果你的被乘数是 ebprbp,那么使用 imul 需要多一个字节
  • 如果你的汇编程序不支持快捷方式,则输入更多内容
  • 对不熟悉该技术的读者不透明