Change this:
mov esi, backward
mov al,source[esi]
dec backward
To:
dec backward
mov esi, backward
mov al,source[esi]
because:
movzx eax, strl
mov backward, eax
initially backward
points not to last element of string, but one after last (0 byte), so you first read it.