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 indicar al sistema operativo dónde enviar la salida (descriptor de archivo en rdi), debes indicarle qué imprimir. Esto se hace pasando la address de la cadena en la 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 data. En nuestro caso, el búfer es el string que queremos imprimir.

¿Por qué address y no el valor en sí?

El write syscall necesita saber dónde comienza la string en la memoria. Leerá bytes desde ese address hasta alcanzar la longitud que especifiques en rdx. No envías los caracteres reales al 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é es realmente <strong>msg</strong>:

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 sistema operativo intentará leer desde una dirección de memoria aleatoria, lo que probablemente provocará un fallo de segmentación (bloqueo).

Ejemplo completo con la llamada al sistema write:

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

section .text
    mov rax, 1          ; syscall 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' seguida de un salto de línea. Escribe la línea de código que carga la dirección de greeting en rsi.

Escribe únicamente 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

Practica por tu cuenta: Playground de Assembly