网站客服:zx81024163 |

MIPS 通用寄存器的别名、用处及汇编程序中应用约定

2024-11-17 18:02:51发布    浏览430次    信息编号:200856

友情提醒:凡是以各种理由向你收取费用,均有骗子嫌疑,请提高警惕,不要轻易支付。

MIPS 通用寄存器的别名、用处及汇编程序中应用约定

有几篇朋友的文章介绍了关于更改寄存器指令的文章。相关文章地址

MIPS 有 32 个通用寄存器($0-$31)。各寄存器的作用及其在汇编程序中的应用约定如下:

下表描述了 32 个通用寄存器的别名和用途

姓名

用法

$0

零美元

常量 0(值 0)

1 美元

$在

为汇编程序保留 ( for )

$2-$3

$v0-$v1

函数调用返回值(与)

$4-$7

$a0-$a3

函数调用参数()

$8-$15

$t0-$t7

临时(或随意应用)

$16-$23

$s0-$s7

已保存(或者如果使用,则需要SAVE/)(已保存)

$24-$25

$t8-$t9

临时(或随意应用)

28 美元

$gp

全局指针()

29 美元

$sp

堆栈指针(Stack)

30 美元

$fp

帧指针(Frame)

31 美元

$ra

返回地址()

一天一个真理

人的一生就像汹涌的洪水。不遇到岛礁,就很难激起美丽的波浪。

具体说明如下:

$0:即零美元。该寄存器始终返回零,为有效常量 0 提供简洁的编码形式。

移动$t0,$t1

现实是

添加$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 一起支持子例程/进程

调用分别用于传递参数、返回结果和存储返回地址。当需要使用更多寄存器时,就需要堆栈

是的,MIPS 编译器总是在堆栈上为参数留出空间,以防有参数需要存储。

$8..$15:($t0-$t7)临时寄存器,子程序可以使用它们而不保留它们。

$16..$23:($s0-$s7)保存寄存器,过程调用时需要保留(被调用者保存和恢复,包括$fp和$ra),MIPS

提供临时寄存器和保存寄存器,从而减少寄存器溢出(将不常用的变量放入内存的过程),

当编译器编译叶过程(不调用其他过程的过程)时,它总是在分配必要的临时寄存器后使用它们。

保存的寄存器。

$24..$25:($t8-$t9) 与 ($t0-$t7) 相同

$26..$27:($k0,$k1) 保留用于操作系统/异常处理,至少必须保留一个。异常(或中断)是不需要在程序中表示的异常

调用过程。 MIPS 有一个寄存器,称为异常程序计数器(EPC),属于 CP0 寄存器。

用于保存引起异常的指令地址。查看控制寄存器的唯一方法是将其复制到通用寄存器。指令mfc0(move from)可以将EPC中的地址复制到通用寄存器中。通过跳转语句(jr),程序可以

返回引发异常的指令并继续执行。 MIPS 程序员必须保留两个寄存器 $k0 和 $k1 供操作系统使用。

当异常发生时,这两个寄存器的值不会被恢复,编译器也不会使用k0和k1。异常处理函数可以将返回地址放在这里。

两者任选其一,然后使用jr跳转到导致异常的指令继续执行。

$28: ($gp) 为了简化静态数据的访问,MIPS软件预留了一个寄存器:全局指针gp(,$gp),全局指针

仅需要静态数据区域中运行时确定的地址。当访问gp值上下32KB范围内的数据时,只需要根据gp一行即可。

指针指令就足够了。编译时,数据必须在基于 gp 的指针的 64KB 范围内。

$29:($sp) MIPS 硬件不直接支持堆栈。你可以将其用于其他目的,但是为了使用别人的程序或者让别人使用你的程序

程序中,你还是要遵守这个协议的,但这与硬件无关。

$30: ($fp) GNU MIPS C编译器使用帧指针,但SGI C编译器不使用它,并使用该寄存器作为受保护的寄存器

注册应用程序($s8),节省了调用和返回开销,但增加了代码生成的复杂度。

$31:($ra) 存储返回地址。 MIPS有一条jal(jump-and link,跳转并链接)指令。当跳转到一个地址时,下一条指令是

地址放在$ra 中。用于支持子程序。比如调用程序将参数放入$a0~$a3中,然后jal X跳转到X进程。被调用的进程执行后

将结果放入$v0、$v1中,然后应用jr $ra返回。

此外,MIPS通过协处理器0(CP0)控制CPU。

在文章的最后,我想跟大家分享一些程序员的笑话: 该事件并不像国内主流媒体普遍误导的那样。这就是中国政府和美国企业、中国文化和美国文化、甚至中国人和美国人的关系。 ,是民族主义与帝国主义的关系;更重要的是政府与企业的关系,权力控制与市场自由的关系。从这个意义上说,过度监管的受害者主要是国内企业。如果能脱身,国内企业就只能指望特区了。

提醒:请联系我时一定说明是从星空网上看到的!