Challenge #21 description it's quite simple
This is easy. What does the following code do?
We can assume this will be easy.
Here's the assembly code we need to analyze
f1: push r12 push rbp mov rbp, rdi push rbx mov rbx, rsi ;; strlen(rdi); call strlen ;; strlen(rbx); mov rdi, rbx mov r12, rax call strlen ;; size_1 -= size_2; sub r12, rax mov rsi, rbx lea rdi, [rbp+0+r12] call strcmp pop rbx test eax, eax pop rbp sete al pop r12 ret
Right after the calls to
strlen we have the following instruction
sub r12, rax
r12 we stored the result of our first call to
strlen, so with this instruction we are computing the difference in length of these two strings.
The following three instructions perform a comparison in size of strings
mov rsi, rbx lea rdi, [rbp+0+r12] call strcmp
r12 we have the result of the difference, so if for
str1 we have
str1_size, and for
str2 we have
str2_size, then in
r12 we have
str1_size - str2_size. Hence these three instructions can be expressed in this way
size_t s1 = strlen(str1); size_t s2 = strlen(str2); strcmp((str1+(s1-s2)), str2);
Our last step it's quite simple also, in case our comparison with
strcmp was 0 we return 1, otherwise we return 0.
The function takes two strings as arguments and return 1 if one string it's the suffix of the other, and 0 otherwise.
Coming from the frustration with challenge #19, making this one was quite easy.