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

Convert the code into MIPS and run it in MARS #include<iostream> #include<cstrin

ID: 3731061 • Letter: C

Question

Convert the code into MIPS and run it in MARS

#include<iostream>

#include<cstring>

using namespace std;

//method to reverse the string

char *Reverse(char *s)

{

int len=strlen(s);//finding length of the string

char *front=s;//0th index

char *rear=(s+(len-1));//last index

//condition where front less than rear

while(front<rear)

{

//swaping

char t=*front;

*front=*rear;

*rear=t;

//incrementing front

front++;

//decrementing rear

rear--;

}

//returning reversed string

return s;

}

//main method

int main()

{

//Allocating memory for the string

char *s=new char[sizeof(char)*100];

//prompting user to enter string

cout<<" Enter a string: ";

cin>>s;

//passing string to Reverse method

s=Reverse(s);

//displaying string after reversing

cout<<" After reversing: ";

cout<<s;

//deleting memory allocated

delete [] s;

s=NULL;

}

Explanation / Answer

Reverse(char*):

push rbp

mov rbp, rsp

sub rsp, 48

mov QWORD PTR [rbp-40], rdi

mov rax, QWORD PTR [rbp-40]

mov rdi, rax

call strlen

mov DWORD PTR [rbp-20], eax

mov rax, QWORD PTR [rbp-40]

mov QWORD PTR [rbp-8], rax

mov eax, DWORD PTR [rbp-20]

cdqe

lea rdx, [rax-1]

mov rax, QWORD PTR [rbp-40]

add rax, rdx

mov QWORD PTR [rbp-16], rax

.L3:

mov rax, QWORD PTR [rbp-8]

cmp rax, QWORD PTR [rbp-16]

jnb .L2

mov rax, QWORD PTR [rbp-8]

movzx eax, BYTE PTR [rax]

mov BYTE PTR [rbp-21], al

mov rax, QWORD PTR [rbp-16]

movzx edx, BYTE PTR [rax]

mov rax, QWORD PTR [rbp-8]

mov BYTE PTR [rax], dl

mov rax, QWORD PTR [rbp-16]

movzx edx, BYTE PTR [rbp-21]

mov BYTE PTR [rax], dl

add QWORD PTR [rbp-8], 1

sub QWORD PTR [rbp-16], 1

jmp .L3

.L2:

mov rax, QWORD PTR [rbp-40]

leave

ret

.LC0:

.string " Enter a string: "

.LC1:

.string " After reversing: "

main:

push rbp

mov rbp, rsp

sub rsp, 16

mov edi, 100

call operator new[](unsigned long)

mov QWORD PTR [rbp-8], rax

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 rax, QWORD PTR [rbp-8]

mov rsi, rax

mov edi, OFFSET FLAT:std::cin

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

mov rax, QWORD PTR [rbp-8]

mov rdi, rax

call Reverse(char*)

mov QWORD PTR [rbp-8], 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 rax, QWORD PTR [rbp-8]

mov rsi, rax

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

cmp QWORD PTR [rbp-8], 0

je .L6

mov rax, QWORD PTR [rbp-8]

mov rdi, rax

call operator delete[](void*)

.L6:

mov QWORD PTR [rbp-8], 0

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

cmp DWORD PTR [rbp-8], 65535

jne .L10

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

.L10:

nop

leave

ret

_GLOBAL__sub_I__Z7ReversePc:

push rbp

mov rbp, rsp

mov esi, 65535

mov edi, 1

call __static_initialization_and_destruction_0(int, int)

pop rbp

ret