**
Nombre: cefa.s
Autor: Karla Itzel Vázquez Cruz
Fecha: 09-04-2025
Descripción: Celsius a Fahrenheit
Plataforma: Raspberry Pi OS 64-bit
Asciinema: cefa.s
Versión en C:
Versión en ARM64 RaspbianOS Linux:
.section .data
msg_input: .asciz "Ingresa la temperatura en Celsius: "
msg_result: .asciz "\nTemperatura en Fahrenheit: "
buffer: .skip 10 // buffer para la entrada
newline: .asciz "\n"
.section .text
.global _start
_start:
// Mostrar mensaje de entrada
mov x0, 1 // STDOUT
ldr x1, =msg_input
mov x2, 31 // longitud del mensaje
mov x8, 64 // syscall write
svc 0
// Leer desde teclado
mov x0, 0 // STDIN
ldr x1, =buffer
mov x2, 10 // leer hasta 10 bytes
mov x8, 63 // syscall read
svc 0
// Convertir cadena ASCII a número entero (en x2)
ldr x1, =buffer
mov x2, 0 // resultado
convert_loop:
ldrb w3, [x1], 1 // leer byte
cmp w3, #'0'
blt conversion_done
cmp w3, #'9'
bgt conversion_done
sub x3, x3, '0' // convertir ASCII a número
mov x4, #10
mul x2, x2, x4 // x2 *= 10
add x2, x2, x3 // x2 += nuevo dígito
b convert_loop
conversion_done:
// Fórmula: Fahrenheit = (Celsius * 9) / 5 + 32
mov x3, x2
mov x4, #9
mul x3, x3, x4 // Celsius * 9
mov x4, #5
udiv x3, x3, x4 // /5
add x3, x3, 32 // +32
// Convertir resultado x3 a ASCII en buffer
mov x5, x3 // copiar resultado
ldr x6, =buffer+9 // apuntar al final
mov x7, 10 // divisor base 10
int_to_ascii:
mov x8, x5
udiv x5, x5, x7 // x5 = x5 / 10
msub x9, x5, x7, x8 // x9 = x8 - x5*10
add x9, x9, '0' // convertir a ASCII
strb w9, [x6, -1]! // guardar y retroceder
cmp x5, 0
bne int_to_ascii
// Mostrar mensaje resultado
mov x0, 1
ldr x1, =msg_result
mov x2, 28 // longitud con \n
mov x8, 64
svc 0
// Mostrar número
mov x0, 1
mov x1, x6
ldr x2, =buffer+9
sub x2, x2, x6
mov x8, 64
svc 0
// Salto de línea
mov x0, 1
ldr x1, =newline
mov x2, 1
mov x8, 64
svc 0
// Salida limpia
mov x0, 0
mov x8, 93
svc 0