Arrays 初始化MIPS中数组的索引?

Arrays 初始化MIPS中数组的索引?,arrays,memory,mips,Arrays,Memory,Mips,我是MIPS的新手,这里有个家庭作业问题 有人问我: 在开始循环之前,应该初始化$s0以保存数组的基址,初始化$s1以保存数组的索引。索引应该是零基的,这意味着第十个元素的数组索引应该是9 我真的不知道这意味着什么。我想我已经初始化了基址,但我根本不知道数组的索引是什么。以下是我得到的代码: .data #by default, the "data segment" starts at address 0x10010000 .word 1 .word 2 .word 3 .word 4 .wo

我是MIPS的新手,这里有个家庭作业问题

有人问我: 在开始循环之前,应该初始化$s0以保存数组的基址,初始化$s1以保存数组的索引。索引应该是零基的,这意味着第十个元素的数组索引应该是9

我真的不知道这意味着什么。我想我已经初始化了基址,但我根本不知道数组的索引是什么。以下是我得到的代码:

.data  #by default, the "data segment" starts at address 0x10010000
.word 1
.word 2
.word 3
.word 4
.word 5
.word 6
.word 7
.word 8
.word 9
.word 0

.text #instructions start below

lui $s0,0x1001
我已经增加了底线,其余的都给了我。任何帮助都将不胜感激,谢谢。

好吧,如果“我真的不知道这意味着什么”是一个准确的说法,那么让我们一次说一个“这个”

我是MIPS的新手,这里有个家庭作业问题

这意味着,您正在考虑依赖堆栈溢出来完成作业。也许会,也许不会,但它不会在考试时出现。:)

在开始循环之前,应该初始化$s0以保存数组的基址

你知道“初始化变量”是什么意思吗?如果没有,您需要返回“编程简介”。假设这不是问题所在,我们希望定义“在寄存器中设置值”和“数组地址”

您的指令确实设置了寄存器的所有32位,并且您似乎已经收集到它清除了较低的16位,即0x10010000:

lui $s0,0x1001
但这真是个坏主意。您不希望您的代码被如此锁定到特定的内存位置。不同的汇编器可能会将您放入不同的内存段,或者(更可能)您可能希望将该内存块(我们称之为“数组”,尽管这毫无意义)移动到不同的位置。相反,您应该让汇编程序通过使用标签和伪操作为您做一些工作

.data # I don't know or care where the data segment starts
myArray:
.word 0x00000001 # aka 0x01 or just 1, but this shows what's really happening
.word 0x00000002
# etc etc
.text # Instructions do indeed start below
la $s0 myArray # magic pseudo-op
汇编程序将把
la
(加载地址)伪op转换为
lui
,地址的上半部分用于高位,然后将
ori
转换为地址的下半部分用于低位。当您这样做时,这些代码仍然有效:

.data
somethingElse:
.word 0xDEADBEEF # I want anyone decompiling my code to see "DEAD BEEF" at the top of the dump
myArray:
.word 0x00000001
.word 0x00000002
# etc etc
.text # Instructions do indeed start below
la $s0 myArray # I still have a pointer to the first word in myArray!
好的,现在让我们来看下一件你不知道的事情:

$s1以保存数组的索引。索引应该是从零开始的,这意味着第十个元素将有一个从零开始的数组索引9。。。我根本不知道数组的索引是什么

同样,如果您不知道高级语言中
A[0]
A[9]
的含义,请询问您的导师,在没有适当先决条件的情况下,您是如何进入这门课程的。我想你已经把那部分搞定了。。。因为你要做的第一件事就是完全忘记它

MIPS没有数组。它的内存位置可以是您决定的任何位置。如果我将地址
myArray
发送给需要ASCII字符字符串的函数,它将读取内存位置,就像它们包含ASCII字符一样。没有类型(只有Zuul)。你要做的是“指针算术”

正如@Konrad指出的,您的“数组”中的第一个字(您打算作为整数处理的四个字节)(您打算作为一个字序列处理的一组内存位置)位于内存地址
myArray
(可能但不一定位于0x10010000)。因此,如果要获取存储在第一个“数组元素”中的值,可以执行以下操作:

lw $t0, 0($s0) # load word into $t0, from address pointed to by $s0, offset by 0
然后,你可以得到下一个这样的单词,它将获取内存地址中的数据
$s0+4
。(为什么是+4?因为每个字都有4个字节长。)

这对访问随机数组元素没有多大帮助。在MIPS中,不能仅用数组索引
$s1
替换
4
。你得自己做加法。但不是这样

add $t1, $s0, $s1 # Base address + oops!
如果$s1=1,这将为您提供
$s0+1
,这不是您想要的。您需要
$s0+(4*$s1)
。本着不为你做所有家庭作业的精神,我将向你抛出一个你可能不知道的操作码,并迫使你咨询谷歌的精神,以找出为什么这样做有效

sll $t2, $s1, 2 # Look it up!
add $t1, $s0, $s1 # address of "array element"
lw $t0, 0($t1) # value of "array element"

第一个索引是0。当前元素总是$s0+$s1*4“我真的不知道这意味着什么。”然后你应该咨询你的课程材料和/或老师。连作业都不懂就继续下去是没有意义的。非常感谢你的评论。当我提出这个问题的时候,我很惊慌,我确实理解了所有的基本原理。抱歉:)这就是我的代码现在的样子
lui$s0,0x1001 addi$s1,$zero,1 loop:add$t1,$s0,$t2 lw$t0,0($t1)beq$t0,$zero,end addi$t0,$t0,2 sw$t0,0($t1)addi$s1,$s1,1 sll$t2,$s1,2 j loop
它一直在循环,我不知道怎么修复它。谢谢你的回答!这真的很有帮助。这一定不是你的全部代码——我假设你在某处定义了一个
end
标签。我看到缺少的另一件事是,
$t2
未初始化。可能还有更多——这正是跳出来的。你有没有单步完成代码(你可以在火星上完成)?
sll $t2, $s1, 2 # Look it up!
add $t1, $s0, $s1 # address of "array element"
lw $t0, 0($t1) # value of "array element"