常用指令參考一覽
包含了一些nasm常用指令
; dst srcmov rax, 1 ; 註解nasm採用的是intel風格,先寫目標再寫來源,這行的意思是把立即數1放入暫存器rax
; 分號後面都是單行註解
空格與tab沒有硬性規定,但可以參考Coding Style
mov用於將一個任意值移動到目標,目標只能是暫存器或記憶體地址
xor rax, rax將兩數進行xor運算,並保存到目標
這是將暫存器內容清零的最佳作法,當兩數相同的xor結果會是0
syscall
Section titled “syscall”系統呼叫,呼叫作業系統寫好的函數,有些動作需要仰賴系統核心來完成,讓使用者程式無需直接操作底層硬體來實現,維護安全和穩定性
像是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