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
Related Questions
Navigate
Integrity-first tutoring: explanations and feedback only — we do not complete graded work. Learn more.