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

In Assembly x86 please Write the three functions (Square, Multiply, and Divide)

ID: 3590212 • Letter: I

Question

In Assembly x86 please

Write the three functions (Square, Multiply, and Divide) required for the following C++ program. Square and Multiply will return the result to the calling program and will also call PrintResult to display the answer. If successful, Divide will return a 1, set the value of the result and the remainder into the appropriate parameters, and call PrintResult twice (once for result and once for remainder). If Divide is not successful, it will return a 0 and call PrintResult to display the failure message. Link them to the above program to demonstrate their functionality.

The C++ Project is:

#include <iostream>

using namespace std;

enum ResultCode       {ShowSquare, ShowMultiply, ShowDivide, ShowRemainder, ShowDivideFailure};

enum SuccessCode   {Failure, Success};

extern "C" SuccessCode Divide (long, long, long &, long &);

extern "C" long Multiply (long, long);

extern "C" void PrintResult (ResultCode, long);

extern "C" long Square (long);

void main ()

   {

   long Num1;

   long Num2;

   long Result;

   long Remainder;

   do

       {

       cout << "Enter Number to Square" << endl;

       cin >> Num1;

       Result = Square (Num1);

       cout << "Square is: " << Result << endl;

       cout << "Enter two numbers to multiply" << endl;

       cin >> Num1 >> Num2;

       Result = Multiply (Num1, Num2);

       cout << "Result of multiply is: " << Result << endl;

       cout << "Enter mumber to divide into then number to divide by" << endl;

       cin >> Num1 >> Num2;

       if (Divide (Num1, Num2, Result, Remainder) == Success)

               cout << "Result is " << Result << " and remainder is " << Remainder << endl;

           else

               cout << "Attempted division by zero";

       } while (Result > 0);

   }

void PrintResult (ResultCode PrintCode, long Value)

   {

   switch (PrintCode)

       {

       case ShowSquare:

               cout << "Display of square is: " << Value << endl;

               break;

       case ShowMultiply:

               cout << "Display of multiply is: " << Value << endl;

               break;

       case ShowDivide:

               cout << "Display of divide is " << Value << endl;

               break;

       case ShowRemainder:

               cout << "Display of remainder is " << Value << endl;

               break;

       case ShowDivideFailure:

               cout << "Display of Division by zero" << endl;

               break;

       default:

               cout << "Error in assembly routines" << endl;

       }

   }

Explanation / Answer

.LC0:

.string "Enter Number to Square"

.LC1:

.string "Square is: "

.LC2:

.string "Enter two numbers to multiply"

.LC3:

.string "Result of multiply is: "

.LC4:

.string "Enter mumber to divide into then number to divide by"

.LC5:

.string "Result is "

.LC6:

.string " and remainder is "

.LC7:

.string "Attempted division by zero"

main:

push rbp

mov rbp, rsp

sub rsp, 32

.L5:

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 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> >&))

lea rax, [rbp-8]

mov rsi, rax

mov edi, OFFSET FLAT:std::cin

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

mov rax, QWORD PTR [rbp-8]

mov rdi, rax

call Square

mov QWORD PTR [rbp-24], rax

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 rdx, rax

mov rax, QWORD PTR [rbp-24]

mov rsi, rax

mov rdi, rdx

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 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> >&))

lea rax, [rbp-8]

mov rsi, rax

mov edi, OFFSET FLAT:std::cin

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

mov rdx, rax

lea rax, [rbp-16]

mov rsi, rax

mov rdi, rdx

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

mov rdx, QWORD PTR [rbp-16]

mov rax, QWORD PTR [rbp-8]

mov rsi, rdx

mov rdi, rax

call Multiply

mov QWORD PTR [rbp-24], rax

mov esi, OFFSET FLAT:.LC3

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 rdx, rax

mov rax, QWORD PTR [rbp-24]

mov rsi, rax

mov rdi, rdx

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:.LC4

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 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> >&))

lea rax, [rbp-8]

mov rsi, rax

mov edi, OFFSET FLAT:std::cin

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

mov rdx, rax

lea rax, [rbp-16]

mov rsi, rax

mov rdi, rdx

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

mov rsi, QWORD PTR [rbp-16]

mov rax, QWORD PTR [rbp-8]

lea rcx, [rbp-32]

lea rdx, [rbp-24]

mov rdi, rax

call Divide

cmp eax, 1

sete al

test al, al

je .L2

mov esi, OFFSET FLAT:.LC5

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 rdx, rax

mov rax, QWORD PTR [rbp-24]

mov rsi, rax

mov rdi, rdx

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

mov esi, OFFSET FLAT:.LC6

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 rdx, rax

mov rax, QWORD PTR [rbp-32]

mov rsi, rax

mov rdi, rdx

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> >&))

jmp .L3

.L2:

mov esi, OFFSET FLAT:.LC7

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*)

.L3:

mov rax, QWORD PTR [rbp-24]

test rax, rax

jle .L4

jmp .L5

.L4:

mov eax, 0

leave

ret

.LC8:

.string "Display of square is: "

.LC9:

.string "Display of multiply is: "

.LC10:

.string "Display of divide is "

.LC11:

.string "Display of remainder is "

.LC12:

.string "Display of Division by zero"

.LC13:

.string "Error in assembly routines"

PrintResult:

push rbp

mov rbp, rsp

sub rsp, 16

mov DWORD PTR [rbp-4], edi

mov QWORD PTR [rbp-16], rsi

mov eax, DWORD PTR [rbp-4]

cmp eax, 4

ja .L8

mov eax, eax

mov rax, QWORD PTR .L10[0+rax*8]

jmp rax

.L10:

.quad .L9

.quad .L11

.quad .L12

.quad .L13

.quad .L14

.L9:

mov esi, OFFSET FLAT:.LC8

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 rdx, rax

mov rax, QWORD PTR [rbp-16]

mov rsi, rax

mov rdi, rdx

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> >&))

jmp .L15

.L11:

mov esi, OFFSET FLAT:.LC9

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 rdx, rax

mov rax, QWORD PTR [rbp-16]

mov rsi, rax

mov rdi, rdx

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> >&))

jmp .L15

.L12:

mov esi, OFFSET FLAT:.LC10

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 rdx, rax

mov rax, QWORD PTR [rbp-16]

mov rsi, rax

mov rdi, rdx

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> >&))

jmp .L15

.L13:

mov esi, OFFSET FLAT:.LC11

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 rdx, rax

mov rax, QWORD PTR [rbp-16]

mov rsi, rax

mov rdi, rdx

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> >&))

jmp .L15

.L14:

mov esi, OFFSET FLAT:.LC12

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 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> >&))

jmp .L15

.L8:

mov esi, OFFSET FLAT:.LC13

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 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> >&))

.L15:

nop

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 .L18

cmp DWORD PTR [rbp-8], 65535

jne .L18

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

.L18:

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