常见汇编指令

  • 指令基本格式
    • 操作码 操作数1 (操作数2 ……)
    • 对于双操作数指令,一般来说第一个是目标操作数
  • 简单指令示例
指令类型 指令操作码 指令示例 作用或对应的高级语言写法
数据传送指令 mov mov rax, rbx mov qword ptr [rdi], rax rax = rbx *(rdi) = rax
取地址指令 lea lea rax, [rsi] rax = & *(rsi)
算术运算指令 add add rax, rbx add qword ptr[rdi], rax rax += rbx *(rdi) += rax
sub sub rax, rbx rax -= rbx
逻辑运算指令 and and rax, rbx rax &= rbx
xor xor rax, rbx rax ^= rbx
函数调用指令 call call 0x401000 执行0x40100地址的函数
函数返回指令 ret ret 函数返回
比较指令 cmp cmp rax, rbx 根据rax与rbx比较的结果改变flags
无条件跳转指令 jmp jmp 0x401000 跳到0x401000地址执行
栈操作指令 push push rax 将rax的值压入栈中
pop pop rax 从栈上弹出一个元素放入rax

流程控制

  • 无条件跳转 jmp

  • 有条件跳转

    • 通过cmp,test等指令改变flags的值,根据flags的情况进行跳转
指令 全称 cmp a, b条件 Flags条件
jz/je Jump if Zero/Equal a = b ZF = 1
jnz/jne Jump if not Zero/Equal a != b ZF = 0
jb/jnae/jc Jump if below/not above or equal/carry a < b,无符号数 CF = 1
ja/jnbe Jump if above/not below or equal a > b,无符号数
Jna****/****jbe Jump if not above/below or equal a <= b,无符号数
Jnc/jnb/jae Jump if not carry/not below/above or equal a >= b,无符号数 CF = 0
jg/jnle jump if greater/not less or equal a> b,有符号数
jge/jnl jump if greater or equal/not less a >= b,有符号数
jl/jnge jump if less/not greater or equal a < b,有符号数
jle/jng jump if less or equal/not greater a <= b,有符号数
jo jump if overflow OF = 1
js jump if signed SF = 1
  • 函数调用与返回 call ret
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容