#
# Búsqueda lineal en arreglos
#
# El procedimiento de búsqueda regresa:
#	el índice (>= 0) si el elemento está en el arreglo
#	-1 si no está
#

	.data
A:      .word 22, 6, 16, 15, 2, 11, 14, 3       # arreglo
n:	.word 8					# número de elementos
x:	.word 0					# número a buscar
m1:	.asciiz "Escribe el número a buscar: "
m2: .asciiz "El número no está."
m3: .asciiz "El número está en el índice: "

	.text
#
# Procedimiento main
#

main:
# Lee el número a buscar
	la $a0, m1
	li $v0, 4 # print_str
	syscall

	li $v0, 5 # read_int
	syscall
	la $t0, x		# t0 apunta a x
	sw $v0, ($t0)		# guarda v0 en x

# Llama a la búsqueda lineal
	la $a0, A		# dirección del arreglo
	la $a1, n		# tamaño del arreglo
	la $a2, x		# direccion del número a buscar
	jal bus_lin

# Escribe el resultado
	move $t0, $v0		# t0 tiene el resultado de la búsqueda
	li $t1, -1		# -1 es condición de falla
	beq $t0, $t1, no_esta	# if (t0 == -1) goto no_esta

	la $a0, m3		# a0 apunta al string "si esta"
	li $v0, 4		# print_str
	syscall

	move $a0, $t0		# a0 tiene el índice
	li $v0, 1		# print_int
	syscall

	j fin

no_esta:
	la $a0, m2		# a0 apunta al string "no esta"
	li $v0, 4		# print_str
	syscall

# The program is finished. Exit.
fin:
	li $v0, 10          	# system call for exit
	syscall               	# Exit!

#
# Procedimiento bus_lin
#
# Registros usados:
#	$a0 - apunta al string (A)
#	$s0 - tamaño del string (n)
#	$s1 - elemento a buscar (x)
#	$t0 - contador que guarda el índice en A del elemento que se está considerando.
#	      $t0 comienza en 0 y si llega a valer n el elemento no está en A.
#

bus_lin:
	li $t0, 0			# t0 = 0
	lw $s0, ($a1)		# s0 = n
	lw $s1, ($a2)		# s1 = x

ciclo:
	beq $t0, $s0, falla	# if (t0 == n) goto falla
	lw $s2, ($a0)		# s2 = arreglo[a0]
	beq $s1, $s2, exito	# if (s1 == s2) goto exito
	addi $a0, $a0, 4	# a0 apunta al siguiente elemento
	addi $t0, $t0, 1	# t0++
	j ciclo

exito:
	move $v0, $t0		# regresa el índice (exito)
	j regresa

falla:
	li $v0, -1		# regresa -1 (falla)

regresa:
	jr $31
