跳到內容

常用指令參考一覽

包含了一些nasm常用指令

; dst src
mov rax, 1 ; 註解

nasm採用的是intel風格,先寫目標再寫來源,這行的意思是把立即數1放入暫存器rax
; 分號後面都是單行註解
空格與tab沒有硬性規定,但可以參考Coding Style

mov用於將一個任意值移動到目標,目標只能是暫存器或記憶體地址

xor rax, rax

將兩數進行xor運算,並保存到目標
這是將暫存器內容清零的最佳作法,當兩數相同的xor結果會是0

系統呼叫,呼叫作業系統寫好的函數,有些動作需要仰賴系統核心來完成,讓使用者程式無需直接操作底層硬體來實現,維護安全和穩定性
像是mmap分配一塊記憶體空間、(0) sys_read讀取、(1) sys_write寫入、(60) sys_exit結束等
進行系統呼叫除了將參數放到對應位置,還要將rax設為函數對應的編號,請參考linux系統呼叫表

※ 照順序閱讀請前往下一篇,後續常用指令稍後用到再回來閱讀

  • jmp: 直接跳躍
  • je/jz: 等於 & ZF旗標
  • jne/jnz: 不等於 & 無ZF旗標
  • jge: 大於等於
  • jg: 大於
  • jle: 小於等於
  • jl: 小於
  • ja: 高於
  • jb: 低於
  • add: 加法
  • sub: 減法
  • inc: 遞增1
  • dec: 遞減1
  • mul: 乘法,rax * 暫存器 = rdx:rax
  • div: 除法,rdx:rax / 暫存器 = 商rax 餘數rdx
  • shl: 左移
  • shr: 右移
  • sal: 有符號左移
  • sar: 有符號右移
  • rol: 循環左移
  • ror: 循環右移

取得記憶體位址,跟mov相似但只取地址而不碰值

將目標以零填充到與目標相同長度,再做mov操作

LODSB/LODSW/LODSD/LODSQ - 從記憶體讀取內容

Section titled “LODSB/LODSW/LODSD/LODSQ - 從記憶體讀取內容”

從rsi讀取至al/ax/eax/rax,遞增rsi
rep搭配rcx重複次數

STOSB/STOSW/STOSD/STOSQ - 寫入內容到記憶體

Section titled “STOSB/STOSW/STOSD/STOSQ - 寫入內容到記憶體”

將al/ax/eax/rax的值存入至rdi的位址,遞增rdi
rep搭配rcx重複次數

MOVSB/MOVSW/MOVSD/MOVSQ - 搬動暫存器內容

Section titled “MOVSB/MOVSW/MOVSD/MOVSQ - 搬動暫存器內容”

將內容從rsi搬動至rdi,遞增rsi和rdi

SCASB/SCASW/SCASD/SCASQ - 記憶體內容與暫存器比對

Section titled “SCASB/SCASW/SCASD/SCASQ - 記憶體內容與暫存器比對”

將rdi指向地址與al/ax/eax/rax做cmp,遞增rdi

CMPSB/CMPSW/CMPSD/CMPSQ - 記憶體內容與記憶體內容比對

Section titled “CMPSB/CMPSW/CMPSD/CMPSQ - 記憶體內容與記憶體內容比對”

將rdi指向的地址與rsi指向的地址做cmp,遞增rdi和rsi

  1. 相當齊全的簡述表格
  2. Intel x86_64指令集文檔
  3. Nasm指令文檔