Les declaracions condicionals són una part fonamental de qualsevol llenguatge de programació, incloent-hi Assembly. Aquestes permeten que el programa prengui decisions basades en certes condicions, alterant el flux d'execució del codi. En aquest tema, aprendrem com implementar declaracions condicionals en Assembly, utilitzant instruccions de salt condicional.
Conceptes Clau
- Instruccions de Comparació: Utilitzades per comparar valors.
- Instruccions de Salt Condicional: Utilitzades per saltar a una altra part del codi basant-se en el resultat d'una comparació.
- Flags: Indicadors que la CPU utilitza per determinar el resultat d'operacions aritmètiques i lògiques.
Instruccions de Comparació
Les instruccions de comparació en Assembly són utilitzades per comparar dos valors i establir els flags corresponents. La instrucció més comuna és CMP
.
Sintaxi de CMP
Aquesta instrucció resta operand2
de operand1
i ajusta els flags de la CPU basant-se en el resultat, però no emmagatzema el resultat de la resta.
Exemple
Després d'executar CMP AX, 3
, els flags de la CPU es configuren de la següent manera:
- Zero Flag (ZF): S'activa si
AX
és igual a 3. - Sign Flag (SF): S'activa si
AX
és menor que 3. - Carry Flag (CF): S'activa si hi ha un préstec en la resta (és a dir, si
AX
és menor que 3).
Instruccions de Salt Condicional
Les instruccions de salt condicional permeten canviar el flux d'execució del programa basant-se en els flags establerts per una instrucció de comparació.
Principals Instruccions de Salt Condicional
Instrucció | Descripció |
---|---|
JE |
Salta si és igual (ZF = 1) |
JNE |
Salta si no és igual (ZF = 0) |
JG |
Salta si és més gran (ZF = 0 i SF = OF) |
JL |
Salta si és més petit (SF ≠ OF) |
JGE |
Salta si és més gran o igual (SF = OF) |
JLE |
Salta si és més petit o igual (ZF = 1 o SF ≠ OF) |
Exemple
MOV AX, 5 ; Carrega el valor 5 en el registre AX CMP AX, 3 ; Compara el valor de AX amb 3 JE EQUAL_LABEL ; Salta a EQUAL_LABEL si AX és igual a 3 JG GREATER_LABEL ; Salta a GREATER_LABEL si AX és més gran que 3 JL LESS_LABEL ; Salta a LESS_LABEL si AX és més petit que 3 EQUAL_LABEL: ; Codi per a quan AX és igual a 3 JMP END_LABEL GREATER_LABEL: ; Codi per a quan AX és més gran que 3 JMP END_LABEL LESS_LABEL: ; Codi per a quan AX és més petit que 3 END_LABEL: ; Continuació del programa
Exercicis Pràctics
Exercici 1: Comparació de Dos Nombres
Escriu un programa en Assembly que compari dos nombres i imprimeixi si el primer és més gran, més petit o igual al segon.
Solució
section .data msg_equal db 'Els nombres són iguals', 0 msg_greater db 'El primer nombre és més gran', 0 msg_less db 'El primer nombre és més petit', 0 section .bss section .text global _start _start: ; Carrega els nombres a comparar MOV AX, 10 MOV BX, 20 ; Compara els nombres CMP AX, BX JE equal JG greater JL less equal: ; Imprimeix missatge d'igualtat MOV EAX, 4 MOV EBX, 1 MOV ECX, msg_equal MOV EDX, 21 INT 0x80 JMP end greater: ; Imprimeix missatge de major MOV EAX, 4 MOV EBX, 1 MOV ECX, msg_greater MOV EDX, 27 INT 0x80 JMP end less: ; Imprimeix missatge de menor MOV EAX, 4 MOV EBX, 1 MOV ECX, msg_less MOV EDX, 25 INT 0x80 end: ; Sortida del programa MOV EAX, 1 XOR EBX, EBX INT 0x80
Exercici 2: Determinar si un Nombre és Parell o Senar
Escriu un programa en Assembly que determini si un nombre és parell o senar i imprimeixi el resultat.
Solució
section .data msg_even db 'El nombre és parell', 0 msg_odd db 'El nombre és senar', 0 section .bss section .text global _start _start: ; Carrega el nombre a verificar MOV AX, 15 ; Comprova si el nombre és parell o senar AND AX, 1 JZ even JNZ odd even: ; Imprimeix missatge de parell MOV EAX, 4 MOV EBX, 1 MOV ECX, msg_even MOV EDX, 18 INT 0x80 JMP end odd: ; Imprimeix missatge de senar MOV EAX, 4 MOV EBX, 1 MOV ECX, msg_odd MOV EDX, 17 INT 0x80 end: ; Sortida del programa MOV EAX, 1 XOR EBX, EBX INT 0x80
Errors Comuns i Consells
- Oblidar Configurar els Flags: Assegura't que les instruccions de comparació (
CMP
) s'executin abans de les instruccions de salt condicional. - Confusió amb els Flags: Comprendre com funcionen els flags és crucial per utilitzar correctament les instruccions de salt condicional.
- Saltar a Etiquetes Incorrectes: Verifica que les etiquetes (
labels
) utilitzades en les instruccions de salt condicional existeixin i estiguin correctament definides.
Resum
En aquesta secció, hem après com utilitzar les declaracions condicionals en Assembly per alterar el flux d'execució del programa basant-se en comparacions de valors. Hem explorat les instruccions de comparació (CMP
) i les instruccions de salt condicional (JE
, JNE
, JG
, JL
, etc.), i hem practicat amb exemples i exercicis pràctics. Aquestes habilitats són fonamentals per escriure programes més complexos i dinàmics en Assembly.
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