Saltos condicionales e incondicionales

Hasta este punto los programas que hemos examinado han sido ejecutados en forma lineal, esto es con una instrucción secuencialmente a continuación de otra. Sin embargo, rara vez un programa programable es tan sencillo. La mayoría de los programas constan de varios ciclos en los que una serie de pasos se repite hasta alcanzar un requisito especifico y varias pruebas para determinar que acción se realiza de entre varias posibles.

Requisitos como este implican la transferencia de control a la dirección de una instrucción que no sigue de inmediato de la que se esta ejecutando actualmente. Una transferencia de control puede ser hacia adelante, para ejecutar una serie de pasos nuevos, o hacia atrás, para volver a ejecutar los mismos pasos.

Ciertas instrucciones pueden transferir el control fuera del flujo secuencial normal añadiendo un valor de desplazamiento al IP.

Direcciones Corta, cercana y lejana

Una operación de salto alcanza una dirección corta por medio de un desplazamiento de un byte, limitado a una distancia de -128 a 127 bytes. Una operación de salto alcanza una dirección cercana por medio de un desplazamiento de una palabra, limitado a una distancia de -32, 768 a 32, 767 bytes dentro del mismo segmento. Una dirección lejana puede estar en otro segmento y es alcanzada por medio de una dirección de segmento y un desplazamiento; CALL es la instrucción normal para este propósito.

La tabla siguiente indica las reglas sobre distancias para la operaciones JMP, LOOP y CALL. Hay poca necesidad de memorizar estas reglas, ya que el uso normal de estas instrucciones en rara ocasión causa problemas.

Direcciones Corta, cercana y lejana

Etiquetas de instrucciones

Las instrucciones JMP, Jnnn (salto condicional) y LOOP requieren un operando que se refiere a la etiqueta de una instrucción. El ejemplo siguiente salta a A90, que es una etiqueta dada a una instrucción MOV:

JMP A90
. . .
A90: MOV AH, 00
. . .

La etiqueta de una instrucción, tal como A90:, terminada con dos puntos (:) para darle atributo de cercana – esto es, la etiqueta esta dentro de un procedimiento en el mismo segmento de código.

Cuidado: Un error común es la omisión de los dos puntos. Note que una etiqueta de dirección en un operando de instrucción (como JMP A90) no tiene un carácter de dos puntos.

La instrucción JMP (Salto incondicional)

Una instrucción usada comúnmente para la transferencia de control es la instrucción JMP (jump, salto, bifurcación). Un salto es incondicional, ya que la operación transfiere el control bajo cualquier circunstancia. También JMP vacía el resultado de la instrucción previamente procesada; por lo que, un programa con muchas operaciones de salto puede perder velocidad de procesamiento. El formato general para JMP es:

|  [etiqueta]  |  JMP  |  dirección corta, cercana o lejana  |

Una operación JMP dentro del mismo segmento puede ser corta o cercana (o de manera técnica, lejana, si el destino es un procedimiento con el atributo FAR). En su primer paso por un programa fuente, el ensamblador genera la longitud de cada instrucción. Sin embargo, una instrucción JMP puede ser de dos o tres bytes de longitud. Una operación JMP a una etiqueta dentro de -128 a + 127 bytes es un salto corto.

El ensamblador genera un byte para la operación (EB) y  un byte para el operando. El operando actúa como un valor de desplazamiento que la computadora suma al registro IP cuando se ejecuta el programa. El ensamblador ya puede haber encontrado el operando designado (un salto hacia atrás) dentro de -128 bytes, como en:

A50:
. . .
JMP A50

En este caso, el ensamblador genera una instrucción de maquina de dos bytes. Una JMP que excede -128 a 127 bytes se convierte en un salto cercano, para que el ensamblador genere un código de maquina diferente (E9) y un operando de dos bytes (procesadores 8088/8086) o un operando de cuatro bytes (procesadores 80386 y posteriores). En un salto hacia adelante, el ensamblador aun no ha encontrado el operando designado:

JMP A90
. . .
A90:

Ya que algunas versiones del ensamblador no saben en este punto si el salto es corto o cercano, generan de forma automática una instrucción de tres bytes.

Page 60,132
TITLE     P08JUMP (COM) Uso de JMP para iterar
.MODEL     SMALL
.CODE
ORG          100H
MAIN      PROC         NEAR
MOV            AX,01                     ;Iniciación de AX,
MOV            BX,01                     ;BX y
MOV            CX,01                     ;CX a 01
A20:
ADD             AX, 01                    ;Sumar 01 a AX
ADD             BX, AX                   ;Sumar AX a BX
SHL             CX, 1                      ;Multiplicar por dos a CX
JMP             A20                        ;Saltar a la etiqueta A20
MAIN     ENDP
END             MAIN