MIPS Assembly Language Programming Exercise: Write a program to evaluate 3ab - 2
ID: 3567365 • Letter: M
Question
MIPS Assembly Language Programming Exercise:
Write a program to evaluate 3ab - 2bc - 5a + 20ac - 16
Prompt the user for the values for a, b, and c, all single-precision floating-point values.
To evaluate this, use as few registers as possible. Use the stack to hold all of the
intermediate values. Write the final value to the monitor with an appropriate descriptive
message.
This solution is not working:
.data
prompt: .asciiz "Enter a number: "
x: .float 0.0
y: .float 0.0
z: .float 0.0
.text
.globl main
main:
li.s $f7, 16.0
li.s $f0, 0.0
li.s $f1, 0.0
li.s $f2, 0.0
la $a0, prompt # print prompt
li $v0, 4
syscall
li $v0, 6
syscall # get a
s.s $f0 , x # store in x
nop
li $v0, 4
syscall # print prompt again
li $v0, 6
syscall
s.s $f0, y # store in y
nop
li $v0, 4
syscall # print prompt again
li $v0, 6
syscall
s.s $f0, z # store in z
nop
# get x, y, and z
l.s $f1, x
l.s $f2, y
l.s $f3, z
li.s $f4, 3.0
mul.s $f5, $f1, $f2 # a * b
mul.s $f5, $f5, $f4 # 3ab
addi $sp, $sp, -4
mfc1 $t1, $f5 # $t1 = f1
sw $t1, ($sp) # push 3ab onto stack
nop
li.s $f4, -2.0
mul.s $f5, $f2, $f3 # b * c
mul.s $f5, $f5, $f3 # -2bc
addi $sp, $sp, -4
mfc1 $t1, $f5 # $t1 = f1
sw $t1, ($sp) # push -2bc onto stack
nop
li.s $f4, -5.0
mul.s $f5, $f4, $f1 # 5 * a
addi $sp, $sp, -4
mfc1 $t1, $f5 # $t1 = f1
sw $t1, ($sp) # push -5a onto stack
nop
li.s $f4, 20.0
mul.s $f5, $f1, $f3 # a * c
mul.s $f5, $f5, $f4 # 20ac
addi $sp, $sp, -4
mfc1 $t1, $f5 # $t1 = f1
sw $t1, ($sp) # push 20ac onto stack ( top of stack )
nop
li.s $f4, -16.0
lw $t1, ($sp) # pop 20ac
nop
mtc1 $t1, $f5 # $f5 = $t1
addi $sp, $sp, 4
add.s $f4, $f5, $f4 # 20ac - 16
lw $t1, ($sp) # pop -5a
nop
mtc1 $t1, $f5 # $f5 = $t1
addi $sp, $sp, 4
add.s $f4, $f5, $f4 # - 5a + 20ac - 16
lw $t1, ($sp) # pop -2bc
nop
mtc1 $t1, $f5 # $f5 = $t1
addi $sp, $sp, 4
add.s $f4, $f5, $f4 # - 2bc - 5a + 20ac - 16
lw $t1, ($sp) # pop 3ab
nop
mtc1 $t1, $f5 # $f5 = $t1
addi $sp, $sp, 4
add.s $f4, $f5, $f4 # 3ab - 2bc - 5a + 20ac - 16
li $v0, 10
syscall # exit
Can someone please post the correct Assembly Language code for this problem?
Explanation / Answer
li.s $f7, 16.0
li.s $f0, 0.0
li.s $f1, 0.0
li.s $f2, 0.0
la $a0, prompt # print prompt
li $v0, 4
syscall
li $v0, 6
syscall # get a
s.s $f0 , x # store in x
nop
li $v0, 4
syscall # print prompt again
li $v0, 6
syscall
s.s $f0, y # store in y
nop
li $v0, 4
syscall # print prompt again
li $v0, 6
syscall
s.s $f0, z # store in z
nop
# get x, y, and z
l.s $f1, x
l.s $f2, y
l.s $f3, z
li.s $f4, 3.0
mul.s $f5, $f1, $f2 # a * b
mul.s $f5, $f5, $f4 # 3ab
addi $sp, $sp, -4
mfc1 $t1, $f5 # $t1 = f1
sw $t1, ($sp) # push 3ab onto stack
nop
li.s $f4, -2.0
mul.s $f5, $f2, $f3 # b * c
mul.s $f5, $f5, $f3 # -2bc
addi $sp, $sp, -4
mfc1 $t1, $f5 # $t1 = f1
sw $t1, ($sp) # push -2bc onto stack
nop
li.s $f4, -5.0
mul.s $f5, $f4, $f1 # 5 * a
addi $sp, $sp, -4
mfc1 $t1, $f5 # $t1 = f1
sw $t1, ($sp) # push -5a onto stack
nop
li.s $f4, 20.0
mul.s $f5, $f1, $f3 # a * c
mul.s $f5, $f5, $f4 # 20ac
addi $sp, $sp, -4
mfc1 $t1, $f5 # $t1 = f1
sw $t1, ($sp) # push 20ac onto stack ( top of stack )
nop
li.s $f4, -16.0
lw $t1, (sp) # pop 20ac<---- THIS WHERE IT BLOWS UP
nop
mtc1 $t1, $f5 # $f5 = $t1
addu $sp, $sp, 4
addu $f4, $f5, $f4 # 20ac - 16
lw $t1, ($sp) # pop -5a
nop
mtc1 $t1, $f5 # $f5 = $t1
addu $sp, $sp, 4
addu $f4, $f5, $f4 # - 5a + 20ac - 16
lw $t1, ($sp) # pop -2bc
nop
mtc1 $t1, $f5 # $f5 = $t1
addu $sp, $sp, 4
addu $f4, $f5, $f4 # - 2bc - 5a + 20ac - 16
lw $t1, ($sp) # pop 3ab
nop
mtc1 $t1, $f5 # $f5 = $t1
addu $sp, $sp, 4
addu $f4, $f5, $f4 # 3ab - 2bc - 5a + 20ac - 16
li $v0, 10
syscall # exit
Related Questions
Navigate
Integrity-first tutoring: explanations and feedback only — we do not complete graded work. Learn more.