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

covert the following C code to Assembly language for MSP430G2553 (assembler used

ID: 3858696 • Letter: C

Question

covert the following C code to Assembly language for MSP430G2553 (assembler used is code composer)

#include <msp430.h>

#define ONOFF ((P2IFG & 0x40) == 0x40)
#define RSPEED ((P2IFG & 0x04) == 0x04)
#define NWASH ((P2IFG & 0x08) == 0x08)
#define PWASH ((P2IFG & 0x10) == 0x10)
#define FSPIN ((P2IFG & 0x20) == 0x20)
#define RedLedToggle (P2OUT ^= 0x01)
#define YellowLedToggle (P2OUT ^= 0x02)
#define NormalWash 1
#define PreWash 2
#define FinalSpin 3

int Program=0;
int RotationSpeed = 0;
int open = 0;

void delay_ms(int);
void Wash();

void main(void)

{
WDTCTL = WDTPW|WDTHOLD;

P2SEL = 0x00;
P1DIR = 0xFF;
P2DIR = 0x83;
P2REN = 0x7C;
P1OUT = 0x00;
P2OUT = 0x7C;
P2IE = 0x7C;
P2IES = 0x7C;
P2IFG = 0x00;

_enable_interrupts();

while(1){
if(Program!=0) Wash();
}
}

void delay_ms(int a){
while(a != 0)
{
_delay_cycles(1000);
a--;
}
}

void Wash(){
int speed, turn, fast, slow, Rturn, Lturn, pos;
volatile unsigned int seqr[8] = {0x08,0x0C,0x04,0x06,0x02,0x03,0x01,0x09};
volatile unsigned int seql[8] = {0x09,0x01,0x03,0x02,0x06,0x04,0x0C,0x08};
if (Program == 1){
slow = 20, fast = 10, Rturn = 100, Lturn = 100;
}
if (Program == 2){
slow = 20, fast = 10, Rturn = 30, Lturn = 30;
}
if (Program == 3){
slow = 10, fast = 5, Rturn = 50, Lturn = 0;
}

if(RotationSpeed == 0)
speed = fast;
else
speed = slow;

for (turn=0; turn<Rturn; turn++){
if(open == 1){
pos = 0;
while(pos<8){
P1OUT = seqr[pos];
pos++;
delay_ms(speed);
}
P1OUT = 0x00;
}
else break;
}
for (turn=0; turn<Lturn; turn++){
if(open == 1){
pos = 0;
while(pos<8){
P1OUT = seql[pos];
pos++;
delay_ms(speed);
}
P1OUT = 0x00;
}
else break;
}
Program = 0;
}

#pragma vector =PORT2_VECTOR
__interrupt void PORT2_ISR(void){
if(ONOFF){
open ^= 1;
RedLedToggle;
P2IFG &= ~0x40;
P1OUT &= ~0xff;
}
if ((RSPEED) && (open == 1)){
RotationSpeed ^= 1;
YellowLedToggle;
P2IFG &= ~0x04;
}
if ((NWASH) && (open == 1)){
Program = NormalWash;
P1OUT ^= 0b01010100;
__delay_cycles(1000000);
P1OUT &=~0xff;
P1OUT ^= 0b00101010;
__delay_cycles(1000000);
P2IFG &= ~0x08;
}
if ((PWASH) && (open == 1)){
Program = PreWash;
P1OUT ^= 0b01110011;
__delay_cycles(1000000);
P1OUT &=~0xff;
P1OUT ^= 0b00101010;
__delay_cycles(1000000);
P2IFG &= ~0x10;
}
if ((FSPIN) && (open == 1)){
Program = FinalSpin;
P1OUT ^= 0b01110001;
__delay_cycles(1000000);
P1OUT &=~0xff;
P1OUT ^= 0b01101101;
__delay_cycles(1000000);
P2IFG &= ~0x20;
}
P2IFG=0x00;
}

Explanation / Answer

Answer:

temp:

.zero 4

timeToWash:

.zero 4

operation:

.zero 4

.LC0:

.string "Washing Machine CE224"

.LC1:

.string "Choose Mode: (1)Default, (2)Manual "

.LC2:

.string "Choose Parts to wash: (1)Upper Only, (2)Lower Only, (3)Upper and Lower "

.LC3:

.string "Press (S) to Start,and close the Door."

.LC4:

.string "LED is On "

.LC5:

.string "Washing Operation Started! Time Left:"

.LC6:

.string "Washing with Soap Operation Started! "

.LC7:

.string "Rinsing Operation Started! Time Left:"

.LC8:

.string "Drying Operation Started! Time Left:"

.LC9:

.string "End! LED is Off"

main:

push rbp

mov rbp, rsp

sub rsp, 32

mov DWORD PTR [rbp-24], 0

mov DWORD PTR [rbp-28], 3

mov DWORD PTR [rbp-16], 0

mov DWORD PTR [rbp-20], 3

mov DWORD PTR [rbp-8], 0

mov DWORD PTR [rbp-12], 25

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

.L5:

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

lea rax, [rbp-24]

mov rsi, rax

mov edi, OFFSET FLAT:std::cin

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

mov eax, DWORD PTR [rbp-24]

cmp eax, 1

jne .L2

call defaultMode()

.L2:

mov eax, DWORD PTR [rbp-24]

cmp eax, 2

jne .L3

call manualMode()

.L3:

mov eax, DWORD PTR [rbp-24]

test eax, eax

jne .L4

jmp .L5

.L4:

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

lea rax, [rbp-28]

mov rsi, rax

mov edi, OFFSET FLAT:std::cin

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

mov eax, DWORD PTR [rbp-28]

cmp eax, 1

jl .L6

cmp eax, 2

jle .L7

cmp eax, 3

je .L8

jmp .L6

.L7:

mov DWORD PTR [rbp-4], 0

jmp .L6

.L8:

mov DWORD PTR [rbp-4], 1

nop

.L6:

cmp DWORD PTR [rbp-16], 0

jne .L9

.L14:

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 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-29]

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

