The subroutine int_to_string works well when writing to a 10 bytes memory buffer (see here), but outputs a weird result after I modified it to write to a string. 
Only the digit for the unit is correct (1). 
What is the issue here?
; sum of array elements (integers)
; and write to console
section .text
global _start
_start:
      mov eax, 0        
      mov ebx, array          
      mov ecx, lena
loop:
      cmp ecx, 0    
      je print  
      add eax, [ebx]
      add ebx, 4    
      sub ecx, 1
      jmp loop
print:
      ; convert integer to string
      mov  esi, msg
      call int_to_string
      
      ; call write syscall
      mov edx, lenmsg      ; length of the string
      mov ecx, msg         ; address of the string
      mov ebx, 1           ; file descriptor, in this case stdout
      mov eax, 4           ; syscall number for write
      int 0x80
      ; call exit syscall
      mov eax, 1
      int 0x80
; Input:
; eax = integer value to convert
; esi = pointer to string to store the digit characters
int_to_string:
      add esi, lenmsg-2
      mov ebx, 10               
.next_digit:
      xor edx, edx       ; clear edx prior to dividing edx:eax by ebx
      div ebx            ; eax /= 10
      add dl, '0'        ; convert the remainder to ASCII 
      dec esi            ; store characters in reverse order
      mov [esi], dl      ;
      test eax, eax           
      jnz .next_digit    ; repeat until eax==0
      ret
section .data
      array dd 10, 20, 30, 40, 501
      lena: equ $-array      ; length of array
      msg db "The sum is            .", 0xA
      lenmsg: equ $-msg      ; length of msg
 
    