6

我对 x86-64 汇编有点坚定(也许不是专家),但是从一个平台的汇编器到下一个平台的汇编器,许多方面都是相似的,所以我也在尝试回答实际上不在我知识范围内的问题,我偶然发现了几个关于 MIPS 汇编的问题。

这唤醒了我对细节的兴趣,所以我检查了几个在线资源以获取详细信息。mips.com有很多内容可供阅读,但仅供参考:

寄存器只是传统的$zero零还是硬件零?

一些消息来源说它通常为零,另一些则声称它始终为零。还是后者只是假设它为零,因为它通常是?

提前感谢您的澄清(和/或指向 MIPS 网站上特定文档的指针,因此我不需要抓取我实际上不需要的信息)。

4

2 回答 2

9

可以在MIPS32® 程序员架构第一卷:MIPS32® 架构简介(pdf)中找到对此的明确答案,可从mips.com 获得(需要注册)。根据该文档中的第 2.4.8.1 节:

两个 CPU 通用寄存器具有指定的功能:

  • r0 被硬连线为零值,并且可以用作任何结果要被丢弃的指令的目标寄存器。当需要零值时,r0 也可以用作源。

  • r31 是 JAL、BLTZAL、BLTZALL、BGEZAL 和 BGEZALL 使用的目标寄存器,而指令字中没有明确指定。否则 r31 用作普通寄存器。

其余寄存器可用于通用用途。

于 2012-09-22T21:55:19.353 回答
6

前 5 名的参考资料说它是一个硬(re|ired)零。

而且,无论多么令人惊讶,MIPS 并不是唯一拥有如此奇怪寄存器的人。

作为比较,TI 的 MSP430 有两个特殊寄存器:R2(状态寄存器)和 R3(常数发生器)。当您通过它们读取内存操作数(或直接读取 R3)时,您会获取以下预定义常量之一:-1、0、1、2、4、8。该常量取决于寄存器编号和访问类型(直接、索引、间接、间接+自动增量)。这减少了代码大小和(AFAIR)执行时间,因为否则立即常量占用 16 位并且需要获取。

于 2012-09-22T07:08:19.703 回答