0

我的目标是交换交换中的值:函数

但是它什么也没做。

我将 a0 和 a1 的值设置为任何值,它不会覆盖它们的值。我不允许使用 t0,我必须使用堆栈。

仍然,为什么它不对a0和a1做任何事情,我是否必须在v0中返回一些东西?

    .text
main:
    la  $a0,n1
    la  $a1,n2
    jal     swap
    li  $v0,1   # print n1 and n2; should be 27 and 14
    lw  $a0,n1
    syscall
    li  $v0,11
    li  $a0,' '
    syscall
    li  $v0,1
    lw  $a0,n2
    syscall
    li  $v0,11
    li  $a0,'\n'
    syscall
    li  $v0,10  # exit
    syscall

swap:


    addi $sp, $sp, -4
    sw $a0, 0($sp)
    addi $a0, $a1, 0
    lw $a1, 0($sp)
    addi $sp, $sp, 4        
    jr $ra


L1: 

    .data
n1: .word   14
n2: .word   27
4

1 回答 1

1

您正在交换指针,而不是它们指向的。当您打印值时,您直接从交换的指针中读取它们,n1n2不是通过交换的指针。

要解决此问题,您可以:

  • 在调用之前加载 and 的值n1n2而不是它们的地址)swap。然后打印$a0,然后,而不是从和$a1重新加载值。n1n2
  • 取消引用交换内部的指针以实际交换值。
  • 在执行系统调用之前取消引用指针print_int,而不是直接从n1和读取要打印的值n2

第一个解决方案将是最简单的。

于 2013-03-23T10:49:03.340 回答