Este documento describe instrucciones de salto condicionales en microprocesadores. Explica que los saltos condicionales permiten pasar de una etapa a otra sin activar etapas intermedias. Luego detalla varios tipos de instrucciones de salto como saltos basados en comparaciones, banderas y registros. Finalmente, presenta ejemplos de código que usan instrucciones de salto para determinar el mayor de tres números y calcular una expresión.
3. DEFINICIÓN
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.
4. INSTRUCCIONES DE SALTO
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 dirección de saltos se
representa 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.
5. Saltos si la condición es una comparación no signada
• 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).
6. Saltos si la condición es una comparación signada
• 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).
7. Saltos si la condición es un estado de una bandera o el registro CX
• 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.
8. 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
9. EJEMPLOS
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
10. 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