// ****************************************************************************
// * Nombre del archivo: practica.s
// * Descripción: Imprimir las tablas de sumar hasta el 12
// * Autor: Roldan Castro Luis Alberto
// * Fecha: 10-04-2025
// * Plataforma: Raspberry Pi OS (64 bits)
// * Asciinema: https://asciinema.org/a/F1ByFffGV65OB4dRRqpRXMuZ0
// ****************************************************************************
// ****************************************************************************
// Version en python
//
//# Imprimir las tablas de sumar del 1 al 12
//for i in range(13): # Desde 0 hasta 12
// print(f"\nTabla del {i}:")
// for j in range(13): # Desde 0 hasta 12
// print(f"{i} + {j} = {i + j}")
// ****************************************************************************
.section .data
plus: .ascii " + "
len_plus = . - plus
equal: .ascii " = "
len_equal = . - equal
nl: .ascii "\n"
len_nl = . - nl
.section .bss
buf: .skip 16 // buffer temporal para print_int
.section .text
.global _start
_start:
mov x20, #0 // i = 0
outer_loop:
cmp x20, #13 // mientras i < 13
bge end_program
mov x21, #0 // j = 0
inner_loop:
cmp x21, #13 // mientras j < 13
bge print_blank_line
// Mostrar i
mov x0, x20
bl print_int
// Mostrar " + "
ldr x0, =plus
mov x1, #len_plus
bl print_msg
// Mostrar j
mov x0, x21
bl print_int
// Mostrar " = "
ldr x0, =equal
mov x1, #len_equal
bl print_msg
// Calcular suma
add x0, x20, x21
bl print_int
// Mostrar nueva línea
ldr x0, =nl
mov x1, #len_nl
bl print_msg
// j++
add x21, x21, #1
b inner_loop
print_blank_line:
// Imprimir línea en blanco
ldr x0, =nl
mov x1, #len_nl
bl print_msg
add x20, x20, #1 // i++
b outer_loop
end_program:
mov x8, #93 // exit syscall
mov x0, #0
svc #0
// --------------------------------------------------
print_msg: // x0 = ptr, x1 = len
mov x2, x1
mov x1, x0
mov x0, #1 // stdout
mov x8, #64 // syscall write
svc #0
ret
// --------------------------------------------------
print_int: // x0 = número a imprimir
sub sp, sp, #16
mov x1, x0 // número a convertir
mov x2, sp // puntero al buffer
cmp x1, #0
b.ne int_convert
mov w3, #'0'
strb w3, [x2]
mov x2, #1
b int_print
int_convert:
mov x3, #10
mov x4, x2 // ptr final del buffer
int_loop:
udiv x5, x1, x3
msub x6, x5, x3, x1
add x6, x6, #'0'
sub x4, x4, #1
strb w6, [x4]
mov x1, x5
cmp x1, #0
b.ne int_loop
sub x2, x2, x4
mov x1, x4
int_print:
mov x0, #1
mov x8, #64
svc #0
add sp, sp, #16
ret