使用多个数组时如何在程序集中分配内存。例如,我有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)
答案 0 :(得分:2)
我希望我没有误解你的问题,但是为数组分配内存通常是通过特殊的汇编程序指令完成的,而不是通过特定的指令。不幸的是,语法各不相同,但一般的想法是要求汇编程序分配一些空间。假设X数组需要100个int和Y数组200.以下是一些汇编程序执行此操作的方法:
X: defs 100*4
Y: defs 200*4
其他人可能会说“.byte”而不是“defs”。 “* 4”是因为您以字节为单位分配空间,但每个int为4个字节。有时汇编者会说“分配空间并用一些价值填充它”。我在这里介绍的内容不会这样做,因此确保您现在需要编写初始值。让我们用1和Y填充X和2用:
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汇编程序助记符或出错的可能事件中所做的事情。
动态分配数组是一个完全不同的命题。通常会有一个操作系统子例程,您调用它来获取指向一定大小的内存块的指针。如果你真的处于低水平,你将不得不想出自己的方案。有趣的是,这本身就是一个声明一个覆盖所有可用内存的静态数组,然后在程序要求时传递它的块。然后你必须抓紧机会跟踪你已经交出的东西,这样你就可以释放大块的东西。
在任何一种情况下,您都会获得指向所请求内存量的指针。通常,您需要将该指针保存在内存位置,但它可以存在于一个简单程序的寄存器中。分配代码可能如下所示:
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];”相同。 vs.“int * X = malloc(100 * sizeof(int));”。在这两种情况下,您都可以说“X [n]”但在幕后C使用正确的汇编程序序列。