7_TABLA_MULT.s



# REALIZA LA TABLA DE MULTIPLICAR DADO UN NUMERO
# POR TECLADO DEL 1 (UNO) AL 9 (NUEVE)
# EVITANDO EL RESULTADO DE TRES DIGITOS



.data
	CADENA:	.string "INTRODUCE N(1 a 9): "
	POR:	.string "   X   "
	IGUAL:	.string "   =   "
	NL:	.byte 0x0A		# cOdigo ascii del salto de lInea

	# Longitudes de las cadenas
	LCAD:	.int 20
	LPI:	.int 7
	LNL:	.int 1

	TABLA:	.int 9	# valor de la tabla
	X:	.int 1	# variable del ciclo
	Rdiv:	.int 10	# divisor
	RESP:	.int 5  # resultado
	NUM:	.int 1	# auxiliar en la impresiOn de nUmeros
	COCIENTE: .int 1
	RESIDUO:	.int 1


# MUESTRA MENSAJE
.macro print mess len
	movl	$4, %eax
	movl	$1, %ebx
	movl	\mess, %ecx
	movl	\len, %edx
	int	$0x80	
.endm


.text
        .global main

main:  
	print $CADENA LCAD

	# PIDE LA TABLA
	movl	$3, %eax
	movl	$0, %ebx
	movl	$TABLA, %ecx
	movl	$1, %edx
	int	$0x80
	print	$NL LNL

	subl	$48, TABLA	# ajusta el valor dado de teclado (ascii)

	# CICLO ASCENDENTE 1 A 10
ciclo:
	movl	$11, %eax	# limite de la tabla (10)
	movl	X, %ebx
	cmpl	%ebx, %eax	# llegaste a once?
	je	fin

	# MULTIPLICACION
	movl	TABLA, %eax
	movl	X, %ebx
	mul	%ebx
	jmp	VerFormato
continUa:
	addl	$1, X
	jmp	ciclo

	# MUESTRA EL RESULTADO DE CADA MULTIPLICACION
VerFormato:
	movl	%eax, RESP

	addl	$48, TABLA
	print	$TABLA $1
	subl	$48, TABLA

	print	$POR LPI

	movl	X, %eax
	jmp	VerFactor2
Factor2:
	print	$IGUAL LPI

	movl	RESP, %eax
	jmp	VerResp
Respuesta:
	print	$NL LNL
	jmp	continUa

VerResp:
	movl	%eax, NUM
	cmpl	$10, NUM
	jae	NDigitos		# NUM, es mayor o igual a diez??
	call	UnDigito
	jmp	Respuesta
NDigitos:
	call	DosDigitos
	jmp	Respuesta

VerFactor2:			# el dato llega en %eax
	movl	%eax, NUM
	cmpl	$10, NUM
	jae	Es_Diez		# NUM, es mayor o igual a diez??
	call	UnDigito		# si no, se trata de un sOlo dIgito
	jmp	Factor2
Es_Diez:
	call	DosDigitos
	jmp	Factor2

	# FIN DEL PROGRAMA
fin:
	movl $1, %eax
	movl $0, %ebx
	int $0x80

#==============================================================
#		R U T I N A S
#==============================================================
DosDigitos:
	movl	NUM, %eax
	movl	$1, %ebx		# truquito ;-) 
	mul	%ebx
	divl	Rdiv		# AX / 10
	addl	$48, %eax	# cociente
	addl	$48, %edx	# residuo
	movl	%eax, COCIENTE
	movl	%edx, RESIDUO

	print	$COCIENTE $1
	print	$RESIDUO $1
	ret
UnDigito:
	addl	$48, NUM
	print	$NUM $1
	subl	$48, NUM
	ret