.section .data
msg: .asciz "Grados: "
buffer_rad: .space 8
entero_buf: .space 8
decimal_buf: .space 8
newline: .asciz "\n"
factor: .quad 57295800 // 180/π ≈ 57.2958 × 1,000,000
escala: .quad 1000000 // escala para punto fijo
.section .text
.global _start
_start:
// Leer radianes desde stdin
mov x0, #0
ldr x1, =buffer_rad
mov x2, #8
mov x8, #63
svc 0
ldr x1, =buffer_rad
bl ascii_to_int
mov x20, x0 // x20 = radianes (como entero)
// Multiplicar por (180 / π)
ldr x21, =factor
ldr x21, [x21]
mul x22, x20, x21 // radianes × factor
// Dividir por escala para obtener valor real
ldr x23, =escala
ldr x23, [x23]
udiv x24, x22, x23 // parte entera
msub x25, x24, x23, x22 // parte decimal
// Convertir parte entera
mov x0, x24
ldr x1, =entero_buf
bl int_to_ascii
// Parte decimal (dos cifras)
mov x0, x25
mov x1, #10000
udiv x0, x0, x1 // 2 decimales (xx.yy)
ldr x1, =decimal_buf
bl int_to_ascii
// Imprimir "Grados: "
mov x0, #1
ldr x1, =msg
mov x2, #8
mov x8, #64
svc 0
// Imprimir parte entera
mov x0, #1
ldr x1, =entero_buf
mov x2, #8
mov x8, #64
svc 0
// Imprimir "."
mov x0, #1
ldr x1, =newline
mov w2, #1
mov w3, #'.'
strb w3, [x1]
mov x2, #1
mov x8, #64
svc 0
// Imprimir 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
// Función: ascii_to_int
// Entrada: x1 = buffer con texto
// Salida: x0 = número entero
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
// Función: int_to_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