# 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