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