Sie sind auf Seite 1von 19

5.

CAPITULO V: INSTRUCCCIONES BSICAS


5.1. TRANSFERENCIA DE DATOS
Los mnemotcnicos de transferencia de datos son utilizados para mover el contenido de los operadores,
cada instruccin puede ser usado con los diferentes modos de direccionamiento:

MOV, MOVS (MOVSB) (MOVSW), XCHG

Instruccin MOV
Propsito: Transfiere datos entre celdas de memoria, registros y el acumulador
Sintaxis: MOV Destino, Fuente

Donde Destino es el lugar donde los datos sern movidos y la Fuente es el lugar donde los datos estn.

Los diferentes movimientos de datos permitidos por MOV son:

MOV Registro, Registro MOV AEX, EBX


MOV Memoria, Registro MOV [BX], AL
MOV Registro, Memoria MOV CH, [40ffh]
MOV Memoria, Inmediato MOV byte ptr [DI], 25 * 80
MOV Registro, Inmediato MOV EBX, offffh
MOV SegmentoReg, Registro16 MOV DS, AX
MOV Registro16, SegmentoReg MOV AX, ES
MOV Memoria, SegmentoReg MOV [SI], ES
MOV SegmentoReg, Memoria MOV SS, [1234h]

Instruccin MOVS (MOVSB) (MOVSW)


Propsito: Mueve el BYTE o WORD desde la Fuente, direccionado por el Registro SI, a la direccin del
Destino direccionado por el Registro DI.

Sintaxis: MOVS

Este mnemotcnico no necesita parmetros, porque siempre toma como FUENTE el contenido del
Registro SI y el DESTINO el contenido del Registro DI

Ejemplo: MOV SI, OFFSET VAR1


MOV DI, OFFSET VAR2
MOVS

En el ejemplo, primero inicializamos los valores de SI y DI, con la direccin de VAR1 y VAR2
respectivamente, luego ejecutamos MOVS, el contenido de VAR1 es copiado dentro de VAR2

MOVSB y MOVSW, son utilizados de la misma manera, solo que el primero mueve un BYTE y el
segundo mueve un WORD.

SIS-330 :: Programacin en Assembler 41


Instruccin XCHG
Propsito : Intercambia el contenido entre dos operandos. No pueden utilizarse registros de segmento
como operandos.
Sintaxis : XCHG Destino, Fuente

Ejemplo:
XCHG SI, DI ; Si SI tiene valor 45 y DI tiene valor 68, ahora, DI se queda con
; valor 45 y SI con 68.
XCHG AL, [BX + 4]
XCHG SS:[SI], BX

5.2. INSTRUCCINES DE CARGA


Son instrucciones especficas de los registros. Son usadas para cargar en algn registro bytes o cadenas de
bytes.

LODS (LODSB) (LODSW), LAHF, LDS, LEA, LES

Instruccin LODS (LODSB) (LODSW)


Propsito : Cargar cadenas de un byte o palabra al acumulador.
Sintaxis : LODS

Esta instruccin toma la cadena que se encuentre en la direccin especificada por SI, la carga al registro
AL (o AX) y suma o resta 1 (segn el estado de DF) a SI, si la transferencia es de bytes o 2 si la
transferencia es de palabras.

MOV SI, OFFSET VAR1


LODS

La primer lnea carga la direccin de VAR1 en SI y la segunda lnea lleva el contenido de esa localidad al
registro AL.

Los comandos LODSB y LODSW se utilizan de la misma forma, el primero carga un byte y el segundo
una palabra (utiliza el registro completo AX).

Instruccin LAHF
Propsito : Transfiere al registro AH el contenido de las banderas
Sintaxis : LAHF

Esta instruccin es til para verificar el estado de las banderas durante la ejecucin de nuestro programa.

Las banderas quedan en el siguiente orden dentro del registro:

Bit 7 6 5 4 3 2 1 0
Valor SF ZF ?? AF ?? PF ?? CF

El smbolo "??" significa que en esos bits habr. un valor indefinido.


SIS-330 :: Programacin en Assembler 42
Instruccin LDS
Propsito : Cargar el registro del segmento de datos
Sintaxis : LDS destino, fuente

El operando fuente debe ser una palabra doble en memoria. La palabra asociada con la direccin mas
grande es transferida a DS, o sea que se toma como la direccin del segmento. La palabra asociada con la
direccin menor es la direccin del desplazamiento y se deposita en el registro se-alado como destino.}