.L11:

mov eax, DWORD PTR [rbp-8]

cmp eax, DWORD PTR [rbp-4]

je .L10

add DWORD PTR [rbp-8], 1

jmp .L11

.L10:

mov eax, DWORD PTR temp[rip]

cmp DWORD PTR [rbp-12], eax

je .L12

add DWORD PTR [rbp-12], 1

jmp .L10

.L12:

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 eax, DWORD PTR timeToWash[rip]

mov esi, eax

mov rdi, rdx

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

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

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 eax, DWORD PTR timeToWash[rip]

mov edx, eax

shr edx, 31

add eax, edx

sar eax

mov DWORD PTR timeToWash[rip], eax

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

mov rdx, rax

mov eax, DWORD PTR timeToWash[rip]

mov esi, eax

mov rdi, rdx

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

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, DWORD PTR timeToWash[rip]

mov edx, eax

shr edx, 31

add eax, edx

sar eax

mov DWORD PTR timeToWash[rip], eax

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 eax, DWORD PTR timeToWash[rip]

mov esi, eax

mov rdi, rdx

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

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 DWORD PTR timeToWash[rip], 0

mov BYTE PTR [rbp-29], 80

movzx eax, BYTE PTR [rbp-29]

cmp al, 115

je .L14

movzx eax, BYTE PTR [rbp-29]

cmp al, 83

jne .L9

jmp .L14

.L9:

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 eax, 0

leave

ret

.LC10:

.string "Enter Temperature: "

.LC11:

.string "Enter Time to wash: "

.LC12:

.string "Choose Operation: (1)Water Only, (2)Water and Soap, (3)Rinse, (4)Dry, (5)All "

manualMode():

push rbp

mov rbp, rsp

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 esi, OFFSET FLAT:temp

mov edi, OFFSET FLAT:std::cin

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

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 esi, OFFSET FLAT:timeToWash

mov edi, OFFSET FLAT:std::cin

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

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:operation

mov edi, OFFSET FLAT:std::cin

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

nop

pop rbp

ret

.LC13:

.string "Choose what to Wash: (1)Cups, (2)Plates, (3)Pots"

defaultMode():

push rbp

mov rbp, rsp

sub rsp, 16

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

lea rax, [rbp-4]

mov rsi, rax

mov edi, OFFSET FLAT:std::cin

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

mov eax, DWORD PTR [rbp-4]

cmp eax, 2

je .L19

cmp eax, 3

je .L20

cmp eax, 1

je .L21

jmp .L22

.L21:

mov DWORD PTR temp[rip], 30

mov DWORD PTR timeToWash[rip], 3

jmp .L18

.L19:

mov DWORD PTR temp[rip], 40

mov DWORD PTR timeToWash[rip], 3

jmp .L18

.L20:

mov DWORD PTR temp[rip], 60

mov DWORD PTR timeToWash[rip], 3

nop

.L18:

.L22:

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

cmp DWORD PTR [rbp-8], 65535

jne .L25

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

.L25:

nop

leave

ret

_GLOBAL__sub_I_temp:

push rbp

mov rbp, rsp

mov esi, 65535

mov edi, 1

call __static_initialization_and_destruction_0(int, int)

pop rbp

ret