Question

.data prompt: .asciiz "Input an integer x:\n" result: .asciiz "Fact(x) = " .text main: # show prompt li $v0, 4 la $a0, prompt syscall # read x li $v0, 5 syscall # function call move $a...

.data prompt: .asciiz "Input an integer x:\n" result: .asciiz "Fact(x) = " .text main: # show prompt li $v0, 4 la $a0, prompt syscall # read x li $v0, 5 syscall # function call move $a0, $v0 jal factorial # jump factorial and save position to $ra move $t0, $v0 # $t0 = $v0 # show prompt li $v0, 4 la $a0, result syscall # print the result li $v0, 1 # system call #1 - print int move $a0, $t0 # $a0 = $t0 syscall # execute # return 0 li $v0, 10 # $v0 = 10 syscall .text factorial: # base case -- still in parent's stack segment # adjust stack pointer to store return address and argument addi $sp, $sp, -8 # save $s0 and $ra sw $s0, 4($sp) sw $ra, 0($sp) bne $a0, 0, else addi $v0, $zero, 1 # return 1 j fact_return else: # backup $a0 move $s0, $a0 addi $a0, $a0, -1 # x -= 1 jal factorial # when we get here, we already have Fact(x-1) store in $v0 multu $s0, $v0 # return x*Fact(x-1) mflo $v0 fact_return: lw $s0, 4($sp) lw $ra, 0($sp) addi $sp, $sp, 8 jr $ra this code almost works but i need it to only do factorial between 0 and 10 and give Invaled Entry! for everything else

0 0
Add a comment Improve this question Transcribed image text
Answer #1

fact.asm:

.data
prompt: .asciiz "Input an integer x:\n"
result: .asciiz "Fact(x) = "
error: .asciiz "Invalid Entry!"
.text
main:
# show prompt
   li $v0, 4
   la $a0, prompt
   syscall # read x
   li $v0, 5
   syscall
   move $a0, $v0
   move $t7,$a0       # function call
   bgt $t7,10,exit
   blt $t7,0,exit
   jal factorial # jump factorial and save position to $ra
   move $t0, $v0 # $t0 = $v0 # show prompt
   li $v0, 4
   la $a0, result
   syscall # print the result
   li $v0, 1 # system call #1 - print int
   move $a0, $t0 # $a0 = $t0
   syscall
   li $v0, 10 # $v0 = 10
   syscall
exit:    li $v0, 4
   la $a0, error
   syscall # read x
   li $v0, 10 # $v0 = 10
   syscall

factorial:    addi $sp, $sp, -8# base case -- still in parent's stack segment # adjust stack pointer to store return address and argument
           sw $s0, 4($sp) # save $s0 and $ra
           sw $ra, 0($sp)
       bne $t7, 0, else
       addi $v0, $zero, 1 # return 1
       j fact_return
else: # backup $a0
       move $s0, $t7
       addi $t7, $t7, -1 # x -= 1
       jal factorial # when we get here, we already have Fact(x-1) store in $v0
       multu $s0, $v0 # return x*Fact(x-1)
       mflo $v0
fact_return:    lw $s0, 4($sp)
       lw $ra, 0($sp)
       addi $sp, $sp, 8
       jr $ra


Output:

Mars Messages Run I/o Input an integer x: Invalid Entry! - program is finished running - - Input an integer x: Invalid Entry!

Add a comment
Know the answer?
Add Answer to:
.data prompt: .asciiz "Input an integer x:\n" result: .asciiz "Fact(x) = " .text main: # show prompt li $v0, 4 la $a0, prompt syscall # read x li $v0, 5 syscall # function call move $a...
Your Answer:

Post as a guest

Your Name:

What's your source?

Earn Coins

Coins can be redeemed for fabulous gifts.

Not the answer you're looking for? Ask your own homework help question. Our experts will answer your question WITHIN MINUTES for Free.
Similar Homework Help Questions
ADVERTISEMENT
Free Homework Help App
Download From Google Play
Scan Your Homework
to Get Instant Free Answers
Need Online Homework Help?
Ask a Question
Get Answers For Free
Most questions answered within 3 hours.
ADVERTISEMENT
ADVERTISEMENT
ADVERTISEMENT