Write an Assembly x86 code inside the block: ******The function parameter is \"c
ID: 3840260 • Letter: W
Question
Write an Assembly x86 code inside the block: ******The function parameter is "char *string" ********
*****Task: Change Letter Case******
You are given a string (null-terminated array of characters) that may contain numbers,
upper andlower case letters, punctuations symbols, etc. Implement a function to convert all
uppercase letters to lowercase and vice versa.
For example "ThisIsTheFinalLabOf51" should be converted to "tHISiStHEfINALlABoF51".
The string should be modifed in place. There is no explicit output for this function.
Tips:
- Note that each element of the arrays is a char (1 byte). You can NOT use a 32-bit register
to read/write from/to a memory location. Instead you should use the 8-bit version of the x86
general-purpose registers.
- The link to the ASCII codes is here: http://www.asciitable.com/
void changeCase(char *string) {
__asm{
// BEGIN YOUR CODE HERE
// END YOUR CODE HERE
}
}
Explanation / Answer
.LC0:
.string "enter the string :"
.LC1:
.string "modified string is : "
main:
push rbp
mov rbp, rsp
push rbx
sub rsp, 56
lea rax, [rbp-64]
mov rdi, rax
call std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >::basic_string()
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> >&))
lea rax, [rbp-64]
mov rsi, rax
mov edi, OFFSET FLAT:std::cin
call std::basic_istream<char, std::char_traits<char> >& std::operator>><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> >&)
mov DWORD PTR [rbp-20], 0
.L9:
mov eax, DWORD PTR [rbp-20]
movsx rbx, eax
lea rax, [rbp-64]
mov rdi, rax
call std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >::length() const
cmp rbx, rax
setb al
test al, al
je .L2
mov eax, DWORD PTR [rbp-20]
movsx rdx, eax
lea rax, [rbp-64]
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]
cmp al, 64
jle .L3
mov eax, DWORD PTR [rbp-20]
movsx rdx, eax
lea rax, [rbp-64]
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]
cmp al, 90
jg .L3
mov eax, 1
jmp .L4
.L3:
mov eax, 0
.L4:
test al, al
je .L5
mov eax, DWORD PTR [rbp-20]
movsx rdx, eax
lea rax, [rbp-64]
mov rsi, rdx
mov rdi, rax
call std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >::operator[](unsigned long)
movzx edx, BYTE PTR [rax]
add edx, 32
mov BYTE PTR [rax], dl
jmp .L6
.L5:
mov eax, DWORD PTR [rbp-20]
movsx rdx, eax
lea rax, [rbp-64]
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]
cmp al, 96
jle .L7
mov eax, DWORD PTR [rbp-20]
movsx rdx, eax
lea rax, [rbp-64]
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]
cmp al, 122
jg .L7
mov eax, 1
jmp .L8
.L7:
mov eax, 0
.L8:
test al, al
je .L6
mov eax, DWORD PTR [rbp-20]
movsx rdx, eax
lea rax, [rbp-64]
mov rsi, rdx
mov rdi, rax
call std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >::operator[](unsigned long)
movzx edx, BYTE PTR [rax]
sub edx, 32
mov BYTE PTR [rax], dl
.L6:
add DWORD PTR [rbp-20], 1
jmp .L9
.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 rdx, rax
lea rax, [rbp-64]
mov rsi, rax
mov rdi, rdx
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-64]
mov rdi, rax
call std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >::~basic_string()
mov eax, ebx
jmp .L13
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()
mov rax, rbx
mov rdi, rax
call _Unwind_Resume
.L13:
add rsp, 56
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 .L16
cmp DWORD PTR [rbp-8], 65535
jne .L16
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
.L16:
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.