0

例如,我正在尝试将 C 代码转换为等效的 MIPS:

int a[50];
int i;
...
a[0] = 1;
a[1] = 1;
...

看了其中一个答案,有没有别的办法呢?:

     .data
array: .word  1,1,...,0  (till the 50th zero)
4

3 回答 3

3

好吧,我想说你所描述的没有任何问题。但是,显然也可以使用循环来初始化数组。

initTable:

    la     $t0 table #$t0 stores first address in table
    addi   $t1 $t0 196 #$t1 stores address of one past end (49 * 4)
    addi   $t2 $zero 1

    intiTableLoop:

          sw   $t2 0($t0)
          addi $t0 $t0 4
          blt  $t0 $t1 initTableLoop

   sw $zero 0($t0)

   jr $ra

使用循环当然是初始化动态分配数组的唯一方法。


从那以后,我从这里的答案中发现:MIPS Data Directives that one can do this in mips as so:

array: .word 1:49
       .word 0

其中冒号后面的数字表示应该分配给冒号前面的值的单词数。这可能就是你要找的。

于 2013-07-21T16:13:03.257 回答
2

文字数据不等同于您的 C 代码。这更像是

mov [data], 1
mov [data+1], 1

与您.data未初始化的BSS 部分中。如果您要走这条路线,请确保将数据归零。

不过,我发现插入实际文字数据没有任何问题。仅仅 50 个零不算什么,虽然我不会像键入它们那样多,而是使用我的文本编辑器的强大功能。对于更多随机数据,我编写了几个简短的程序将其二进制格式转换为我可以插入代码的格式。

于 2013-07-21T11:28:02.460 回答
0

这不是 .space 指令的用途吗?

那么答案不就是

.data 
a: .space 1:50

它创建一个数组 a,为其分配 50 个字,并在每个字中存储“1”。

于 2018-04-04T02:59:05.243 回答