【问题标题】:Copying content of array to another array and printing in MIPS assembly将数组的内容复制到另一个数组并在 MIPS 程序集中打印
【发布时间】:2013-10-20 04:07:07
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: assembly printing mips arrays


    【解决方案1】:

    首先介绍一下你的程序:

    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
    

    【讨论】:

    • 我认为您的键盘吞下了您的一些 s,除非您打算随机使用非别名的寄存器编号(例如 $2 而不是 $s2)。
    • 是的,我做了你所说的更改,但我到处都出错了。
    • 罗伯特B:正确。当然,$2 必须是 $s2。是打字错误。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-04
    • 2022-11-30
    • 2013-01-15
    • 1970-01-01
    相关资源
    最近更新 更多