2017-02-07 3 views
-1

与えられた数の因数を出力するプロシージャのコードを作成しました。しかし、ユーザーが終了する前にネガを入力するまでは、ユーザーに番号を尋ねる必要があります。ドライバのループのチェックを作成する

それがこの

のようなものがn(または終了するには、負の値)の値を入力します見えるように:6

6! 720

のnの値を入力します(または負の値が終了する):9

9! 362880

は、nの値を入力します(または負の値が終了する):11

11! 39916800

は、nの値を入力します(または負の値が終了する):20

20! -2102132736

は、nの値を入力します(または負の値が終了する):100

100! 0

は、nの値を入力します(または負の値が終了する):-1テスト用

ありがとう!

このようなものの代わりに。

番号(または出口に負)の値を入力:5

値が返さテスト120の

おかげです!

fact: 
slti $t0, $a0, 1  # test for n < 1 
beq $t0, $zero, L1 # if n >= 1, go to L1 

li $v0, 1  # return 1 
jr $ra  # return to instruction after jal 

L1: 
addi $sp, $sp, -8 # adjust stack for 2 items 
sw $ra, 4($sp) # save the return address 
sw $a0, 0($sp) # save the argument n 

addi $a0, $a0, -1 # n >= 1; argument gets (n – 1) 
jal fact  # call fact with (n – 1) 

lw $a0, 0($sp) # return from jal: restore argument n 
lw $ra, 4($sp) # restore the return address 
addi $sp, $sp, 8 # adjust stack pointer to pop 2 items 

mul $v0, $a0, $v0 # return n * fact (n – 1) 

jr $ra  # return to the caller 

main: 
la $a0, nreq # get value of n 
li $v0, 4 
syscall 

li $v0, 5  # read value of n 
syscall 
move $a0, $v0  # place value n in $a0 
jal fact  # invoke fact 

move $s0, $v0  #save value returned by facts 

la $a0, ans  # display 
li $v0, 4 
syscall 

move $a0, $s0 
li $v0, 1 
syscall 

la $a0, cr  #display closing 
li $v0, 4 
syscall 

li $v0, 10  # exit 
syscall 

.data 

nreq:.asciiz "のnの値を入力します(または出口への負):" ANS: "!テストのための\ nThanks \ n" は.asciiz

:.asciiz CR "の値が返されるのです"

答えて

0

全体的に、かなり近い。しかし、1つか2つのもの。いくつかのシミュレータは、与えられたシンボルmainのではなく、最低.textアドレスから開始と

私は、fact上、先頭にmainを移動すると思います。たとえば、marsでは、注文を元に戻すまで、これは機能していないようです。

mainは、負の入力のテストが欠落していて、ループしませんでした。ここで

が動作しているようですバージョンは、[無償スタイルのクリーンアップをご容赦ください]です。

.text 
    .globl main 
main: 
    la  $a0,nreq    # get value of n 
    li  $v0,4 
    syscall 

    li  $v0,5     # read value of n 
    syscall 

# NOTE/BUG: add this 
    bltz $v0,exit    # exit program on negative 

    move $a0,$v0     # place value n in $a0 
    jal  fact     # invoke fact 

    move $s0,$v0     # save value returned by facts 

    la  $a0,ans     # display 
    li  $v0,4 
    syscall 

    move $a0,$s0 
    li  $v0,1 
    syscall 

# NOTE: add this 
    li  $v0,4 
    la  $a0,nl 
    syscall 
    j  main 

exit: 
    la  $a0,cr     # display closing 
    li  $v0,4 
    syscall 

    li  $v0,10     # exit 
    syscall 

fact: 
    slti $t0,$a0,1    # test for n < 1 
    beq  $t0,$zero,L1   # if n >= 1, go to L1 

    li  $v0,1     # return 1 
    jr  $ra      # return to instruction after jal 

L1: 
    addi $sp,$sp,-8    # adjust stack for 2 items 
    sw  $ra,4($sp)    # save the return address 
    sw  $a0,0($sp)    # save the argument n 

    addi $a0,$a0,-1    # n >= 1; argument gets (n – 1) 
    jal  fact     # call fact with (n – 1) 

    lw  $a0,0($sp)    # return from jal: restore argument n 
    lw  $ra,4($sp)    # restore the return address 
    addi $sp,$sp,8    # adjust stack pointer to pop 2 items 

    mul  $v0,$a0,$v0    # return n * fact (n – 1) 

    jr  $ra      # return to the caller 

    .data 
nreq:  .asciiz  "Enter a value for n (or negative to exit): " 
ans:  .asciiz  "Value returned is " 
nl:   .asciiz  "\n" 
cr:   .asciiz  "\nThanks for testing!\n" 
関連する問題