Syscall de Salida (60)
Parte de la sección Fundamentos del Journey de Assembly de Coddy. Lección 32 de 45.
La llamada al sistema más importante para cualquier programa es exit. Sin ella, tu programa seguiría ejecutándose para siempre o se bloquearía al llegar al final de la memoria.
El número de la llamada al sistema exit es 60.
Sintaxis:
mov rax, 60 ; número de syscall para exit
mov rdi, 0 ; código de salida (0 = éxito)
syscall ; pide al SO que salgaQué sucede cuando ejecutas <strong>syscall</strong> con <strong>rax = 60</strong>:
- La CPU salta al kernel de Linux
- El kernel ve: "exit syscall with code 0"
- El kernel termina tu programa
- El kernel devuelve el control al shell o al sistema operativo
El código de salida 0 significa éxito: el programa se completó sin errores. Los códigos de salida del 1 al 255 indican errores diferentes. Puedes elegir cualquier número para indicar qué salió mal.
Por qué importan los códigos de salida:
Después de que tu programa termina, el shell (terminal) almacena el código de salida. Puedes comprobarlo con:
./myprogram
echo $? ; Imprime el código de salidaEsto es útil para:
- Scripts que comprueban si un programa tuvo éxito
- Depuración (códigos diferentes para errores diferentes)
- Encadenar programas
Un programa mínimo completo:
section .text
global _start
_start:
mov rax, 60 ; syscall de salida
mov rdi, 0 ; código de salida 0 (éxito)
syscallEste programa no hace nada visible. Simplemente sale correctamente. Pero es un programa válido y completo.
Mencionemos qué son global _start y _start:.
| Código | Qué es | Por qué lo necesitas |
|---|---|---|
global _start | Indica al enlazador dónde comienza tu programa | Sin esto, el enlazador no sabe qué etiqueta es el punto de entrada |
_start: | Una etiqueta que marca el comienzo de tu código | La CPU comienza a ejecutar aquí |
No necesitas memorizar los detalles. Solo debes saber que cada main.asm debe tener estas dos líneas antes de tu código. Las usarás en todos los programas.
¿Qué ocurre si olvidas la llamada al sistema de salida?
Si no incluyes la llamada al sistema de salida, la CPU seguirá ejecutando cualquier dato basura que se encuentre en la memoria después de tu código. Esto suele provocar un fallo de segmentación (crash) o un comportamiento completamente inesperado. Tu programa no finalizará correctamente.
Termina siempre tu programa con una llamada al sistema de salida.
Desafío
Añade la llamada al sistema de salida con el código de salida 5.
El código para imprimir el mensaje "Exiting with code 5" ya se te proporciona. Todavía no necesitas entenderlo. Se explicará en el capítulo 5.
Tu tarea consiste únicamente en añadir la llamada al sistema de salida al final.
Pruébalo tú mismo
section .data
msg db 'Exiting with code 5', 0x0a
msgLen equ $ - msg
section .text
global _start
_start:
mov rax, 1
mov rdi, 1
mov rsi, msg
mov rdx, msgLen
syscall
; TODO: Añade la syscall exit con código de salida 5
Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.
Todas las lecciones de Fundamentos
1La máquina
¿Qué es la CPU?MemoriaRegistros vs. MemoriaCómo funcionan las instruccionesPatrón de dos archivosLa arquitectura x86-64Practica por tu cuenta: Playground de Assembly