You are on page 1of 2

INSTRUCCIONES DE COMPARACIN

CMP operando1,operando2 (CoMPare, comparar) {O,S,Z,A,P,C}


Funciona exactamente igual que SUB solamente que sin almacenar el resultado (o sea, efectua la
operacin operando1-operando2, alterando los flags en consecuencia). Al igual que la instruccin
CMP del motorola se utiliza antes de efectuar un salto condicional.
TEST operando1,operando2 (TEST, comprobar) {O,S,Z,A,P,C}
Como la anterior, pero con la operacin AND en lugar de SUB.
-INSTRUCCIONES DE SALTO
JMP direccin (JuMP, saltar)
Salta a la direccin indicada. Este salto puede ser tanto lejano como cercano, y la direccin puede
venir dada en valor inmediato (generalmente mediante una etiqueta) o en memoria. Un salto cercano
tiene lugar dentro del mismo segmento (llamado tambin salto intrasegmento por este motivo),
cargando IP (EIP en modo protegido) con el nuevo offset. Los saltos lejanos cambiar el valor tanto de
IP(EIP) como de CS.
El tipo de salto se puede indicar con la direccin mediante los prefijos near o far en cada caso.
Existe un tercer tipo de salto denominado corto indicado por el prefijo short, cuya direccin viene
codificada en un byte. Este ltimo salto es en realidad una forma abreviada de expresar un salto
cercano, donde en lugar de indicar la direccin a la que se salta, se especifica la distancia desde la
posicin actual como un nmero de 8 bits en complemento a dos.
Jcc direccin
"cc" representa la condicin. Si la condicin es verdadera, salta. En caso contrario, contina la
ejecucin. Las distintas condiciones se presentan en la tabla inferior. El ensamblador de Intel tiene
algunos mnemnicos distintos para las mismas instrucciones, lo cual viene muy bien para recordar
qu comparacin usar en cada caso. Por ejemplo, JZ (saltar si cero) y JE (saltar si iguales) son
exactamente la misma instruccin. Una curiosidad: en el 8086 los saltos condicionales slo podan
ser cortos (lo que significa que la distancia se codificaba en un byte), obligando a utilizar la
comparacin contraria y un JMP para poder saltar a ms de 127/128 bytes de distancia. En el 80386
estos saltos son de hasta 32 bits, con lo que prcticamente no tenemos limitacin alguna. Si
queremos saltar cuando el bit de carry sea 1, podemos hacerlo con algo como JC etiqueta y
olvidarnos de todo lo dems.
Instruccin

Condicin

JZ

Jump if Zero

salta si cero

ZF=1

JNZ

Jump if Not Zero

salta si no cero

ZF=0

JC

Jump if Carry

salta si acarreo

CF=1

JNC

Jump if Not Carry

salta si no acarreo

CF=0

JO

Jump if Overflow

salta si overflow

OF=1

JNO

Jump if Not Overflow

salta si no overflow

OF=0

JS

Jump if Sign

salta si signo

SF=1

JNO

Jump if Not Sign

salta si no signo

SF=0

JP/JPE

Jump if Parity (Parity Even)

salta si paridad (Paridad Par)

PF=1

JNP/JPO

Jump if Not Parity (Parity Odd)

salta si no paridad (Paridad Par)

PF=0

Cuando queremos hacer un salto condicionado por una comparacin, y no directamente por el
estado de los flags, lo que hacemos es una comparacin CMP A,B. A continuacin usamos una
instruccin de salto de entre las siguientes:
Instruccin

Condicin

JA

Jump if Above

salta si por encima

A>B (sin signo)

JAE

Jump if Above or Equal

salta si por encima o igual

A>=B (sin signo)

JB

Jump if Below

salta si por debajo

A<B (sin signo)

JBE

Jump if Below or Equal

salta si por debajo o igual

A<=B (sin signo)

JE

Jump if Equal

salta si igual

A=B

JG

Jump if Greater

salta si mayor

A>B (con signo)

JGE

Jump if Greater or Equal

salta si mayor o igual

A>=B (con signo)

JL

Jump if Less

salta si menor

A<B (con signo)

JLE

Jump if Less or Equal

salta si menor o igual

A<=B (con signo)

CMP equivala a una resta que no modificaba los operandos; si queremos saltar si A<B, podemos
hacer CMP A,B. Si A<B al hacer la resta me llevar una, por lo que el bit de carry se pondr a 1.
Vemos que JC es equivalente a JB. Con similares deducciones se pueden obtener algunos saltos
ms; otros, sin embargo, dependen del resultado de dos flags al tiempo ("menor o igual" saltar con
CF=1 y ZF=1), por lo que sus mnemnicos correspondern a instrucciones nuevas.
Para poner las cosas an ms fciles, existen JNA,JNAE,JNB,JNBE,JNE,JNG, JNGE,JNL,
JNLE. No haca falta que estuvieran, porque son equivalentes a JBE,JB,JAE,JA,JNZ, JLE,JL y JG,
pero as nos evitan pensar un poco. Una N delante indica la condicin contraria. Si uno no quiere
los, basta que recuerde que Below/Above son para nmeros sin signo y Less/Greater para con
signo.
Una instruccin de salto muy til en combinacin con las siguientes (LOOP y variaciones)
es JCXZ (Jump if CX is Zero, salta si CX es cero), o JECXZ si estamos operando en 32 bits.
Para hacer ciclos (algo as como for i=1 to 10) la familia del 8086 cuenta con LOOP y la pareja
LOOPE/LOOPZ (mnemnicos de lo mismo)