2013-03-22 122 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直接打印的值。

第一個解決方案將是最簡單的。