Arrays 汇编多阵列内存分配
使用多个数组时如何在程序集中分配内存。例如,我有2个数组Arrays 汇编多阵列内存分配,arrays,assembly,memory-management,mips,Arrays,Assembly,Memory Management,Mips,使用多个数组时如何在程序集中分配内存。例如,我有2个数组 la $s0, X la $s1, Y 例如,如果要以这种方式“初始化”,则内存分配是连续的 Address +0 +4 +8 +12 ..... 22112 x[0] y[0] x[1] y[1] ... . . . arrayAllocationX: la $t0, X fill with $zero until n-1(
la $s0, X
la $s1, Y
例如,如果要以这种方式“初始化”,则内存分配是连续的
Address +0 +4 +8 +12 .....
22112 x[0] y[0] x[1] y[1] ...
.
.
.
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
为了“修复”这个问题,我考虑加载第一个数组地址初始化n
值,然后从那里初始化另一个。比如说
Address +0 +4 +8 +12 .....
22112 x[0] y[0] x[1] y[1] ...
.
.
.
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汇编程序助记符或犯了错误
动态分配数组是一个完全不同的命题。通常,您会调用一个操作系统子例程来获取指向特定大小内存块的指针。如果你的水平真的很低,你就必须拿出自己的方案。有趣的是,这本身就是一个声明一个覆盖所有可用内存的静态数组的问题,然后根据程序的要求将它的块传递出去。然后,你必须掌握一些技巧来跟踪你交给别人的东西,这样你才能释放出大块的东西
在这两种情况下,您都会得到一个指向所请求内存量的指针。通常,您需要将该指针保存在内存位置,但它可以保存在一个简单程序的寄存器中。分配代码可能如下所示:
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语言,这里的区别与“intx[100];”与“int*X=malloc(100*sizeof(int));”相同。在这两种情况下,你都可以说“X[n]”,但在幕后C使用了正确的汇编程序序列。回答得很好,乔治,谢谢你这么详细。然而,当我需要同时在两个数组中引入项时,我的问题就出现了。例如,您的姓名在x[0]中,手机在y[0]中。此外,我认为不能使用“defs/.space”,因为数组大小在执行之前是未知的。如果像我说的那样“连续填充项,并在读取数组跳转1内存地址.x[0]=地址2234->y[0]=2234+4的值时”会是一种不好的做法吗?名称会使事情变得复杂,因为它们的宽度往往是可变的。但是,对于固定大小的值,您的建议没有问题。它更像是一个数组,每个位置都有两个相关的数据块。在C语言中,结构的数组。如果register$t0指向数组中的一个项目,“l$s0,0($t0)”可能会得到薪水,“l$s0,4($t0)”可能会得到年龄。移动到下一个数组元素意味着将8添加到$t0。动态内存分配是另一回事。我会更新我的答案。