过程大致如下:
在.data段开辟一段空间,然后在.text读取数组的首地址,通过偏移量得到每个单元的地址,用lw和sw加载和存储数据。
具体可以看下面一个例子:
Int main () { Int K,Y; Int Z[50]; Y=56; For(k=0;k<50;K++) Z[k]=Y-16*(k/4+210); }
用MIPS实现如下:
.data Z: .space 200 #开辟一个200字节大小的空间 space: .ascii " " #空格 输出时将每个数分开
.text init: la $s0,Z #$s0存储Z数组的首地址 move $t0 $0 #$t0表示K addi $s1 $0 56 #$s1表示Y move $t3 $0 #用于循环打印 loop: slti $t1 $t0 50 #判断K是否小于50 beq $t1 0 print #K>=50 进入打印部分 div $t1 $t0 4 #$t1作临时寄存器储存计算结果 t1=k/4 addi $t1 $t1 210 #t1=t1+210 mul $t1 $t1 16 #t1=t1*16 sub $t1 $s1 $t1 #t1=Y-t1 sll $t2 $t0 2 #求偏移量 add $t2 $t2 $s0 #$t2存储偏移后的地址 sw $t1 0($t2) #将数存储到数组单元中 addi $t0 $t0 1 #K=K+1 j loop #进入下一次循环 print: slti $t1 $t3 50 #判断打印次数是否小于50 beq $t1 0 exit #打印次数>=50 退出 sll $t2 $t3 2 #求偏移量 add $t2 $t2 $s0 #$t2存储偏移后的地址 lw $a0 0($t2) #读取数组单元并放到$a0 li $v0 1 #打印结果 syscall la $a0 space #打印空格 li $v0 4 syscall addi $t3 $t3 1 #打印次数加1 j print #进入下一次循环
exit: li $v0 10 #退出程序 syscall