将阵列的内容复制到另一个阵列并在MIPS程序集中打印

时间:2013-10-20 04:07:08

标签: arrays assembly printing mips arraycopy

我是汇编语言的新手。我已经帮助编写了一段代码来获取数组并打印出来。我现在想简单地将第一个数组的内容复制到第二个数组中,然后打印第二个数组。 (稍后我将操纵它,以便第二个数组向后打印第一个数组)

我只是想学习如何将数组复制到第二个数组并打印出来。下面是我打印第一个数组的代码

# PrintList.asm
.data
Sz: .word 10
Array: .word 1, 1, 2, 3, 5, 8, 13, 21, 34, 55
NL: .asciiz " "

.text

main:
lw $s7, Sz 
move $s1, $zero  
move $s2, $zero 

print_loop:
bge $s1, $s7, print_loop_end 

lw $a0, Array($s2) 
li $v0, 1
syscall
la $a0, NL 
li $v0, 4
syscall
addi $s1, $s1, 1 
addi $s2, $s2, 4 
j print_loop 

print_loop_end:

任何指导或提示都会有所帮助,谢谢

1 个答案:

答案 0 :(得分:2)

有关您的计划的一些评论:

move $2, $zero
...
lw $a0, Array($s2) 

在真实环境中使用MIPS时(例如:许多WLAN路由器使用MIPS处理器),第二行不起作用。原因是“数组”的地址通常在0x10000以上的范围内,并且代码中的行将无法访问0x7FFF以上的地址。

最好使用以下两行:

la $2, Array
...
lw $a0, 0($s2) 

您还应该知道“syscall”会调用操作系统。这意味着“$ v0”寄存器中数字的含义取决于所使用的操作系统(或模拟器)。在Unix中有以下几行:

li $v0, 1
syscall

将调用“exit()”系统调用,该调用将立即停止程序。使用“syscall”指令时,您应该提到您使用的例如SPIM模拟器(其中$ v0 = 1表示:打印整数)。

现在关于实际问题:

要复制数组,只需在“lw”指令后添加“sw”指令:

lw $a0, Array($s2)
sw $a0, SecondArray($s2)

某些真正的MIPS处理器不允许在以下指令中使用使用“lw”加载的寄存器。因此,您应该以避免这种情况的方式重新排序说明:

lw $a0, Array($s2)
li $v0, 1
sw $a0, SecondArray($s2)

地址问题> 0x10000仍然存在。如果你的程序应该使用这样的地址,你需要第二个数组指针:

la $s2, Array
la $s3, SecondArray
  ...
lw $a0, 0($s2)
li $v0, 1
sw $a0, 0($s3)
  ...
addi $2, $2, 4
addi $3, $3, 4