Los saltos condicionales permiten pasar de una etapa a otra sin ser éstas consecutivas, sin activar las etapas intermedias. Estos saltos pueden darse en sentido evolución del Grafcet como en sentido inverso a la evolución del Grafcet.
Para explicar con ecuaciones estos saltos condicionales utilizaremos el siguiente ejemplo:

En este ejemplo partimos de la etapa E1 y para activar justo a continuación la etapa E7, activaremos la condición de transición Fx y mantendremos desactivado la condición de transición F1.
Las ecuaciones que obtenemos con este ejemplo son las siguientes:

Una instrucción de salto produce un cambio en la ejecución del programa pasando a una nueva posición, no secuencial. La dirección del salto se representa con una etiqueta.
CMP: Esta instrucción es considerada como una instrucción Aritmética, ya que sustrae el operando fuente del operando destino, solo que el resultado no se almacena en el operando destino, el resultado se utiliza solo para activar las banderas.
Comparaciones de números sin signo:
- JA o JNBE: Salta si está por arriba de, o lo mismo si no está por debajo o igual de.
- JAE o JNB: Salta si está por arriba o es igual, o lo mismo si no está por debajo de. (CF=0).
- JB o JNAE: Salta si está por debajo de, o salta si no está por arriba ni es igual. (CF=1).
- JBE o JNA: Salta si está por debajo de o es igual, o salta si no está por arriba de. (CF=1 or ZF=1).
Comparaciones para enteros con signo:
- JG o JNLE: Salta si es mayor, lo mismo, salta si no es menor ni igual. (ZF=0 or OF=SF).
- JGE o JNL: Salta si es mayor o igual, lo mismo, salta si no es menor. (SF=OF).
- JL o JNGE: Salta si es menor, lo mismo, salta si no es mayor ni igual. (SF<>OF).
- JLE o JNG: Salta si es menor o igual, lo mismo, salta si no es mayor. (ZF=1 or SF<>OF).
Verificando el estado de las banderas:
- JC: Salta si la bandera del carry es 1 (CF=1).
- JNC: Salta si la bandera del carry es 0 (CF=0).
- JO: Salta si la bandera del overflow es 1 (OF=1).
- JNO: Salta si la bandera del overflow es 0 (OF=0).
- JNP o JPO: Salta si no hay paridad (PF=0). Esto significa paridad par.
- JP o JPE Salta si hay paridad (PF=1). Esto significa paridad impar.
- JS: Salta si la bandera del signo es 1 (SF=1).
- JCXZ: Salta si el contenido de CX es 0.
Hay más de 30 instrucciones de salto, vamos a nombrar las más usadas:
Instrucción | Descripción |
---|---|
jmp etiqueta | Salto incondicional directo |
je etiqueta | Salto por igual |
jne etiqueta | Salto por no igual |
jg etiqueta | Salto por mayor |
jng etiqueta | Salto por no mayor |
jge etiqueta | Salto por mayor igual |
jnge etiqueta | Salto por no mayor igual |
jl etiqueta | Salto por menor |
jnl etiqueta | Salto por no menor |
jle etiqueta | Salto por menor igual |
jnle etiqueta | Salto por no menor igual |
js etiqueta | Salto negativo |
Programa que calcula la expresión x=(a+(b-c))/(c*d) dados los valores a=4, b=5, c=2, d=7 declarados en la sección de datos.
# Programa que calcula x=(a+(b-c))/(c*d) | ||
.section .data | ||
a: | .long 4 | |
b: | .long 5 | |
c: | .long 2 | |
d: | .long 7 | |
x: | .long 0 | |
.section .text | ||
.globl _start | ||
_start: | ||
movl b, %eax | # %eax=b | |
subl c, %eax | # %eax=b-c | |
addl a, %eax | # %eax=(b-c)+a | |
movl c, %ecx | # %ecx=c | |
imull d, %ecx | # %ecx=c*d | |
cltd | # %edx=0 | |
idivl %ecx | # %eax=((b-c)+a)/(c*d) %edx=resto | |
movl %eax, x | # guarda el resultado en x | |
movl $1, %eax | # fin del programa | |
movl $0, %ebx | ||
int $0x80 |
Programa que dados tres valores enteros declarados en la sección de datos, determina el mayor y lo guarda en una variable denominada mayor.
# Programa que revisa tres numeros y escoge el mayor | ||
.section .data | ||
a: | .long 4 | |
b: | .long 2 | |
c: | .long 3 | |
mayor: | .long 0 | |
.section .text | ||
.globl _start | ||
_start: | ||
movl a, %eax | ||
movl b, %ebx | ||
movl c, %ecx | ||
cmpl %ebx, %eax | # compara a con b | |
jg amayorb | # si a>b salta a amayorb | |
cmpl %ecx, %ebx | # compara b con c | |
jl bmenorc | # si b<c salta a mnenorc | |
movl %ebx, mayor | # cuando b es el mayor | |
jmp fin | # salta a fin | |
bmenorc: | movl %ecx, mayor | # cuando c es el mayor |
jmp fin | # salta a fin | |
amayorb: | cmpl %ecx, %eax | # compara a con c |
jl amenorc | # si a<c salta a amenorc | |
movl %eax,mayor | # cuando a es el mayor | |
jmp fin | # salta a fin | |
amenorc: | movl %ecx, mayor | # cuando c es el mayor |
fin: | movl $1, %eax | # fin del programa |
movl $0, %ebx | ||
int $0x80 |
Las instrucciones de salto condicional hacen que el control de flujo del programa salte a la instrucción cuya dirección está especificada por su operando si se cumple una condición dada. La direccion de saltos se reperesenta con una etiqueta:
Las instrucciones de salto se clasifican en tres grupos:
- Saltos si la condición es una comparación no signada
- Saltos si la condición es una comparación signada
- Saltos si la condición es un estado de una bandera o el registro CX.
The conditional jump instructions cause the program flow control to skip to the instruction whose address is specified by its operand if a given condition is met. The direction of jumps is reflected with a label:
The jump instructions are classified into three groups:
- Jumps if the condition is an unnamed comparison
- Jumps if the condition is a signed comparison
- Jumps if the condition is a state of a flag or the CX record.
- Se necesita predecir dirección y objetivo de salto.
- La dirección real solo se conoce después de ejecutar la instrucción.
- Una predicción incorrecta origina un vaciado total del cauce.
- Los saltos condicionales son similares a JMP, en la sintaxis pero la diferencia es en el nombre.
- Los saltos condicionales permiten pasar de una etapa a otra sin ser éstas consecutivas, sin activar las etapas intermedias. Estos saltos pueden darse en sentido evolución del Grafcet como en sentido inverso a la evolución del Grafcet.
- Las instrucciones son las siguientes JE o JZ.
- El objetivo es saltar si la última comparación realizada da igual.
Para este tema "SALTO CONDICIONAL" me fue fácil ya que conté con el material adecuado y además me ayudo mucho la Internet, espero que les sea útil y les sirva esta investigación.
GLOSARIO DE TÉRMINOS
CMP: Esta instrucción es considerada como una instrucción Aritmética.
GRAFCET: es un diagrama funcional que describe los procesos a automatizar.
BIBLIOGRÁFIA
- http://www.sc.ehu.es/sbweb/webcentro/automatica/WebCS1/salto_condicional.htm
- http://learnassembler.com/salto.html
- http://lenguajeensamblador2013.blogspot.pe/2013/08/guia-nro-4-saltos-condicionales-y-bucles.html
Descargar el documento en PDF
Diapositiva "Salto Condicional"