Menu
Coddy logo textTech

Dirección del buffer (rsi)

Parte de la sección Fundamentos del Journey de Assembly de Coddy — lección 37 de 45.

En la llamada al sistema write, después de decirle al sistema operativo a dónde enviar la salida (descriptor de archivo en rdi), necesitas decirle qué imprimir. Esto se hace pasando la dirección de la cadena en memoria.

El registro para la dirección del búfer es rsi.

¿Qué es un búfer?

Un búfer es simplemente un bloque de memoria que contiene datos. En nuestro caso, el búfer es la cadena que queremos imprimir.

¿Por qué la dirección, no el valor en sí?

La syscall write necesita saber dónde comienza la cadena en memoria. Leerá bytes desde esa dirección hasta que alcance la longitud que especifiques en rdx. No envías los caracteres reales a la syscall — envías su ubicación.

Ejemplo:

section .data
    msg db 'Hello', 0x0a

section .text
    mov rsi, msg        ; rsi contiene la dirección de msg

Qué <strong>msg</strong> es realmente:

msg es una etiqueta. El ensamblador la reemplaza por un número — la dirección de memoria donde se almacena la cadena 'Hello'. Cuando escribes mov rsi, msg, estás poniendo ese número de dirección en rsi.

¿Qué sucede si olvidas la dirección?

Si no estableces rsi, el registro contiene cualquier basura que hubiera allí antes. El SO intentará leer de una dirección de memoria aleatoria, lo que probablemente causará un fallo de segmentación (bloqueo).

Ejemplo completo con la llamada al sistema (syscall) write:

section .data
    msg db 'Hello', 0x0a
    len equ $ - msg

section .text
    mov rax, 1          ; llamada al sistema write
    mov rdi, 1          ; stdout
    mov rsi, msg        ; dirección de la cadena
    mov rdx, len        ; número de bytes
    syscall
challenge icon

Desafío

Se te proporciona una cadena llamada greeting con el valor 'Hi' seguido de una nueva línea. Escribe la línea de código que carga la dirección de greeting en rsi.

Solo escribe la instrucción mov para rsi.

Pruébalo tú mismo

section .text
    global _start

_start:
    %include "solution.asm"
    
    mov rax, 1
    mov rdi, 1
    ; rsi ya tiene la dirección (del código del estudiante)
    mov rdx, greetingLen
    syscall

    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