- 指令基本格式
- 操作码 操作数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
网友评论