GNU/Linux
•
xterm
•
bash
177 views
Este código es un programa en ensamblador ARM64 que solicita al usuario dos números de punto flotante, los suma y luego imprime el resultado. A continuación, te explico cada parte del código:
Sección de Datos (.data):
-
msg_prompt1: Es el mensaje que se muestra para solicitar el primer número del usuario. -
msg_prompt2: Es el mensaje que se muestra para solicitar el segundo número del usuario. -
msg_result: Es el mensaje que se utiliza para imprimir el resultado de la suma de los números con un formato de dos decimales (%.2f). -
fmt_float: Especifica el formato de entrada para leer números de punto flotante (en este caso, un número de tipodoublecon el formato%lf).
Sección de Código (.text):
El flujo de ejecución del programa se detalla en la función principal main.
1. Prologo (Configuración de la pila):
stp x29, x30, [sp, -16]! // Reserva espacio en la pila para los registros x29 (puntero de marco) y x30 (registro de enlace de retorno)
mov x29, sp // Establece el puntero de marco al valor actual de sp
sub sp, sp, #16 // Reserva 16 bytes de espacio para almacenar los dos números (double) en la pila
-
stp x29, x30, [sp, -16]!: Guarda los registrosx29(puntero de marco) yx30(registro de enlace de retorno) en la pila. -
mov x29, sp: Configura el puntero de marco (x29) para que apunte al actual puntero de pila (sp). -
sub sp, sp, #16: Reserva espacio de 16 bytes en la pila para almacenar los dos números de tipodouble(8 bytes cada uno).
2. Solicitar el primer número:
ldr x0, =msg_prompt1 // Cargar la dirección del mensaje para solicitar el primer número
bl printf // Llamar a printf para mostrar el mensaje
ldr x0, =fmt_float // Cargar el formato para leer un número de punto flotante
mov x1, sp // Establecer la dirección donde se guardará el primer número en la pila
bl scanf // Llamar a scanf para leer el primer número
-
ldr x0, =msg_prompt1: Carga la dirección de la cadena de texto para solicitar el primer número enx0. -
bl printf: Llama a la funciónprintfpara imprimir el mensaje. -
ldr x0, =fmt_float: Carga el formato de entrada para un número de punto flotante enx0. -
mov x1, sp: Establece la dirección de memoria donde se almacenará el primer número en la pila (el primer número se almacenará en la posiciónsp). -
bl scanf: Llama ascanfpara leer el número y almacenarlo en la memoria apuntada porx1.
3. Solicitar el segundo número:
ldr x0, =msg_prompt2 // Cargar la dirección del mensaje para solicitar el segundo número
bl printf // Llamar a printf para mostrar el mensaje
ldr x0, =fmt_float // Cargar el formato para leer un número de punto flotante
add x1, sp, #8 // Establecer la dirección donde se guardará el segundo número (8 bytes después del primero)
bl scanf // Llamar a scanf para leer el segundo número
-
ldr x0, =msg_prompt2: Carga la dirección del mensaje para solicitar el segundo número enx0. -
bl printf: Llama aprintfpara mostrar el mensaje. -
ldr x0, =fmt_float: Carga el formato de entrada para un número de punto flotante enx0. -
add x1, sp, #8: Establece la dirección de la pila donde se guardará el segundo número. El segundo número se almacenará 8 bytes después del primer número. -
bl scanf: Llama ascanfpara leer el segundo número y almacenarlo en la memoria apuntada porx1.
4. Cargar los números desde la pila:
ldr d0, [sp] // Cargar el primer número (double) en el registro d0
ldr d1, [sp, #8] // Cargar el segundo número (double) en el registro d1
-
ldr d0, [sp]: Carga el primer número almacenado en la pila en el registrod0(donde se almacenan números de punto flotante en ARM64). -
ldr d1, [sp, #8]: Carga el segundo número almacenado 8 bytes después despen el registrod1.
5. Realizar la suma:
fadd d2, d0, d1 // Sumar los dos números: d2 = d0 + d1
-
fadd d2, d0, d1: Realiza la suma de los dos números flotantes (almacenados end0yd1) y almacena el resultado end2.
6. Imprimir el resultado:
ldr x0, =msg_result // Cargar la dirección del mensaje para imprimir el resultado
fmov d0, d2 // Mover el resultado de la suma (d2) a d0 para que printf lo reciba
bl printf // Llamar a printf para imprimir el resultado
-
ldr x0, =msg_result: Carga la dirección del mensaje para imprimir el resultado enx0. -
fmov d0, d2: Mueve el resultado de la suma (almacenado end2) ad0para queprintflo reciba como argumento. -
bl printf: Llama aprintfpara mostrar el mensaje y el resultado de la suma.
7. Epílogo (Restaurar la pila y retornar):
add sp, sp, #16 // Restaurar el puntero de pila (liberar espacio reservado)
ldp x29, x30, [sp], 16 // Restaurar el puntero de marco y el enlace de retorno
ret // Retornar al sistema operativo (fin del programa)
-
add sp, sp, #16: Restaura el puntero de pila, liberando el espacio reservado para los números. -
ldp x29, x30, [sp], 16: Restaura los registrosx29(puntero de marco) yx30(registro de enlace de retorno) desde la pila. -
ret: Retorna el control al sistema operativo, terminando la ejecución del programa.
Resumen:
Este programa en ARM64 realiza los siguientes pasos:
-
Solicita dos números flotantes (de tipo
double) al usuario. - Suma esos dos números.
- Imprime el resultado de la suma con un formato de dos decimales.
- Al final, limpia la pila y retorna al sistema operativo.
Es un ejemplo simple de cómo manejar operaciones de punto flotante en ARM64 y cómo interactuar con el sistema usando printf y scanf para leer y escribir datos.