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

Write a MIPS program in the MARS simulator to evaluate: 5x^2 + 2xy - y^2 + 1 x a

ID: 3742452 • Letter: W

Question

Write a MIPS program in the MARS simulator to evaluate:
5x^2 + 2xy - y^2 + 1
x and y are user inputs the program should receive at runtime. The program should print the outcome of the expression.

Also, implement this program using two subroutines:
int sqr (a): Return a^2.
int multiply (a, b): Return a*b. Do NOT use the mult instruction in MIPS.

I would really appreciate it if the code included comments, so I can learn how to do similar problems. I'm mostly confused on creating and then calling the subroutines. Thank you.

Explanation / Answer

std::sqrt(float):

push rbp

mov rbp, rsp

sub rsp, 16

movss DWORD PTR [rbp-4], xmm0

movss xmm0, DWORD PTR [rbp-4]

call sqrtf

leave

ret

.LC0:

.string "Enter coefficients a, b and c: "

.LC4:

.string "Roots are real and different."

.LC5:

.string "x1 = "

.LC6:

.string "x2 = "

.LC7:

.string "Roots are real and same."

.LC8:

.string "x1 = x2 ="

.LC9:

.string "Roots are complex and different."

.LC10:

.string "+"

.LC11:

.string "i"

.LC12:

.string "-"

main:

push rbp

mov rbp, rsp

sub rsp, 48

mov esi, OFFSET FLAT:.LC0

mov edi, OFFSET FLAT:_ZSt4cout

call std::basic_ostream<char, std::char_traits<char> >& std::operator<< <std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&, char const*)

lea rax, [rbp-24]

mov rsi, rax

mov edi, OFFSET FLAT:_ZSt3cin

call std::basic_istream<char, std::char_traits<char> >::operator>>(float&)

mov rdx, rax

lea rax, [rbp-28]

mov rsi, rax

mov rdi, rdx

call std::basic_istream<char, std::char_traits<char> >::operator>>(float&)

mov rdx, rax

lea rax, [rbp-32]

mov rsi, rax

mov rdi, rdx

call std::basic_istream<char, std::char_traits<char> >::operator>>(float&)

movss xmm1, DWORD PTR [rbp-28]

movss xmm0, DWORD PTR [rbp-28]

mulss xmm0, xmm1

movss xmm2, DWORD PTR [rbp-24]

movss xmm1, DWORD PTR .LC1[rip]

mulss xmm2, xmm1

movss xmm1, DWORD PTR [rbp-32]

mulss xmm1, xmm2

subss xmm0, xmm1

movss DWORD PTR [rbp-4], xmm0

movss xmm0, DWORD PTR [rbp-4]

pxor xmm1, xmm1

comiss xmm0, xmm1

jbe .L12

movss xmm0, DWORD PTR [rbp-4]

call std::sqrt(float)

movaps xmm1, xmm0

movss xmm0, DWORD PTR [rbp-28]

subss xmm1, xmm0

movss xmm0, DWORD PTR [rbp-24]

addss xmm0, xmm0

divss xmm1, xmm0

movaps xmm0, xmm1

movss DWORD PTR [rbp-8], xmm0

movss xmm0, DWORD PTR [rbp-28]

movss xmm1, DWORD PTR .LC3[rip]

xorps xmm0, xmm1

movss DWORD PTR [rbp-36], xmm0

movss xmm0, DWORD PTR [rbp-4]

call std::sqrt(float)

movss xmm1, DWORD PTR [rbp-36]

subss xmm1, xmm0

movss xmm0, DWORD PTR [rbp-24]

addss xmm0, xmm0

divss xmm1, xmm0

movaps xmm0, xmm1

movss DWORD PTR [rbp-12], xmm0

mov esi, OFFSET FLAT:.LC4

mov edi, OFFSET FLAT:_ZSt4cout

call std::basic_ostream<char, std::char_traits<char> >& std::operator<< <std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&, char const*)

mov esi, OFFSET FLAT:_ZSt4endlIcSt11char_traitsIcEERSt13basic_ostreamIT_T0_ES6_

mov rdi, rax

call std::basic_ostream<char, std::char_traits<char> >::operator<<(std::basic_ostream<char, std::char_traits<char> >& (*)(std::basic_ostream<char, std::char_traits<char> >&))

