C 如何在MIPS程序集中初始化大型数组?
例如,我试图将C代码转换为等效的MIPS:C 如何在MIPS程序集中初始化大型数组?,c,arrays,assembly,mips,C,Arrays,Assembly,Mips,例如,我试图将C代码转换为等效的MIPS: int a[50]; int i; ... a[0] = 1; a[1] = 1; ... 看看其中一个,除了这样,没有别的办法了吗 .data array: .word 1,1,...,0 (till the 50th zero) 文字数据与您的C代码不等价。这更像是 mov [data], 1 mov [data+1], 1 使用未初始化BSS部分中的.data。如果要走这条路线,请确保将数据归零 不过,我发现插入实际的文字数据
int a[50];
int i;
...
a[0] = 1;
a[1] = 1;
...
看看其中一个,除了这样,没有别的办法了吗
.data
array: .word 1,1,...,0 (till the 50th zero)
文字数据与您的C代码不等价。这更像是
mov [data], 1
mov [data+1], 1
使用未初始化BSS部分中的.data
。如果要走这条路线,请确保将数据归零
不过,我发现插入实际的文字数据并没有什么错。仅仅50个零算不了什么,尽管我不会像键入它们那样多,而是使用我的文本编辑器的功能。对于更多的随机数据,我编写了几个简短的程序,将其二进制格式转换为可以插入代码的格式。文字数据与C代码不同。这更像是
mov [data], 1
mov [data+1], 1
使用未初始化BSS部分中的.data
。如果要走这条路线,请确保将数据归零
不过,我发现插入实际的文字数据并没有什么错。仅仅50个零算不了什么,尽管我不会像键入它们那样多,而是使用我的文本编辑器的功能。为了获得更多的随机数据,我编写了几个简短的程序,将其二进制格式转换为可以插入代码的格式。好吧,我想说的是,您所描述的内容没有任何错误。但是,显然也可以使用循环来初始化数组
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中可以这样做:
array: .word 1:49
.word 0
其中,冒号后面的数字表示应分配给冒号前面的值的字数。这可能就是你想要的。好吧,我想说的是,你所描述的没有错。但是,显然也可以使用循环来初始化数组
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中可以这样做:
array: .word 1:49
.word 0
其中,冒号后面的数字表示应分配给冒号前面的值的字数。这可能就是您要查找的内容。这不是.space指令的作用吗 那么答案不就是这样吗
.data
a: .space 1:50
它创建一个数组a,为它分配50个字,并在每个字中存储“1”。这不是.space指令的作用吗 那么答案不就是这样吗
.data
a: .space 1:50
它创建一个数组a,为其分配50个字,并在每个字中存储“1”。yeah只是好奇,但在感兴趣之前从未见过函数“mov”。啊,我看到“mov”实际上被称为“加载”和“存储”(lw/lb和sw/sb)用于MIPSmov'是通用的英特尔操作码,适用于两个方向。顺便说一句,也许你的汇编程序为数据提供了一个.repeat伪操作码。是的,我只是好奇,但在感兴趣之前从未见过函数'mov'。啊,我看到'mov'对于MIPS实际上被称为'load'和'store'(lw/lb和sw/sb)mov'是通用的英特尔操作码,适用于两个方向。顺便说一下,您的汇编程序可能会为数据提供一个.repeat伪操作码。