Arrays 汇编多阵列内存分配

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(

使用多个数组时如何在程序集中分配内存。例如,我有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($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。动态内存分配是另一回事。我会更新我的答案。