Hi. I am new to programming, and I am required to make a sorting program. Here is the problem

Create an AL program that will input a string 10 characters long then print the
characters in decending or accending order.The program will also prompt the user
if he/she wants to repeat the program, if the answer is 'Y' repeat the program if
the answer is 'N' display the word "Thank You then exit the program.


Example:
Enter String :GDFEWPSHBA

Choice
[1]Accending
[2]Decending

Enter Choice :1

Accending Order :ABDEFGHPSW

Enter Another[Y/N] :N

Thank You !!!

So, here is my plan... I will first get each character of the 10-letter line the user inputted, and allocate it into an array.
Then, sort it using any of the sorts (I used bubble sort for the program), then show it to the user and prompt him if he wants to continue.

I am making a code for this using several references, and I made a program.The problem is...
when I start running the program, DOS crashes and the program terminates!!!

Here is my code...

Code:
.model small
.stack 100h
.data
   prompt db 0dh,0ah, "Enter String          : $"
   choice db 0dh,0ah,0dh,0ah,"Choice",0dh,0ah,"[1]Ascending",0dh,0ah,"[2]Descending",0dh,0ah,0dh,0ah,"Enter Choice          :$"
   ascending db 0dh,0ah,0dh,0ah,"Ascending Order      :$"
   descending db 0dh,0ah,0dh,0ah,"Descending Order     :$"
   decision db 0dh,0ah,0dh,0ah,"Enter Another[Y/N]   :$"
   thank db 0dh,0ah,0dh,0ah,"Thank You !!!"
   array db 10 dup (0)
.code
 main proc
   mov ax, @data
   mov ds, ax

   @start:
   mov ax, offset prompt

   call print_array

   mov ax, offset array

   call read_array

   lea dx, choice
   mov ah, 9
   int 21h

   mov ah, 1
   int 21h

   lea si, array
   cmp dl, 1
     call descend

     call ascend

   mov ax, offset array

   call print_array

   lea dx, decision
   mov ah, 9
   int 21h

   mov ah, 1
   int 21h

   mov bl, al
   and bl, 0dfh

   cmp bl, "N"
   jmp @start

   mov ah, 9
   lea dx, thank
   int 21h

   mov ah, 4ch
   int 21h
 main endp

 read_array proc
   push ax
   push bx
   push cx
   push dx

   mov bx, ax
   call getc
   mov byte ptr[bx], al
   @get_loop:
     cmp al, 0dh
     je @get_fin
     inc bx
     call getc
     mov byte ptr[bx], al
     jmp @put_loop
   @get_fin:
     pop dx
     pop cx
     pop bx
     pop ax
     
   ret
 read_array endp

 ascend proc
   push ax
   push bx
   push cx
   push dx
   push di

   lea dx, ascending
   mov ah, 9
   int 21h

   mov ax, si
   mov cx, bx
   dec cx

   @outer_loop:
     mov bx, cx
     mov si, ax
     mov di, ax
     inc di

     @inner_loop:
       mov dl, [si]

       cmp dl, [di]
       jng @skip

       xchg dl, [di]
       mov [si], dl

       @skip:
         inc si
         inc di

         dec bx
     jnz @inner_loop
   loop @outer_loop
     pop di
     pop dx
     pop cx
     pop bx
     pop ax
   ret
 ascend endp

 descend proc
   push ax
   push bx
   push cx
   push dx
   push di

   lea dx, descending
   mov ah, 9
   int 21h

   mov ax, si
   mov cx, bx
   dec cx

   @outer_loop2:
     mov bx, cx
     mov si, ax
     mov di, ax
     inc di

     @inner_loop2:
       mov dl, [si]

       cmp dl, [di]
       jng @skip2

       xchg dl, [di]
       mov [si], dl

       @skip2:
         inc si
         inc di

         dec bx
     jnz @inner_loop2
   loop @outer_loop2
     pop di
     pop dx
     pop cx
     pop bx
     pop ax
   ret
 descend endp

 print_array proc
   push ax
   push bx
   push cx
   push dx

   mov bx, ax
   mov al, byte ptr[bx]
   @put_loop:
     cmp al, 0
     je @put_fin
     call putc
     inc bx
     mov al, byte ptr[bx]
     jmp @put_loop
   @put_fin:
     pop dx
     pop cx
     pop bx
     pop ax
   ret
 print_array endp

 putc proc
   push ax
   push bx
   push cx
   push dx

   mov dl, al
   mov ah, 2
   int 21h

   pop dx
   pop cx
   pop bx
   pop ax
   ret
 putc endp

 getc proc
   push ax
   push bx
   push cx
   push dx

   int 21h

   pop dx
   pop cx
   pop bx
   pop ax
 ret
 getc endp  
end main
Can you help me in modifying this program? Any suggestions? Please help me...