## DEV Community

Gealber Morales

Posted on • Updated on • Originally published at gealber.com

# Challenge RE #21

Challenge #21 description it's quite simple

This is easy. What does the following code do?

We can assume this will be easy.

## Analysis

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

)
We have two calls to strlen and one to strcmp. With this in mind we can assume we receive two strings as arguments of our function.

Right after the calls to strlen we have the following instruction

sub r12, rax

In 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 rbx and [rbp+0+r12].

mov     rsi, rbx
lea     rdi, [rbp+0+r12]
call    strcmp

In 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.

Formal description

The function takes two strings as arguments and return 1 if one string it's the suffix of the other, and 0 otherwise.

## Conclusion

Coming from the frustration with challenge #19, making this one was quite easy.