mips寄存器、指令、寄存器和函数调用
本文是为分析0ctf2016 trace所写,下文相关知识点如果有遗漏请见凉
寄存器
https://blog.csdn.net/gujing001/article/details/8476685
REGISTER | NAME | USAGE |
---|---|---|
$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 | 帧指针(Frame Pointer) |
$31 | $ra | 返回地址(return address) |
指令
指令 | 用法 | 功能 |
---|---|---|
addiu | addiu $1,$2,n | $1=$2+n |
sw | sw $1,n($2) | memory[n+$2]=$1 |
addiu | addiu $1,$2,n | $1=$2+n |
lui | lui $1,n | $1=65536*$1 |
lw | lw $1,n($2) | $1=memory[n+$2] |
bnez | bnez R1,addr | 不等于0则跳转到addr |
jal | jal addr | 类似与call |
j | j addr | 直接跳转指令,跳转的地址在指令中 |
函数调用
http://vcamx.me/2013/05/15/subroutines-functions-in-MIPS/
- 调用者将参数保存在寄存器 $a0 - $a3 中。其总共能保存4个参数。如果有更多的参数,或者有传值的结构,其将被保存在栈中。
- 调用者使用 jal 加上子程序的标记。返回地址保存在 $ra 中。
- 返回地址是 PC + 4,PC 是 jal 指令的地址。
- 如果被调用者使用框架指针,它通常将其设置为栈指针。旧的栈指针必须在之前被保存到栈中。
- 被调用者通常在开头将其需要使用的寄存器保存到栈中。如果被调用者调用了辅助子程序,必须将 $ra入栈,同时也必须将临时寄存器或被保留的寄存器入栈。
- 当子程序结束,返回值要保存在 $v0 - $v1 中。
- 被调用者使用 jr $ra 返回到调用者那里。
网友评论