mips寄存器、指令、寄存器和函数调用

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 返回到调用者那里。

推荐阅读更多精彩内容