2013-03-22 119 views
0

我的目标是交换交换值:功能jal mips没有做任何事情

但是它没有做任何事情。

我将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 

回答

1

你交换指针,不是他们指出值。当你打印这些值时,你直接从n1n2读取它们,而不是通过交换的指针。

为了解决这个问题,你可以:

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

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