- 1、本文档共3页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
MIPS 通用寄存器
MIPS 通⽤寄存器
MIPS有32个通⽤寄存器($0-$31),各寄存器的功能及汇编程序中使⽤约定如下:
下表描述32个通⽤寄存器的别名和⽤途
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)
下⾯给以详细说明:
$0:即$zero,该寄存器总是返回零,为0这个有⽤常数提供了⼀个简洁的编码形式。
move $t0,$t1
实际为
add $t0,$0,$t1
使⽤伪指令可以简化任务,汇编程序提供了⽐硬件更丰富的指令集。
$1:即$at ,该寄存器为汇编保留,由于I型指令的⽴即数字段只有16位,在加载⼤常数时,编译器或
汇编程序需要
把⼤常数拆开,然后重新组合到寄存器⾥。⽐如加载⼀个32位⽴即数需要 lui (装⼊⾼位⽴即数)
和addi两条
指令。像MIPS程序拆散和重装⼤常数由汇编程序来完成,汇编程序必需⼀个临时寄存器来重组
⼤常数,这
也是为汇编保留$at的原因之⼀。
$2..$3:($v0-$v1)⽤于⼦程序的⾮浮点结果或返回值,对于⼦程序如何传递参数及如何返回,MIPS范
围有⼀套约
定,堆栈中少数⼏个位置处的内容装⼊CPU寄存器,其相应内存位置保留未做定义,当这两个
寄存器不够存
放返回值时,编译器通过内存来完成。
$4..$7:($a0-$a3)⽤来传递前四个参数给⼦程序,不够的⽤堆栈。a0-a3和v0-v1以及ra⼀起来⽀持⼦
程序/过程
调⽤,分别⽤以传递参数,返回结果和存放返回地址。当需要使⽤更多的寄存器时,就需要堆
栈(stack)
了,MIPS编译器总是为参数在堆栈中留有空间以防有参数需要存储。
$8..$15:($t0-$t7)临时寄存器,⼦程序可以使⽤它们⽽不⽤保留。
$16..$23:($s0-$s7)保存寄存器,在过程调⽤过程中需要保留(被调⽤者保存和恢复,还包括$fp和
$ra),MIPS
提供了临时寄存器和保存寄存器,这样就减少了寄存器溢出(spilling,即将不常⽤的变量放到存
储器的过程),
编译器在编译⼀个叶(leaf)过程(不调⽤其它过程的过程)的时候,总是在临时寄存器分配完
了才使⽤需要
保存的寄存器。
$24..$25:($t8-$t9) 同($t0-$t7)
$26..$27:($k0,$k1)为操作系统/异常处理保留,⾄少要预留⼀个。异常(或中断)是⼀种不需要在
程序中显⽰
调⽤的过程。MIPS有个叫异常程序计数器(exception program counter,EPC)的寄存器,属于
CP0寄存器,
⽤于保存造成异常的那条指令的地址。查看控制寄存器的唯⼀⽅法是把它复制到通⽤寄存器⾥,
指令mfc0
(move from system control)可以将EPC中的地址复制到某个通⽤寄存器中,通过跳转语句(jr) ,
程序可以返
回到造成异常的那条指令处继续执⾏。MIPS程序员都必须保留两个寄存器$k0和$k1 ,供操作系
统使⽤。
发⽣异常时,这两个寄存器的值不会被恢复,编译器也不使⽤k0和k1,异常处理函数可以将返回
地址放到这
两个中的任何⼀个,然后使⽤jr跳转到造成异常的指令处继续执⾏。
$28:($gp)为了简化静态数据的访问,MIPS软件保留了⼀个寄存器:全局指针gp(global
pointer,$gp) ,全局指针
只想静态数据区中的运⾏时决定的地址,在存取位于gp值上下32KB范围内的数据时,只需要⼀
条以gp为基
指针的指令即可。在编译时
文档评论(0)