【问题标题】:Memory addressing in MIPS assemblyMIPS 程序集中的内存寻址
【发布时间】:2013-04-08 20:23:18
【问题描述】:

我最近在阅读 Patterson 和 Hennessy 的《计算机组织与设计》一书,以学习一点汇编。 我遇到了一个部分,其中解释了 lwsw 机器指令以及它们如何将 16 位立即数作为加载/存储地址。作者在这里指出的是: “16 位地址意味着加载字指令可以加载基址寄存器 rs 中地址的 [...] 8192 个字区域内的任何字”。

我的问题是:

  • 这是否意味着所有寄存器的地址都相隔 8192 个字?
  • 另外,这是否意味着整个可用内存为 32 * 8192 = 262144 个字?

【问题讨论】:

  • 你取指令中使用的地址寄存器,加上立即偏移量(你所说的这个 16 位偏移量),这个总和就是用于加载或存储的地址。只要总和与加载或存储的大小对齐,寄存器中的值和偏移量几乎可以是任何值。
  • 但基本上可以保证不同寄存器的偏移量不会发生冲突,对吧?我不确定从寄存器加载的值是该内存地址中保存的值还是地址本身......
  • 地址来自寄存器中的值加上偏移量的总和。该地址位于内存空间、内存和外围设备中,无法通过内存空间中的地址访问(通用)寄存器。指令中的几位用于选择哪个寄存器包含地址的一部分。

标签: memory assembly mips


【解决方案1】:

这是否意味着所有寄存器的地址都相隔 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

【讨论】:

  • 我现在明白了。我假设 lw 加载了地址本身。感谢您的澄清。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-06-05
  • 2013-11-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多