常用指令参考一览
概述
包含了一些nasm常用指令
语法规范
; dst srcmov rax, 1 ; 注释
nasm采用的是intel风格,先写目标再写来源,这行的意思是把立即数1放入寄存器rax
; 分号后面都是单行注释
空格与tab没有强制规定,但可以参考Coding Style
mov
mov用于将一个任意值移动到目标,目标只能是寄存器或内存地址
xor
xor rax, rax
将两数进行xor运算,并保存到目标
这是将寄存器内容清零的最佳作法,当两数相同的xor结果会是0
syscall
系统呼叫,呼叫操作系统写好的函数,有些动作需要仰赖内核来完成,让使用者程序无需直接操作底层硬件来实现,维护安全和稳定性
像是mmap分配一块内存空间、(0) sys_read读取、(1) sys_write写入、(60) sys_exit结束等
进行系统呼叫除了将参数放到对应位置,还要将rax设为函数对应的编号,请参考linux系统呼叫表
※ 照顺序阅读请前往下一篇,后续常用指令稍后用到再回来阅读
Jcc
- 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: 循环右移
lea
取得内存地址,跟mov相似但只取地址而不碰值
movzx
将目标以零填充到与来源相同长度,再做mov操作
rep相关
STOSB/STOSW/STOSD/STOSQ — Store String
将al/ax/eax/rax的值存入至rdi的地址,递增rdi
rep搭配rcx重复次数
LODSB/LODSW/LODSD/LODSQ — Load String
从rsi读取至al/ax/eax/rax,递增rsi
rep搭配rcx重复次数
MOVSB/MOVSW/MOVSD/MOVSQ — Move Data From String to String
将内容从rsi搬动至rdi,递增rsi和rdi \