Assembly-x86

2024-04-25

組合語言

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

image
image

Stack相關指令

指令 意思 範例 範例意思
push 放進stack push rax rax放到stack頂部,rax資料不清除
pop 拿出stack pop rbx 取stack頂部資料放入rbx

簡單x86指令

mov <Destination>,<Source>

  • 移動
    1
    2
    3
    mov 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
2
3
4
5
(rcx=0x0102030405060708)
mov byte [rcx],0x61 (rcx=0x0102030405060761)
mov word [rcx],0x61 (rcx=0x0102030405060061)
mov dword [rcx],0x61 (rcx=0x0102030400000061)
mov qword [rcx],0x61 (rcx=0x0000000000000061)

分支

使用比較以及跳轉實現 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 跳轉

image
image

image
image

呼叫

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

image
image