我很难理解这个概念。我正在阅读我的计算机体系结构书籍,并举例说明如何将以下C代码写入MIPS代码
g = h + A [8]
它说:
“我们假设A是一个100字的数组,并且编译器已经将变量g和h与寄存器$ s1和$ s2关联起来。让我们假设起始地址或基地址,数组是$ s3“
我首先感到困惑的是当它说A是100个单词的数组时它意味着什么。我知道从C ++和Java编程中,一个数组可以容纳很多东西,包括整数,浮点数,对象,指针等。所以当它说“100个单词的数组”时,究竟是指什么?如果有一个整数数组,那么数组中的每个整数都代表一个单词?
继续上面的例子,它最初在MIPS中给出了答案
lw $ t0,8($ s3),并说“此数组元素的地址是基数的总和 寄存器$ s3中的数组A加上选择元素8的数字。“ - &gt;然后它继续在下一页(解释字节寻址后)解释答案实际上是< / p>
lw $ t0,32($ s3)。这是我再次感到困惑的部分,因为我不理解字节寻址。它说:
“由于8位字节在许多程序中都很有用,因此大多数架构都针对个人 字节。 因此, 地址 的 一个字 火柴 地址 的 之一 4 字节 内 这个单词。 因此, 地址 的 连续的话 不同的是 4 ....字节寻址也会影响数组索引。获取正确的字节地址 上面的代码,要添加到基址寄存器的偏移量 $ s3必须是4 x 8或32, 这样加载地址就会选择 A [8]而不是A [8/4]。 “
说实话,我不知道这甚至意味着什么,我知道这很多但是有人可以试着帮助我理解这一点,因为我的头脑即使在我抬头时也是如此100个资源
答案 0 :(得分:1)
你的问题很可能源于这句话:“我从C ++和Java编程中知道......”当你达到机器代码级别时,你必须忘记你在更高级语言中学到的一切。甚至“阵列”的概念也具有完全不同的含义。
如果您认为数组是一系列明确定义的强类型元素,那就不再是这种情况了。当你处于比特级别时,没有“类型”(仅Zuul)。当有人在MIPS上下文中说“X的数组”时,它只是一堆包含1和0的内存位置。所有现代处理器所寻址的最小内存单元是8位字节,而MIPS(或任何32位处理器)所寻址的“本机”较大内存单元是4字节(32位)字。 / p>
因此,如果有人说“A是一个100字节的数组”,则意味着:标签“A”指向一个100字节长的内存块的地址,我们已经保留了供我们使用,并将作为字节引用。如果你看一下那段记忆,你会看到:
A+0: 00000000
A+1: 00000000
A+2: 00000000
...
A+99: 00000000
现在,有人出现并说“A是100个单词”的数组。现在,它们意味着标签“A”指向一个100字长的内存块的地址。由于每个字是4个字节,因此该块内存需要为400 字节长。并且因为字节仍然是内存的基本单位,所以你必须调整指针以适应这一事实。
A+0*4: 00000000 00000000 00000000 00000000
A+1*4: 00000000 00000000 00000000 00000000
A+2*4: 00000000 00000000 00000000 00000000
...
A+99*4: 00000000 00000000 00000000 00000000
这是否解释了为什么这个语句得到第8个字节 ...
lw $t0, 8($s3)
...但是这句话就是你如何得到第8个字?
lw $t0, 32($s3) # 32 = 8*4
答案 1 :(得分:0)
一个字节是8位 一个字就是32位 一个字是4byte 这将解决大部分的困扰
答案 2 :(得分:0)
100个字的数组表示占用100 * 32位数据的数组,每个数据间隔32位
例如,要访问数组的第二个元素,请参阅数组的第32位
0-31--1字 32-63--2nd字等等