| 暫存器 | 慣用用途 |
|---|---|
| EAX | 累加器、函數返回值 |
| EBX | 基址暫存器 |
| ECX | 計數器 (迴圈、字串操作) |
| EDX | 資料暫存器、I/O、乘除法擴展 |
| ESP | 堆疊指標 (Stack Pointer) |
| EBP | 幀指標 (Base Pointer) |
| ESI | 來源變址 (字串/陣列操作) |
| EDI | 目的變址 |
段暫存器:CS (代碼)、DS (資料)、SS (堆疊)、ES/FS/GS (附加資料)。
標誌暫存器 EFLAGS:條件碼、控制位。
AT&T 語法:`%eax` 表示暫存器,`$10` 表示立即數,`0x100` 表示絕對位址。
組合語言變數三要素:標號 (位址)、資料類型 (大小)、預設值。
myvalue:
.long 190 # 4 字節有號整數,初值 190
mess:
.ascii "hello" # 5 字節字串 (無結束符)
對應 C 代碼:
long myvalue = 190;
char mess[] = "hello"; // 含 \0 則用 .string 或 .asciz
.LC0:
.string "hello,world" # 唯讀資料區
.text
.globl main
.type main, @function
main:
leal 4(%esp), %ecx
andl $-16, %esp
pushl -4(%ecx)
pushl %ebp
movl %esp, %ebp
pushl %ecx
subl $4, %esp
movl $.LC0, (%esp) # 參數壓棧
call puts # 呼叫 C 庫函數
movl $0, %eax # 返回 0
addl $4, %esp
popl %ecx
popl %ebp
leal -4(%ecx), %esp
ret
leal 4(%esp), %ecx:計算 `argv` 位址 (`argc` 之後)andl $-16, %esp:堆疊 16 字節對齊pushl -4(%ecx):保存 `argc`pushl %ebp / movl %esp, %ebp:建立堆疊幀pushl %ecx:保存 `argv` 位址subl $4, %esp:分配區域空間 (對齊填充)movl $.LC0, (%esp):將字串位址放入參數位置call puts:呼叫輸出函數 (破壞暫存器,故前序保存)-O0 (預設) 保留幀指標,便於除錯。-O2 可能省略 `%ebp` (幀指標省略優化),改用 `%esp` 相對位址存取區域變數。