Menu
Coddy logo textTech

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:

ArgumentoRegistroQué haceEjemplo
Descriptor de archivordiDónde escribir (1 = pantalla)mov rdi, 1
Dirección del búferrsiDónde está el texto en memoriamov rsi, message
Cantidad de bytesrdxCuántos bytes imprimirmov 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 imprima

Para 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:

  1. La CPU salta al kernel de Linux
  2. El kernel ve: "write syscall"
  3. Lee rdi (dónde escribir), rsi (dónde está el texto) y rdx (cuántos bytes)
  1. Imprime el texto en la pantalla
  2. 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
    syscall

Este programa imprime Hello y luego finaliza.

challenge icon

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
    syscall
quiz iconPonte a prueba

Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.

Todas las lecciones de Fundamentos