MIPS阵列用户输入



我有个问题。如何将用户输入的输入放入数组中?用户将输入放在其他函数中,我希望它作为我在数组中的输入。

首先,制作一个数组——例如,在.data部分中声明一个全局数组,使用标签,并保留存储,可能使用.space 40来保留10个字的存储。如果数组在字符串之后(用于提示和打印(,请在全局数组之前使用.align 2,以确保数组在内存中正确对齐。

.data
...
.align 2
array:  .space 40

我们还可以通过系统调用9、sbrk为数组使用动态存储,或者通过降低堆栈指针来使用堆栈空间。

其次,我们通过计算感兴趣的元素的地址并使用对该地址的加载或存储来进行数组引用。感兴趣的地址可以通过公式array + index * scale来计算,其中scale是数组元素的字节大小(即,对于字数组为4(。例如,假设一个数组索引i在寄存器$t0中,并且我们想要引用array[i]。乘4(这是2的二次方(是用移位指令完成的。

la $t1, array      # load base address of the array into $t1
sll $t2, $t0, 2    # multiply i by 4 to scale for element size of 4 bytes each
addu $t2, $t2, $t1 # sum base address and scaled i -- $t2 now points to array[i]
lw $t3, ($t2)      # fetch from memory the value referred to by address in $t2

或者对于分配,类似的只是将负载更改为存储,例如array[i]=t3

la $t1, array      # load base address of the array into $t1
sll $t2, $t0, 2    # multiply i by 4 to scale for element size of 4 bytes each
addu $t2, $t2, $t1 # sum base address and scaled i -- $t2 now points to array[i]
sw $t3, ($t2)      # store value into memory at array[i]

在递增索引i的循环中使用这些序列。注意,我们可以在循环的持续时间内将数组的地址保留在寄存器中,因此la伪指令可以在循环之前和之外。

我们也可以使用指针而不是索引。为此,请修改引用数组的寄存器。不是每次计算array + index * scale,而是在循环主体内将寄存器(此处为$t0(递增4,以指向数组中的下一个元素。

loop:
...
lw -or- sw $t3, ($t0)
...
addiu $t0, $t0, 4
...
j loop

循环主体的其他部分将需要进行提示和用户输入操作。

最新更新