【发布时间】: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