組合語言
Author:堇姬
電腦底層架構
與程式執行相關硬體
- CPU
實際運算硬體,配有暫存器,儲存運算資料
- RAM
記憶體
指令集架構
先設計好指令集架構再設計電路。
常見:
- x86/x86-64
- ARM
- MIPS
大部分用的是intel x86/x86-64架構
CPU暫存器
隨設計而改變用途
| 名稱 | 意思 |
|---|---|
| rax | accumulator |
| rbx | base |
| rcx | count |
| rdx | data |
固定用途
| 名稱 | 意思 |
|---|---|
| rsi | source index |
| rdi | destination index |
| rbp | base pointer(控制stack) |
| rsp | stack pointer(控制stack) |
| rip | instruction pointer(執行到甚麼位置) |
- 同個暫存器可以用不同名稱來存取不同大小資料(RAX/EAX/AX/AH/AL是同個暫存器,只是大小不同)
ex:
RAX= 0x0102030405060708
EAX= 0x05060708
AH = 0x0506
AL = 0x0708

Stack相關指令
| 指令 | 意思 | 範例 | 範例意思 |
|---|---|---|---|
| push | 放進stack | push rax | rax放到stack頂部,rax資料不清除 |
| pop | 拿出stack | pop rbx | 取stack頂部資料放入rbx |
簡單x86指令
mov <Destination>,<Source>
- 移動
1
2
3mov rax,rbx (rax=rbx)
mov rax,[rbp-0x4] (rax=*(rbx-0x4))
mov [rax],rbx (*rax=rbx)
運算式指令
- 指令 <Destination>,<source>
| 指令 | 意思 |
|---|---|
| add | 加 |
| sub | 減 |
| imul | 乘 |
| idiv | 除 |
| and | 且 |
| or | 或 |
| xor | 異或 |
- 指令 <Destination>
| 指令 | 意思 |
|---|---|
| inc | +1 |
| dec | -1 |
| neg | |
| not |
指定大小
可以在[]前面加上大小來決定取值大小
- byte 1byte
- word 2bytes
- dword 4bytes
- qword 8bytes
1 | (rcx=0x0102030405060708) |
分支
使用比較以及跳轉實現 if / for /while
- 比較
| 指令 | 意思 |
|---|---|
| cmp A,B | 比較A B |
- 跳轉<指令 ADDRESS>
| 指令 | 意思 |
|---|---|
| je | jump equal |
| jne | jump not equal |
| ja | jump above |
| jb | jump below |
| jna | jump not above |
| jbe | jump below equal |
| jz | jump zero |
| jmp | 跳轉 |


呼叫
- call ADDRESS
- 參數(call前面)
64bits:rdi,rsi,rdx,rcx,r8,r9,stack
32bits:stack - 回傳值:rax
rdi -> rsi -> rdx -> rcx -> r8 -> r9 -> rsp -> rsp+8