mov esi, OFFSET FLAT:.LC5

mov edi, OFFSET FLAT:_ZSt4cout

call std::basic_ostream<char, std::char_traits<char> >& std::operator<< <std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&, char const*)

movss xmm0, DWORD PTR [rbp-8]

mov rdi, rax

call std::basic_ostream<char, std::char_traits<char> >::operator<<(float)

mov esi, OFFSET FLAT:_ZSt4endlIcSt11char_traitsIcEERSt13basic_ostreamIT_T0_ES6_

mov rdi, rax

call std::basic_ostream<char, std::char_traits<char> >::operator<<(std::basic_ostream<char, std::char_traits<char> >& (*)(std::basic_ostream<char, std::char_traits<char> >&))

mov esi, OFFSET FLAT:.LC6

mov edi, OFFSET FLAT:_ZSt4cout

call std::basic_ostream<char, std::char_traits<char> >& std::operator<< <std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&, char const*)

movss xmm0, DWORD PTR [rbp-12]

mov rdi, rax

call std::basic_ostream<char, std::char_traits<char> >::operator<<(float)

mov esi, OFFSET FLAT:_ZSt4endlIcSt11char_traitsIcEERSt13basic_ostreamIT_T0_ES6_

mov rdi, rax

call std::basic_ostream<char, std::char_traits<char> >::operator<<(std::basic_ostream<char, std::char_traits<char> >& (*)(std::basic_ostream<char, std::char_traits<char> >&))

jmp .L6

.L12:

pxor xmm0, xmm0

ucomiss xmm0, DWORD PTR [rbp-4]

jp .L7

pxor xmm0, xmm0

ucomiss xmm0, DWORD PTR [rbp-4]

jne .L7

mov esi, OFFSET FLAT:.LC7

mov edi, OFFSET FLAT:_ZSt4cout

call std::basic_ostream<char, std::char_traits<char> >& std::operator<< <std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&, char const*)

mov esi, OFFSET FLAT:_ZSt4endlIcSt11char_traitsIcEERSt13basic_ostreamIT_T0_ES6_

mov rdi, rax

call std::basic_ostream<char, std::char_traits<char> >::operator<<(std::basic_ostream<char, std::char_traits<char> >& (*)(std::basic_ostream<char, std::char_traits<char> >&))

movss xmm0, DWORD PTR [rbp-4]

call std::sqrt(float)

movaps xmm1, xmm0

movss xmm0, DWORD PTR [rbp-28]

subss xmm1, xmm0

movss xmm0, DWORD PTR [rbp-24]

addss xmm0, xmm0

divss xmm1, xmm0

movaps xmm0, xmm1

movss DWORD PTR [rbp-8], xmm0

mov esi, OFFSET FLAT:.LC8

mov edi, OFFSET FLAT:_ZSt4cout

call std::basic_ostream<char, std::char_traits<char> >& std::operator<< <std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&, char const*)

movss xmm0, DWORD PTR [rbp-8]

mov rdi, rax

call std::basic_ostream<char, std::char_traits<char> >::operator<<(float)

mov esi, OFFSET FLAT:_ZSt4endlIcSt11char_traitsIcEERSt13basic_ostreamIT_T0_ES6_

mov rdi, rax

call std::basic_ostream<char, std::char_traits<char> >::operator<<(std::basic_ostream<char, std::char_traits<char> >& (*)(std::basic_ostream<char, std::char_traits<char> >&))

jmp .L6

.L7:

movss xmm0, DWORD PTR [rbp-28]

movss xmm1, DWORD PTR .LC3[rip]

xorps xmm1, xmm0

movss xmm0, DWORD PTR [rbp-24]

addss xmm0, xmm0

divss xmm1, xmm0

movaps xmm0, xmm1

movss DWORD PTR [rbp-16], xmm0

movss xmm0, DWORD PTR [rbp-4]

movss xmm1, DWORD PTR .LC3[rip]

xorps xmm0, xmm1

call std::sqrt(float)

movaps xmm1, xmm0

movss xmm0, DWORD PTR [rbp-24]

addss xmm0, xmm0

divss xmm1, xmm0

movaps xmm0, xmm1

movss DWORD PTR [rbp-20], xmm0

mov esi, OFFSET FLAT:.LC9

