Syscall Write (1)
Parte de la sección Fundamentos del Journey de Assembly de Coddy — lección 35 de 45.
Ya sabes cómo salir de un programa. Pero salir silenciosamente no es muy útil. Quieres que tu programa imprima una salida para que el usuario pueda ver algo.
Para ello, necesitas la syscall write.
¿Qué es la syscall write?
La syscall write le indica al sistema operativo que imprima texto en la pantalla (o que escriba en un archivo). Es la forma en que tu programa produce una salida.
El número de syscall para write es 1.
Cómo funciona write:
A diferencia de la syscall exit (que solo necesita un argumento), write necesita tres argumentos:
| Argumento | Registro | Qué hace | Ejemplo |
|---|---|---|---|
| Descriptor de archivo | rdi | Dónde escribir (1 = pantalla) | mov rdi, 1 |
| Dirección del búfer | rsi | Dónde está el texto en memoria | mov rsi, message |
| Cantidad de bytes | rdx | Cuántos bytes imprimir | mov rdx, 13 |
La syscall write en acción:
mov rax, 1 ; número de syscall para write
mov rdi, 1 ; descriptor de archivo 1 = stdout (pantalla)
mov rsi, msg ; dirección de la cadena a imprimir
mov rdx, 13 ; número de bytes a imprimir
syscall ; pedir al SO que imprimaPara imprimir un mensaje en la pantalla, necesitamos 5 líneas. Primero, ponemos el número de syscall 1 en rax para escribir. Luego ponemos 1 en rdi para decirle al SO que imprima en la pantalla.
A continuación, ponemos la dirección de la cadena (msg) en rsi. Después de eso, ponemos el número de bytes (13) en rdx. Finalmente, ejecutamos syscall para pedirle al SO que imprima.
Qué sucede cuando ejecutas write:
- La CPU salta al kernel de Linux
- El kernel ve: "write syscall"
- Lee
rdi(dónde escribir),rsi(dónde está el texto) yrdx(cuántos bytes)
- Imprime el texto en la pantalla
- Devuelve el control a su programa
Poniéndolo todo junto con una cadena:
section .data
msg db 'Hello', 0x0a ; cadena con salto de línea
section .text
global _start
_start:
mov rax, 1 ; syscall write
mov rdi, 1 ; stdout
mov rsi, msg ; dirección de la cadena
mov rdx, 6 ; longitud (Hello + salto de línea = 6 bytes)
syscall
mov rax, 60 ; syscall exit
mov rdi, 0
syscallEste programa imprime Hello y luego finaliza.
Desafío
Escribe un programa que imprima el mensaje "Hi" seguido de una nueva línea. Usa la llamada al sistema write.
La cadena ya está definida para ti en el arnés de pruebas. Solo necesitas escribir la configuración de la llamada al sistema.
Pruébalo tú mismo
section .data
msg db 'Hi', 0x0a
msgLen equ $ - msg
section .text
global _start
_start:
; TODO: Configurar y llamar a la syscall write para imprimir msg
; Usar rax=1, rdi=1, rsi=msg, rdx=msgLen
; Salir del programa
mov rax, 60
mov rdi, 0
syscallEsta 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-64