Introducció
El llenguatge Assembly x86 és un dels més utilitzats i estudiats en el món de la programació de baix nivell. Aquesta arquitectura ha estat predominant en els ordinadors personals durant dècades, i comprendre el seu funcionament és essencial per a qualsevol programador que vulgui aprofundir en el desenvolupament de sistemes, optimització de codi o interfície amb el maquinari.
Objectius del Tema
- Comprendre la història i la importància de l'arquitectura x86.
- Familiaritzar-se amb els registres i les instruccions bàsiques de x86.
- Escriure i executar programes simples en Assembly x86.
- Aprendre a utilitzar eines de desenvolupament i depuració per a x86.
Història i Importància de l'Arquitectura x86
L'arquitectura x86 va ser introduïda per Intel amb el processador 8086 el 1978. Des de llavors, ha evolucionat significativament, però ha mantingut la compatibilitat cap enrere, cosa que ha permès que el programari escrit per a versions antigues continuï funcionant en processadors més nous.
Característiques Clau
- Compatibilitat Cap Enrere: Permet executar programes antics en maquinari nou.
- Ampliació de Registres: Els registres han evolucionat des de 16 bits (8086) fins a 32 bits (80386) i 64 bits (x86-64).
- Instruccions Complexes: Inclou una àmplia varietat d'instruccions que permeten operacions complexes amb una sola instrucció.
Registres en x86
Els registres són una part fonamental de qualsevol arquitectura de CPU. En x86, hi ha diversos registres generals, de segment, de punter i d'índex. A continuació es mostra una taula amb els registres més comuns en l'arquitectura x86 de 32 bits.
Nom del Registre | Descripció |
---|---|
EAX | Acumulador per a operacions aritmètiques i lògiques |
EBX | Registre base |
ECX | Comptador per a bucles |
EDX | Registre de dades |
ESI | Índex de font per a operacions de cadena |
EDI | Índex de destinació per a operacions de cadena |
EBP | Punter de base per a la pila |
ESP | Punter de pila |
EIP | Punter d'instrucció |
EFLAGS | Registre de banderes |
Sintaxi i Estructura Bàsiques
La sintaxi de l'Assembly x86 pot variar lleugerament segons l'assemblador utilitzat (NASM, MASM, etc.), però en general segueix una estructura similar.
Exemples de Codi
A continuació es mostra un exemple de codi Assembly x86 que suma dos nombres i emmagatzema el resultat en un registre.
section .data num1 db 5 num2 db 10 section .bss result resb 1 section .text global _start _start: ; Carregar els valors en registres mov al, [num1] mov bl, [num2] ; Sumar els valors add al, bl ; Emmagatzemar el resultat mov [result], al ; Sortir del programa mov eax, 1 int 0x80
Explicació del Codi
- section .data: Defineix la secció de dades inicialitzades.
- section .bss: Defineix la secció de dades no inicialitzades.
- section .text: Defineix la secció de codi.
- global _start: Indica el punt d'entrada del programa.
- mov al, [num1]: Carrega el valor de
num1
en el registreal
. - mov bl, [num2]: Carrega el valor de
num2
en el registrebl
. - add al, bl: Suma els valors dels registres
al
ibl
. - mov [result], al: Emmagatzema el resultat en la variable
result
. - mov eax, 1: Prepara la crida al sistema per sortir del programa.
- int 0x80: Fa la crida al sistema per sortir.
Eines de Desenvolupament i Depuració
Per treballar amb Assembly x86, necessitaràs algunes eines essencials:
- Assemblador: NASM (Netwide Assembler) és una opció popular.
- Depurador: GDB (GNU Debugger) és útil per depurar programes en Assembly.
- Editor de Text: Qualsevol editor de text pot ser utilitzat, però editors com Visual Studio Code ofereixen extensions per a Assembly.
Instal·lació de NASM
Per instal·lar NASM en un sistema basat en Linux, pots utilitzar el següent comandament:
Compilació i Execució d'un Programa
Per compilar i executar el programa d'exemple anterior, segueix aquests passos:
- Guarda el codi en un fitxer amb extensió
.asm
, per exemple,sum.asm
. - Compila el codi amb NASM:
- Enllaça l'objecte compilat amb l'enllaçador
ld
:
- Executa el programa:
Exercicis Pràctics
Exercici 1: Multiplicació de Dos Nombres
Escriu un programa en Assembly x86 que multipliqui dos nombres i emmagatzemi el resultat en una variable.
Solució
section .data num1 db 5 num2 db 10 section .bss result resb 1 section .text global _start _start: ; Carregar els valors en registres mov al, [num1] mov bl, [num2] ; Multiplicar els valors mul bl ; Emmagatzemar el resultat mov [result], al ; Sortir del programa mov eax, 1 int 0x80
Exercici 2: Comparació de Dos Nombres
Escriu un programa en Assembly x86 que compari dos nombres i emmagatzemi el valor més gran en una variable.
Solució
section .data num1 db 5 num2 db 10 section .bss max resb 1 section .text global _start _start: ; Carregar els valors en registres mov al, [num1] mov bl, [num2] ; Comparar els valors cmp al, bl jg num1_greater ; Si num2 és més gran o igual mov [max], bl jmp end num1_greater: ; Si num1 és més gran mov [max], al end: ; Sortir del programa mov eax, 1 int 0x80
Conclusió
En aquesta secció, hem explorat els fonaments del llenguatge Assembly x86, incloent-hi la seva història, registres, sintaxi bàsica i eines de desenvolupament. També hem proporcionat exemples pràctics i exercicis per ajudar-te a consolidar els teus coneixements. Amb aquesta base, estaràs preparat per aprofundir en temes més avançats i aplicar el llenguatge Assembly x86 en projectes reals.
Curs de Programació en Assembly
Mòdul 1: Introducció al Llenguatge Assembly
- Què és el Llenguatge Assembly?
- Història i Evolució de l'Assembly
- Conceptes Bàsics i Terminologia
- Configuració de l'Entorn de Desenvolupament
Mòdul 2: Fonaments del Llenguatge Assembly
- Comprensió de la CPU i la Memòria
- Registres i les Seves Funcions
- Sintaxi i Estructura Bàsiques
- Escrivint el Teu Primer Programa en Assembly
Mòdul 3: Representació de Dades i Instruccions
- Sistemes Binari i Hexadecimal
- Tipus de Dades i Mides
- Instruccions Aritmètiques
- Instruccions Lògiques
Mòdul 4: Flux de Control
Mòdul 5: Conceptes Avançats d'Assembly
- Interrupcions i Crides de Sistema
- Macros i Assembly Condicional
- Assembly Inline en Llenguatges d'Alt Nivell
- Optimització del Codi Assembly
Mòdul 6: Assembly per a Diferents Arquitectures
Mòdul 7: Aplicacions Pràctiques i Projectes
- Escrivint un Bootloader Simple
- Creant un Nucli Bàsic de Sistema Operatiu
- Interfície amb el Maquinari
- Depuració i Perfilat del Codi Assembly