Introducció pràctica a Assembly

Aquest document està pensat per a estudiants que ja coneixen el llenguatge C i volen entendre com funciona un programa a un nivell més proper al maquinari. Assembly permet controlar directament els registres del processador i entendre com el compilador transforma el codi C en instruccions de màquina.

Per què aprendre Assembly?

Comparació entre C i Assembly

Exemple en C

int a = 5;
int b = 3;
int c = a + b;

Equivalent simplificat en Assembly (x86-64 Intel)

mov eax, 5
mov ebx, 3
add eax, ebx
mov [c], eax

En aquest exemple:

Els registres

Els registres són petites zones de memòria molt ràpides situades dins del processador.

Condicions i salts

En C:

if (a == b) {
    c = 1;
}

En Assembly:

cmp eax, ebx
je igual

mov ecx, 0
jmp final

igual:
mov ecx, 1

final:

La instrucció cmp compara dos valors i je (Jump if Equal) salta si són iguals.

Bucles

En C:

for(int i = 0; i < 5; i++) {
    // cos del bucle
}

En Assembly:

mov ecx, 5

bucle:
    ; cos del bucle
    dec ecx
    jnz bucle

dec decrementa el registre i jnz continua el bucle mentre el resultat no sigui zero.

Conceptes importants

Exercici proposat

Escriviu aquest programa en C:

int suma(int a, int b){
    return a + b;
}

A continuació, compileu-lo amb:

gcc -S programa.c

Observeu el fitxer programa.s i identifiqueu: