使用多个数组时如何在程序集中分配内存。例如,我有 2 个数组;
la $s0, X
la $s1, Y
如果以这种方式“初始化”它,例如内存分配是连续的
Address +0 +4 +8 +12 .....
22112 x[0] y[0] x[1] y[1] ...
.
.
.
为了“修复”这个问题,我想到加载第一个数组地址来初始化 n
值,然后从那里初始化另一个。例如
arrayAllocationX:
la $t0, X
fill with $zero until n-1($t0)
la $s0, X
arrayAllocationY:
la $t1, Y
fill with $zero until n-1($t1)
la $s1, Y
这不起作用,因为它在声明 la $s0, X
和 la $s1, Y
时会继续连续存储值。
例如,我想到了其他可行的方法;连续填充项目并在读取任一数组的值时跳转 1 个内存地址,因此 x[0] = 地址 2234 -> x[1] = 2234+8。但这似乎并不是好的编程习惯。
你能告诉我哪种方法是正确的吗?谢谢!
顺便说一下,值总是被输入,并按顺序读取(先是 x 然后是 y)
最佳答案
我希望我没有曲解您的问题,但为数组分配内存通常是通过特殊的汇编器指令完成的,而不是通过特定指令完成的。不幸的是,语法各不相同,但总体思路是要求汇编程序分配一些空间。假设 X 数组需要 100 个整数,而 Y 数组需要 200 个整数。以下是一些汇编器的做法:
X: defs 100*4
Y: defs 200*4
其他人可能会说“.byte”而不是“defs”。 “*4”是因为您以字节为单位分配空间,但每个 int 是 4 个字节。有时汇编程序有一种说法是“分配空间并用一些值填充它”。我在此处介绍的内容不会这样做,因此请确保您现在需要写入初始值。让我们用 1 填充 X,用 2 填充 Y:
la $t0,X ; get address of X array into $t0
mov $t1,100 ; number of items in X into $t1
mov $s0,1 ; All X[] to be filled with 1
xlp: st $s0,0($t0) ; write next X[] value
add $t0,$t0,4 ; move to next position in X[] array
add $t1,$t1,-1 ; count down one less item
bne $t1,0,xlp ; keep doing this until we get to zero
la $t0,Y
mov $t1,200
mov $s0,2
ylp: st $s0,0($t0)
add $t0,$t0,4
add $t1,$t1,-1
bne $t1,0,ylp
评论有点多余,但我想重申一下我正在做的事情,以防万一我忘记了 MIPS 汇编器助记符或犯了错误。
动态分配数组是一个完全不同的命题。通常会有一个操作系统子例程,您可以调用该子例程来获取指向一定大小的内存块的指针。如果你真的水平很低,你就得想出你自己的方案。有趣的是,这本身就是声明一个覆盖所有可用内存的静态数组,然后在程序要求时传递其中的 block 。然后,您必须巧妙地跟踪已移交的内容,以便释放 block 。
在任何一种情况下,您都会得到一个指向请求的内存量的指针。通常你需要将该指针保存在一个内存位置,但它可以存在于一个简单程序的寄存器中。分配代码可能如下所示:
X: word 0
mov $t0,100*8 ; how much memory we will need
bal alloc ; get memory -- assume it returns pointer in $t1
la $s0,X ; X pointer address
st $t1,0($s0) ; keep track of start of array
注意我们必须如何执行两个步骤来获取数组地址。 “X”之前是要使用的内存地址。现在“X”是包含数组地址的 4 个字节内存的地址。
前面的初始化代码将像以前一样工作,但您必须:
而不是简单的“la $t0,X”la $t0,X
l $t0,0($t0)
如果您熟悉 C,这里的区别与“int X[100];”相同与“int *X = malloc(100 * sizeof(int));”。在这两种情况下,您都可以说“X[n]”,但在幕后,C 使用正确的汇编程序序列。
关于arrays - 组装多个数组内存分配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4093573/