0

10回繰り返すプログラムを書く必要があります。値を更新して画面に出力するたびに。

スタックを作成し、値を保存して、プログラムを続行するために繰り返して正しい部分に到達できるようにするために、何かをしなければならないことを私は知っています。Ivは多くのことを試みましたが、私はそれを理解できません。これがこれまでの私のコードです

# ############################################################### #
# Phase2.ASM                                                      #
#                                                                 #
# This program will recurse 10 times and show how much interest   #
# is made after 10        "months"                                        #
#                                                                 #
# ############################################################### #   

.data

PRINCIPAL:  .float  100.0   # principal = $100.00
INTEREST_RATE:  .float  0.012   # interest  = 1.2%

promptFirst:     .asciiz "Your starting Principal is $100.00: \n"
promptSecond:     .asciiz "Your interest rate is 1.2%: \n"
promptNow:          .asciiz "Interest Made After a Month:\n"
.text
.globl main

main:   



First:   
     # 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   


Second:  
     # 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    



jal CI


j EXIT



CI:




    la  $a0, PRINCIPAL  # load the address of the principal
    la  $a1, INTEREST_RATE  # load the address of the principal

    lwc1  $f2, ($a0)    # load the principal
    lwc1  $f4, ($a1)    # load the interest rate    
    mul.s $f12, $f4, $f2    # calculate the balance


    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

jr $ra




EXIT:    
jr $ra


# END OF THE LINES ###############################################

これまでの私の現在の出力:

開始元本は$100.00です:

あなたの金利は1.2%です:

1か月後に行われた関心:

1.20000005

どんな助けでも本当にありがたいです。私はアセンブリプログラミングが本当にひどいです。

PS:割り当ては再帰を介して行われる必要があります

編集!新しいコード

# ############################################################### #
# Phase2.ASM                                                      #
#                                                                 #
# This program will recurse 10 times and show how much interest   #
# is made after 10     "months"                                       #
#                                                                 #
# ############################################################### #   

.data

PRINCIPAL:  .float  100.0   # principal = $100.00
INTEREST_RATE:  .float  1.012   # interest  = 1.2%

promptFirst:     .asciiz "Your starting Principal is $100.00: \n"
promptSecond:     .asciiz "Your interest rate is 1.2%: \n"
promptNow:          .asciiz "\nYour Balance After A Month:\n"
.text
.globl main

main:   



First:   
     # 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   


Second:  
     # 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    


li $t1, 0
jal CI

ENDCI:
j EXIT



CI:



    add $t1, $t1, 1 
    la  $a0, PRINCIPAL      # load the address of the principal
    la  $a1, INTEREST_RATE  # load the address of the principal

    lwc1  $f2, ($a0)        # load the principal
    lwc1  $f4, ($a1)        # load the interest rate    
    mul.s $f12, $f4, $f2    # calculate the balance


    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

    beq $t1, 10, ENDCI
    jal CI
jr $ra




EXIT:    
jr $ra


# END OF THE LINES ###############################################

新しい出力:

開始元本は$100.00です:あなたの利率は1.2%です:

1か月後の残高:

101.19999695

1か月後の残高:

101.19999695

1か月後の残高:

101.19999695

1か月後の残高:

101.19999695

1か月後の残高:

101.19999695

1か月後の残高:

101.19999695

1か月後の残高:

101.19999695

1か月後の残高:

101.19999695

1か月後の残高:

101.19999695

1か月後の残高:

101.19999695

だから私は10回繰り返すコードを手に入れました。前月に表示されるように金額を更新する必要があります+追加された利息

4

2 に答える 2

1

次の呼び出しで元の値が使用され続けないように、更新のたびに現在の残高を保存する必要があります。

つまり、次のようなものです。

lwc1  $f2, ($a0)        # load the principal
lwc1  $f4, ($a1)        # load the interest rate    
mul.s $f12, $f4, $f2    # calculate the balance
swc1  $f12, ($a0)

追加の呼び出しを行う前にCI、現在の差出人住所を保存してから、差出人住所を復元する必要があります。

addi $sp,$sp,-4     # push the current return address
sw   $ra,($sp)      # ...
beq  $t1, 10, CIRET
jal  CI
CIRET:
lw   $ra,($sp)      # pop the saved return address
addi $sp,$sp,4      # ....
jr   $ra
于 2013-03-11T08:50:23.067 に答える
0

この問題は再帰を必要としません-単純なループで十分です。アセンブリのループは、コードの条件付きジャンプアップ(または条件付きジャンプアップと組み合わせた無条件ジャンプアップ)です。

条件はカウンターベースであり、カウンターは0から9、または9から0になります。通常、アセンブリでは、ゼロとの比較に基づいて条件付きジャンプを実行する方が簡単です。

于 2013-03-11T01:46:45.517 に答える