Write a program in MIPS that reads in a Roman form number from the user, then output the number in decimal form. Write a program in MIPS that reads in a Roman form number from the user, then output the number in decimal form. Solution Answer: MIPS Assembly Language Program: .zero 1 RomanNumber::RomanNumber(std::__cxx11::basic_string, std::allocator >): push rbp mov rbp, rsp push rbx sub rsp, 24 mov QWORD PTR [rbp-24], rdi mov QWORD PTR [rbp-32], rsi mov rax, QWORD PTR [rbp-24] mov rdi, rax call std::__cxx11::basic_string, std::allocator >::basic_string() mov rax, QWORD PTR [rbp-24] mov rdx, QWORD PTR [rbp-32] mov rsi, rdx mov rdi, rax call std::__cxx11::basic_string, std::allocator >::operator=(std::__cxx11::basic_string, std::allocator > const&) jmp .L4 mov rbx, rax mov rax, QWORD PTR [rbp-24] mov rdi, rax call std::__cxx11::basic_string, std::allocator >::~basic_string() mov rax, rbx mov rdi, rax call _Unwind_Resume .L4: add rsp, 24 pop rbx pop rbp ret .LC0: .string \" is not a Roman Numeral!\" RomanNumber::convert(): push rbp mov rbp, rsp sub rsp, 32 mov QWORD PTR [rbp-24], rdi mov rax, QWORD PTR [rbp-24] mov rdi, rax call std::__cxx11::basic_string, std::allocator >::length() const mov DWORD PTR [rbp-16], eax mov DWORD PTR [rbp-4], 0 mov BYTE PTR [rbp-5], 0 mov DWORD PTR [rbp-12], 0 mov rax, QWORD PTR [rbp-24] mov DWORD PTR [rax+32], 0 .L24: cmp BYTE PTR [rbp-5], 0 jne .L6 mov eax, DWORD PTR [rbp-12] cmp eax, DWORD PTR [rbp-16] jge .L6 mov eax, DWORD PTR [rbp-12] movsx rdx, eax mov rax, QWORD PTR [rbp-24] mov rsi, rdx mov rdi, rax call std::__cxx11::basic_string, std::allocator >::operator[](unsigned long) movzx eax, BYTE PTR [rax] movsx eax, al sub eax, 67 cmp eax, 21 ja .L7 mov eax, eax mov rax, QWORD PTR .L9[0+rax*8] jmp rax .L9: .quad .L8 .quad .L10 .quad .L7 .quad .L7 .quad .L7 .quad .L7 .quad .L11 .quad .L7 .quad .L7 .quad .L12 .quad .L13 .quad .L7 .quad .L7 .quad .L7 .quad .L7 .quad .L7 .quad .L7 .quad .L7 .quad .L7 .quad .L14 .quad .L7 .quad .L15 .L13: mov rax, QWORD PTR [rbp-24] mov eax, DWORD PTR [rax+32] lea edx, [rax+1000] mov rax, QWORD PTR [rbp-24] mov DWORD PTR [rax+32], edx cmp DWORD PTR [rbp-4], 999 jg .L16 mov rax, QWORD PTR [rbp-24] mov eax, DWORD PTR [rax+32] mov edx, DWORD PTR [rbp-4] add edx, edx sub eax, edx mov edx, eax mov rax, QWORD PTR [rbp-24] mov DWORD PTR [rax+32], edx .L16: mov DWORD PTR [rbp-4], 1000 jmp .L17 .L10: mov rax, QWORD PTR [rbp-24] mov eax, DWORD PTR [rax+32] lea edx, [rax+500] mov rax, QWORD PTR [rbp-24] mov DWORD PTR [rax+32], edx cmp DWORD PTR [rbp-4], 499 jg .L18 mov rax, QWORD PTR [rbp-24] mov eax, DWORD PTR [rax+32] mov edx, DWORD PTR [rbp-4] add edx, edx sub eax, edx mov edx, eax mov rax, QWORD PTR [rbp-24] mov DWORD PTR [rax+32], edx .L18: mov DWORD PTR [rbp-4], 500 jmp .L17 .L8: mov rax, QWORD PTR [rbp-24] mov eax, DWORD PTR [rax+32] lea edx, [rax+100] mov rax, QWORD PTR [rbp-24] mov DWORD PTR [rax+32], edx cmp DWORD PTR [rbp-4], 99 jg .L19 mov rax, QWORD PTR [rbp-24] mov eax, DWORD PTR .