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

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