汇编多个数组内存分配

时间:2010-11-04 03:05:59

标签: arrays assembly memory-management

使用多个数组时如何在程序集中分配内存。例如,我有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, Xla $s1, Y时会继续连续存储值。

我可以通过其他方式做到这一点,例如;连续填充项目并在读取任一数组的值时跳转1个内存地址,因此x [0] =地址2234 - > x [1] = 2234 + 8。但这似乎并不是一个好的编程实践。

你能告诉我这样做的正确方法。谢谢!


顺便说一下,总是输入值,然后按顺序读取(先x和y)

1 个答案:

答案 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使用正确的汇编程序序列。