0

私の目標は、 swap: 関数の値を交換することです

しかし、それは何もしていません。

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

ポインタが指す値ではなく、ポインタを交換ています。そして、あなたが値を印刷するとき、あなたはあなたが交換したポインターを通してではなく、n1直接それらを読みます。n2

これを修正するには、次のようにします。

  • を呼び出す前に、(アドレスではなく)n1との値をロードします。次に、とから値を再ロードする代わりに、印刷してから実行します。n2swap$a0$a1n1n2
  • 実際に値を交換するには、swap内のポインターを逆参照します。
  • およびprint_intから直接出力する値を読み取る代わりに、syscallを実行する前にポインタを逆参照します。n1n2

最初の解決策が最も簡単です。

于 2013-03-23T10:49:03.340 に答える