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
Related Questions
drjack9650@gmail.com
Navigate
Integrity-first tutoring: explanations and feedback only — we do not complete graded work. Learn more.