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

Translate the program below into PEP/8 assembly language Ø Start with Assembly c

ID: 3933699 • Letter: T

Question

Translate the program below into PEP/8 assembly language
Ø Start with Assembly code for Fig 6.36 (Use Pep8 help)
Ø Change to output array in same order as input
Ø Add function twoVect
Ø Pass array as parameter as shown in Fig 6.38
Ø Use trace tags on all variables.

a) Comment lines of the source code to trace the C++ code.

b) Run for a set of 4 inputs and paste a screen shot of the Output area of PEP/8.

c) Step thru & Cut and paste the memory trace when in the twoVect function.


#include <iostream>
using namespace std;
void twoVect(int v[], int n){

int k;
for(k = 0; k < n; k++){
v[k] = v[k] * 2;
}
}
int main () {
int vector[4];
int j;

for (j=0; j<4; j++){
cin >> vector[j];
}

twoVect(vector, 4);
for (j=0; j<4; j++){
cout << j << ' ' << vector[j] << endl;
}
return 0;
}

Explanation / Answer

twoVect(int*, int):

push {r7}

sub sp, sp, #20

add r7, sp, #0

str r0, [r7, #4]

str r1, [r7, #0]

mov r3, #0

str r3, [r7, #12]

b .L2

.L3:

ldr r3, [r7, #12]

lsl r3, r3, #2

ldr r2, [r7, #4]

adds r3, r2, r3

ldr r2, [r7, #12]

lsl r2, r2, #2

ldr r1, [r7, #4]

adds r2, r1, r2

ldr r2, [r2, #0]

lsl r2, r2, #1

str r2, [r3, #0]

ldr r3, [r7, #12]

add r3, r3, #1

str r3, [r7, #12]

.L2:

ldr r2, [r7, #12]

ldr r3, [r7, #0]

cmp r2, r3

ite ge

movge r3, #0

movlt r3, #1

uxtb r3, r3

cmp r3, #0

bne .L3

add r7, r7, #20

mov sp, r7

pop {r7}

bx lr

main:

push {r7, lr}

sub sp, sp, #24

add r7, sp, #0

mov r3, #0

str r3, [r7, #20]

b .L5

.L6:

add r2, r7, #4

ldr r3, [r7, #20]

lsl r3, r3, #2

adds r3, r2, r3

movw r0, #:lower16:std::cin

movt r0, #:upper16:std::cin

mov r1, r3

bl std::basic_istream<char, std::char_traits<char> >::operator>>(int&)

ldr r3, [r7, #20]

add r3, r3, #1

str r3, [r7, #20]

.L5:

ldr r3, [r7, #20]

cmp r3, #3

ite gt

movgt r3, #0

movle r3, #1

uxtb r3, r3

cmp r3, #0

bne .L6

add r3, r7, #4

mov r0, r3

mov r1, #4

bl twoVect(int*, int)

mov r3, #0

str r3, [r7, #20]

b .L7

.L8:

movw r0, #:lower16:std::cout

movt r0, #:upper16:std::cout

ldr r1, [r7, #20]

bl std::basic_ostream<char, std::char_traits<char> >::operator<<(int)

mov r3, r0

mov r0, r3

mov r1, #32

bl std::basic_ostream<char, std::char_traits<char> >& std::operator<< <std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&, char)

mov r3, r0

mov r2, r3

ldr r3, [r7, #20]

lsl r3, r3, #2

add r1, r7, #24

adds r3, r1, r3

ldr r3, [r3, #-20]

mov r0, r2

mov r1, r3

bl std::basic_ostream<char, std::char_traits<char> >::operator<<(int)

mov r3, r0

mov r0, r3

movw r1, #:lower16:std::basic_ostream<char, std::char_traits<char> >& std::endl<char, std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&)

movt r1, #:upper16:std::basic_ostream<char, std::char_traits<char> >& std::endl<char, std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&)

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

ldr r3, [r7, #20]

add r3, r3, #1

str r3, [r7, #20]

.L7:

ldr r3, [r7, #20]

cmp r3, #3

ite gt

movgt r3, #0

movle r3, #1

uxtb r3, r3

cmp r3, #0

bne .L8

mov r3, #0

mov r0, r3

add r7, r7, #24

mov sp, r7

pop {r7, pc}

__static_initialization_and_destruction_0(int, int):

push {r7, lr}

sub sp, sp, #8

add r7, sp, #0

str r0, [r7, #4]

str r1, [r7, #0]

ldr r3, [r7, #4]

cmp r3, #1

bne .L9

ldr r2, [r7, #0]

movw r3, #65535

cmp r2, r3

bne .L9

movw r0, #:lower16:std::__ioinit

movt r0, #:upper16:std::__ioinit

bl std::ios_base::Init::Init()

movw r3, #:lower16:std::ios_base::Init::~Init()

movt r3, #:upper16:std::ios_base::Init::~Init()

movw r0, #:lower16:std::__ioinit

movt r0, #:upper16:std::__ioinit

mov r1, r3

movw r2, #:lower16:__dso_handle

movt r2, #:upper16:__dso_handle

bl __aeabi_atexit

.L9:

add r7, r7, #8

mov sp, r7

pop {r7, pc}

global constructors keyed to twoVect(int*, int):

push {r7, lr}

add r7, sp, #0

mov r0, #1

movw r1, #65535

bl __static_initialization_and_destruction_0(int, int)

pop {r7, pc}

Hire Me For All Your Tutoring Needs
Integrity-first tutoring: clear explanations, guidance, and feedback.
Drop an Email at
drjack9650@gmail.com
Chat Now And Get Quote