Demo entry 6254593

nelson

   

Submitted by anonymous on Oct 14, 2016 at 23:50
Language: NASM. Code size: 4.0 kB.

.model small
.stack 256
.data
;========================Variables declaradas aqui===========================

max 	db  101 		;maxima cantidad que almacena
len		db  0			;caracteres leidos
text	db  102 dup(0)	;buffer de entrada
		
flen	db	0			;este lo debo aumentar yo
ftext 	db	102 dup('$') 	;para almacenar la entrada filtrada

menu	db	"Ordena mayusculas con u, minusculas con l y numeros con n", 10, '$'

;============================================================================
.code
main:	
	mov ax, @data
	mov ds, ax
	mov es, ax                  ;set segment register
    and sp, not 3               ;align stack to avoid AC fault
;====================================Código==================================  
	
	;RECIBO LA CADENA
	mov ah, 0ah 			;Indico cual funcion del DOS utilizaré
	mov dx, offset max		;paso la posicion del buffer 
	int 21h					;la interrupcion de siempre
	
L1:
	mov ah, 09h
	mov dl, offset menu 	;imprime el menu
	int 21h

	mov ah, 7	;tomar un caracter de entrada sin eco
	int 21h		;el valor se almacena en al

	;AQUI EMPIEZA LA PELEA

	cmp al, 1bh	;comparar con el caracter de ESC
	je	exit	;si es igual salta a la salida

	mov bx, -1	;inicializo bx
	mov si, 0	;tambien si

	cmp al, 'u'	;opcion para las mayusculas
	jne	next1	;sino es igual saltarse este pedazo

	l11:
		inc bx	
		cmp text[bx], 13	;si llegue al final del texto ir a ordenar el 13 es valor ascii de CR que es el fin de cadena
		je sort
		cmp text[bx], 'A'	;si es menor que A esta fuera de rango
		jl l11
		cmp text[bx], 'Z'	;si es mayor que Z esta fuera de rango
		jg l11
		;si llega hasta aqui esta dentro del rango
		mov cl, text[bx]
		mov ftext[si], cl	;coloca el caracter filtrado en ftext
		inc si
	jmp	l11

next1:	
	
	cmp al, 'l' ;opcion para las minusculas
	jne next2	;sino es esta opcion saltate esta parte

	l12:
		inc bx
		cmp text[bx], 13  ;13 => valor de CR que es el fin de cadena
		je sort
		cmp text[bx], 'a' ;menor a 'a' es fuera de rango
		jl l12
		cmp text[bx], 'z' ;mayor a 'z' es fuera de rango too
		jg l12

		mov cl, text[bx]
		mov ftext[si], cl
		inc si
	jmp l12

next2:

	cmp al, 'n' ;opcion para los números
	jne l1	;si tampoco es esta opcion el usuario se equivoco vuelve a repetir el menu

	l13:
		inc bx
		cmp text[bx], 13  ;13 => valor de CR que es el fin de cadena
		je sort
		cmp text[bx], '0' ;menor a '0' es fuera de rango
		jl l13
		cmp text[bx], '9' ;mayor a '9' es fuera de rango too
		jg l13

		mov cl, text[bx]
		mov ftext[si], cl
		inc si
	jmp l13

sort: ;;ORDENACION POR BURBUJA (para el ftext)
	mov cx, si ; para poder usar el cl
	mov [flen], cl ;SI guarda la cantidad ingresada menos 1 en ftext
	mov ax, 0 ;medida precautiva tambien
	mov bx, 0 ;inicializacion
ls1: ;;primer loop del ordenamiento de burbuja
	mov al, cl ;al basicamente es para guardar (cl-1)
	dec al
	cmp bx, ax ; if (bx >= cl-1)
	jge fin
	mov si, bx ;si = bx + 1
	inc si
ls2:
	cmp si, cx ; if (si >= cl)
	jge no1
	mov dl, ftext[si] ;; para comparar abajo
	cmp ftext[bx], dl;  if (text[bx] <= text[si])
	jle no2
	xchg ftext[bx], dl ; swap(text[bx], text[si])
	mov ftext[si], dl ;colocar su valor en ftext[si]
no2:
	inc si ;incremento el contador del bucle interno del algoritmo
	jmp ls2
no1:
	inc bx ; incremento el contador del bucle externo
	jmp ls1
fin: ;;FIN ORDENACION POR BURBUJA
	
	mov ah, 09h				;Funcion para imprimir string que termina en '$' almacenado en dx
	mov dx, offset ftext
	int 21h
	
	mov ah, 2  ; un salto de linea para que se impriman uno debajo de la otra
	mov dl, 10
	int 21h
	;;-----------------------

	jmp l1 ;vuelve a repetir el loop

exit:

;============================================================================

.exit
;================================Funciones aqui==============================



;============================================================================
end main

This snippet took 0.00 seconds to highlight.

Back to the Entry List or Home.

Delete this entry (admin only).