Instruccin LEA
Propsito : Carga la direccin del operando fuente.
Sintaxis : LEA destino, fuente

El operando fuente debe estar ubicado en memoria, y se coloca su desplazamiento en el registro ndice o
apuntador especificado en destino.

Para ilustrar una de las facilidades que tenemos con este comando pongamos una equivalencia:

MOV SI, OFFSET VAR1

Equivale a:

LEA SI, VAR1

Es muy probable que para el programador sea mas sencillo crear programas extensos utilizando este
ltimo formato.

Instruccin LES
Propsito : Carga el registro del segmento extra
Sintaxis : LES Destino, Fuente

El operando fuente debe ser un operando en memoria de palabra doble. El contenido de la palabra con la
direccin mayor se interpreta como la direccin del segmento y se coloca en ES. La palabra con la
direccin menor es la direccin del desplazamiento y se coloca en el registro especificado en el parmetro
destino.

5.3. INSTRUCCINES DE PILA


Estas instrucciones permiten el uso de la pila para almacenar y extraer datos.

PUSH, PUSHF, POP, POPF

Instruccin PUSH
Propsito : Coloca una palabra en la pila.
Sintaxis : PUSH fuente

La instruccin PUSH decrementa en dos el valor de SP y luego transfiere el contenido del operando
fuente a la nueva direccin resultante en el registro recin modificado.
SIS-330 :: Programacin en Assembler 43
El decremento en la direccin se debe a que al agregar valores a la pila sta crece de la direccin mayor a
la direccin menor del segmento, por lo tanto al restarle 2 al valor del registro SP lo que hacemos es
aumentar el tamao de la pila en dos bytes, que es la nica cantidad de informacin que puede manejar la
pila en cada entrada y salida de datos.

Instruccin PUSHF
Propsito : Coloca el valor de las banderas en la pila
Sintaxis : PUSHF

Este comando decrementa en 2 el valor del registro SP y luego se transfiere el contenido del registro de
banderas a la pila, en la direccin indicada por SP.

Las banderas quedan almacenadas en memoria en los mismos bits indicados en el comando POPF

Instruccin POP
Propsito : Recupera un dato de la pila
Sintaxis : POP destino

Esta instruccin transfiere el ltimo valor almacenado en la pila al operando destino, despus incrementa
en dos el registro SP.

Este incremento se debe a que la pila va creciendo desde la direccin mas alta de memoria del segmento
hacia la mas baja, y la pila solo trabaja con palabras (2 bytes), entonces al incrementar en dos el registro
SP realmente se le esta restando dos al tamao real de la pila.

Instruccin POPF
Propsito : Extrae las banderas almacenadas en la pila.
Sintaxis : POPF

Este comando transfiere bits de la palabra almacenada en la parte superior de la pila hacia el registro de
banderas.

La forma de transferencia es la siguiente:


BIT Bandera
0 CF
2 PF
4 AF
6 ZF
7 SF
8 TF
9 IF
10 DF
11 OF

Estas localizaciones son las mismas para el comando PUSHF

Una vez hecha la transferencia se incrementa en 2 el registro SP disminuyendo as el tamao de la pila.


SIS-330 :: Programacin en Assembler 44
5.4. OPERACIONES ARITMETICAS
Son utilizados para realizar las operaciones aritmticas sobre los operadores.

ADC, ADD, SBB, SUB, MUL, IMUL, DIV, IDIV, INC, DEC

Instruccin ADD
Propsito : Adicin de los operadores
Sintaxis : ADD Destino, Fuente

Suma los dos operadores y almacena el resultado en el operador Destino.

Ejemplo: ADD AX, BX


ADD SI, DI
ADD [0], AX
ADD AH, [BX]
ADD byte ptr[DI - 2], 2
MOV EBX, 43981
ADD EAX, EBX

Instruccin ADC
Propsito : Adicin de los operadores con Acarreo
Sintaxis : ADC Destino, Fuente

Suma los dos operadores y suma uno (1) al resultado en caso de que CF (registro FLAG), este activada,
esto es en caso de existir acarreo.

El resultado es almacenado en el Operador Destino.

Instruccin SUB
Propsito : Substraccin
Sintaxis : SUB Destino, Fuente

