0

我是汇编语言的新手。我在很多帮助下编写了一段代码,该代码需要一个数组并打印它。我现在只想简单地将第一个数组的内容复制到第二个数组中,然后打印第二个数组。(稍后我将对其进行操作,以便第二个数组向后打印第一个数组)

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

# 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:

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

4

1 回答 1

2

首先对您的程序进行一些评论:

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

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

最好使用以下两行:

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

您还应该知道“系统调用”调用操作系统。这意味着“$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 $s2, $s2, 4
addi $s3, $s3, 4
于 2013-10-20T06:06:05.903 回答