MinMax.s



#------------------------------------------
# Se piden 10 numeros de un digito
# y se localiza a max y a min
# Mayo - 2006
#------------------------------------------
.data
	vector:  .int 0,0,0,0,0,0,0,0,0,0
	CAD:	.ascii	"0123456789"
	max:	.int -500
	min:	.int 500

	Pide:	.ascii  "Dato: "
                LPide = . - Pide
	CadMax:	.ascii	"\nEl mayor es: "
		LCadMax = .- CadMax
	CadMin:	.ascii	"\nEl menor es: "
		LCadMin = .- CadMin


.text
	.global main
main:
	mov	%esp,	%ebp
	movl	$0,	8(%ebp)		# valor del ciclo

				# --------------------------Lectura del teclado
cicloLee:
	movl	8(%ebp), %eax		# rescato el paso de iteracion
	cmp	$9,	%eax
	jle	PideDato
	jmp	MinMax
PideDato:
	movl    $4,	%eax		# funcion write
        movl    $1,	%ebx		# io
        movl    $Pide,	%ecx		# cadena a mostrar
        movl    $LPide,	%edx		# Longitud de lo que se lee
        int     $0x80			# llamada al sistema
				# ------------------------
	movl    $3,     %eax		# funcion read
        movl    $1,     %ebx		# io
        movl    $2,	%edx		# Longitud ( el caracter y el enter )
        int     $0x80			# llamada al sistema
				# ------------------------
	movb	(%ecx),	%al		# se lee el primer byte. (si es 23 entonces es el 2)
	subl	$48,	%eax		# Es un ascii. (1 = 49 entonces 49 - 48 = 1)
				# Se almacena en su posicion
	movl	8(%ebp), %edx
	movl	%eax,	vector(, %edx, 4)
					# se actualiza el paso iterativo
	leal	8(%ebp), %eax
	incl	(%eax)
	jmp	cicloLee
	
					# Busqueda de max y min
MinMax:
	movl	$0,	8(%ebp)

cicloRevisa:
	movl    8(%ebp), %ebx           # rescato el paso de iteracion
        cmp     $9,     %ebx
	jle     Revisa
	jmp     Respuesta

Revisa:
	movl    8(%ebp), %ebx
	movl	vector(, %ebx, 4), %eax
	cmpl    max,	%eax
	jg      SwapMax
RevMin:
	movl	vector(, %ebx, 4), %eax
	cmpl	min,	%eax
	jl	SwapMin
next:
	leal	8(%ebp), %eax
	incl	(%eax)
	jmp	cicloRevisa

SwapMax:
	movl	vector(, %ebx, 4), %eax
	movl	%eax, max
	jmp	RevMin

SwapMin:
	movl	vector(, %ebx, 4), %eax
	movl	%eax,	min
	jmp	next


	
Respuesta:
	movl    $4,     %eax            # funcion write
	movl    $1,     %ebx            # io
	movl    $CadMax,  %ecx            # cadena a mostrar
	movl    $LCadMax, %edx            # Longitud de lo que se lee
	int     $0x80

        mov     max,    %eax
        leal    CAD(,%eax,1), %eax
        mov     %eax,   %ecx
	movl	$4,	%eax
	movl	$1,	%ebx
	movl	$1,	%edx
	int	$0x80

        movl    $4,     %eax            # funcion write
        movl    $1,     %ebx            # io
	movl    $CadMin,  %ecx
	movl    $LCadMin, %edx
	int     $0x80

	movl    min,    %eax
	leal    CAD(,%eax,1), %eax
	mov	%eax,	%ecx
	movl    $4,     %eax
	movl    $1,     %ebx
	movl    $1,     %edx
	int     $0x80

Salir:
	pop %ebp
	ret