Resta el operando Fuente del Destino.

Instruccin SBB
Propsito : Substraccin con acarreo
Sintaxis : SBB Destino, Fuente

Esta instruccin resta los operandos y resta uno al resultado si CF (registro FLAG), est activada. El
operando fuente siempre se resta del destino. Este tipo de substraccin se utiliza cuando se trabaja con
cantidades de 32 bits.

SIS-330 :: Programacin en Assembler 45


Instruccin MUL
Propsito : Multiplicacin sin signo
Sintaxis : MUL fuente

El ensamblador asume que el multiplicando ser del mismo tamao que el del multiplicador, por lo tanto
multiplica el valor almacenado en el registro que se le da como operando por el que se encuentre
contenido en AH si el multiplicador es de 8 bits o por AX si el multiplicador es de 16 bits.

Cuando se realiza una multiplicacin con valores de 8 bits el resultado se almacena en el registro AX y
cuando la multiplicacin es con valores de 16 bits el resultado se almacena en el registro par DX:AX.

Ejemplo:
MOV AL, 10 ; Movemos a AL 10.
MOV BL, 12 ; Movemos a BL 12.
MUL BL ; Fuente de tipo byte; el resultado queda en AX (AX=AL*BL).
; La parte ms alta queda en AH y la ms baja en AL
MOV AX, 20
MOV BX, 5
MUL BX ; Fuente de tipo palabra.
; El resultado queda en DXAX (DXAX=AX*BX).
; La parte alta queda en DX y la ms baja en AX.
MOV EAX, 5
MOV EBX, 2
MUL EBX ; Fuente de tipo doble palabra; el resultado queda en
; EDXEAX (EDXEAX = EAX * EBX). La parte alta queda en EDX
; y la ms baja en EAX

Instruccin IMUL
Propsito : Multiplicacin de dos enteros con signo.
Sintaxis : IMUL fuente

Esta instruccin realiza lo mismo que el anterior, solo que si toma en cuenta los signos de las cantidades
que se multiplican.

Instruccin DIV
Propsito : Divisin sin signo
Sintaxis : DIV Fuente

El divisor puede ser un byte o palabra y es el operando que se le da a la instruccin.

Si el divisor es de 8 bits se toma como dividendo el registro de 16 bits AX y si el divisor es de 16 bits se


tomara como dividendo el registro par DX:AX, tomando como palabra alta DX y como baja AX.

Si el divisor es un BYTE el cociente se almacena en el registro AL y el residuo en AH, si es un WORD el


cociente se guarda en AX y el residuo en DX.
SIS-330 :: Programacin en Assembler 46
Ejemplo:
MOV AX, 12 ; Movemos a AX 12.
MOV BL, 10 ; Movemos a BL 10.
DIV BL ; fuente de tipo byte.
; el cociente queda en AL (AL=1), y el resto queda en AH(AH=2).
MOV AX, ES:[SI]
MOV BX, ES:[SI + 2] ; Movemos en DXAX un valor almacenado en memoria,
; por ejemplo, 123567.
MOV BX, 65000
DIV BX ; Fuente de tipo palabra; el cociente queda en AX y el resto
; queda almacenado en DX.
MOV EAX, ES:[si]
MOV EBX, ES:[SI + 4] ; Movemos a EDXEAX un valor almacenado en memoria.
MOV EBX, 50000
DIV EBX ; Fuente de tipo doble palabra; el cociente queda en EAX y
; el resto queda almacenado en EDX.

Instruccin IDIV
Propsito : Divisin con signo
Sintaxis : IDIV fuente

Consiste bsicamente en lo mismo que la instruccin DIV, solo que esta ltima realiza la operacin con
signo. Para sus resultados utiliza los mismos registros que la instruccin DIV.

Instruccin INC
Propsito : Se utiliza para incrementar el contenido de un registro o de una posicin de memoria.
Sintaxis : INC Destino

Ejemplo:
MOV AX, 5 ; a AX se le pasa el valor 5.
INC AX ; AX incrementa en una unidad su valor (AX=6).
INC byte ptr[BP + SI] ; El byte al que apunta la suma de "BP + SI" en la memoria
; se ve incrementado en una unidad.
INC word ptr[BP + SI] ; Lo mismo pero para una palabra.

