GNU/Linux xterm-256color bash 159 views

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

// ****************************************************************************
// * Codigo equivalente en python
// * import math
// * def main():
// *    print("Ingrese el radio: ", end='')
// *    try:
// *        radio = int(input())
// *    except ValueError:
// *        print("Error: Debe ingresar un número entero válido")
// *        return
// *    area = (314 * radio * radio) // 100
// *    print(f"Area del circulo: {area}")
// * if __name__ == "__main__":
// *    main()
// ****************************************************************************

.section .bss
input_buffer: .skip 16

.section .data
msg_ingreso: .ascii "Ingrese el radio: "
len_ingreso = . - msg_ingreso

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

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

.section .text
.global _start

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

    // Leer entrada del usuario
    mov x0, #0              // stdin
    ldr x1, =input_buffer
    mov x2, #16
    mov x8, #63             // syscall read
    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 *= 10
    add x2, x2, x4, lsl #1  // x2 = x2*10
    add x2, x2, x3
    b read_loop

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

    // Calcular área: A = (314 * r * r) / 100
    mul x6, x5, x5          // x6 = r^2
    mov x7, #314
    mul x6, x6, x7          // x6 = r^2 * 314
    mov x7, #100
    udiv x6, x6, x7         // x6 = area

    // Mostrar mensaje: "Area del circulo: "
    ldr x0, =msg_resultado
    mov x1, #len_resultado
    bl print_msg

    // Mostrar área (x6)
    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     // length
    mov x1, x0     // pointer
    mov x0, #1     // stdout
    mov x8, #64    // syscall write
    svc #0
    ret

// Imprime número entero en x0
print_number:
    // Convierte número en x0 a ASCII (almacena en buffer)
    mov x1, x0
    ldr x2, =input_buffer
    add x2, x2, #15     // posiciona al final del buffer
    mov w3, #0

convert_loop_num:
    mov x4, #10
    udiv x5, x1, x4     // x5 = x1 / 10
    msub x6, x5, x4, x1 // x6 = x1 - x5 * 10 (resto)
    add x6, x6, #'0'    // convierte a ASCII
    strb w6, [x2], #-1  // almacena byte y retrocede
    mov x1, x5
    add w3, w3, #1
    cbnz x1, convert_loop_num

    // imprimir desde x2+1, w3 bytes
    add x2, x2, #1
    mov x1, x2
    mov w2, w3       // <-- CORREGIDO
    mov x0, #1
    mov x8, #64
    svc #0
    ret