跳转到内容

常用指令参考一览

概述

包含了一些nasm常用指令

语法规范

; dst src
mov 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 \

可参考资料

  1. 相当齐全的简述表格
  2. Intel x86_64指令集文档