0

再帰ループを使用する複利カウンターとして機能するプログラムをアセンブリで作成しようとしています。設定された元本と設定された金利でプログラムを動作させることができ、それを10回繰り返し、各反復後のバランスを示しました。今、私はそれを変更しようとしているので、ユーザーに開始元本、金利、およびターゲット元本を要求します。次に、プログラムは、ターゲットプリンシパルが満たされるまで繰り返す必要があります。

これは今のところ私の機能していないコードです。私が使用しているレジスターをめちゃくちゃにしていると思います。Ivは、beq行で使用されているこのレジスタを$a2と$a0に変更しようとしましたが、どちらも機能しませんでした。助言がありますか?imが近いか離れている場合はIdk。レジスターをフォローするのに苦労しています=/

promptFirst:        .asciiz "Enter Your Starting Balance: \n"
promptSecond:       .asciiz "Enter the Interst Rate: \n"
promptThird:        .asciiz "Enter Your Target Balance \n"


promptNow:          .asciiz "\nYour Balance After A Iteration:\n"
.text
.globl main

main:   




     # Prints the first prompt  
     li $v0, 4               # syscall number 4 will print string whose address is in $a0       
     la $a0, promptFirst     # "load address" of the string
     syscall                 # actually print the string   

     # Reads in the first operand 
     li $v0, 5               # syscall number 5 will read an int
     syscall                 # actually read the int
     move $s0, $v0           # save result in $s0 for later


     # Prints the second prompt
     li $v0, 4               # syscall number 4 will print string whose address is in $a0   
     la $a0, promptSecond    # "load address" of the string
     syscall                 # actually print the string    

    # Reads in the second operand 
     li $v0, 5               # syscall number 5 will read an int
     syscall                 # actually read the int
     move $s1, $v0           # save result in $s1 for later

    # Prints the third prompt
     li $v0, 4               # syscall number 4 will print string whose address is in $a0   
     la $a0, promptThird    # "load address" of the string
     syscall                 # actually print the string    

    # Reads in the third operand 
     li $v0, 5               # syscall number 5 will read an int
     syscall                 # actually read the int
     move $s2, $v0           # save result in $s2 for later



jal LOOP

ENDLOOP:
j EXIT



LOOP:




    la  $a0, $s0    # load the address of the principal
    la  $a1, $s1    # load the address of the interest
    la  $a2, $s2    # load the address of the goal principal


    lwc1  $f2, ($a0)        # load the principal
    lwc1  $f4, ($a1)        # load the interest rate    
    lwc1  $f6  ($a2)

    mul.s $f12, $f4, $f2    # calculate the balance
    swc1  $f12, ($a0)

    li $v0, 4               # syscall number 4 will print      string whose address is in $a0   
    la $a0, promptNow       # "load address" of the string
    syscall                 # actually print the string
    li  $v0, 2              # system call #2    
    syscall

    addi $sp,$sp,-4     # push the current return address
    sw   $ra,($sp)      
    beq  $f12, $f6, LOOPRET

    beq $f12, $f6, ENDLOOP

    jal LOOP


LOOPRET:

    lw   $ra,($sp)      # pop the saved return address
    addi $sp,$sp,4      
    jr   $ra






EXIT:    
jr $ra

どんな提案でもいいでしょう。私がしなければならない問題にはもっとたくさんのことがあります。しかし、私は最初にこの部分を通過する必要があります。脳が疲れたような気がします

4

1 に答える 1

0
la  $a0, $s0    # load the address of the principal

これもコンパイルされますか?目的はla、ラベルの[A]アドレスを[L]ロードすることです。レジスターのアドレスを取得することはできません。

lwc1  $f2, ($a0)        # load the principal

間違った値を$a0脇に置いlwc1ても、整数から浮動小数点への変換は実行されません。したがって、これを行うことによって適切なフロートを取得することはできません。

おそらくあなたがすべきことは、la/lwc1命令を破棄し、代わりに次のようなものを使用することです。

mtc1 $s0,$f2     # move $s0 to floating point register $f2
cvt.s.w $f2,$f2  # convert the integer in $f2 to a float
# ..similarly for the rest of your values
于 2013-03-25T06:12:11.010 に答える