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 eso, necesitas la llamada al sistema write.

¿Qué es la llamada al sistema write?

La llamada al sistema write indica al sistema operativo que imprima texto en la pantalla (o que lo escriba en un archivo). Así es como tu programa produce salida.

El número de syscall para write es 1.

Cómo funciona write:

A diferencia de la llamada al sistema 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 la memoriamov rsi, message
Cantidad de bytesrdxCuántos bytes imprimirmov rdx, 13

La llamada al sistema 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. Después ponemos 1 en rdi para indicarle al sistema operativo 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 un salto de línea. Usa la llamada al sistema write.

La cadena ya está definida para ti en el entorno 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

Practica por tu cuenta: Playground de Assembly