Instruccin DEC
Propsito : Se utiliza para decrementar el contenido de un registro o de una posicin de memoria.
Sintaxis : DEC Destino

Ejemplo:
MOV AX, 5 ; a AX se le pasa el valor 5
DEC AX ; AX decrementado en una unidad su valor (AX=4)
DEC byte ptr[BP + SI] ; El byte al que apunta la suma de "BP+SI" en la memoria
; se ve decrementado en una unidad.
DEC word ptr[BP + SI] ; Lo mismo pero para una palabra.

SIS-330 :: Programacin en Assembler 47


5.5. OPERACIONES LGICAS
Son utilizados para realizar las operaciones lgicas sobre los operadores.

AND, OR, XOR, NEG, NOT, TEST

Instruccin AND

Propsito : Realiza la conjuncin de los operandos bit por bit.


Sintaxis : AND Destino, Fuente

Con esta instruccin se lleva a cabo la operacin "Y" lgica de los dos operandos:

Fuente Destino Resultado


1 1 1
1 0 0
0 1 0
0 0 0

El resultado de la operacin se almacena en el operando destino.

Instruccin OR
Propsito : OR inclusivo lgico
Sintaxis : OR Destino, Fuente

La instruccin OR lleva a cabo, bit por bit, la disyuncin inclusiva lgica de los dos operandos:

Fuente Destino Resultado


1 1 1
1 0 1
0 1 1
0 0 0

Instruccin XOR
Propsito : OR exclusivo
Sintaxis : XOR Destino, Fuente

Su funcin es efectuar bit por bit la disyuncin exclusiva lgica de los dos operandos.

Fuente Destino Resultado


1 1 0
1 0 1
0 1 1
0 0 0

SIS-330 :: Programacin en Assembler 48


Instruccin NEG
Propsito : Genera el complemento a 2
Sintaxis : NEG Destino

Esta instruccin genera el complemento a 2 del operando destino y lo almacena en este mismo operando.
Ejemplo:
MOV AX, 1234H
NEG AX ; Nos dejara almacenado en el registro AX el valor EDCCH.

MOV AX, 5 ; a AX se le pasa el valor 5.


NEG AX ; Se haya el complemento a 2 de AX y se guarda
; en AX (AX= -5).
NEG byte ptr ES:[BX + SI + 2] ; Se haya el complemento a 2 de la posicin de memoria
; (dentro del Segmento Extra) indicada por el de "BX+SI+2"

Instruccin NOT
Propsito : Lleva a cabo la negacin bit por bit del operando destino.
Sintaxis : NOT destino

El resultado se guarda en el mismo operando destino.

Instruccin TEST
Propsito : Comparar lgicamente los operandos
Sintaxis : TEST Destino, Fuente

Realiza una conjuncin, bit por bit, de los operandos, pero a diferencia de AND esta instruccin no
coloca el resultado en el operando destino, solo tiene efecto sobre el estado de las banderas.

5.6. INSTRUCCIONES DE CICLOS


Transfieren el flujo del proceso, condicional o incondicionalmente, a un destino repitindose esta accin
hasta que el contador sea cero.

LOOP, LOOPE, LOOPNE

Instruccin LOOP
Propsito : Generar un ciclo en el programa.
Sintaxis : LOOP etiqueta

La instruccin loop decrementa CX en 1, y transfiere el flujo del programa a la etiqueta dada como
operando si CX es diferente a 1.

Ejemplo:
MOV CX, 15 ; CX=15; 15 sera el nmero de veces que se va a ejecutar el bucle.
etiqueta:
; Aqu estaran las instrucciones que estn dentro del bucle.
LOOP etiqueta ; CX = CX-1 y bifurca a ETIQUETA si CX es distinto a cero.
SIS-330 :: Programacin en Assembler 49
Instruccin LOOPE
Propsito : Generar un ciclo en el programa considerando el estado de ZF
Sintaxis : LOOPE etiqueta

Esta instruccin decrementa CX en 1. Si CX es diferente a cero y ZF es igual a 1, entonces el flujo del


programa se transfiere a la etiqueta indicada como operando.

