Question

In: Electrical Engineering

1. Write MIPS assembly code to sum “n” positive integers. Forexample, n=5, read 5 numbers...

1. Write MIPS assembly code to sum “n” positive integers. For example, n=5, read 5 numbers in memory (“.data” section) and add them together.

2. Write MIPS assembly code to calculate N-factorial. Read n from the memory. (Hint: use “.data” to define the content in a memory location)

Solutions

Expert Solution

Program to find sum of 5 positive integers
.data
array:      .word       23,2,45,67,89
arrend:

sum: .asciiz     "The sum of the numbers is: "
newLine:    .asciiz     "\n"
    # Algorithm to sum positive integers
    # sum = 0 (initial sum = 0)
    # for i = 0 to 4
    # sum = sum + array[i]

    # registers:
    #
    .text

main:
    li      $t0,0                   # sum = 0

    la      $t3,array               # pointer to current element of array
    la      $t2,arrend              # load address of array end
    j       test

loop:
    lw      $t4,0($t3)              # load array[i]
    addi    $t3,$t3,4               # increment array pointer

    add     $t0,$t0,$t4             # update sum
test:
    blt     $t3,$t2,loop            # more to do? if yes, loop

    # print message
    li      $v0,4
    la      $a0,sumMessage
    syscall

    # print sum of 5 numbers
    li      $v0,1
    addi    $a0,$t0,0
    syscall

 

Program to find Factorial N

.globl main
  .data
  msgprompt: .word msgprompt_data
  msgres1: .word msgres1_data
  msgres2: .word msgres2_data
   
  msgprompt_data: .asciiz "Positive integer: "
  msgres1_data: .asciiz "The value of factorial("
  msgres2_data: .asciiz ") is "
   
  # every function call has a stack segment of 12 bytes, or 3 words.
  # the space is reserved as follows:
  # 0($sp) is reserved for the initial value given to this call
  # 4($sp) is the space reserved for a return value
  # 8($sp) is the space reserved for the return address.
  # calls may manipulate their parent's data, but parents may not
  # manipulate their child's data.
  # i.e: if we have a call A who has a child call B:
  # B may run:
  # sw $t0, 16($sp)
  # which would store data from $t0 into the parent's return value register
  # A, however, should not(and, in all cases I can think of, cannot) manipulate
  # any data that belongs to a child call.
   
   
  .text
  main:
  # printing the prompt
  #printf("Positive integer: ");
  la $t0, msgprompt # load address of msgprompt into $t0
  lw $a0, 0($t0) # load data from address in $t0 into $a0
  li $v0, 4 # call code for print_string
  syscall # run the print_string syscall
   
  # reading the input int
  # scanf("%d", &number);
  li $v0, 5 # call code for read_int
  syscall # run the read_int syscall
  move $t0, $v0 # store input in $t0
   
  move $a0, $t0 # move input to argument register $a0
  addi $sp, $sp, -12 # move stackpointer up 3 words
  sw $t0, 0($sp) # store input in top of stack
  sw $ra, 8($sp) # store counter at bottom of stack
  jal factorial # call factorial
   
  # when we get here, we have the final return value in 4($sp)
   
  lw $s0, 4($sp) # load final return val into $s0
   
  # printf("The value of 'factorial(%d)' is: %d\n",
  la $t1, msgres1 # load msgres1 address into $t1
  lw $a0, 0($t1) # load msgres1_data value into $a0
  li $v0, 4 # system call for print_string
  syscall # print value of msgres1_data to screen
   
  lw $a0, 0($sp) # load original value into $a0
  li $v0, 1 # system call for print_int
  syscall # print original value to screen
   
  la $t2, msgres2 #load msgres2 address into $t1
  lw $a0, 0($t2) # load msgres_data value into $a0
  li $v0, 4 # system call for print_string
  syscall # print value of msgres2_data to screen
   
  move $a0, $s0 # move final return value from $s0 to $a0 for return
  li $v0, 1 # system call for print_int
  syscall # print final return value to screen
   
  addi $sp, $sp, 12 # move stack pointer back down where we started
   
  # return 0;
  li $v0, 10 # system call for exit
  syscall # exit!
   
   
   
  .text
  factorial:
  # base case - still in parent's stack segment
  lw $t0, 0($sp) # load input from top of stack into register $t0
  #if (x == 0)
  beq $t0, 0, returnOne # if $t0 is equal to 0, branch to returnOne
  addi $t0, $t0, -1 # subtract 1 from $t0 if not equal to 0
   
  # recursive case - move to this call's stack segment
  addi $sp, $sp, -12 # move stack pointer up 3 words
  sw $t0, 0($sp) # store current working number into the top of the stack segment
  sw $ra, 8($sp) # store counter at bottom of stack segment
   
  jal factorial # recursive call
   
  # if we get here, then we have the child return value in 4($sp)
  lw $ra, 8($sp) # load this call's $ra again(we just got back from a jump)
  lw $t1, 4($sp) # load child's return value into $t1
   
  lw $t2, 12($sp) # load parent's start value into $t2
  # return x * factorial(x-1); (not the return statement, but the multiplication)
  mul $t3, $t1, $t2 # multiply child's return value by parent's working value, store in $t3.
   
  sw $t3, 16($sp) # take result(in $t3), store in parent's return value.
   
  addi $sp, $sp, 12 # move stackpointer back down for the parent call
   
  jr $ra # jump to parent call
   
  .text
  #return 1;
  returnOne:
  li $t0, 1 # load 1 into register $t0
  sw $t0, 4($sp) # store 1 into the parent's return value register
  jr $ra # jump to parent call

