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

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

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