⚙️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:
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:
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:
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