跳转到内容

常用指令参考一览

包含了一些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指令文档