GNU/Linux xterm bash 160 views

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.