MIPS 偏移加基数寄存器寻址.它是如何工作的?



我对计算机组织书中的一些文字感到困惑:

假设 A 是一个包含 100 个单词的数组,并且编译器像以前一样将变量 g 和 h 与寄存器 $s 1 和 $s 2 相关联。我们还假设数组的起始地址或基址在 $s 3 中。编译此 C 赋值语句:

g = h + A[8];

尽管此赋值语句中只有一个操作,但其中一个操作数在内存中,因此我们必须首先将 A[8] 传输到寄存器。此数组元素的地址是在寄存器 $s 3 中找到的数组 A 的基数加上用于选择元素 8 的数字的总和。数据应放在临时寄存器中,以便在下一条指令中使用。基于图 2.2,第一个编译的指令是

lw    $t0,8($s3) # Temporary reg $t0 gets A[8]

阵列 A 的基数是什么?

计算机分为使用最左边或"大端"字节的地址作为单词地址的计算机和使用最右边或"小端"字节的计算机。MIPS属于大端阵营。由于仅当您以单词和四个字节的形式访问相同的数据时,顺序才重要,因此很少有人需要了解字节序。(附录 A 显示了对单词中的字节进行编号的两个选项。

字节寻址也会影响数组索引。为了在上面的代码中获得正确的字节地址,要添加到基寄存器$s 3的偏移量必须为4 * 8或32,以便负载地址将选择A[8]而不是A[8/4]。(请参阅第 2.19 节第 160 页的相关陷阱。

为什么是4*8?因此,如果偏移量为 32...这是否意味着 $s 3 中的值是 -24?有人可以澄清这段文字吗?

什么是大端字节?最左边的是什么?

为什么是4*8?

因为"A是一个100个单词的数组">,而单词的大小是4个字节。因此,索引 8 处的单词将位于偏移量8*sizeof(word)==8*4

这是否意味着 $s 3 中的值为 -24?

不,它没有说明$s3中的值。

最左边的是什么?

0x12345678
^-- left-most byte
0x12345678
^-- right-most byte

在大端内存布局中,该单词将存储为:

Address: N     N+1   N+2   N+3    
-------------------------------
Value:   0x12  0x34  0x56  0x78

在小端存储器布局中,它将存储为:

Address: N     N+1   N+2   N+3 
-------------------------------   
Value:   0x78  0x56  0x34  0x12

最新更新