Ejemplo:
MOV CX, Length tabla ; CX=longitud de la TABLA.
MOV SI, inicio ; Movemos a SI el inicio de la TABLA.
DEC SI ; Esto se hace para poder realizar el bucle
; que viene ahora
OTRO:
INC SI ; Movemos a SI su valor inicial.
CMP tabla[SI], 0 ; Comparamos cada valor de la TABLA con cero
LOOPE OTRO ; si el valor de TABLA es igual a cero realiza un
; LOOP normal, sino, no hace el LOOP.

Instruccin LOOPNE
Propsito : Generar un ciclo en el programa, considerando el estado de ZF
Sintaxis : LOOPNE etiqueta

Esta instruccin decrementa en uno a CX y transfiere el flujo del programa solo si ZF es diferente a 0.

Ejemplo:
MOV CX, Length tabla ; CX=longitud de la TABLA.
MOV SI, inicio ; Movemos a SI el inicio de la TABLA.
DEC SI ; Esto se hace para poder realizar el bucle
; que viene ahora.
OTRO:
INC SI ; Movemos a SI su valor inicial.
CMP tabla[SI], 0 ; Comparamos cada valor de la TABLA con cero
LOOPNE OTRO ; si el valor de TABLA es distinto a LOOP normal,
; sino, no hace el LOOP.

SIS-330 :: Programacin en Assembler 50


5.7. ROTACION Y TRASLACIN
Este grupo de instrucciones nos permitirn tratar la informacin almacenada en registros o en memoria
mediante el tratamiento unitario de sus bits.
RCL, RCR, ROL, ROR,

Instruccin RCL
Propsito : Rotar a la izquierda con acarreo
Sintaxis : RCL Operando, Contador

Rota a la izquierda los bits del operando junto con la bandera de acarreo, CF, el nmero de bits
especificado en el segundo operando. Si el nmero a desplazar es 1, se puede especificar directamente
(Por ejemplo: RCL AL, 1). Si es mayor que 1, su valor debe cargarse en CL y especificar CL como
segundo operando.

Ejemplo: MOV CL, 3 ; Rotar 3 bits


; AL = 0101 1110b, CF=0 (Flag de acarreo=0)
RCL AL, CL ; AL = 1111 0001b, CF=0

Cuenta (CL) Antes Despus

1 AL = 0101 1110b, CF=0 AL = 1011 1100b, CF=0

2 AL = 1011 1100b, CF=0 AL = 0111 1000b, CF=1

3 AL = 0111 1000b, CF=1 AL = 1111 0001b, CF=0

Instruccin RCR
Propsito : Rotar a la derecha con acarreo
Sintaxis : RCR Operando, Contador

El formato es: RCR operando, contador. Rota a la derecha los bits del operando junto con la bandera de
acarreo, CF, el nmero de bits especificado en el segundo operando. Si el nmero a desplazar es 1, se
puede especificar directamente (Por ejemplo: RCR AL, 1). Si es mayor que 1, su valor debe cargarse en
CL y especificar CL como segundo operando.
Ejemplo:
MOV CL, 3 ; Rotar 3 bits
; AL = 0101 1110b, CF=0 (Flag de acarreo=0)
RCR AL, CL ; AL = 1000 1011b, CF=1

Cuenta (CL) Antes Despus


1 AL = 0101 1110b, CF=0 AL = 0010 1111b, CF=0
2 AL = 0010 1111b, CF=0 AL = 0001 0111b, CF=1
3 AL = 0001 0111b, CF=1 AL = 1000 1011b, CF=1

SIS-330 :: Programacin en Assembler 51


Instruccin ROL
Propsito : Rotar a la Izquierda
Sintaxis : ROL Operando, Contador

El formato es: ROL operando, contador. Rota a la izquierda los bits del operando de tal forma que el bits
del extremo izquierdo del operando destino para al bit extremo derecho de dicho operando y al mismo
tiempo para el bit de acarreo (CF). Si el nmero a desplazar es 1, se puede especificar directamente (Por
ejemplo: ROL AL, 1). Si es mayor que 1, su valor debe cargarse en CL y especificar CL como segundo
operando.

Ejemplo:
MOV CL, 2 ; Rotar 2 bits
; AL = 1100 1100b, CF=0 (Flag de acarreo=0)
ROL AL, CL ; AL = 0011 0011b, CF=1

Cuenta (CL) Antes Despus


1 AL = 1100 1100b, CF=0 AL = 1001 1001b, CF=1
2 AL = 1001 1001b, CF=1 AL = 0011 0011b, CF=1

