assembly w/ Mars (Memory mapped I/O – polling) Write a MIPS program to implement
ID: 3822879 • Letter: A
Question
assembly w/ Mars
(Memory mapped I/O – polling) Write a MIPS program to implement the following single digit adder:
keyboard input: X+Y=
display output: X+Y=Z (w/ MMIO simulator)
where X and Y are single digits (such as 2 and 7) and Z is the result (such as 9).
A possible way to implement:
1. Polling on the receiver control and read the byte from the receiver data. Doing this for four times so that the four characters X, +, Y, = are stored in an array.
2. Compute the result Z. You need find your own way of converting the ascii byte for a digit into the value of the digit so that the value of Z can be computed. Store the ascii bytes (the result Z might have two digits) into the array.
3. Polling on the transmitter control and write into the transmitter data so that the experssion (such as 5+7=12) is sent to the display.
4. To test your code, you need open the MMIO in the simulator. Goto ToolsKeyboard and Display MMIO make sure you press “connect to MIPS” to run your code. Sometimes, it is also helpful to press “reset” on the same screen.
5. Hint: a way to convert a byte storing a single digit into the value of the digit, and the converse (my code is untested)
char2num:
lb $t0, asciiZero
subu $v0, $a0, $t0
jr $ra
num2char:
lb $t0, asciiZero
addu $v0, $a0, $t0
jr $ra
.data
asciiZero: .byte ’0’
exp: .byte 30
I Codel last- Pchar-into btte41a4b Shador jelrto | Mealeh)du-msale app-instale thidofre--aol she rhe /f Malton-ery-tso. Cey-SSD-6tya Aealt-in se3 so. Ce b-Ssb ab 379 e..th_nesuyub . Sne byte or trolyhe. llSeed.Asex-a chak hoDeple Pryhe snd-r bthr Erp. r space to Buffer ptbefferZre law-clon h th.Explanation / Answer
Answer:
Assembly Language Program Code:
.LC0:
.string "number 1.:"
.LC1:
.string "number 2.:"
.LC2:
.string "sum"
.LC3:
.string ""
.LC4:
.string "carry"
main:
push rbp
mov rbp, rsp
push rbx
sub rsp, 136
mov QWORD PTR [rbp-144], 0
mov QWORD PTR [rbp-136], 0
mov QWORD PTR [rbp-128], 0
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> >&))
mov DWORD PTR [rbp-20], 0
.L3:
cmp DWORD PTR [rbp-20], 4
jg .L2
lea rax, [rbp-48]
mov edx, DWORD PTR [rbp-20]
movsx rdx, edx
sal rdx, 2
add rax, rdx
mov rsi, rax
mov edi, OFFSET FLAT:std::cin
call std::basic_istream<char, std::char_traits<char> >::operator>>(int&)
add DWORD PTR [rbp-20], 1
jmp .L3
.L2:
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*)
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 [rbp-20], 0
.L5:
cmp DWORD PTR [rbp-20], 4
jg .L4
lea rax, [rbp-80]
mov edx, DWORD PTR [rbp-20]
movsx rdx, edx
sal rdx, 2
add rax, rdx
mov rsi, rax
mov edi, OFFSET FLAT:std::cin
call std::basic_istream<char, std::char_traits<char> >::operator>>(int&)
add DWORD PTR [rbp-20], 1
jmp .L5
.L4:
mov DWORD PTR [rbp-20], 0
.L11:
cmp DWORD PTR [rbp-20], 4
jg .L6
mov eax, DWORD PTR [rbp-20]
cdqe
mov edx, DWORD PTR [rbp-48+rax*4]
mov eax, DWORD PTR [rbp-20]
cdqe
mov eax, DWORD PTR [rbp-80+rax*4]
add edx, eax
mov eax, DWORD PTR [rbp-20]
cdqe
mov eax, DWORD PTR [rbp-144+rax*4]
add eax, edx
mov DWORD PTR [rbp-24], eax
cmp DWORD PTR [rbp-24], 0
jne .L7
mov eax, DWORD PTR [rbp-20]
cdqe
mov DWORD PTR [rbp-112+rax*4], 0
mov eax, DWORD PTR [rbp-20]
add eax, 1
cdqe
mov DWORD PTR [rbp-144+rax*4], 0
jmp .L8
.L7:
cmp DWORD PTR [rbp-24], 1
jne .L9
mov eax, DWORD PTR [rbp-20]
cdqe
mov DWORD PTR [rbp-112+rax*4], 1
mov eax, DWORD PTR [rbp-20]
add eax, 1
cdqe
mov DWORD PTR [rbp-144+rax*4], 0
jmp .L8
.L9:
cmp DWORD PTR [rbp-24], 2
jne .L10
mov eax, DWORD PTR [rbp-20]
cdqe
mov DWORD PTR [rbp-112+rax*4], 0
mov eax, DWORD PTR [rbp-20]
add eax, 1
cdqe
mov DWORD PTR [rbp-144+rax*4], 1
jmp .L8
.L10:
cmp DWORD PTR [rbp-24], 3
jne .L8
mov eax, DWORD PTR [rbp-20]
cdqe
mov DWORD PTR [rbp-112+rax*4], 1
mov eax, DWORD PTR [rbp-20]
add eax, 1
cdqe
mov DWORD PTR [rbp-144+rax*4], 1
.L8:
add DWORD PTR [rbp-20], 1
jmp .L11
.L6:
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*)
mov esi, OFFSET FLAT:.LC3
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 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: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 [rbp-20], 0
.L13:
mov DWORD PTR [rbp-20], 4
mov eax, 1
test al, al
je .L12
mov eax, DWORD PTR [rbp-20]
add eax, 1
cdqe
mov ebx, DWORD PTR [rbp-144+rax*4]
mov eax, DWORD PTR [rbp-20]
cdqe
mov eax, DWORD PTR [rbp-112+rax*4]
mov esi, eax
mov edi, OFFSET FLAT:std::cout
call std::basic_ostream<char, std::char_traits<char> >::operator<<(int)
mov esi, OFFSET FLAT:.LC3
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, ebx
mov rdi, rax
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> >&))
add DWORD PTR [rbp-20], 1
jmp .L13
.L12:
mov eax, 0
add rsp, 136
pop rbx
pop rbp
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 .L17
cmp DWORD PTR [rbp-8], 65535
jne .L17
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
.L17:
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
Navigate
Integrity-first tutoring: explanations and feedback only — we do not complete graded work. Learn more.