Integrando todo
Parte de la sección Fundamentos del Journey de Assembly de Coddy — lección 39 de 45.
Has aprendido las cuatro partes de la llamada al sistema (syscall) write:
| Registro | Lo que contiene | Valor para salida por pantalla |
|---|---|---|
rax | Número de syscall | 1 (write) |
rdi | Descriptor de archivo | 1 (stdout) |
rsi | Dirección del búfer | Dirección de tu cadena |
rdx | Recuento de bytes | Longitud de tu cadena |
Ahora es el momento de ponerlo todo junto.
El patrón completo de la syscall write:
mov rax, 1 ; número de syscall para write
mov rdi, 1 ; descriptor de archivo (stdout)
mov rsi, msg ; dirección de la cadena
mov rdx, msgLen ; número de bytes a imprimir
syscall ; pedir al SO que imprimaUn programa funcional completo:
section .data
msg db 'Hello, World!', 0x0a
msgLen equ $ - msg
section .text
global _start
_start:
mov rax, 1
mov rdi, 1
mov rsi, msg
mov rdx, msgLen
syscall
mov rax, 60
mov rdi, 0
syscallQué hace este programa:
| Paso | Qué sucede |
|---|---|
| 1 | Imprime "Hello, World!" en la pantalla |
| 2 | Se mueve a una nueva línea |
| 3 | Finaliza limpiamente con el código 0 |
El orden importa:
Debes configurar los registros antes de ejecutar syscall. El orden de las instrucciones mov no importa siempre que las cuatro estén configuradas antes de syscall.
Desafío
Escribe un programa completo que imprima el mensaje "Assembly is fun" seguido de una nueva línea, y luego finalice limpiamente.
La cadena y su longitud ya están definidas. Solo necesitas escribir el código dentro de _start:.
Pruébalo tú mismo
section .data
msg db 'Assembly is fun', 0x0a
msgLen equ $ - msg
section .text
global _start
_start:
; TODO: Configurar y llamar a la syscall write
; Usar rax=1, rdi=1, rsi=msg, rdx=msgLen
; TODO: Salir limpiamente con el código 0
Esta 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