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

  1. Instruccions de Comparació: Utilitzades per comparar valors.
  2. Instruccions de Salt Condicional: Utilitzades per saltar a una altra part del codi basant-se en el resultat d'una comparació.
  3. 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

CMP operand1, operand2

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

MOV AX, 5      ; Carrega el valor 5 en el registre AX
CMP AX, 3      ; Compara el valor de AX amb 3

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

  1. Oblidar Configurar els Flags: Assegura't que les instruccions de comparació (CMP) s'executin abans de les instruccions de salt condicional.
  2. Confusió amb els Flags: Comprendre com funcionen els flags és crucial per utilitzar correctament les instruccions de salt condicional.
  3. 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.

© Copyright 2024. Tots els drets reservats