- El llenguatge assemblador organitza les instruccions per finalitat: transferència, càlcul, control de flux i més.
- Cada instrucció està formada per un opcode i operands, amb formats diferents segons l'arquitectura.
- Hi ha diverses maneres d'encaminament per accedir a les dades, com ara immediat, directe i indirecte.
El llenguatge assemblador ha estat un dels pilars fonamentals en el desenvolupament de programari des dels inicis de la informàtica. Encara que avui dia els llenguatges d'alt nivell dominen l'escena, l'assemblador continua tenint ús i rellevància en entorns on el control sobre el maquinari, optimització o restriccions de recursos són prioritàries.
En aquest article ens endinsarem en profunditat en els tipus d'instruccions del llenguatge assemblador, analitzant la seva estructura, objectius, modes d'encaminament i com s'organitzen en diferents arquitectures. A més, coneixeràs exemples, formats i una visió global que et permetrà entendre a fons la lògica darrere d'aquestes instruccions que operen molt a prop del maquinari.
Què és una instrucció en llenguatge assemblador?
Una instrucció assemblador és una ordre que la CPU pot entendre directament (un cop traduïda a codi màquina per un programa assemblador). Cada instrucció té un propòsit específic i sol estar composta per un mnemònic que representa l'operació i un o diversos operands que indiquen on es prenen les dades i/o on s'emmagatzemen els resultats.
Aquestes instruccions són molt dependents de l'arquitectura del processador, per la qual cosa cada tipus de CPU (ja sigui x86, ARM, MIPS, entre d'altres) té el seu propi conjunt d'instruccions amb sintaxi i capacitats particulars.
Estructura d´una instrucció
Les instruccions es componen normalment de dues parts:
- Codi d'operació (opcode): Indica l'acció que cal executar, com sumar, moure dades, comparar, etc.
Els operands proporcionen la informació necessària per fer l'operació i poden estar en registres, memòria o ser constants. No totes les instruccions requereixen operands i en alguns casos aquests poden estar implícits en la instrucció o registres predefinits.
Tipus d'instruccions en llenguatge assemblador
Segons la funcionalitat que exerceixen dins un programa, les instruccions del llenguatge assemblador es poden classificar en diversos grups. A continuació, es detallen els més rellevants:
1. Instruccions de transferència de dades
Aquestes instruccions permeten copiar dades d'un lloc a un altre , sense modificar-ne el contingut a l'origen. Són fonamentals per moure informació entre registres, memòria i perifèrics.
Algunes de les instruccions més comunes en aquest grup són:
- MOV: Copia el contingut d'un operand a l'altre. Per exemple,
MOV AX, BXcopia el contingut de BX a AX. - MOVS / MOVSB / MOVSW: Mou cadenes des d'una adreça font (SI) a una adreça destí (DI), automatitzant el procés de transferència.
- LODS / LODSB / LODSW: Carregueu un valor des de l'adreça indicada pel registre SI a l'acumulador (AL o AX).
- LLEGEIXI: Carrega una adreça efectiva en lloc del valor. Útil per obtenir la direcció duna variable o estructura.
2. Instruccions de la pila
La pila (stack) és una estructura LIFO (últim a entrar, primer a sortir) utilitzada per emmagatzemar dades temporalment, passar paràmetres o guardar el context d'execució.
- PUSH: Desa un valor a la pila, decrementant el punter SP.
- POP: Recupera el valor més recent emmagatzemat a la pila, incrementant SP.
- PUSHF / POPF: Emmagatzemen i recuperen l'estat de les banderes de la CPU a la pila.
3. Instruccions aritmètiques i lògiques
Permeten fer càlculs i operacions sobre bits. Aquestes instruccions són essencials per manipular dades numèriques i prendre decisions al flux del programa.
Entre les més utilitzades trobem:
- ADD / SUB: Suma i resta.
- MUL / IMUL: Multiplicacions binàries.
- DIV / IDIV: Divisió (sencera o amb signe).
- AND / OR / XOR / NOT: Operacions lògiques bit a bit.
- SHL / SHR / ROL / ROR: Desplaçaments i rotacions de bits.
4. Instruccions de control de flux
Permeten modificar la seqüència d'execució del programa , introduint salts o trucades condicionals i incondicionals a altres instruccions.
- JMP: Salta incondicionalment a una altra adreça del programa.
- CALL / RET: Trucada a una subrutina i tornada.
- JE / JNE / JG / JL / JZ / JNZ: Salts condicionals, s'executen si es compleixen certes condicions (després d'una comparació).
5. Instruccions d'entrada/sortida (I/O)
Permeten la comunicació del processador amb dispositius externs. Aquestes instruccions permeten llegir i escriure dades des de/cap a ports (hardware).
- IN: Llegiu dades des d'un port d'entrada.
- OUT: Envieu dades a un port de sortida.
6. Instruccions de coma flotant
Moltes CPU tenen coprocessadors matemàtics (o instruccions especials) dedicats a treballar amb números decimals (punt flotant). Aquestes instruccions permeten realitzar operacions com:
- Suma, resta, multiplicació i divisió de números reals.
- Operacions trigonomètriques (sinus, cosinus, tangent).
- Operacions logarítmiques, exponencials i arrels.
Aquestes instruccions solen complir amb l'estàndard IEEE 754 per a precisió numèrica.
Maneres d'encaminament
Una part fonamental del disseny d'instruccions és com s'identifica on són els operands. Els modes d'encaminament defineixen com accedeix la CPU a les dades.
1. Direccionament immediat
La dada està inclosa directament a la instrucció. És ràpid, però no permet modificar valors sense canviar la instrucció.
MOV AX, 5
2. Direccionament directe
L'adreça de memòria que conté la dada s'especifica explícitament.
MOV AX,
3. Direccionament indirecte
L‟adreça efectiva s‟obté a partir del contingut d‟un registre. Molt flexible i usat per a estructures i llistes enllaçades.
MOV AX,
4. Direccionament indexat
Es calcula la direcció sumant una base i un índex (per exemple, per recórrer arrays). Usa registres especials com SI, DI o registres base + desplaçament.
MOV AX,
Formats d'instruccions: diferents tipus d'arquitectura
L'estructura d'una instrucció pot variar segons l'arquitectura.
Format de 4 adreces
Inclou dos operands, una ubicació de resultat i la direcció de la següent instrucció. Avui dia està en desús per la complexitat.
Format de 3 adreces
Especifica dos operands i una adreça de destinació. És comú en arquitectures RISC modernes.
Format de 2 adreces
Usa un operant font i una destinació (la destinació també pot aportar valor). Popular a x86 i altres arquitectures CISC.
Format de 1 adreça
Només s'hi indica un operand; l'altre suposa que és l'acumulador. Comú en processadors antics i sistemes simples.
Format de 0 adreces (basat en pila)
Les operacions usen la pila per extreure i emmagatzemar operands i resultats. Molt eficient per a màquines amb pila, com algunes calculadores programables.
Macro instruccions i pseudo-opcodes
Per millorar la productivitat, molts assembladors ofereixen macroinstruccions , que expandeixen una sola línia en diverses instruccions reals. Són útils per evitar repetir patrons complexos o per crear estructures d'alt nivell com ara bucles o estructures condicionals.
Els pseudo-opcodes són instruccions que l‟assemblador tradueix internament a una seqüència real d‟instruccions. Per exemple, NOP (no operació) es pot traduir com XCHG AX, AX a CPU x86.
Directives de l'assemblador
Les directives ( també anomenades pseudo-operacions ) no són instruccions pròpiament dites. Serveixen per controlar el procés d'acoblament, definir dades, seccions de codi, macros, condicions de compilació, etc.
Exemples comuns inclouen:
- .data / .code: Indiquen la secció de dades o de codi.
- .org: Estableix la direcció des de la que iniciarà l'assemblatge.
- .equ: Defineix constants simbòliques.
Casos d'ús del llenguatge assemblador
Tot i l'auge de llenguatges d'alt nivell, l'assemblador continua sent clau en diversos àmbits:
- Desenvolupament de sistemes encastats i microcontroladors.
- Programació de drivers, bootloaders i BIOS.
- Optimització extrema en aplicacions com a videojocs o criptografia.
- Enginyeria inversa, debugging i hacking a baix nivell.
A més, la formació en llenguatge assemblador encara ocupa un lloc important en carreres d'informàtica i electrònica, ja que aporta una comprensió profunda de com funciona un processador, com s'emmagatzemen i es manipulen les dades, i com s'executen les instruccions a nivell binari.
Comprendre tots els tipus d'instruccions en assemblador, la seva estructura, funcionalitats i modes d'encaminament ofereix una base sòlida per a qualsevol programador que es vulgui endinsar en la programació de baix nivell o comprendre com els llenguatges d'alt nivell es tradueixen finalment en codi màquina. Tot i que el seu ús s'ha tornat més específic, continua sent una eina imprescindible en múltiples àrees crítiques del desenvolupament de programari i sistemes.