问题描述
我想我有一个相当基本的 MIPS 问题,但我仍然对在 mips 中寻址的工作方式感到困惑。
我的问题是:寄存器$t0的地址是什么?
我有两个想法:
- 寄存器 $t0 的寄存器编号为 8,所以我想知道它的地址是否为 0x0000 0008 并且位于内存块的保留部分。
- 或者它会落入静态数据部分并具有 0x1000 0008 的地址?
我知道 MARS 和不同的汇编程序可能以不同的方式启动寻址,如此相关问题中所述: How is the la instruction translated in MIPS?
我试图了解寄存器 $t0 的“基”地址是什么,以便我更好地了解偏移量(基)的工作原理。 例如 8($t0) 的地址是什么
感谢您的帮助!
解决方法
功能 | 注册 | 内存 |
---|---|---|
计数 | 很少 | 广阔 |
速度 | 快速 | 慢 |
命名 | 是 | no |
可寻址 | no | 是 |
通常有 32 个或更少的寄存器可供程序员使用。在 32 位机器上,我们可以寻址 2^32 个不同字节的内存。
寄存器速度快,而内存速度慢,根据缓存特性和条件,可能需要几十个周期。
在 load-store machine 上,寄存器可以直接在大多数指令中使用(通过在机器代码指令中命名它们),而内存访问需要单独的加载或存储指令。这种机器上的计算指令通常允许命名最多 3 个寄存器(例如目标、源 1、源 2)。内存操作数必须放入寄存器进行计算(有时会移回内存)。
寄存器可以在指令中命名,但它们没有地址,不能被索引。在 MIPS 上,无法在内存中的某个地址处找到作为别名的寄存器。即使是很小的数组(例如 10 个数组)也很难放在寄存器中,因为它们没有地址并且无法索引。内存具有数字地址,因此我们可以依靠以可预测的地址模式存储数组和对象。 (内存通常没有名称,只有地址;但是,通常有特殊的内存位置用于处理 I/O 各种设备,并且,正如您所注意到的,内存被划分为具有开始(和结束)地址的部分。)
需要明确的是,过去的一些处理器中已经设计了基于内存的别名。例如,HP/1000(大约 70 年代-80 年代)有 2 个寄存器(A 和 B),它们分别在内存位置 0 和 1 处具有别名。然而,这种 CPU 寄存器到内存的别名通常不再在现代处理器上完成。
例如 8($t0) 的地址是什么
8($t0)
指的是(寄存器$t0
的内容)+8的内存地址。如果使用得当,程序片段将 $t0
将使用 $t0
作为指针,它是一些保存内存地址的变量。