TITLE ORDENAMIENTO_10_NUMEROS
COMMENT *TAREA6 PRACTICA5*
; Se inicializar� el stack a continuaci�n
stack segment para stack 'STACK'
db 128 dup ("PILA ")
stack ends
stack segment para stack 'STACK'
db 128 dup ("PILA ")
stack ends
data segment para PUBLIC 'data'
MEN1 DB 0AH, 0DH, "Ingresa un numero del 00 al 99 (Numeros de 2 digitos, 78,
87, 09): ", "$"
MEN2 DB 0AH, 0DH, "Ingresa 0 para ordenar ascendentemente o ingrese 1 para
ordenar descendemente:", "$", 0AH, 0DH
MEN3 DB 0AH, 0DH, "Ingresa 1 si desea hacer otro ordenamiento, Ingresa otra
tecla si desea salir", 0AH, 0DH
ALMVALORES DB " ", 0AH, 0DH, "$"
NUMEROS DW 0AH, 0DH, 0H, 0H, 0H, 0H, 0H, 0H, 0H, 0H, 0H, 0H, 0AH, 0DH,
"$" ;array de los valores
data ends
codigo segment para public 'code'
assume cs:codigo,ss:stack,ds:data
KEYS proc FAR
PUSH DS
SUB AX, AX
PUSH AX
MOV AX, SEG DATA
MOV DS, AX
INICIO_CONTEO:
MOV DI, 0
SOLICITAR_NUMEROS:
MOV AH, 09H
MOV DX, OFFSET MEN1
INT 21H
MOV AH, 01H
INT 21H
MOV NUMEROS[DI], AX
SUB AL, 30H ; Convertir de ASCII a valor num�rico
MOV BH, AL
MOV AH, 01H
INT 21H
MOV NUMEROS[DI + 1], AX
SUB AL, 30H ; Convertir de ASCII a valor num�rico
MOV BL, AL
INC DI
INC DI; Avanzar al siguiente n�mero
CMP DI, 20
JL SOLICITAR_NUMEROS
MOV DI, 0
MOV SI, 0
SENTIDO:
MOV AH, 09H
MOV DX, OFFSET MEN2
INT 21H
MOV AH, 01H
INT 21H
CMP AL, '0'
JE ASCENDENTE
CMP AL, '1'
JE DESCENDENTE
JMP SENTIDO ; Si la entrada no es v�lida, volver a preguntar
DESCENDENTE:
MOV DI, 0
DESCENDENTE_LOOP:
MOV SI, 0
DESC_LOOP:
MOV AX, NUMEROS[SI]
MOV BX, NUMEROS[SI + 2]
MOV DL, AH
MOV DH, AL
MOV CL, BH
MOV CH, BL
CMP DX, CX
JGE NO_SWAP
XCHG AX, BX
MOV NUMEROS[SI], AX
MOV NUMEROS[SI + 2], BX
NO_SWAP:
ADD SI, 2
CMP SI, 20
JL DESC_LOOP
INC DI
CMP DI, 20
JL DESCENDENTE_LOOP
JMP IMP_NUMEROS
ASCENDENTE:
MOV DI, 0
ASCENDENTE_LOOP:
MOV SI, 0
ASC_LOOP:
MOV AX, NUMEROS[SI]
MOV BX, NUMEROS[SI + 2]
MOV DL, AH
MOV DH, AL
MOV CL, BH
MOV CH, BL
CMP DX, CX
JLE SWAP
XCHG AX, BX
MOV NUMEROS[SI], AX
MOV NUMEROS[SI + 2], BX
SWAP:
ADD SI, 2
CMP SI, 18
JL ASC_LOOP
INC DI
CMP DI, 18
JL ASCENDENTE_LOOP
JMP IMP_NUMEROS
IMP_NUMEROS:
MOV AH, 09H
MOV DX, OFFSET ALMVALORES
INT 21H
MOV DI, 0
IMP_NUMEROS_LOOP:
MOV AX, NUMEROS[DI]
MOV DL, AL
MOV AH, 02H ; Funci�n de DOS para imprimir car�cter
INT 21H
MOV AX, NUMEROS[DI + 1]
;ADD AL, 30H ; Convertir de valor num�rico a ASCII
MOV DL, AL
MOV AH, 02H ; Funci�n de DOS para imprimir car�cter
INT 21H
MOV AH, 09H
MOV DX, OFFSET ALMVALORES
INC DI
INC DI; Avanzar al siguiente n�mero
CMP DI, 20
JL IMP_NUMEROS_LOOP
; Repetir operaciones
MOV AH, 09H
MOV DX, OFFSET MEN3
INT 21H
MOV AH,01H
INT 21H
CMP AL, '1' ; Verificar si se desea repetir la operaci�n
JNE SALIR
JMP INICIO_CONTEO
SALIR:
RET
KEYS endp
CODIGO ends
end