GNU/Linux xterm-256color bash 185 views

/*
Autor: Victor Manuel Madrid Lugo
Fecha: 09/04/2025
Descripción: Imprime la tabla de multiplicar del 2 (2x1 a 2x10)
Demostración: [https://asciinema.org/a/Qw67hLil7FDJd1HIPyZA7YHDT]

Equivalente en Python:
for i in range(1, 11):
    print(f"2 x {i} = {2*i}")
*/

.section .data
    tabla:      .asciz "2 x "
    igual:      .asciz " = "
    newline:    .asciz "\n"
    buffer:     .skip 12       // Buffer para conversión numérica

.section .text
.global _start

_start:
    // Inicializar contador (1 a 10)
    mov x19, #1          // Contador (i)

multiplicar:
    // Imprimir "2 x "
    mov x0, #1
    ldr x1, =tabla
    mov x2, #4           // Longitud de "2 x "
    mov x8, #64          // syscall write
    svc #0

    // Convertir contador a string
    ldr x0, =buffer
    mov x1, x19
    bl int_to_str
    mov x20, x0          // Guardar longitud

    // Imprimir contador
    mov x0, #1
    ldr x1, =buffer
    mov x2, x20          // Longitud del número
    mov x8, #64
    svc #0

    // Imprimir " = "
    mov x0, #1
    ldr x1, =igual
    mov x2, #3           // Longitud de " = "
    mov x8, #64
    svc #0

    // Calcular 2*i
    mov x21, #2
    mul x22, x21, x19    // x22 = 2 * i

    // Convertir resultado a string
    ldr x0, =buffer
    mov x1, x22
    bl int_to_str
    mov x23, x0          // Guardar longitud

    // Imprimir resultado
    mov x0, #1
    ldr x1, =buffer
    mov x2, x23          // Longitud del número
    mov x8, #64
    svc #0

    // Imprimir nueva línea
    mov x0, #1
    ldr x1, =newline
    mov x2, #1
    mov x8, #64
    svc #0

    // Incrementar contador
    add x19, x19, #1

    // Verificar condición (i <= 10)
    cmp x19, #10
    ble multiplicar

    // Salir
    mov x0, #0
    mov x8, #93
    svc #0

// Función int_to_str (conversión de entero a string)
int_to_str:
    mov x2, #10
    mov x3, #0           // Contador dígitos
    mov x4, x0           // Guardar dirección buffer

    // Manejar 0
    cbz x1, handle_zero

    // Convertir dígitos
convert_loop:
    udiv x5, x1, x2      // x5 = x1 / 10
    msub x6, x5, x2, x1  // x6 = x1 % 10
    add x6, x6, #'0'
    strb w6, [x4, x3]
    add x3, x3, #1
    mov x1, x5
    cbnz x1, convert_loop

    // Invertir dígitos
    mov x5, #0           // inicio
    sub x6, x3, #1       // fin
reverse_loop:
    cmp x5, x6
    b.ge reverse_done
    ldrb w7, [x4, x5]
    ldrb w8, [x4, x6]
    strb w8, [x4, x5]
    strb w7, [x4, x6]
    add x5, x5, #1
    sub x6, x6, #1
    b reverse_loop

handle_zero:
    mov w5, #'0'
    strb w5, [x4]
    mov x3, #1

reverse_done:
    // Null terminator
    mov w5, #0
    strb w5, [x4, x3]
    mov x0, x3           // Devolver longitud
    ret