GNU/Linux xterm-256color zsh 138 views

.section .data
msg:         .asciz "Radianes: "
buffer_deg:  .space 8
entero_buf:  .space 8
decimal_buf: .space 8
newline:     .asciz "\n"
pi_180:      .quad 17453        // π/180 ≈ 0.017453 × 1,000,000
escala:      .quad 1000000      // Para dividir y separar parte decimal

.section .text
.global _start

_start:
    // -----------------------
    // Leer grados desde stdin
    // -----------------------
    mov x0, #0
    ldr x1, =buffer_deg
    mov x2, #8
    mov x8, #63
    svc 0
    ldr x1, =buffer_deg
    bl ascii_to_int
    mov x20, x0         // x20 = grados

    // -----------------------
    // Calcular radianes = grados × π/180
    // -----------------------
    ldr x21, =pi_180
    ldr x21, [x21]
    mul x22, x20, x21   // grados × 17453

    // División para separar parte entera y decimal
    ldr x23, =escala
    ldr x23, [x23]
    udiv x24, x22, x23      // x24 = parte entera
    msub x25, x24, x23, x22 // x25 = residuo (parte decimal)

    // Convertir parte entera
    mov x0, x24
    ldr x1, =entero_buf
    bl int_to_ascii

    // Convertir parte decimal (tomamos solo 2 cifras decimales)
    mov x0, x25
    mov x1, #10000          // ajustar de escala ×1_000_000 a ×100
    udiv x0, x0, x1         // redondear parte decimal (2 dígitos)
    ldr x1, =decimal_buf
    bl int_to_ascii

    // -----------------------
    // Mostrar mensaje base
    // -----------------------
    mov x0, #1
    ldr x1, =msg
    mov x2, #10
    mov x8, #64
    svc 0

    // Mostrar parte entera
    mov x0, #1
    ldr x1, =entero_buf
    mov x2, #8
    mov x8, #64
    svc 0

    // Mostrar punto "."
    mov x0, #1
    ldr x1, =newline       // temporalmente reutilizamos \n
    mov w2, #1
    mov w3, #'.'
    strb w3, [x1]
    mov x2, #1
    mov x8, #64
    svc 0

    // Mostrar parte decimal
    mov x0, #1
    ldr x1, =decimal_buf
    mov x2, #2
    mov x8, #64
    svc 0

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

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

// ------------------------------------------------------------
// ascii_to_int: convierte texto ASCII a número
// Entrada: x1 = buffer
// Salida:  x0 = número
// ------------------------------------------------------------
ascii_to_int:
    mov x0, #0
    mov x2, #0
    mov x3, #10
parse_loop:
    add x4, x1, x2
    ldrb w5, [x4]
    cmp w5, #'0'
    blt end_parse
    cmp w5, #'9'
    bgt end_parse
    sub w5, w5, #'0'
    mul x0, x0, x3
    uxtw x6, w5
    add x0, x0, x6
    add x2, x2, #1
    b parse_loop
end_parse:
    ret

// ------------------------------------------------------------
// int_to_ascii: convierte número entero positivo a ASCII
// Entrada: x0 = número, x1 = buffer destino
// ------------------------------------------------------------
int_to_ascii:
    mov x2, #10
    mov x3, x1
    mov x4, #0
convert_loop:
    udiv x5, x0, x2
    msub x6, x5, x2, x0
    add x6, x6, #'0'
    strb w6, [x1], #1
    add x4, x4, #1
    mov x0, x5
    cbz x0, reverse_ascii
    b convert_loop
reverse_ascii:
    sub x1, x1, x4
    mov x5, #0
rev_loop:
    cmp x5, x4
    bge done_ascii
    sub x4, x4, #1
    ldrb w6, [x1, x5]
    ldrb w7, [x1, x4]
    strb w7, [x1, x5]
    strb w6, [x1, x4]
    add x5, x5, #1
    b rev_loop
done_ascii:
    ret