mov edi, OFFSET FLAT:_ZSt4cout

call std::basic_ostream<char, std::char_traits<char> >& std::operator<< <std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&, char const*)

mov esi, OFFSET FLAT:_ZSt4endlIcSt11char_traitsIcEERSt13basic_ostreamIT_T0_ES6_

mov rdi, rax

call std::basic_ostream<char, std::char_traits<char> >::operator<<(std::basic_ostream<char, std::char_traits<char> >& (*)(std::basic_ostream<char, std::char_traits<char> >&))

mov esi, OFFSET FLAT:.LC5

mov edi, OFFSET FLAT:_ZSt4cout

call std::basic_ostream<char, std::char_traits<char> >& std::operator<< <std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&, char const*)

movss xmm0, DWORD PTR [rbp-16]

mov rdi, rax

call std::basic_ostream<char, std::char_traits<char> >::operator<<(float)

mov esi, OFFSET FLAT:.LC10

mov rdi, rax

call std::basic_ostream<char, std::char_traits<char> >& std::operator<< <std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&, char const*)

movss xmm0, DWORD PTR [rbp-20]

mov rdi, rax

call std::basic_ostream<char, std::char_traits<char> >::operator<<(float)

mov esi, OFFSET FLAT:.LC11

mov rdi, rax

call std::basic_ostream<char, std::char_traits<char> >& std::operator<< <std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&, char const*)

mov esi, OFFSET FLAT:_ZSt4endlIcSt11char_traitsIcEERSt13basic_ostreamIT_T0_ES6_

mov rdi, rax

call std::basic_ostream<char, std::char_traits<char> >::operator<<(std::basic_ostream<char, std::char_traits<char> >& (*)(std::basic_ostream<char, std::char_traits<char> >&))

mov esi, OFFSET FLAT:.LC6

mov edi, OFFSET FLAT:_ZSt4cout

call std::basic_ostream<char, std::char_traits<char> >& std::operator<< <std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&, char const*)

movss xmm0, DWORD PTR [rbp-16]

mov rdi, rax

call std::basic_ostream<char, std::char_traits<char> >::operator<<(float)

mov esi, OFFSET FLAT:.LC12

mov rdi, rax

call std::basic_ostream<char, std::char_traits<char> >& std::operator<< <std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&, char const*)

movss xmm0, DWORD PTR [rbp-20]

mov rdi, rax

call std::basic_ostream<char, std::char_traits<char> >::operator<<(float)

mov esi, OFFSET FLAT:.LC11

mov rdi, rax

call std::basic_ostream<char, std::char_traits<char> >& std::operator<< <std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&, char const*)

mov esi, OFFSET FLAT:_ZSt4endlIcSt11char_traitsIcEERSt13basic_ostreamIT_T0_ES6_

mov rdi, rax

call std::basic_ostream<char, std::char_traits<char> >::operator<<(std::basic_ostream<char, std::char_traits<char> >& (*)(std::basic_ostream<char, std::char_traits<char> >&))

.L6:

mov eax, 0

leave

ret

__static_initialization_and_destruction_0(int, int):

push rbp

mov rbp, rsp

sub rsp, 16

mov DWORD PTR [rbp-4], edi

mov DWORD PTR [rbp-8], esi

cmp DWORD PTR [rbp-4], 1

jne .L15

cmp DWORD PTR [rbp-8], 65535

jne .L15

mov edi, OFFSET FLAT:_ZStL8__ioinit

call std::ios_base::Init::Init() [complete object constructor]

mov edx, OFFSET FLAT:__dso_handle

mov esi, OFFSET FLAT:_ZStL8__ioinit

mov edi, OFFSET FLAT:_ZNSt8ios_base4InitD1Ev

call __cxa_atexit

.L15:

nop

leave

ret

_GLOBAL__sub_I_main:

push rbp

mov rbp, rsp

mov esi, 65535

mov edi, 1

call __static_initialization_and_destruction_0(int, int)

pop rbp

ret

.LC1:

.long 1082130432

.LC3:

.long 2147483648

.long 0

.long 0

.long 0

Hire Me For All Your Tutoring Needs
Integrity-first tutoring: clear explanations, guidance, and feedback.
Drop an Email at
drjack9650@gmail.com
Chat Now And Get Quote