2010-11-04 83 views
3

如何在使用多个阵列时在程序集中分配内存。例如,我有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)

回答

2

我希望我没有误解你的问题,但对于一个数组分配内存通常是通过做一个特殊的汇编指令,而不是通过特定的指令。不幸的是,语法有所不同,但总体思路是要求汇编程序分配一些空间。假设X阵列需要100个整数和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个字节的存储器的地址。

前面的初始化代码将像以前一样工作,但不是一个简单的“拉$ T0,X”你必须:

la $t0,X 
l $t0,0($t0) 

如果你熟悉C,所不同的是这里与“int X [100]”相同;“与“int * X = malloc(100 * sizeof(int));”。在这两种情况下,您都可以说“X [n]”,但幕后C使用正确的汇编程序序列。

+0

伟大的答案乔治和感谢,因为如此详细。然而,当我需要在两个阵列中同时引入项目时,我的问题就出现了。例如你的名字在x [0]中,你的手机在y [0]中。另外我认为不能使用“defs/.space”,因为数组的大小在执行前是未知的。这是不好的做法,就像我说的“连续填充项目并读取数组跳转1内存地址的值x [0] =地址2234 - > y [0] = 2234 + 4”? – Carlos 2010-11-04 03:52:31

+0

名称使事情变得复杂,因为它们往往是可变宽度。但是你所建议的对于固定大小的值是很好的。它更多的是在每个位置都有两个相关数据的单个数组。用C语言来说,是一系列结构。如果寄存器$ t0指向数组中的一个项目,“l $ s0,0($ t0)”可能会获得工资,“l $ s0,4($ t0)”可能获得该年龄。移动到下一个数组元素意味着将8添加到$ t0。动态内存分配是另一回事。我会更新我的答案。 – 2010-11-04 04:43:24

+0

令人惊叹的答案!谢谢乔治! – Carlos 2010-11-04 05:20:44