2013-04-16 128 views
0

我最近读了Patterson和Hennessy的书“计算机组织与设计”,以便研究一下汇编。 我遇到一个部分,其中lwsw机器指令进行了解释,以及他们如何将16位立即作为加载/存储地址。作者在这里指出的是: “16位地址意味着一个加载字指令可以加载基址寄存器中地址的8192个字的区域内的任何字”rs“。MIPS汇编中的内存寻址

我的问题是:

  • 这是否意味着所有的寄存器的地址是从相互隔开8192个字?
  • 另外,这是否意味着整个可用内存的操作是32 * 8192 = 262144个字?
+0

你把在指令中使用的地址寄存器,添加直接偏移量(这个16位偏移量你正在谈论),并且总和是用于该加载或存储地址。只要总和与加载或存储的大小对齐,寄存器中的值和偏移就可以是任何东西。 –

+0

但基本上可以保证不同寄存器的偏移不会相互冲突,对吧? 我不确定寄存器的加载值是保存在那个存储器地址中的值还是地址本身...... – jrhetf4xb

+1

地址来自寄存器中的值加上偏移量的总和。该地址位于内存空间,内存和外设中,(通用)寄存器无法通过内存空间中的地址到达。指令中的几位用于选择哪个寄存器包含地址的一部分。 –

回答

2

这是否意味着所有寄存器的地址间隔8192字?

编号寄存器没有地址。

此外,这是否意味着整个可用内存的操作是32 * 8192 = 262144字?

不。这些立即数是偏移量到用于加载/存储的基址。它允许你指定基地址的-32768 .. + 32767字节内的地址。 32768/sizeof(word)== 8192.如果您想要移动该范围,您可以简单地更改基址寄存器的值。
寄存器数量与您可以解决的内存量无关。

例如:

li $a0,0  # set $a0 to 0 
lw $t0,0($a0) # load a word from address 0 
lw $t0,8($a0) # load a word from address 8 

lui $a0,0xffff # set the upper half-word of $a0 to 0xffff 
lw $t0,4($a0) # load a word from address 0xffff0004 
+0

我现在明白了。我假设我加载了地址本身。 谢谢澄清。 – jrhetf4xb