Related Solutions

Write MIPs program that will read two integers from the user and compute for the sum...
Write MIPs program that will read two integers from the user and compute for the sum and difference of the two integers. Ask the user whether he wants to repeat the program : "[Y/y] / [N/n] ?".
Write a C++ program to read N numbers. Find sum, product, and average of N numbers
Write a C++ program to read N numbers. Find sum, product, and average of N numbers
Write a MIPS assembly program to calculate the Fibonacci numbers from 1..n using the recursive method....
Write a MIPS assembly program to calculate the Fibonacci numbers from 1..n using the recursive method. The definition of a Fibonacci number is F(n) = F(n-1) + F(n-2). The implementation must follow the following guidelines: Prompt the user for a number n Allocate heap memory to hold the exact number of elements in the Fibonacci sequence for n Implement recursive Fibonacci method as a subprogram Print the Fibonacci sequence array
Write a MIPS assembly program to repeatedly read two non-negative integers and print the integer product...
Write a MIPS assembly program to repeatedly read two non-negative integers and print the integer product and quotient without using the multiplication and division instructions. Each input number will be entered on a separate line. Your program will terminate when two zeroes are entered by the user. If only the second number in a pair is zero, then a divide-by-zero error message should be printed for the division operation. Use comments generously in your program. Test your program with the...
Write a MIPS assembly program to repeatedly read two non-negative integers and print the integer product...
Write a MIPS assembly program to repeatedly read two non-negative integers and print the integer product and quotient without using the multiplication and division instructions. Each input number will be entered on a separate line. Your program will terminate when two zeroes are entered by the user. If only the second number in a pair is zero, then a divide-by-zero error message should be printed for the division operation. Use comments generously in your program. Test your program with the...
Write a MIPS assembly program to repeatedly read two non-negative integers and print the integer product...
Write a MIPS assembly program to repeatedly read two non-negative integers and print the integer product and quotient without using the multiplication and division instructions. Each input number will be entered on a separate line. Your program will terminate when two zeroes are entered by the user. If only the second number in a pair is zero, then a divide-by-zero error message should be printed for the division operation. Use comments generously in your program. Test your program with the...
Write a MIPS assembly program to repeatedly read two non-negative integers and print the integer product...
Write a MIPS assembly program to repeatedly read two non-negative integers and print the integer product and quotient without using the multiplication and division instructions. Each input number will be entered on a separate line. Your program will terminate when two zeroes are entered by the user. If only the second number in a pair is zero, then a divide-by-zero error message should be printed for the division operation. Use comments generously in your program. Test your program with the...
This is to be done with MIPS assembly language. Write MIPS code which is equivalent to...
This is to be done with MIPS assembly language. Write MIPS code which is equivalent to the follow java program: int day = (int)(Math.random() * 7); switch (day) { case 1: System.out.println(“Monday”); break case 2: System.out.println(“Tuesday”); break case 3: System.out.println(“Wednesday”); break case 4: System.out.println(“Thursday”); break case 5: System.out.println(“Friday”); break case 6: System.out.println(“Saturday”); break case 0: System.out.println(“Sunday”); break }
MIPS Assembly program: Accept N numbers from the user and sort the N numbers using any...
MIPS Assembly program: Accept N numbers from the user and sort the N numbers using any sorting algorithm. Print both the sorted array and unsorted array. N should be greater than or equal to 10.
Binary Search. Write a MIPS assembly program to perform a binary search on A[10], which is an array of 10 positive integers.
Binary Search. Write a MIPS assembly program to perform a binary search on A[10], which is an array of 10 positive integers. Your program should have a main routine that does the following:(a) Prompt the user to enter all the 10 integers in the array.(b) Prompt the user to enter the number to be searched.(c) Reads the integer values and makes sure it is a positive integer.(d) Prints the index of the integer. If the input is not available in...
ADVERTISEMENT
ADVERTISEMENT
ADVERTISEMENT