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