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]中 |
后续有待补充... ...