I need help finishing this assembly language code. The code below is used to con
ID: 3804890 • Letter: I
Question
I need help finishing this assembly language code. The code below is used to convert a string into Pig Latin only using the registers. I have most of the work but need help finishing it.
Guidelines:
You should include Irvine32.inc.
Your procedures should NOT use INVOKE or any advanced procedure calling techniques. You must explicity deal with all registers used in the procedure, and you must assume that you need to protect all registers that could possibly be used in main, whether they are used or not.
However, in the two procedures that you write, you CANNOT use any procedures from Irvine32.inc.
In addConvertedWord you must use movsb and rep.
In addConvertedWord, you should find the length of the current output_str, and find the length of converted_word, as part of your implementation.
INCLUDE Irvine32.inc
.data
input_str BYTE "This sentence will be converted to silly string ",0
output_str BYTE 100 DUP(0),0
word_to_convert BYTE ?
converted_word BYTE 103 DUP(?),0
index_into_input_str DWORD 0
.code
main proc
headOfLoop:
mov eax,OFFSET input_str
add eax,index_into_input_str
cmp BYTE PTR [eax],0
je writeSillyStr
push OFFSET input_str
push OFFSET word_to_convert
push OFFSET index_into_input_str
;-----------------------------------------------------------------------------------------
; 1. remove any space characters at beginning of current input_str
; 2. copy first word of current input_str to word_to_convert stopping at end of string
; or first space character. If all that is left in input_str prior to
; calling removeChars are spaces and termination character or just termination character
; then word_to_convert pointer will point at termination character at end of removeChars
;-----------------------------------------------------------------------------------------
call removeChars
add ebp,12
;-----------------------------------------------------------------------------------------
; make word "silly" by:
; 1. putting first character of word_to_convert on end of word
; 2. adding ay to end of word
;
; first character of word_to_convert is NOT erased, it is just ignored by using
; converted_word hereafter
;-----------------------------------------------------------------------------------------
call createSillyStr ; <<<<<<<<<<< CALL TO createSillyStr and clean up GOES HERE >>>>>>>>>>>>>>
;------------------------------------------------------------------------------------------
; add converted_word to the end of the output string. converted_word already has first
; character of word_to_convert removed. if word_to_convert was empty, then
; converted_word will also be empty.
;------------------------------------------------------------------------------------------
call addConvertedWord ; <<<<<<<<<<<< CALL TO addConvertedWord and clean up GOES HERE >>>>>>>>>>>>
jmp headOfLoop
writeSillyStr:
mov edx,OFFSET output_str
call WriteString
invoke ExitProcess,0
main endp
removeChars PROC
push ebp
mov ebp, esp
push esi
push edi
push eax
push edx
push ecx
mov edx,[ebp + 8]
mov edi,[ebp + 12]
mov esi,[ebp + 16]
mov ecx,[edx]
add esi,[edx]
headOfEraseBlanks:
cmp BYTE PTR [esi],0
je exitProc
cmp BYTE PTR [esi],' '
jne deleteAndInsert2
inc esi
inc ecx
jmp headOfEraseBlanks
deleteAndInsert1:
cmp BYTE PTR [esi],0
je exitProc
cmp BYTE PTR [esi],' '
je exitProc
deleteAndInsert2:
mov al,BYTE PTR [esi]
mov BYTE PTR [edi],al
inc esi
inc edi
inc ecx
jmp deleteAndInsert1
exitProc:
mov BYTE PTR [edi],0
mov [edx],ecx
pop ecx
pop edx
pop eax
pop edi
pop esi
pop ebp
ret
removeChars ENDP
createSillyStr PROC; <<<<<<<<<<<<< CODE FOR createSillyStr GOES HERE >>>>>>>>>>>>>>>>>>>
createSillyStr ENDP
addConvertedWord PROC; <<<<<<<<<<<<< CODE FOR addConvertedWord GOES HERE >>>>>>>>>>>>>>>>>
addConvertedWord ENDP
end main
Explanation / Answer
Answer:
main:
push rbp
mov rbp, rsp
push rbx
sub rsp, 104
lea rax, [rbp-112]
mov rdi, rax
call std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >::basic_string()
lea rax, [rbp-112]
mov rsi, rax
mov edi, OFFSET FLAT:std::cin
call std::basic_istream<char, std::char_traits<char> >& std::getline<char, std::char_traits<char>, std::allocator<char> >(std::basic_istream<char, std::char_traits<char> >&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >&)
lea rdx, [rbp-112]
lea rax, [rbp-48]
mov rsi, rdx
mov rdi, rax
call std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >::basic_string(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)
lea rax, [rbp-80]
lea rdx, [rbp-48]
mov rsi, rdx
mov rdi, rax
call pigLatin(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >)
lea rdx, [rbp-80]
lea rax, [rbp-112]
mov rsi, rdx
mov rdi, rax
call std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >::operator=(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >&&)
lea rax, [rbp-80]
mov rdi, rax
call std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >::~basic_string()
lea rax, [rbp-48]
mov rdi, rax
call std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >::~basic_string()
lea rax, [rbp-112]
mov rsi, rax
mov edi, OFFSET FLAT:std::cout
call std::basic_ostream<char, std::char_traits<char> >& std::operator<< <char, std::char_traits<char>, std::allocator<char> >(std::basic_ostream<char, std::char_traits<char> >&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<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 ebx, 0
lea rax, [rbp-112]
mov rdi, rax
call std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >::~basic_string()
mov eax, ebx
jmp .L7
mov rbx, rax
lea rax, [rbp-48]
mov rdi, rax
call std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >::~basic_string()
jmp .L4
mov rbx, rax
.L4:
lea rax, [rbp-112]
mov rdi, rax
call std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >::~basic_string()
mov rax, rbx
mov rdi, rax
call _Unwind_Resume
.L7:
add rsp, 104
pop rbx
pop rbp
ret
.LC0:
.string ""
.LC1:
.string "ay"
.LC2:
.string " "
pigLatin(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >):
push rbp
mov rbp, rsp
push rbx
sub rsp, 184
mov QWORD PTR [rbp-184], rdi
mov QWORD PTR [rbp-192], rsi
lea rax, [rbp-176]
mov rdi, rax
call std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >::basic_string()
lea rax, [rbp-129]
mov rdi, rax
call std::allocator<char>::allocator()
lea rdx, [rbp-129]
mov rax, QWORD PTR [rbp-184]
mov esi, OFFSET FLAT:.LC0
mov rdi, rax
call std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >::basic_string(char const*, std::allocator<char> const&)
lea rax, [rbp-129]
mov rdi, rax
call std::allocator<char>::~allocator()
mov DWORD PTR [rbp-24], 0
mov DWORD PTR [rbp-20], 0
.L12:
mov eax, DWORD PTR [rbp-20]
movsx rdx, eax
mov rax, QWORD PTR [rbp-192]
mov rsi, rdx
mov rdi, rax
call std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >::operator[](unsigned long)
movzx eax, BYTE PTR [rax]
test al, al
setne al
test al, al
je .L23
mov eax, DWORD PTR [rbp-20]
movsx rdx, eax
mov rax, QWORD PTR [rbp-192]
mov esi, 32
mov rdi, rax
call std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >::find(char, unsigned long) const
cmp rax, -1
setne al
test al, al
je .L10
mov eax, DWORD PTR [rbp-20]
movsx rdx, eax
mov rax, QWORD PTR [rbp-192]
mov esi, 32
mov rdi, rax
call std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >::find(char, unsigned long) const
mov DWORD PTR [rbp-24], eax
mov eax, DWORD PTR [rbp-20]
sub DWORD PTR [rbp-24], eax
mov eax, DWORD PTR [rbp-24]
movsx rcx, eax
mov eax, DWORD PTR [rbp-20]
movsx rdx, eax
lea rax, [rbp-128]
mov rsi, QWORD PTR [rbp-192]
mov rdi, rax
call std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >::substr(unsigned long, unsigned long) const
lea rdx, [rbp-128]
lea rax, [rbp-176]
mov rsi, rdx
mov rdi, rax
call std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >::operator=(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >&&)
lea rax, [rbp-128]
mov rdi, rax
call std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >::~basic_string()
mov eax, DWORD PTR [rbp-24]
movsx rcx, eax
lea rax, [rbp-176]
mov edx, OFFSET FLAT:.LC1
mov rsi, rcx
mov rdi, rax
call std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >::insert(unsigned long, char const*)
mov eax, DWORD PTR [rbp-20]
movsx rdx, eax
mov rax, QWORD PTR [rbp-192]
mov rsi, rdx
mov rdi, rax
call std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >::operator[](unsigned long)
movzx eax, BYTE PTR [rax]
movsx edx, al
mov eax, DWORD PTR [rbp-24]
movsx rsi, eax
lea rax, [rbp-176]
mov ecx, edx
mov edx, 1
mov rdi, rax
call std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >::insert(unsigned long, unsigned long, char)
lea rax, [rbp-176]
mov edx, 1
mov esi, 0
mov rdi, rax
call std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >::erase(unsigned long, unsigned long)
mov eax, DWORD PTR [rbp-24]
add eax, 1
add DWORD PTR [rbp-20], eax
jmp .L11
.L10:
mov eax, DWORD PTR [rbp-20]
movsx rdx, eax
lea rax, [rbp-96]
mov rsi, QWORD PTR [rbp-192]
mov rcx, -1
mov rdi, rax
call std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >::substr(unsigned long, unsigned long) const
lea rdx, [rbp-96]
lea rax, [rbp-176]
mov rsi, rdx
mov rdi, rax
call std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >::operator=(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >&&)
lea rax, [rbp-96]
mov rdi, rax
call std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >::~basic_string()
lea rax, [rbp-176]
mov rdi, rax
call std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >::length() const
mov DWORD PTR [rbp-24], eax
mov eax, DWORD PTR [rbp-24]
movsx rcx, eax
lea rax, [rbp-176]
mov edx, OFFSET FLAT:.LC1
mov rsi, rcx
mov rdi, rax
call std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >::insert(unsigned long, char const*)
mov eax, DWORD PTR [rbp-20]
movsx rdx, eax
mov rax, QWORD PTR [rbp-192]
mov rsi, rdx
mov rdi, rax
call std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >::operator[](unsigned long)
movzx eax, BYTE PTR [rax]
movsx edx, al
mov eax, DWORD PTR [rbp-24]
movsx rsi, eax
lea rax, [rbp-176]
mov ecx, edx
mov edx, 1
mov rdi, rax
call std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >::insert(unsigned long, unsigned long, char)
lea rax, [rbp-176]
mov edx, 1
mov esi, 0
mov rdi, rax
call std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >::erase(unsigned long, unsigned long)
mov rax, QWORD PTR [rbp-192]
mov rdi, rax
call std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >::length() const
mov DWORD PTR [rbp-20], eax
.L11:
lea rax, [rbp-64]
lea rcx, [rbp-176]
mov edx, OFFSET FLAT:.LC2
mov rsi, rcx
mov rdi, rax
call std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > std::operator+<char, std::char_traits<char>, std::allocator<char> >(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, char const*)
lea rdx, [rbp-64]
mov rax, QWORD PTR [rbp-184]
mov rsi, rdx
mov rdi, rax
call std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >::operator+=(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)
lea rax, [rbp-64]
mov rdi, rax
call std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >::~basic_string()
jmp .L12
.L23:
nop
lea rax, [rbp-176]
mov rdi, rax
call std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >::~basic_string()
jmp .L22
mov rbx, rax
lea rax, [rbp-129]
mov rdi, rax
call std::allocator<char>::~allocator()
jmp .L15
mov rbx, rax
lea rax, [rbp-64]
mov rdi, rax
call std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >::~basic_string()
jmp .L17
mov rbx, rax
.L17:
mov rax, QWORD PTR [rbp-184]
mov rdi, rax
call std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >::~basic_string()
.L15:
lea rax, [rbp-176]
mov rdi, rax
call std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >::~basic_string()
mov rax, rbx
mov rdi, rax
call _Unwind_Resume
.L22:
mov rax, QWORD PTR [rbp-184]
add rsp, 184
pop rbx
pop rbp
ret
std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > std::operator+<char, std::char_traits<char>, std::allocator<char> >(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, char const*):
push rbp
mov rbp, rsp
push rbx
sub rsp, 40
mov QWORD PTR [rbp-24], rdi
mov QWORD PTR [rbp-32], rsi
mov QWORD PTR [rbp-40], rdx
mov rdx, QWORD PTR [rbp-32]
mov rax, QWORD PTR [rbp-24]
mov rsi, rdx
mov rdi, rax
call std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >::basic_string(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)
mov rdx, QWORD PTR [rbp-40]
mov rax, QWORD PTR [rbp-24]
mov rsi, rdx
mov rdi, rax
call std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >::append(char const*)
jmp .L28
mov rbx, rax
mov rax, QWORD PTR [rbp-24]
mov rdi, rax
call std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >::~basic_string()
mov rax, rbx
mov rdi, rax
call _Unwind_Resume
.L28:
mov rax, QWORD PTR [rbp-24]
add rsp, 40
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 .L31
cmp DWORD PTR [rbp-8], 65535
jne .L31
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
.L31:
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.