MIPS操作数组中存储的数据

时间:2018-07-26 03:11:39

标签: c arrays mips

我似乎无法想象它是如何工作的。 我正在尝试将此简单的任务从C转换为mips:

#define ARRAYSIZE 16
int intarray[]={1, 5, -3, 6, 12, 21, 18, 44, 32, 9, 23, 10, 11, 99, 100, 24};

intarray[little] = intarray[ARRAYSIZE-1];

所以我在数据中定义了数组

.data
  intarray: .word 1, 5, -3, 6, 12, 21, 18, 44, 32, 9, 23, 10, 11, 99, 100, 24

现在的问题是我知道如何足够容易地从此数组中加载单词

lw $t0, intarray($a0)

但是我不知道如何保存到该数组,因为它不在寄存器中。我什至可以操纵该数组,还是必须在寄存器中构建一个重复的数组?

2 个答案:

答案 0 :(得分:1)

我混淆了lwsw,一开始组装时的想法可能会造成混乱。事实证明,我一直在寻找的答案是,您需要首先加载数组的基地址(la address),然后调用sw register address

答案 1 :(得分:-1)

实际上,“ lw”指令将特定地址中包含的数据保存到寄存器中。您应该在.data中更改汇编程序指令,然后在.word x,y,z ...中进行更改。然后,汇编程序将开始在内存中逐一分配,然后使用sw指令将所需的值传递给寄存器(记住MIPS是小尾数法,因此分配将从低有效位开始)

请记住,在MIPS上无法找到数组,但是可以在数组中分配每个值。 (32位是寄存器的最大值)

通常,您在beq / bne / j指令中或循环使用标签。

关于lw / sw指令的小知识:

lw $ 1,100($ 2)表示$ 1 =内存[$ 2 + 100]

sw $ 1,100($ 2)表示内存[$ 2 + 100] = $ 1

还请记住,lw / sw指令使用基址,其格式为I。因此,您可以知道每个寄存器使用了多少位。