我是汇编语言的新手。我已经帮助编写了一段代码来获取数组并打印出来。我现在想简单地将第一个数组的内容复制到第二个数组中,然后打印第二个数组。 (稍后我将操纵它,以便第二个数组向后打印第一个数组)
我只是想学习如何将数组复制到第二个数组并打印出来。下面是我打印第一个数组的代码
# 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:
任何指导或提示都会有所帮助,谢谢
答案 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