Ensamblaje: sintaxis básica
Un programa de montaje se puede dividir en tres secciones:
los data sección,
los bss sección, y
los text sección.
La sección de datos
los dataLa sección se utiliza para declarar constantes o datos inicializados. Estos datos no cambian en tiempo de ejecución. Puede declarar varios valores constantes, nombres de archivo o tamaño de búfer, etc., en esta sección.
La sintaxis para declarar la sección de datos es:
section.data
La sección bss
los bssLa sección se utiliza para declarar variables. La sintaxis para declarar la sección bss es:
section.bss
La sección de texto
los textLa sección se utiliza para mantener el código real. Esta sección debe comenzar con la declaraciónglobal _start, que le dice al kernel dónde comienza la ejecución del programa.
La sintaxis para declarar la sección de texto es:
section.text
global _start
_start:
Comentarios
El comentario en lenguaje ensamblador comienza con un punto y coma (;). Puede contener cualquier carácter imprimible, incluido el espacio en blanco. Puede aparecer en una línea por sí solo, como:
; This program displays a message on screen
o, en la misma línea junto con una instrucción, como -
add eax, ebx ; adds ebx to eax
Declaraciones en lenguaje ensamblador
Los programas en lenguaje ensamblador constan de tres tipos de declaraciones:
- Instrucciones o instrucciones ejecutables,
- Directivas de ensamblador o pseudo-operaciones, y
- Macros.
los executable instructions o simplemente instructionsdígale al procesador qué hacer. Cada instrucción consta de unaoperation code(código de operación). Cada instrucción ejecutable genera una instrucción en lenguaje de máquina.
los assembler directives o pseudo-opsInformar al ensamblador sobre los diversos aspectos del proceso de ensamblaje. Estos no son ejecutables y no generan instrucciones en lenguaje de máquina.
Macros son básicamente un mecanismo de sustitución de texto.
Sintaxis de declaraciones en lenguaje ensamblador
Las declaraciones en lenguaje ensamblador se ingresan una declaración por línea. Cada declaración sigue el siguiente formato:
[label] mnemonic [operands] [;comment]
Los campos entre corchetes son opcionales. Una instrucción básica tiene dos partes, la primera es el nombre de la instrucción (o el mnemónico), que se va a ejecutar, y la segunda son los operandos o los parámetros del comando.
A continuación se muestran algunos ejemplos de declaraciones típicas en lenguaje ensamblador:
INC COUNT ; Increment the memory variable COUNT
MOV TOTAL, 48 ; Transfer the value 48 in the
; memory variable TOTAL
ADD AH, BH ; Add the content of the
; BH register into the AH register
AND MASK1, 128 ; Perform AND operation on the
; variable MASK1 and 128
ADD MARKS, 10 ; Add 10 to the variable MARKS
MOV AL, 10 ; Transfer the value 10 to the AL register
El Programa Hola Mundo en Asamblea
El siguiente código en lenguaje ensamblador muestra la cadena 'Hello World' en la pantalla:
section .text
global _start ;must be declared for linker (ld)
_start: ;tells linker entry point
mov edx,len ;message length
mov ecx,msg ;message to write
mov ebx,1 ;file descriptor (stdout)
mov eax,4 ;system call number (sys_write)
int 0x80 ;call kernel
mov eax,1 ;system call number (sys_exit)
int 0x80 ;call kernel
section .data
msg db 'Hello, world!', 0xa ;string to be printed
len equ $ - msg ;length of the string
Cuando se compila y ejecuta el código anterior, produce el siguiente resultado:
Hello, world!
Compilar y vincular un programa de ensamblaje en NASM
Asegúrese de haber establecido el camino de nasm y ldbinarios en su variable de entorno PATH. Ahora, siga los siguientes pasos para compilar y vincular el programa anterior:
Escriba el código anterior con un editor de texto y guárdelo como hello.asm.
Asegúrese de estar en el mismo directorio donde guardó hello.asm.
Para ensamblar el programa, escriba nasm -f elf hello.asm
Si hay algún error, se le preguntará al respecto en esta etapa. De lo contrario, un archivo objeto de su programa llamadohello.o se creará.
Para vincular el archivo de objeto y crear un archivo ejecutable llamado hello, escriba ld -m elf_i386 -s -o hello hello.o
Ejecute el programa escribiendo ./hello
Si ha hecho todo correctamente, se mostrará "¡Hola, mundo!" en la pantalla.