乘以 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 位暫存器(不是 esp
或 rsp
)乘以 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]
對於所有可能的被乘數,除了 ebp
或 rbp
之外,得到的指令長度與使用 imul
相同。
優點
- 執行得更快
缺點
- 如果你的被乘數是
ebp
或rbp
,那麼使用imul
需要多一個位元組 - 如果你的彙編程式不支援快捷方式,則輸入更多內容
- 對不熟悉該技術的讀者不透明