Este programa ARM64 para Raspberry Pi con RaspbianOS de 64 bits convierte una temperatura de Celsius a Fahrenheit, usando números de punto flotante (double). Vamos a desglosarlo paso a paso, explicándolo de manera clara y en español.
🔥🌡️ ¿Qué hace el programa?
-
Solicita al usuario una temperatura en grados Celsius.
-
Realiza la fórmula:
[
\text{Fahrenheit} = \text{Celsius} \times 1.8 + 32
]
-
Imprime el resultado con dos decimales.
🗂️ .data – Segmento de datos
msg_prompt: .asciz "Ingresa la temperatura en Celsius: "
msg_result: .asciz "La temperatura en Fahrenheit es: %.2f\n"
fmt_float: .asciz "%lf"
factor: .double 1.8
addend: .double 32.0
-
msg_prompt: mensaje que se muestra para que el usuario ingrese una temperatura.
-
msg_result: formato de printf con 2 decimales (%.2f) para mostrar Fahrenheit.
-
fmt_float: formato para scanf con double (%lf).
-
factor: constante 1.8 (equivalente a 9.0 / 5.0).
-
addend: constante 32.0.
🧾 .text – Código ejecutable
🔧 Prólogo: preparar el stack
stp x29, x30, [sp, -16]!
mov x29, sp
sub sp, sp, #16
-
Guarda
x29 y x30 (marco y enlace de retorno).
-
Reserva 16 bytes en la pila para guardar el número
double.
🖨️ Mostrar mensaje de entrada
ldr x0, =msg_prompt
bl printf
-
Carga la dirección del mensaje y lo imprime.
⌨️ Leer número double con scanf
ldr x0, =fmt_float // "%lf"
mov x1, sp // Guarda en la pila
bl scanf
-
Lee el número y lo guarda en la dirección actual del stack (
sp).
📥 Cargar Celsius desde la pila
ldr d0, [sp]
-
Carga el número ingresado como
double en el registro d0.
🔢 Realizar la conversión
ldr x1, =factor
ldr d1, [x1]
fmul d2, d0, d1
-
d1 = 1.8, d0 = Celsius, d2 = Celsius * 1.8
ldr x2, =addend
ldr d3, [x2]
fadd d2, d2, d3
-
d3 = 32.0, d2 = d2 + 32 → Resultado final en d2
🖨️ Imprimir resultado
ldr x0, =msg_result
fmov d0, d2
bl printf
-
Prepara el mensaje y mueve el resultado a
d0 para pasarlo como parámetro de printf.
🧹 Epílogo
add sp, sp, #16
ldp x29, x30, [sp], 16
ret
-
Libera el espacio en la pila y restaura registros.
-
Termina el programa con
ret.
🧪 Ejemplo de ejecución
$ ./celsius2f
Ingresa la temperatura en Celsius: 100
La temperatura en Fahrenheit es: 212.00
🚧 Detalles técnicos útiles
-
Usa registros
d0 a d3, que son de doble precisión (64 bits).
-
Se apoya en funciones de C (
printf y scanf) usando la ABI de Linux ARM64.
-
Buena práctica: reserva espacio en la pila para evitar registros globales innecesarios.