常用指令参考一览
包含了一些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