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

  1. section .data: Defineix la secció de dades inicialitzades.
  2. section .bss: Defineix la secció de dades no inicialitzades.
  3. section .text: Defineix la secció de codi.
  4. global _start: Indica el punt d'entrada del programa.
  5. mov al, [num1]: Carrega el valor de num1 en el registre al.
  6. mov bl, [num2]: Carrega el valor de num2 en el registre bl.
  7. add al, bl: Suma els valors dels registres al i bl.
  8. mov [result], al: Emmagatzema el resultat en la variable result.
  9. mov eax, 1: Prepara la crida al sistema per sortir del programa.
  10. 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:

sudo apt-get install nasm

Compilació i Execució d'un Programa

Per compilar i executar el programa d'exemple anterior, segueix aquests passos:

  1. Guarda el codi en un fitxer amb extensió .asm, per exemple, sum.asm.
  2. Compila el codi amb NASM:
nasm -f elf32 sum.asm -o sum.o
  1. Enllaça l'objecte compilat amb l'enllaçador ld:
ld -m elf_i386 sum.o -o sum
  1. Executa el programa:
./sum

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.

© Copyright 2024. Tots els drets reservats