⚙️CONDICIONALES

La ejecucion coondicional se logra mediante varias instrucciones de bucle bifurcacion. Estas instrucciones pueden cambiar el flujo del programa. La ejecucion condicional se observa en dos escenarios:

Sr.No.

Instrucciones condicionales

1

Salto Incondicional

Esto lo realiza la instrucción JMP. La ejecución condicional a menudo implica una transferencia de control a la dirección de una instrucción que no sigue a la instrucción que se está ejecutando actualmente. La transferencia de control puede ser hacia adelante, para ejecutar un nuevo conjunto de instrucciones o hacia atrás, para volver a ejecutar los mismos pasos.

2

Salto Condicional

Esto se realiza mediante un conjunto de instrucciones de salto j <condición> dependiendo de la condición. Las instrucciones condicionales transfieren el control rompiendo el flujo secuencial y lo hacen cambiando el valor de compensación en IP.

Analicemos la instruccion CMP antes de analizar las instruccines condicionales.

Instruccion CMP:

Esta compara dos operandos. Basicamente resta un operando del otro para comparar si son iguales o no. No perturba los operandos de origen o destino. Se utiliza junto con la instruccion de salto condicional para tomar desiciones.

cmp destinaction, source

CMP compara dos campos numericos. El operando de destino podria estar en el registro o en la memoria. El operando source posria ser un dato constante (inmediato), un registro o una memoria.

EJEMPLO:

cmp dx, 00    ; Comparacion 
je  L7        ; Se hace la condicion, si dx = 00 pasa a L7

L7:           ; El codigo que seguiria segun la condicion.

CMP se usa a menudo para comparar si un valor de contador ha alcanzado la cantidad de veces que se debe ejecutar un ciclo.

inc edx        ; Incrememtamos edx
cmp edx, 10    ; Comparamos que edx sea igual a 10
jle lp1        ; Si es menor o igual a 10, salta a lp1

Salto Incondicional

Esto lo realiza la instruccion JMP. La ejecucion condicional a menudo implica una trasferencia de control a la direccion de una instruccion que se esta ejecutando actualmente. La transferencia de control puede ser hacia adelante, para ejecutar un nuevo conjunto de instrucciones o hacia atras.

SINTAXIS:

La instruccion JMP proporciona un nombre de etiqueta donde el flujo de control se transfiere inmediatamente:

jmp label

EJEMPLO:

El siguiente fragmento de codigo ilustra la instruccion JMP:

mov ax, 00
mov bx, 00
mov cx, 01

L20

add ax, 01    ; Agrega el 1 a ax
add bx, ax    ; Agrega el valor de ax a bx
shl cx, 1     ; Displaza un bit a cx a la izquierda, multiplica el valor cx por dos.
jmp L20       ; Hace el salto a que se repita este bloque de codigo.

Salto Condicional

si se cumple una condicion especifica , el flujo de control se transfiere a una instruccion de destino. existen numerosas instrucciones de salto condicional, segun la condicion y los datos.

Estas son las instrucciones de salto condicionla utilizadas en dtaos firmados utilizados en la aritmetica:

InstructionDescriptionFlags tested

JE/JZ

Jump Equal or Jump Zero

ZF

JNE/JNZ

Jump not Equal or Jump Not Zero

ZF

JG/JNLE

Jump Greater or Jump Not Less/Equal

OF, SF, ZF

JGE/JNL

Jump Greater/Equal or Jump Not Less

OF, SF

JL/JNGE

Jump Less or Jump Not Greater/Equal

OF, SF

JLE/JNG

Jump Less/Equal or Jump Not Greater

OF, SF, ZF

Estas son las instruccines de salto condicional utilizadas en datos sin firmar de operaciones logicas:

JE/JZJump Equal or Jump ZeroZF

JNE/JNZ

Jump not Equal or Jump Not Zero

ZF

JA/JNBE

Jump Above or Jump Not Below/Equal

CF, ZF

JAE/JNB

Jump Above/Equal or Jump Not Below

CF

JB/JNAE

Jump Below or Jump Not Above/Equal

CF

JBE/JNA

Jump Below/Equal or Jump Not Above

AF, CF

Estas instrucciones de salto condicional tienen usos especiales y verifican el valor de las flags:

InstructionDescriptionFlags tested

JXCZ

Jump if CX is Zero

none

JC

Jump If Carry

CF

JNC

Jump If No Carry

CF

JO

Jump If Overflow

OF

JNO

Jump If No Overflow

OF

JP/JPE

Jump Parity or Jump Parity Even

PF

JNP/JPO

Jump No Parity or Jump Parity Odd

PF

JS

Jump Sign (negative value)

SF

JNS

Jump No Sign (positive value)

SF

La sintaxis para el conjunto de instrucciones J <condition>

CMP	AL, BL    ; Compara que sean iguales en valor de bits
JE	EQUAL     ; Madamos a la condicion equal
CMP	AL, BH    ; Comparamos
JE	EQUAL     ; Condicional
CMP	AL, CL    ; Compara
JE	EQUAL     ; Condicional

NON_EQUAL: ...    ; Si nunguno es igual da este mesaje , de lo contrario el siguiente

EQUAL: ...

EJEMPLO:

El siguiente programa muestra la mayor de tres variables. Las variables son variables de dos digitos. Las tres num1, num2 y num3 tienen valores 47, 22 y 31:

section	.text
   global _start      
      
_start:	                 
   mov   ecx, [num1]            ; Agregamos el valor de la variable num1 a ecx
   cmp   ecx, [num2]            ; Comparamos el valor de la var num2 con el valor de ecx
   jg    check_third_num        ; Salta a esa parte si ecx es mayor que num2
   
   mov   ecx, [num2]            ; mueve el valor de la va a ecx si el cmp de antes es f
   
check_third_num:

   cmp   ecx, [num3]            ; Compara los valores
   jg    _exit                  ; Hace el salto a _exit si ecx es mayor
   mov   ecx, [num3]            ; Mueve el valor de la v a ecx si el anterior es falso


_exit:
   
   mov   [largest], ecx         ; mueve la direccion ecx a la variable
   mov   ecx, msg               ; Mueve el msg a ecx
   mov   edx, len               ; agrega la length a edx
   mov   ebx, 1	                ; Ponemos a 1 el ebx ya que no habra input
   mov   eax, 4	               
   int   0x80	
	
   mov   ecx, largest           ; Devolvemos el valor de largest a ecx
   mov   edx, 2                 ; Le damos dos bits de lenght 
   mov   ebx, 1                 	   
   mov   eax, 4	                ; Damos valor de 4 a eax para escribir en consola
   int   0x80	
    
   mov   eax, 1                 ; Cerramos el programa
   int   80h

section	.data
   
   msg db "The largest digit is: ", 0xA,0xD 
   len equ $- msg 
   num1 dd '47'
   num2 dd '22'                 ; Variables con los valores que compara
   num3 dd '31'

segment .bss
   largest resb 2               ; Reserva 2 bits de memoria para la respuesta. 

Última actualización