GNU/Linux xterm-256color bash 176 views

// ****************************************************************************
// * 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