乘以 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 需要多一個位元組
  • 如果你的彙編程式不支援快捷方式,則輸入更多內容
  • 對不熟悉該技術的讀者不透明