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 msgQué <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
syscallDesafí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
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