Instruccin ROR
Propsito : Rotar a la derecha
Sintaxis : ROR Operando, Contador

Rota a la derecha los bits del operando de tal forma que el bits del extremo derecho del operando destino
para al bit extremo izquierdo de dicho operando y al mismo tiempo para el bit de acarreo (CF). Si el
nmero a desplazar es 1, se puede especificar directamente (Por ejemplo: ROR AL, 1). Si es mayor que 1,
su valor debe cargarse en CL y especificar CL como segundo operando.

Ejemplo:
MOV CL, 2 ; Rotar 2 bits
; AL = 0011 0011b, CF=0 (Flag de acarreo=0)
ROR AL, CL ; AL = 1100 1100b, CF=1

Cuenta (CL) Antes Despus


1 AL = 0011 0011b, CF=0 AL = 1001 1001b, CF=1
2 AL = 1001 1001b, CF=1 AL = 1100 1100b, CF=1

Instruccin SAL
Propsito : Desplazamiento aritmtico a la Izquierda (Es equivalente a SHL (Desplazamiento lgico a la
izquierda).
Sintaxis : SAL Operando, Contador

SIS-330 :: Programacin en Assembler 52


SHL y SAL realizan la misma operacin y son fsicamente la misma instruccin. Copia en cada bit del
operando el contenido previo del bit de su derecha. El bit de menor peso se pone a cero. El contenido
previo del bit de mayor peso se copia en el flag de acarreo (CF). Es equivalente a multiplicar el operando
por dos, tanto para nmeros sin signo como para nmero en complemento a 2, siempre el resultado no se
salga del rango. Si el nmero de bits a desplazar es 1, se puede especificar directamente (Por ejemplo:
SAL AL, 1). Si es mayor que 1, su valor debe cargarse en CL y especificar CL como segundo operando.

Ejemplo:
MOV CL, 2 ; Desplazar 2 bits
; AL = 1100 1100b, CF=0 (Flag de acarreo=0)
SAL AL, CL ; AL = 0011 0000b, CF=1

Cuenta (CL) Antes Despus


1 AL = 1100 1100b, CF=0 AL = 1001 1000b, CF=1
2 AL = 1001 1000b, CF=1 AL = 0011 0000b, CF=1

Instruccin SAR
Propsito : Desplazamiento aritmtico a la Derecha con extensin de signo
Sintaxis : SAR Operando, Contador

Copia en cada bit del operando el contenido previo del bit de su izquierda. El bit de mayor peso mantiene
su valor anterior. El contenido previo del bit de menor peso se copia en el flag de acarreo (CF). Es
equivalente a dividir el operando por dos para nmeros en complemento a 2. Si el nmero de bits a
desplazar es 1, se puede especificar directamente (Por ejemplo: SAR AL, 1). Si es mayor que 1, su valor
debe cargarse en CL y especificar CL como segundo operando.

Ejemplo:
MOV CL, 2 ; Desplazar 2 bits
; AL = 1100 1100b, CF=0 (Flag de acarreo=0)
SAR AL, CL ; AL = 1111 0011b, CF=0

Cuenta (CL) Antes Despus


1 AL = 1100 1100b, CF=0 AL = 1110 0110b, CF=0
2 AL = 1110 0110b, CF=0 AL = 1111 0011b, CF=0

Instruccin SHR
Propsito : Desplazamiento aritmtico a la Derecha
Sintaxis : SHR Operando, Contador

Copia en cada bit del operando el contenido previo del bit de la izquierda. En el bit de mayor peso se
almacena un 0. El contenido previo del bit de menor peso se copia en el flag de acarreo (CF). Es equi-
valente a dividir el operando por dos para nmeros sin signo. Si el nmero de bits a desplazar es 1, se
puede especificar directamente (Por ejemplo: SHR AL, 1). Si es mayor que 1, su valor debe cargarse en
CL y especificar CL como segundo operando.

SIS-330 :: Programacin en Assembler 53


Ejemplo:
MOV CL, 2 ; Desplazar 2 bits
; AL = 0011 0011b, CF=0 (Flag de acarreo=0)
SHR AL, CL ; AL = 0000 1100b, CF=1

Cuenta (CL) Antes Despus


1 AL = 0011 0011b, CF=0 AL = 0001 1001b, CF=1
2 AL = 0001 1001b, CF=1 AL = 0000 1100b, CF=1

5.8. INSTRUCCIONES DE COMPARACIN


Son utilizados para comparar los operadores, estos afectan al contenido del Registro FLAG.

CMP, CMPS (CMPSB) (CMPSW),

Instruccin CMP
Propsito : Compara el Operando Destino con el Operando Fuente
Sintaxis : CMP Destino, Fuente

Esta instruccin realiza una resta de un operando origen sobre un operando destino, pero con la
particularidad de no almacenar el resultado y no modificar ninguno de los 2 operandos, pero si se
modifican los bits de indicadores (Flags). Los operandos deben ser del mismo tipo.

Esta modificacin de los bits de indicadores, nos permitir posteriormente, mediante la inspeccin de los
mismos, poder realizar determinadas acciones. Normalmente despus de una instruccin de comparacin
(CMP), hay una instruccin de salto.

Ejemplo: CMP AX, BX ; Comparamos AX con BX


JL menor ; Si AX es menor que BX saltamos a la etiqueta MENOR

menor:
CMP BL, CL
CMP BX, CX
CMP BL, byte ptr ES:[SI]
CMP word ptr ES[SI], BX
CMP BX, 30
CMP byte ptr ES:[SI], 01h ; Normalmente, despus de cada instruccin de
;comparacin, viene una instruccin de salto.

Instruccin CMPS (CMPSB) (CMPSW)


Propsito : Compara dos cadenas de un Byte o un Word
Sintaxis : CMP Destino, Fuente

Con esta instruccin la cadena de caracteres fuente se resta de la cadena destino.


SIS-330 :: Programacin en Assembler 54
Se utilizan DI como ndice para el segmento extra de la cadena fuente y SI como indice de la cadena
destino.

Solo se afecta el contenido de las banderas y tanto DI como SI se incrementan.

5.9. SALTOS CONDICIONALES E INCONDICIONALES


Son utilizadas para transferir el flujo del proceso al operando indicado.

JMP, JA (JNBE), JAE (JNBE), JB (JNAE), JBE (JNA), JE (JZ), JNE (JNZ), JG (JNLE), JGE (JNL), JL
(JNGE), JLE (JNG), JC, JNC, JNO, JNP (JPO), JNS, JO, JP (JPE), JS

Instruccin JMP
Propsito : Salto incondicional
Sintaxis : JMP destino

Esta instruccin se utiliza para desviar el flujo de un programa sin tomar en cuenta las condiciones actuales
de las banderas ni de los datos.

Ejemplo:
ETIQUETA1:
.
JMP continuar
ETIQUETA2:
.
JMP continuar
.
CONTINUAR:

Instruccin JA (JNBE)
Propsito : Salto condicional
Sintaxis : JA Etiqueta

Despus de una comparacin este comando salta si es superior o salta si no es inferior o igual.

Esto significa que el salto se realiza solo si la bandera CF esta desactivada o si la bandera ZF esta
desactivada (que alguna de las dos sea igual a cero).

Instruccin JAE (JNB)


Propsito : Salto condicional
Sintaxis : JAE etiqueta

Salta si es superior o igual o salta si no es inferior. El salto se efecta si CF esta desactivada.

SIS-330 :: Programacin en Assembler 55


Instruccin JB (JNAE)
Propsito : Salto condicional
Sintaxis : JB etiqueta

Salta si es inferior o salta si no es superior o si no es igual. Se efecta el salto si CF esta activada.

Instruccin JBE (JNA)


Propsito : Salto condicional
Sintaxis : JBE etiqueta

Salta si es inferior o igual o salta si no es superior. El salto se efecta si CF est activado o si ZF est
activado (que cualquiera sea igual a 1).

Instruccin JE (JZ)
Propsito : Salto condicional
Sintaxis : JE etiqueta

Salta si es igual o salta si es cero. El salto se realiza si ZF est activada.

Instruccin JNE (JNZ)


Propsito : Salto condicional
Sintaxis : JNE etiqueta

Salta si no es igual o salta si no es cero. El salto se efecta si ZF est desactivada.

Instruccin JG (JNLE)
Propsito : Salto condicional, se toma en cuenta el signo.
Sintaxis : JG etiqueta

Salta si es mayor o salta si no es menor o igual. El salto ocurre si ZF = 0 u OF = SF.

Instruccin JGE (JNL)


Propsito : Salto condicional, se toma en cuenta el signo.
Sintaxis : JGE etiqueta

Salta si es mayor o igual o salta si no es menor que. El salto se realiza si SF = OF

Instruccin JL (JNGE)
Propsito : Salto condicional, se toma en cuenta el signo.
Sintaxis : JL etiqueta

Salta si es menor o salta si no es mayor o igual. El salto se efecta si SF es diferente a OF.

SIS-330 :: Programacin en Assembler 56


Instruccin JLE (JNG)
Propsito : Salto condicional, se toma en cuenta el signo.
Sintaxis : JLE etiqueta

Salta si es menor o igual o salta si no es mayor. El salto se realiza si ZF = 1 o si SF es diferente a OF

Instruccin JC
Propsito : Salto condicional, se toman en cuenta las banderas.
Sintaxis : JC etiqueta

Salta si hay acarreo. El salto se realiza si CF = 1

Instruccin JNC
Propsito : Salto condicional, se toma en cuenta el estado de las banderas.
Sintaxis : JNC etiqueta

Salta si no hay acarreo. El salto se efecta si CF = 0.

Instruccin JNO
Propsito : Salto condicional, se toma en cuenta el estado de las banderas.
Sintaxis : JNO etiqueta

Salta si no hay desbordamiento (overflow). El salto se efecta si OF = 0.

Instruccin JNP (JPO)


Propsito : Salto condicional, toma en cuenta el estado de las banderas.
Sintaxis : JNP etiqueta

Salta si no hay paridad o salta si la paridad es impar. El salto ocurre si PF = 0.

Instruccin JNS
Propsito : Salto condicional, toma en cuenta el estado de las banderas.
Sintaxis : JNP etiqueta

Salta si no hay signo o esta desactivado. El salto se efecta si SF = 0.

Instruccin JO
Propsito : Salto condicional, toma en cuenta el estado de las banderas.
Sintaxis : JO etiqueta

Salta si hay desbordamiento (overflow). El salto se realiza si OF = 1.

Instruccin JP (JPE)
Propsito : Salto condicional, toma en cuenta el estado de las banderas.
Sintaxis : JP etiqueta

Salta si hay paridad o salta si la paridad es par. El salto se efecta si PF = 1.


SIS-330 :: Programacin en Assembler 57
Instruccin JS
Propsito : Salto condicional, toma en cuenta el estado de las banderas.
Sintaxis : JS etiqueta

Salta si hay signo. El salto se efecta si SF = 1.

5.10. INSTRUCCIONES DE BANDERA


Afectan directamente al contenido de las banderas.

CLC, CLD, CLI, CMC, STC, STD, STI

Instruccin CLC
Propsito : Limpiar bandera de acarreo.
Sintaxis : CLC

Esta instruccin apaga el bit correspondiente a la bandera de acarreo, o sea, lo pone en cero.

Instruccin CLD
Propsito : Limpiar bandera de direccin
Sintaxis : CLD

La instruccin CLD pone en cero el bit correspondiente a la bandera de direccin.

Instruccin CLI
Propsito : Limpiar bandera de interrupcin
Sintaxis : CLI

CLI pone en cero la bandera de interrupciones, deshabilitando as aquellas interrupciones enmascarables.


Una interrupcin enmascarable es aquella cuyas funciones son desactivadas cuando IF = 0.

Instruccin CMC
Propsito : Complementar la bandera de acarreo.
Sintaxis : CMC

Esta instruccin complementa el estado de la bandera CF, si CF = 0 la instruccin la iguala a 1, y si es 1 la


instruccin la iguala a 0.

Podemos decir que nicamente "invierte" el valor de la bandera.

Instruccin STC
Propsito : Activar la bandera de acarreo.
Sintaxis : STC

Esta instruccin pone la bandera CF en 1.

SIS-330 :: Programacin en Assembler 58


Instruccin STD
Propsito : Activar la bandera de direccin.
Sintaxis : STD
La instruccin STD pone la bandera DF en 1.

Instruccin STI
Propsito : Activar la bandera de interrupcin.
Sintaxis : STI

La instruccin activa la bandera IF, esto habilita las interrupciones externas enmascarables (las que
funcionan nicamente cuando IF = 1 ).

SIS-330 :: Programacin en Assembler 59