Academic Integrity: tutoring, explanations, and feedback — we don’t complete graded work or submit on a student’s behalf.

The program below is using the MIPS instructions set. It is loaded into memory a

ID: 3813121 • Letter: T

Question

The program below is using the MIPS instructions set. It is loaded into memory at address 0x00400000 (starting with 'loop') loop: addi $v0, $ zero, -4 1w $ a2, -8 ($ s1) # There are 5 instructions here beq $t1, $t0, loop # There are 7 instructions here j loop_end # There are 9 instructions here loop_end: write out the value (in decimal) for each field (opcode, rs, rt etc.) of the following instructions and the final machine representations in Binary and Hex. (Be sure to put down all your steps for partial credit in case you make some mistake at any steps)

Explanation / Answer

.data
# const string for welcome
welc: .asciiz "Welcome to SPIM Calculator one.0! "
p_int: .asciiz " Please provide associate degree integer: "
p_op: .asciiz " Please provide associate degree operator: "
i_err: .asciiz " Input Incorrect, unhealthy operator! "
again_str: .asciiz "Another calculation? (y/n)"
rmndr: .asciiz " r: "
new_line: .asciiz " "

int1: .word one # area to carry int one
int2: .word one # area to carry int a pair of
raw_in: .space one # area to carry raw input
op: .space one # area to carry operator char
a_char: .space one # area to carry once more char

out: .word one # area to carry output
remain: .word one # area to carry remainder

#operator constants
c_plus: .ascii "+" # const for +
c_min: .asciiz "-" # const for -
c_mult: .asciiz "*" # const for *
c_divi: .asciiz "/" # const for /
c_eq: .asciiz "=" # const for =
c_no: .asciiz "n" # const for n

.text
.globl main
main: li $v0, four # syscall four, print string
la $a0, welc # provide argument: string
syscall # truly print string

calc: la $t6, stay # load remainder variable
move $t6, $zero # store zero in remainder (reset)

li $v0, four # syscall four, print string
la $a0, purpose # provide argument: string
syscall # truly print string

li $v0, five # tell syscall we wish to browse int one
syscall # truly browse in int one
la $s1, int1 # load int1 into $s1
move $s1, $v0 # copy the number from $v0 to int1

li $v0, four # syscall four, print string
la $a0, purpose # provide argument: string
syscall # truly print string

li $v0, five # tell syscall we wish to browse int a pair of
syscall # truly browse in int a pair of
la $s2, int2 # provide $s2 the address to carry int a pair of
move $s2, $v0 # copy the number from $v0 to $s2

li $v0, four # syscall four, print string
la $a0, p_op # provide argument: string
syscall # truly print string

li $v0, eight # tell syscall we wish to browse operator
la $a0, op # provide $a0 the address to carry the operator
syscall # truly browse in operator

lb $t0, op # load the primary computer memory unit of op
li $t1, '+' # load const for and
li $t2, '-' # load const for minus
li $t3, '*' # load const for multiplying
li $t4, '/' # load const for dividing

la $s0, out # load dead set $s0

beq $t0, $t1, and # we're adding
beq $t0, $t2, minus # we're subtracting
beq $t0, $t3, multi # we're multiplying
beq $t0, $t4, divi # we're dividing
# else
j error # incorrect input

plus: add $s0, $s1, $s2 # add our ints, store in $t0
j print

minus: sub $s0, $s1, $s2 # work out our ints, store in $t0
j print

multi: slt $t1, $t2, $s2 # if our counter is a smaller amount than int2, set $t1 to one
beq $t1, $zero, print # if we've reached int2, we're done
add $s0, $s1, $s1 # add int1 and int1, store in out
j multi # loop

divi: la $t0 stay # load remainder into $t0
move $t0, $s1 # set remainder to dividend
add $s0, $zero, $zero # kicked off to zero, simply just in case
loop: slt $t1, $t0, $s2 # if remainder is a smaller amount than divisor, set 1
beq $t1, $zero, print # if we're done branch to done
sub $t0, $t0, $s2 # sub divisor from remainder, store in remainder
addi $s0, $s0, one # increment quotient by one
j loop # loop

print: li $v0, one # tell syscall we wish to print int
la $a0, int1 # provide syscall int1 to print
syscall # truly print int
li $v0, four # tell syscall we wish to print string
lb $a0, op # tell syscall we wish to print operator
syscall # truly print string
li $v0, one # tell syscall we wish to print int
la $a0, int2 # provide syscall int2 to print
syscall # truly print int
li $v0, four # tell syscall we wish to print string
la $a0, c_eq # tell syscall we wish to print operator
syscall # truly print string
li $v0, one # tell syscall we wish to print number
la $a0, out # provide syscall our output
syscall # truly print int
la $t0, stay # load remainder
beq $t0, $zero, once more # if we've no remainder, end printing
li $v0, four # tell syscall we wish to print string
la $a0, rmndr # tell syscall we wish to print remainder string
syscall # print "r: "
li $v0, one # tell syscall we wish to print int
la $a0, stay # provide syscall our remainder to print
syscall # print remainder

again: li $v0, four # tell syscall we wish to print string
la $a0, printing operation # tell syscall to print printing operation
syscall
la $a0, once more_str # load prompt for again string for syscall
syscall
li $v0, eight # tell syscall we wish to browse string
la $a0, a_char # tell syscall to place it in $a0
syscall
lb $t0, a_char
li $t1, 'n' # get n char thus we are able to compare
beq $t0, $t1, exit # if we have a tendency to ar done, exit
#else loop
j calc # jump to starting

error: li $v0, four # tell syscall we wish to print string
la $a0, i_err # provide syscall what to print
syscall # truly print
j once more # visit prompt for try

exit: li $v0, ten # exit code
syscall #exit!