> For the complete documentation index, see [llms.txt](https://bla0x1s-organization.gitbook.io/untitled-1/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://bla0x1s-organization.gitbook.io/untitled-1/reverse-engineering/assembly-x86/condicionales.md).

# 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:

<table data-header-hidden><thead><tr><th width="121"></th><th></th></tr></thead><tbody><tr><td>Sr.No.</td><td>Instrucciones condicionales</td></tr><tr><td>1</td><td><p>Salto Incondicional</p><p>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.</p></td></tr><tr><td>2</td><td><p>Salto Condicional</p><p>Esto se realiza mediante un conjunto de instrucciones de salto j &#x3C;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.</p></td></tr></tbody></table>

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:`&#x20;

```
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.&#x20;

```
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:

<table><thead><tr><th width="206.66666666666669">Instruction</th><th>Description</th><th>Flags tested</th></tr></thead><tbody><tr><td>JE/JZ</td><td>Jump Equal or Jump Zero</td><td>ZF</td></tr><tr><td>JNE/JNZ</td><td>Jump not Equal or Jump Not Zero</td><td>ZF</td></tr><tr><td>JG/JNLE</td><td>Jump Greater or Jump Not Less/Equal</td><td>OF, SF, ZF</td></tr><tr><td>JGE/JNL</td><td>Jump Greater/Equal or Jump Not Less</td><td>OF, SF</td></tr><tr><td>JL/JNGE</td><td>Jump Less or Jump Not Greater/Equal</td><td>OF, SF</td></tr><tr><td>JLE/JNG</td><td>Jump Less/Equal or Jump Not Greater</td><td>OF, SF, ZF</td></tr></tbody></table>

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

<table><thead><tr><th width="221.66666666666669">JE/JZ</th><th>Jump Equal or Jump Zero</th><th>ZF</th></tr></thead><tbody><tr><td>JNE/JNZ</td><td>Jump not Equal or Jump Not Zero</td><td>ZF</td></tr><tr><td>JA/JNBE</td><td>Jump Above or Jump Not Below/Equal</td><td>CF, ZF</td></tr><tr><td>JAE/JNB</td><td>Jump Above/Equal or Jump Not Below</td><td>CF</td></tr><tr><td>JB/JNAE</td><td>Jump Below or Jump Not Above/Equal</td><td>CF</td></tr><tr><td>JBE/JNA</td><td>Jump Below/Equal or Jump Not Above</td><td>AF, CF</td></tr></tbody></table>

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

<table><thead><tr><th width="215.66666666666669">Instruction</th><th>Description</th><th>Flags tested</th></tr></thead><tbody><tr><td>JXCZ</td><td>Jump if CX is Zero</td><td>none</td></tr><tr><td>JC</td><td>Jump If Carry</td><td>CF</td></tr><tr><td>JNC</td><td>Jump If No Carry</td><td>CF</td></tr><tr><td>JO</td><td>Jump If Overflow</td><td>OF</td></tr><tr><td>JNO</td><td>Jump If No Overflow</td><td>OF</td></tr><tr><td>JP/JPE</td><td>Jump Parity or Jump Parity Even</td><td>PF</td></tr><tr><td>JNP/JPO</td><td>Jump No Parity or Jump Parity Odd</td><td>PF</td></tr><tr><td>JS</td><td>Jump Sign (negative value)</td><td>SF</td></tr><tr><td>JNS</td><td>Jump No Sign (positive value)</td><td>SF</td></tr></tbody></table>

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. 
```
