【问题标题】:Referencing a word in memory vs referencing a memory cell?引用记忆中的单词与引用记忆单元?
【发布时间】:2013-06-03 20:33:41
【问题描述】:

好吧,我本可以问教授这件事,但过去几周我不常去教职,所以我会问任何遇到这个问题的人。

在 MIPS 中,如果整数数组的起始地址(A[0] 的地址)存储在寄存器 $s3 中,则用于将数组的第 9 个元素存储在临时寄存器 $t0 中的汇编代码将为 lw $t0 32($s3)。所以偏移量是 32。对此的解释是,当今大多数架构都引用内存中的每个字节(即每个内存单元),并且由于整数是 4 字节,这是“字”的最常见大小,因此下一个整数的地址在内存中将是当前地址 + 4 ,使地址为第 9 个整数:起始地址 + 4*8。好的!

现在我知道,对于以 ASCII 编码的字符,所需的位数是 8 = 1 个字节。所以我想问的是,如果我们有一个字符数组,数组中下一个字符的地址是否会是:“当前地址 + 1”,因为聊天只需要 1 个存储单元,每个存储单元都有自己的地址?或者,因为架构中的字大小是 4 个字节,所以可以引用的最小量是一个字,尽管每个存储单元都有自己的地址,使字符占用 4 个字节,尽管只需要 1 个字节?如果第一种情况为真,处理器如何知道天气将 1 添加到 4 的地址?编译器是否需要额外的指令来确定数据类型?另外,由于int占用了4个地址引用的空间,是处理器用来加载第一个字节的整数的地址还是?

现在我在缓存内存中(顺便说一下,我正在向 Patterson 和 Hennessy 的计算机组织和设计学习),这件事真的让我很困扰,所以如果有人的话,我将不胜感激 会回答。那谢谢啦!

【问题讨论】:

  • 天哪,我从没想过这个 int main() { int x[10];字符 a[10];长长 p[10]; printf("x[0]的地址=%d,x[1]的地址是%d \n", &x[0], &x[1]); printf("a[0]的地址=%d,a[1]的地址是%d \n", &a[0], &a[1]); printf("p[0]的地址=%d,p[1]的地址是%d", &p[0], &p[1]);结果:x[0]的地址=2686696,x[1]的地址是2686700 a[0]的地址=2686686,a[1]的地址是2686687 p[0]的地址=2686600, p[1] 是 2686608
  • 编译器如何通知处理器它需要递增 1 或 4?我知道 Hi 和 Lo 寄存器以及处理器如何处理比 32 位字长的数据,例如 long long。
  • 现在当我想到它时:编译器不需要生成额外的指令来指出它是 char 还是 int。它将读取更高级别的代码并确定是否应该设置偏移量 x*4 或 x*1。并且字符的加载会自动取代最低位,因此其他位将保持不变,所以我想如果寄存器中有某些东西,它应该首先被零替换,然后用于存储字符。

标签: memory assembly mips ram memory-address


【解决方案1】:

如果我们有一个字符数组,数组中下一个字符的地址是否会是:“当前地址 + 1 [字节]”?

是的。

如果 [this] 为真,处理器如何知道天气将 1 添加到 4 的地址?编译器是否需要额外的指令来确定数据类型?

还有附加说明。 lw 用于加载words,而lb/lbu 用于加载bytes。但这只会影响要加载的数据的大小。偏移量不会像在 C 中那样根据数据大小进行缩放。如果您对 lw 使用 3 的偏移量,它将尝试从基址寄存器给出的地址 + 3 个字节 em>。

另外,由于int占用了4个地址引用的空间,是处理器用来加载第一个字节的整数的地址还是?

是的。并且字值在内存中的布局取决于 CPU 的字节序。小端系统上的值 0x12345678 将存储为:

-- address -->
78 56 34 12

在大端系统上,它将被存储为:

-- address -->
12 34 56 78

【讨论】:

  • 我不太明白关于偏移量没有被缩放的部分。编译器是否从它编译的更高级别程序(例如 C++)中确定数据类型并相应地放置偏移量?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-12-03
  • 2014-03-24
  • 2020-08-24
  • 1970-01-01
  • 1970-01-01
  • 2023-04-06
相关资源
最近更新 更多