;;; program to sort 3 numbers in ascending order ;;;

INCLUDE PCMAC.INC
		
		.MODEL SMALL
		.586
		.STACK 100H
		.DATA

MSG1		DB		"Please enter first number:$"
MSG2		DB		"Please enter second number:$"
MSG3		DB		"Please enter third number:$"
OUTPUT		DB		"The sorted ouput is:$"
FIRST		DW		?	;this word variable will store first number
SECOND		DW		?	;this word variable will store second number
THIRD		DW		?	;this word variable will store third number
		.CODE
		EXTERN GETDEC:NEAR, PUTDEC:NEAR
JOTA		PROC
		_BEGIN
		_PUTSTR 	MSG1
		CALL 		GETDEC   
		MOV		FIRST, AX	;copy first number in variable FIRST
		_PUTSTR 	MSG2
		CALL 		GETDEC   
		MOV		SECOND, AX	;copy second number in variable SECOND
		_PUTSTR 	MSG3
		CALL 		GETDEC   
		MOV		THIRD, AX	;copy third number in variable THIRD

	;;;;; SORTING STARTS NOW ;;;;;;;		

;;; COMPARING FIRST NUMBER AND SECOND NUMBER
	
		MOV 	DX, SECOND	;copy SECOND variable in DX register
		CMP 	FIRST,DX	;compare first number and DX (i.e. second number)
		JL  	STEP2  		;IF FIRST number < SECOND number GOTO STEP2

;;; ELSE SWAP FIRST AND SECOND values
		
		MOV 	CX, FIRST   	;Save FIRST variable in CX initially
		MOV 	FIRST, DX	;overwrite FIRST variable with value in DX (i.e. the second number)
		MOV 	SECOND, CX	;overwrite SECOND variable with value in CX (i.e. the first number)

;;; COMPARING FIRST NUMBER AND THIRD NUMBER

STEP2: 		MOV 	DX, THIRD	;copy THIRD variable in DX register
		CMP 	FIRST, DX	;compare first number and DX (i.e. third number)		
		JL 	STEP3		;IF FIRST number < THIRD number GOTO STEP3

;;;ELSE SWAP FIRST AND THIRD values
		
		MOV 	CX, FIRST	;Save FIRST number in CX initially
		MOV 	FIRST, DX	;overwrite FIRST variable with value in DX (i.e. the third number)
		MOV 	THIRD, CX	;overwrite THIRD variable with value in CX (i.e. the first number)

;;; COMPARING SECOND NUMBER AND THIRD NUMBER

STEP3:		MOV 	DX, THIRD	;copy THIRD number variable in DX register
		CMP 	SECOND, DX	;compare second number and DX (i.e. third number)
		JL 	ALLGOOD		;IF SECOND number < THIRD number, all three numbers have been sorted. 

;;; ELSE SWAP SECOND AND THIRD values
		
		MOV 	CX, SECOND	;Save SECOND number in CX initially
		MOV 	SECOND, DX	;overwrite SECOND variable with value in DX (i.e. the third number)
		MOV 	THIRD, CX	;overwrite THIRD variable with value in CX (i.e. the second number)

;;; DISPLAYING THE 3 SORTED NUMBERS

ALLGOOD:	_PUTSTR OUTPUT
		MOV 	AX, FIRST
		CALL 	PUTDEC		;Print FIRST (lowest) number
		_PUTCH ','		;Print comma
		MOV 	AX, SECOND
		CALL 	PUTDEC		;Print SECOND number
		_PUTCH ','		;Print comma
		MOV 	AX, THIRD
		CALL 	PUTDEC		;Print THIRD (highest) number
		_PUTCH '.'		;Print full-stop
		_EXIT	0
JOTA		ENDP
		END	JOTA