Write a MIPS program that takes up to 20 integers as input from the user using t
ID: 3911783 • Letter: W
Question
Write a MIPS program that takes up to 20 integers as input from the user using the array frontend and outputs the integers in descending order of value separated by spaces. The code that does not work with the array frontend will not receive any marks. (Hint: Look at the Selection Sort example given below) For example, if the user enters integers 7, 29, 34, 1, 3 one by one using the array front end, the program outputs: 34 2973 1 Make sure you think about corner cases when writing your code. Note only use following instructions .word/add/sub/mult/multu/div/divu/mfhi/mflo/lis/lw/sw/slt/sltu/ beq/bne/ir/jalrExplanation / Answer
.LC0:
.string "value of array"
.LC1:
.string " "
.LC2:
.string "Sorted (Descending Order) Array elements:"
.LC3:
.string " "
main:
push rbp
mov rbp, rsp
sub rsp, 96
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*)
mov DWORD PTR [rbp-4], 0
.L3:
cmp DWORD PTR [rbp-4], 19
jg .L2
lea rax, [rbp-96]
mov edx, DWORD PTR [rbp-4]
movsx rdx, edx
sal rdx, 2
add rax, rdx
mov rsi, rax
mov edi, OFFSET FLAT:_ZSt3cin
call std::basic_istream<char, std::char_traits<char> >::operator>>(int&)
add DWORD PTR [rbp-4], 1
jmp .L3
.L2:
mov DWORD PTR [rbp-4], 0
.L5:
cmp DWORD PTR [rbp-4], 19
jg .L4
mov eax, DWORD PTR [rbp-4]
cdqe
mov eax, DWORD PTR [rbp-96+rax*4]
mov esi, eax
mov edi, OFFSET FLAT:_ZSt4cout
call std::basic_ostream<char, std::char_traits<char> >::operator<<(int)
mov esi, OFFSET FLAT:.LC1
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*)
add DWORD PTR [rbp-4], 1
jmp .L5
.L4:
mov DWORD PTR [rbp-4], 0
.L10:
cmp DWORD PTR [rbp-4], 19
jg .L6
mov eax, DWORD PTR [rbp-4]
add eax, 1
mov DWORD PTR [rbp-8], eax
.L9:
cmp DWORD PTR [rbp-8], 19
jg .L7
mov eax, DWORD PTR [rbp-4]
cdqe
mov edx, DWORD PTR [rbp-96+rax*4]
mov eax, DWORD PTR [rbp-8]
cdqe
mov eax, DWORD PTR [rbp-96+rax*4]
cmp edx, eax
jge .L8
mov eax, DWORD PTR [rbp-4]
cdqe
mov eax, DWORD PTR [rbp-96+rax*4]
mov DWORD PTR [rbp-12], eax
mov eax, DWORD PTR [rbp-8]
cdqe
mov edx, DWORD PTR [rbp-96+rax*4]
mov eax, DWORD PTR [rbp-4]
cdqe
mov DWORD PTR [rbp-96+rax*4], edx
mov eax, DWORD PTR [rbp-8]
cdqe
mov edx, DWORD PTR [rbp-12]
mov DWORD PTR [rbp-96+rax*4], edx
.L8:
add DWORD PTR [rbp-8], 1
jmp .L9
.L7:
add DWORD PTR [rbp-4], 1
jmp .L10
.L6:
mov esi, OFFSET FLAT:.LC2
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 DWORD PTR [rbp-4], 0
.L12:
cmp DWORD PTR [rbp-4], 19
jg .L11
mov eax, DWORD PTR [rbp-4]
cdqe
mov eax, DWORD PTR [rbp-96+rax*4]
mov esi, eax
mov edi, OFFSET FLAT:_ZSt4cout
call std::basic_ostream<char, std::char_traits<char> >::operator<<(int)
mov esi, OFFSET FLAT:.LC3
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*)
add DWORD PTR [rbp-4], 1
jmp .L12
.L11:
mov esi, OFFSET FLAT:_ZSt4endlIcSt11char_traitsIcEERSt13basic_ostreamIT_T0_ES6_
mov edi, OFFSET FLAT:_ZSt4cout
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 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 .L16
cmp DWORD PTR [rbp-8], 65535
jne .L16
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
.L16:
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
Related Questions
drjack9650@gmail.com
Navigate
Integrity-first tutoring: explanations and feedback only — we do not complete graded work. Learn more.