首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 組合語言

計算機系統原理:算術邏輯指令 leal/addl/sall/andl/imull 實戰解析

     編輯:組合語言

指令分類表

算術邏輯指令表

leal 神奇用法:位址計算而非存取

  • movl 4(%edx,%edx,4), %eax:存取記憶體位址 5x+4 取值
  • leal 4(%edx,%edx,4), %eax:計算有效位址 5x+4 存入 %eax,不存取記憶體

相當於 C 語言 &i 取址操作。可用於算術運算優化 (如 leal (%eax,%eax,2), %edx 實現 3*%eax)。

movl vs leal leal 計算位址

完整 C 轉組語範例分析

int arith(int x, int y, int z) {
    int t1 = x + y;
    int t2 = z * 48;
    int t3 = t1 & 0xFFFF;
    int t4 = t2 * t3;
    return t4;
}

編譯輸出組語 (GCC -O1 -S)

arith:
    pushl %ebp
    movl %esp, %ebp
    movl 16(%ebp), %eax       # z → %eax
    leal (%eax,%eax,2), %edx  # %edx = 3*z
    sall $4, %edx             # %edx = 48*z (左移4位=乘16)
    movl 12(%ebp), %eax       # y → %eax
    addl 8(%ebp), %eax        # %eax = x + y (t1)
    andl $65535, %eax         # %eax = t1 & 0xFFFF (t3)
    imull %edx, %eax          # %eax = t2 * t3 (t4)
    popl %ebp
    ret

逐指令圖解執行流程

  1. 建立堆疊幀,參數 x/y/z 在 8/12/16(%ebp)
  2. movl 16(%ebp), %eax 取 z
  3. leal (%eax,%eax,2), %edx 計算 3z (優化乘法)
  4. sall $4, %edx 左移 4 位 → 48z (t2)
  5. movl 12(%ebp), %eax 取 y
  6. addl 8(%ebp), %eax 計算 x+y (t1)
  7. andl $65535, %eax 取低 16 位 (t3)
  8. imull %edx, %eax 計算 t2*t3 (t4) 回傳

堆疊幀初始 取z leal 3z sall 48z 取y add x+y and 0xFFFF imull t4

關鍵洞見

  • 編譯器重新排序運算 (先算 t2 再算 t1)
  • leal 用於乘法優化 (移位+加法)
  • sall 左移實現乘 2 的冪次
  • 指令順序不一定對應源碼順序
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved