Go4Expert

Go4Expert (http://www.go4expert.com/)
-   Assembly Language Programming (ALP) Forum (http://www.go4expert.com/forums/assembly-language-programming-forum/)
-   -   TASM program help : Sorting (http://www.go4expert.com/forums/tasm-program-help-sorting-t26911/)

Nagasaki 12Oct2011 08:18

TASM program help : Sorting
 
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...


All times are GMT +5.5. The time now is 23:18.