MinMax_2.s



#------------------------------------------
# Se piden N numeros de un digito
# y se localiza a max y a min
# Mayo - 2006
#------------------------------------------
.data
	max:	.int -50
	min:	.int 0xA

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


.text
	.global main
main:
	mov	%esp,	%ebp
					# Se pide N
	movl    $4,     %eax
	movl    $1,     %ebx
	movl    $N,	%ecx
	movl    $LN,	%edx
	int     $0x80

	
	movl	$3,     %eax
	movl    $1,	%ebx
	movl    $2,	%edx
	int     $0x80

	movb    (%ecx),	%al
	subl    $48,	%eax

	mov	%eax,	12(%ebp)	# se guarda N
	movl	$0,	8(%ebp)		# valor del ciclo

				# --------------------------Lectura del teclado
cicloLee:
	movl	8(%ebp), %eax		# rescato el paso de iteracion
	cmp	12(%ebp), %eax
	jl	PideDato
	jmp	MinMax
PideDato:
	movl    $4,	%eax
        movl    $1,	%ebx
        movl    $Pide,	%ecx
        movl    $LPide,	%edx
        int     $0x80
				# ------------------------
	movl    $3,     %eax
        movl    $1,     %ebx
        movl    $2,	%edx
        int     $0x80
				# ------------------------
	movb	(%ecx),	%al
	subl	$48,	%eax
				# Se almacena en su posicion
	mov	8(%ebp), %edx
	movl	%eax,	16(%ebp, %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     12(%ebp), %ebx
	jle     Revisa
	jmp     Respuesta

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

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

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


	
Respuesta:
	movl    $4,     %eax
	movl    $1,     %ebx
	movl    $CadMax,  %ecx
	movl    $LCadMax, %edx
	int     $0x80
					# conversion a ascii
        leal	max,    %eax
        add	$48,	(%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
					# conversion a ascii
	leal	min,    %eax
	add	$48,	(%eax)
	mov	%eax,	%ecx
	
	mov    $4,     %eax
	mov    $1,     %ebx
	mov    $1,     %edx
	int     $0x80

	movl    $4,     %eax
	movl    $1,     %ebx
	movl    $N,	%ecx
	movl    $LN,	%edx
	int     $0x80

Salir:
	pop %ebp
	ret