GNU/Linux xterm-256color bash 187 views

// ****************************************************************************
// * Lenguajes de Interfaz en TECNM Campus ITT
// * Nombre del archivo: practica.s
// * Descripción: Programa que calcula el area de un cuadrado
// * Autor: [America Fernanda Nevarez de la Cruz]
// * Fecha: [2025-04-10]
// * Plataforma: Raspberry Pi OS (64 bits)
// * Demostración:  [https://asciinema.org/a/GkRjk6B3XL8yd08r7Zhp4TIwK]
// ****************************************************************************

// ****************************************************************************
// * Codigo equivalente en Python
// *def calcular_area_cuadrado():
// *    try:
// *        print("// *Calculadora de Área de Cuadrado")
// *        lado = float(input("// *Ingrese la longitud del lado: "))
// *        
// *        if lado <= 0:
// *            print("// *Error: El lado debe ser positivo")
// *        else:
// *            area = lado ** 2
// *            print(f"// *El área del cuadrado es: {area:.2f}")
// *            
// *    except ValueError:
// *        print("// *Error: Ingrese un valor numérico válido")
// *
// *if __name__ == "__main__":
// *    calcular_area_cuadrado()
// ****************************************************************************
.section .bss
input_buffer: .skip 16

.section .data
msg_ingreso: .ascii "Ingrese el lado del cuadrado: "
len_ingreso = . - msg_ingreso

msg_resultado: .ascii "Area del cuadrado: "
len_resultado = . - msg_resultado

newline: .ascii "\n"
len_nl = . - newline

.section .text
.global _start

_start:
    // Mostrar mensaje
    ldr x0, =msg_ingreso
    mov x1, #len_ingreso
    bl print_msg

    // Leer entrada
    mov x0, #0
    ldr x1, =input_buffer
    mov x2, #16
    mov x8, #63
    svc #0

    // Convertir ASCII a entero (resultado en x2)
    ldr x1, =input_buffer
    mov x2, #0

read_loop:
    ldrb w3, [x1], #1
    cmp w3, #'0'
    blt done_read
    cmp w3, #'9'
    bgt done_read
    sub w3, w3, #'0'
    mov x4, x2
    lsl x2, x2, #3          // x2 *= 8
    add x2, x2, x4, lsl #1  // x2 = x2 * 10
    add x2, x2, x3
    b read_loop

done_read:
    // Guardar lado en x5
    mov x5, x2

    // Calcular área: A = lado * lado
    mul x6, x5, x5

    // Mostrar mensaje
    ldr x0, =msg_resultado
    mov x1, #len_resultado
    bl print_msg

    // Mostrar área
    mov x0, x6
    bl print_number

    // Salto de línea
    ldr x0, =newline
    mov x1, #len_nl
    bl print_msg

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

// ---------- FUNCIONES ----------

// Imprime mensaje en x0 (puntero) con longitud x1
print_msg:
    mov x2, x1
    mov x1, x0
    mov x0, #1
    mov x8, #64
    svc #0
    ret

// Imprime número entero en x0
print_number:
    mov x1, x0
    ldr x2, =input_buffer
    add x2, x2, #15
    mov w3, #0

convert_loop_num:
    mov x4, #10
    udiv x5, x1, x4
    msub x6, x5, x4, x1
    add x6, x6, #'0'
    strb w6, [x2], #-1
    mov x1, x5
    add w3, w3, #1
    cbnz x1, convert_loop_num

    add x2, x2, #1
    mov x1, x2
    mov w2, w3
    mov x0, #1
    mov x8, #64
    svc #0
    ret