Write in assembly language (in a separatefile named Lab.asm ) the function Avera
ID: 3593825 • Letter: W
Question
Write in assembly language (in a separatefile named Lab.asm ) the function Average.The first parameter is the number of elements in an array, the second is the address of the array. The function will determine the average of the values in the array and return the average rounded to the nearest whole number (if the fractional part of the result is equal to or greater than .5, the result is rounded to the next higher number.
#include <iostream>
using namespace std;
extern "C" long Average(long, long[]);
void main()
{
long Array1[10] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
long Array2[11] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11 };
long Array3[12] = { 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24 };
cout << "Average of Array1 is " << Average(10, Array1) << endl;
cout << "Average of Array2 is " << Average(11, Array2) << endl;
cout << "Average of Array3 is " << Average(12, Array3) << endl;
}
Explanation / Answer
The following answer is the assembly code of function average:
.LC0:
.string "Average of Array1 is "
.LC1:
.string "Average of Array2 is "
.LC2:
.string "Average of Array3 is "
main:
push rbp
mov rbp, rsp
push rbx
sub rsp, 280
mov QWORD PTR [rbp-96], 1
mov QWORD PTR [rbp-88], 2
mov QWORD PTR [rbp-80], 3
mov QWORD PTR [rbp-72], 4
mov QWORD PTR [rbp-64], 5
mov QWORD PTR [rbp-56], 6
mov QWORD PTR [rbp-48], 7
mov QWORD PTR [rbp-40], 8
mov QWORD PTR [rbp-32], 9
mov QWORD PTR [rbp-24], 10
mov QWORD PTR [rbp-192], 1
mov QWORD PTR [rbp-184], 2
mov QWORD PTR [rbp-176], 3
mov QWORD PTR [rbp-168], 4
mov QWORD PTR [rbp-160], 5
mov QWORD PTR [rbp-152], 6
mov QWORD PTR [rbp-144], 7
mov QWORD PTR [rbp-136], 8
mov QWORD PTR [rbp-128], 9
mov QWORD PTR [rbp-120], 10
mov QWORD PTR [rbp-112], 11
mov QWORD PTR [rbp-288], 2
mov QWORD PTR [rbp-280], 4
mov QWORD PTR [rbp-272], 6
mov QWORD PTR [rbp-264], 8
mov QWORD PTR [rbp-256], 10
mov QWORD PTR [rbp-248], 12
mov QWORD PTR [rbp-240], 14
mov QWORD PTR [rbp-232], 16
mov QWORD PTR [rbp-224], 18
mov QWORD PTR [rbp-216], 20
mov QWORD PTR [rbp-208], 22
mov QWORD PTR [rbp-200], 24
mov esi, OFFSET FLAT:.LC0
mov edi, OFFSET FLAT:std::cout
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 rbx, rax
lea rax, [rbp-96]
mov rsi, rax
mov edi, 10
call Average
mov rsi, rax
mov rdi, rbx
call std::basic_ostream<char, std::char_traits<char> >::operator<<(long)
mov esi, OFFSET FLAT:std::basic_ostream<char, std::char_traits<char> >& std::endl<char, std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&)
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:.LC1
mov edi, OFFSET FLAT:std::cout
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 rbx, rax
lea rax, [rbp-192]
mov rsi, rax
mov edi, 11
call Average
mov rsi, rax
mov rdi, rbx
call std::basic_ostream<char, std::char_traits<char> >::operator<<(long)
mov esi, OFFSET FLAT:std::basic_ostream<char, std::char_traits<char> >& std::endl<char, std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&)
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:.LC2
mov edi, OFFSET FLAT:std::cout
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 rbx, rax
lea rax, [rbp-288]
mov rsi, rax
mov edi, 12
call Average
mov rsi, rax
mov rdi, rbx
call std::basic_ostream<char, std::char_traits<char> >::operator<<(long)
mov esi, OFFSET FLAT:std::basic_ostream<char, std::char_traits<char> >& std::endl<char, std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&)
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 eax, 0
add rsp, 280
pop rbx
pop rbp
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 .L5
cmp DWORD PTR [rbp-8], 65535
jne .L5
mov edi, OFFSET FLAT:std::__ioinit
call std::ios_base::Init::Init()
mov edx, OFFSET FLAT:__dso_handle
mov esi, OFFSET FLAT:std::__ioinit
mov edi, OFFSET FLAT:std::ios_base::Init::~Init()
call __cxa_atexit
.L5:
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
Hope this helps .Thank you
Related Questions
drjack9650@gmail.com
Navigate
Integrity-first tutoring: explanations and feedback only — we do not complete graded work. Learn more.