arrays - 组装多个数组内存分配

标签 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]    ...
.
.
.

为了“修复”这个问题,我想到加载第一个数组地址来初始化 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)

最佳答案

我希望我没有曲解您的问题,但为数组分配内存通常是通过特殊的汇编器指令完成的,而不是通过特定指令完成的。不幸的是,语法各不相同,但总体思路是要求汇编程序分配一些空间。假设 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/

相关文章:

javascript - 根据其他数组键值获取数组值总和

c - 使用 ld 将目标文件链接到二进制文件时出现链接错误

c - 正则表达式如何翻译成汇编?

linux - 为什么 gcc 会生成冗长的汇编代码?

PHP 使用的内存多于所需的文件

iphone - 内存警告但事件字节较小

java - 最终字符串的最终数组仍然是可变的吗?

c++ - 非常大的数组——C 数组与 C++ 数组。 Visual Studio - 超过最大值 (268435456)

arrays - 比较数组是否相等,忽略元素的顺序

c - 为什么在 C 的堆中 malloc 2GB 或更大的内存会失败?