1.Intel指令
| 指令 |
描述 |
例子 |
解释 |
| mov |
传送数据 |
mov rax,18 |
将18的值传送进rax寄存器(rax = 18) |
| add |
加法运算 |
add rax,rbx |
rax与rbx的值相加,并存储在rax(rax = rax + rbx) |
| sub |
减法运算 |
sub rax,9 |
rax减9,将结果存储在rax(rax = rax - 9) |
| xor |
异或运算 |
xor rax,rax |
将rax与rax进行异或处理,等价于:(rax = 0) |
| call |
调用函数 |
|
|
| lea |
取地址,现在一般用于运算 |
lea rax,[rbp - 18] |
将rbp-18的结果传送到rax(rax = rbp - 18) |
| cmp |
判断指令,实际作用是做减法运算,通常搭配J开头的命令进行使用 |
cmp rax,0x61 |
进行rax - 0x61运算,此命令不会将运算的结果值存储(rax - 0x61) |
| movzx |
传送数据 |
movzx rax,BYTE ptr [rbp-0x10] |
相当于将rbp-0x10地址的值,取8位数字传送至rax处BYTE:8位WORD:16位DWORD:32位QWORD:64位 |
| push |
压栈 |
push ebp |
等同于:mov esp,esp - 4mov [esp],ebp[]的作用是取寄存器里的地址指向的值没有[]的作用是取寄存器的地址 |
| pop |
弹栈 |
pop ebp |
等同于mov ebp,[esp]mov esp,esp+4 |
| leave |
返回上级函数时,恢复原本栈空间 |
leave |
mov esp,ebppop ebp |
| ret |
返回上级函数后,执行上级函数的指令 |
ret |
等同于pop eip(这条指令实际是不存在的,不能直接向RIP寄存器传送数据) |
| call |
调用指定函数,注意,调用函数时,push eip的值实际上eip下一条指令的地址值 |
call dofunc |
等同于push eipjmp dofunc |
| nop |
无操作,仅使ip指令+1,对应的指令是:\x90 |
|
|
| test |
测试指定寄存器中的值与另一个值(常数或寄存器)的按位与操作结果,而不改变寄存器的值。如果结果为零,将设置零标志位ZF。 |
test rax,rax |
|
| 指令 |
描述 |
标记位 |
| JE,JZ |
结果为0则跳转(相等时跳转) |
ZF=1 |
| JNE,JNZ |
结果不为0则跳转(不相等时则跳转) |
ZF=0 |
| JS |
结果为负跳转 |
SF=1 |
| JNS |
结果为非负跳转 |
SF=0 |
| JP,JPE |
结果中1的个数为偶数则跳转 |
PF=1 |
| JNP,JPO |
结果中1的个数为奇数则跳转 |
PF=0 |
| JO |
结果溢出了则跳转 |
OF=1 |
| JNO |
结果没有溢出则跳转 |
OF=0 |
| JB,JNAE |
小于则跳转(无符号数) |
CF=1 |
| JNB,JAE |
大于等于则跳转(无符号数) |
CF=0 |
| JBE,JNA |
小于等于则跳转(无符号数) |
CF=1 or ZF=1 |
| JNBE,JA |
大于则跳转(无符号数) |
CF=0 and ZF=0 |
| JL,JNGE |
小于则跳转(有符号数) |
SF≠OF |
| JNL,JGE |
大于等于则跳转(有符号数) |
SF=OF |
| JLE,JNG |
小于等于则跳转(有符号数) |
ZF=1 or SF≠OF |
| JNLE,JG |
大于则跳转(有符号数) |
ZF=0 and SF=OF |
2.mips指令
寄存器的作用
$0:$zero 常量0(constant value 0)
$1:$at 保留给汇编器(Reserved for assembler)
$2-$3:$v0-$v1 函数调用返回值(values for results and expression evaluation)
$4-$7:$a0-$a3 函数调用参数(arguments)
$8-$15:$t0-$t7 暂时的(或随便用的)
$16-$23:$s0-$s7 保存的(或如果用,需要SAVE/RESTORE的)(saved)
$24-$25:$t8-$t9 暂时的(或随便用的)
$28:$gp 全局指针(Global Pointer)
$29:$sp 堆栈指针(Stack Pointer)
$30:$fp/$s8 栈帧指针(Frame Pointer)
$31:$ra 返回地址(return address)
| 指令 |
描述 |
例子 |
解释 |
| j |
跳转至标签处,相当于jmp指令 |
|
|
| jr |
跳转至寄存器里的地址指向的值,通常函数的返回处使用的指令为jr指令 |
jr $ra |
将pc指令指向$ra寄存器里的值 |
| jal |
跳转指令,返回地址存储在$ra寄存器中,一般用于函数调用 |
|
jmp 目标地址mov fp,sp |
| jalr |
与jal指令类似,只不过jal的对象为寄存器 |
|
|
| la |
相当于x86的lea |
|
|
| sw |
|
sw $ra, 0x5c($sp) |
把$ra的内容写入到[$sp+0x5c]中 |
后续有待补充... ...