Write an LC-3 assembly language program that counts the number of positive and n
ID: 3915398 • Letter: W
Question
Write an LC-3 assembly language program that counts the number of positive and negative numbers in a sequence of numbers that are stored beginning at address x3300. The last number in the sequence is 0. Your program must start at address x3000. The program’s output must be the following 2 lines: Count of negative numbers: nnnn Count of positive numbers: mmmm Where nnnn and mmm are the number of negative and positive numbers respectively. Number of digits in nnnn and mmmm is not fixed. You can not assume any upper bounds on nnnn and mmmm
Explanation / Answer
.LC0:
.string "Enter size of array:"
.LC1:
.string " Enter numbers in array : "
.LC2:
.string " "
.LC3:
.string " Positive Numbers = "
.LC4:
.string "Negative Numbers = "
main:
push rbp
mov rbp, rsp
sub rsp, 80
mov DWORD PTR [rbp-4], 0
mov DWORD PTR [rbp-8], 0
mov esi, OFFSET FLAT:.LC0
mov edi, OFFSET FLAT:_ZSt4cout
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-68]
mov rsi, rax
mov edi, OFFSET FLAT:_ZSt3cin
call std::basic_istream<char, std::char_traits<char> >::operator>>(int&)
mov eax, DWORD PTR [rbp-68]
mov esi, eax
mov edi, OFFSET FLAT:_ZSt4cout
call std::basic_ostream<char, std::char_traits<char> >::operator<<(int)
mov esi, OFFSET FLAT:.LC1
mov edi, OFFSET FLAT:_ZSt4cout
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 DWORD PTR [rbp-12], 0
.L3:
mov eax, DWORD PTR [rbp-68]
cmp DWORD PTR [rbp-12], eax
jge .L2
lea rax, [rbp-64]
mov edx, DWORD PTR [rbp-12]
movsx rdx, edx
sal rdx, 2
add rax, rdx
mov rsi, rax
mov edi, OFFSET FLAT:_ZSt3cin
call std::basic_istream<char, std::char_traits<char> >::operator>>(int&)
add DWORD PTR [rbp-12], 1
jmp .L3
.L2:
mov DWORD PTR [rbp-12], 0
.L5:
mov eax, DWORD PTR [rbp-68]
cmp DWORD PTR [rbp-12], eax
jge .L4
mov eax, DWORD PTR [rbp-12]
cdqe
mov eax, DWORD PTR [rbp-64+rax*4]
mov esi, eax
mov edi, OFFSET FLAT:_ZSt4cout
call std::basic_ostream<char, std::char_traits<char> >::operator<<(int)
mov esi, OFFSET FLAT:.LC2
mov rdi, rax
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*)
add DWORD PTR [rbp-12], 1
jmp .L5
.L4:
mov DWORD PTR [rbp-12], 0
.L9:
mov eax, DWORD PTR [rbp-68]
cmp DWORD PTR [rbp-12], eax
jge .L6
mov eax, DWORD PTR [rbp-12]
cdqe
mov eax, DWORD PTR [rbp-64+rax*4]
test eax, eax
jns .L7
add DWORD PTR [rbp-8], 1
jmp .L8
.L7:
add DWORD PTR [rbp-4], 1
.L8:
add DWORD PTR [rbp-12], 1
jmp .L9
.L6:
mov esi, OFFSET FLAT:.LC3
mov edi, OFFSET FLAT:_ZSt4cout
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 [rbp-4]
mov esi, eax
mov rdi, rdx
call std::basic_ostream<char, std::char_traits<char> >::operator<<(int)
mov esi, OFFSET FLAT:.LC2
mov rdi, rax
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:.LC4
mov edi, OFFSET FLAT:_ZSt4cout
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 [rbp-8]
mov esi, eax
mov rdi, rdx
call std::basic_ostream<char, std::char_traits<char> >::operator<<(int)
mov esi, OFFSET FLAT:.LC2
mov rdi, rax
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
__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 .L13
cmp DWORD PTR [rbp-8], 65535
jne .L13
mov edi, OFFSET FLAT:_ZStL8__ioinit
call std::ios_base::Init::Init() [complete objectconstructor]
mov edx, OFFSET FLAT:__dso_handle
mov esi, OFFSET FLAT:_ZStL8__ioinit
mov edi, OFFSET FLAT:_ZNSt8ios_base4InitD1Ev
call __cxa_atexit
.L13:
nop
leave
ret
_GLOBAL__sub_I_main:
push rbp
mov rbp, rsp
mov esi, 65535
mov edi, 1
call __static_initialization_and_destruction_0(int, int)
pop rbp
ret
Related Questions
drjack9650@gmail.com
Navigate
Integrity-first tutoring: explanations and feedback only — we do not complete graded work. Learn more.