Sunteți pe pagina 1din 42

Lenguaje Ensamblador

UNIDAD II
ELEMENTOS DEL
LENGUAJE
2.1 INSTRUCCIONES LINEALES.
2.1.1
2.1.2
2.1.3
2.1.4
2.1.5

2.2

SALTOS.
2.2.1
2.2.2

2.3

Movimientos.
Pila.
Matemticos.
Ajustes.
Comparacin.

Incondicionales.
Condicionales.

TIPOS DE CICLOS.

2.4 OPERADORES LGICOS.


2.5 DESPLAZAMIENTO.
2.5.1
2.5.2

Lineal.
Circular.

2.6 PROCESOS DE CONTROL.


2.6.1
2.6.2

Banderas.
Cadenas.

M. D. O. H. Sonia Alvarado Mares

77

Lenguaje Ensamblador

2.1 INSTRUCCIONES LINEALES.


2.1.1 Movimientos.
MOV (transferencia).
Sintaxis:

MOV destino, origen

Indicadores:

OF DF IF TF SF ZF AF PF CF
- - - - - - - -

La instruccin de transferencia de datos por excelencia es MOV. Transfiere datos de


longitud byte o palabra del operando origen al operando destino. Pueden ser operando
origen y operando destino cualquier registro o posicin de memoria direccionada de las
formas ya vistas, con la nica condicin de que origen y destino tengan la misma
dimensin.
Con la instruccin MOV diremos que se pueden realizar todo tipo de movimientos
teniendo en cuenta las siguientes restricciones:
1. No se puede realizar una transferencia de datos entre dos posiciones de memoria
directamente, por esta razn, siempre que queramos efectuarlas tendremos que
utilizar un registro intermedio que haga de puente.
Por ejemplo, para hacer la operacin
DATO1 DATO2
la instruccin MOV DATO2, DATO1 sera incorrecta. Lo que s sera correcto sera
utilizar el registro DX, u otro, como puente y hacer:
MOV DX, DATO1
MOV DATO2, DX
2. Tampoco se puede hacer una transferencia directa entre dos registros de segmento.
Por eso, como en el caso anterior, si fuera preciso se utilizara un registro como
puente.
3. Asimismo, tampoco se puede cargar en los registros de segmento un dato utilizando
direccionamiento inmediato, es decir, una constante, por lo que tambin habr que
recurrir a un registro puente cuando sea preciso.
Existen ciertas limitaciones, como que los registros de segmento no admiten el
direccionamiento inmediato: es incorrecto MOV DS, 4000h; pero no lo es por ejemplo
MOV DS, AX o MOV DS, VARIABLE. No es posible, as mismo, utilizar CS como destino
(es incorrecto hacer MOV CS, AX aunque pueda admitirlo algn ensamblador). Al hacer

M. D. O. H. Sonia Alvarado Mares

78

Lenguaje Ensamblador
MOV hacia un registro de segmento, las interrupciones quedan inhibidas hasta despus
de ejecutarse la siguiente instruccin (8086/88 de 1983 y procesadores posteriores).
Ejemplos:

MOV
MOV
MOV

DS, AX
BX, ES:[SI]
SI, OFFSET DATO

En el ltimo ejemplo, no se coloca en SI el valor de la variable dato sino su direccin de


memoria o desplazamiento respecto al segmento de datos. En otras palabras, SI es un
puntero a DATO pero no es DATO. En el prximo captulo se ver cmo se declaran las
variables.

XCHG (intercambiar).
Sintaxis:

XCHG destino, origen

Indicadores:

OF DF IF TF SF ZF AF PF CF
- - - - - - - -

Una instruccin til pero no imprescindible es XCHG. Intercambia el contenido de los


operandos origen y destino. No pueden utilizarse registros de segmentos como
operandos.
Por ejemplo, si queremos intercambiar los contenidos de los registros AX y BX, podemos
hacer:
MOV AUX, AX
MOV AX, BX
MOV BX, AUX
en donde AUX es una variable auxiliar que hace de puente, o simplemente utilizar:
XCHG AX, BX
Otro ejemplo:
XCHG
XCHG

BL, CH
MEM_PAL, BX

Las restricciones que presenta esta operacin es que no se pueden efectuar intercambios
directamente entre posiciones de memoria ni tampoco entre registros de segmento.

XLAT (traduccin).
Sintaxis:

XLAT tabla

Indicadores:

OF DF IF TF SF ZF AF PF CF
- - - - - - - -

M. D. O. H. Sonia Alvarado Mares

79

Lenguaje Ensamblador
La instruccin XLAT tabla carga en el registro AL el contenido de la posicin [BX][AL], en
donde el registro BX ha de apuntar al comienzo de una tabla. Dicho de otra manera, AL
hace de ndice de la tabla y de almacn destino del contenido de la tabla.
Por ejemplo, el siguiente programa:
DATOS SEGMENT
TABLA DB 2, 3, 5, 8, 16, 23
DATOS ENDS
CODIGO SEGMENT
MOVE BX, OFFSET TABLA ;Inicializa BX con la direccin donde comienza la tabla
MOVE AL, 5
XLAT TABLA
CODIGO ENDS
hace que al final el contenido de AL sea 16 ya que es el quinto elemento de la tabla y AL
antes de XLAT TABLA contena el valor 5.
Otro ejemplo:
MOV
MOV
XLAT

BX, OFFSET TABLA


AL, 4
TABLA

Para finalizar con las instrucciones de transferencia veremos un grupo de tres


instrucciones:
LEA o cargar direccin efectiva
LDS o cargar el puntero en DS
LES o cargar el puntero en ES
denominadas de transferencia de direcciones.

LEA (carga direccin efectiva).


Sintaxis:

LEA destino, origen

Indicadores:

OF DF IF TF SF ZF AF PF CF
- - - - - - -

Transfiere el desplazamiento del operando fuente al operando destino. Otras


instrucciones pueden a continuacin utilizar el registro como desplazamiento para acceder
a los datos que constituyen el objetivo. El operando destino no puede ser un registro de
segmento. En general, esta instruccin es equivalente a MOV destino, OFFSET fuente y
de hecho los buenos ensambladores (TASM) la codifican como MOV para economizar un
byte de memoria. Sin embargo, LEA es en algunos casos ms potente que MOV al
permitir indicar registros de ndice y desplazamiento para calcular el offset:

M. D. O. H. Sonia Alvarado Mares

80

Lenguaje Ensamblador
LEA

DX, DATOS [SI]

En el ejemplo de arriba, el valor depositado en DX es el OFFSET de la etiqueta DATOS


ms el registro SI. Esa sola instruccin es equivalente a estas dos:
MOV
ADD

DX, OFFSET DATOS


DX, SI

LDS (carga un puntero utilizando DS).


Sintaxis:

LDS destino, origen

Indicadores:

OF DF IF TF SF ZF AF PF CF
- - - - - - - -

Traslada un puntero de 32 bits (direccin completa de memoria compuesta por


segmento y desplazamiento), al destino indicado y a DS. A partir de la direccin indicada
por el operando origen, el procesador toma 4 bytes de la memoria: con los dos primeros
forma una palabra que deposita en destino y, con los otros dos, otra en DS.
Ejemplo:
PUNT
LDS

DD

12345678H

SI, PUNT

Como resultado de esta instruccin, en DS:SI se hace referencia a la posicin de memoria


1234h:5678h; 'DD' sirve para definir una variable larga de 4 bytes (denominada PUNT en
el ejemplo).

LES (carga un puntero utilizando ES).


Sintaxis:

LES destino, origen

Esta instruccin es anloga a LDS, pero utilizando ES en lugar de DS.

INSTRUCCIONES DE ENTRADA SALIDA (E/S).


IN (entrada).
Sintaxis:

IN acumulador, puerto

Indicadores:

OF DF IF TF SF ZF AF PF CF
- - - - - - - -

M. D. O. H. Sonia Alvarado Mares

81

Lenguaje Ensamblador
Transfiere datos desde el puerto indicado hasta el registro AL o AX, dependiendo de la
longitud byte o palabra respectivamente. El puerto puede especificarse mediante una
constante (0 a 255) o a travs del valor contenido en DX (0 a 65535).
Ejemplo:
IN
IN

AX, 0FH
AL, DX

OUT (salida).
Sintaxis:
Indicadores:

OUT puerto, acumulador


OF DF IF TF SF ZF AF PF CF
- - - - - - - -

Transfiere un byte o palabra del registro AL o AX a un puerto de salida. El puerto puede


especificarse con un valor fijo entre 0 y 255 a travs del valor contenido en el registro
DX (de 0 a 65535).
Ejemplo:
OUT
OUT

12H, AX
DX, AL

M. D. O. H. Sonia Alvarado Mares

82

Lenguaje Ensamblador
2.1.2 Pila.
POP (Extraer de la pila).
Sintaxis:

POP destino

Indicadores:

OF DF IF TF SF ZF AF PF CF
- - - - - - - -

Transfiere el elemento palabra que se encuentra en lo alto de la pila (apuntado por SP) al
operando destino que a de ser tipo palabra, e incrementa en dos el registro SP. La
instruccin POP CS, poco til, no funciona correctamente en los 286 y superiores.
Ejemplos:
POP
POP

AX
PEPE

PUSH (Introduce en la pila).


Sintaxis:

PUSH origen

Indicadores:

OF DF IF TF SF ZF AF PF CF
- - - - - - - -

Decrementa el puntero de pila (SP) en 2 y luego transfiere la palabra especificada en el


operando origen a la cima de la pila. El registro CS aqu s se puede especificar como
origen, al contrario de lo que afirman algunas publicaciones.
Ejemplo:
PUSH

CS

POPF (extrae los indicadores de la pila).


Sintaxis:

POPF

Indicadores:

OF DF IF TF SF ZF AF PF CF
x x x x x x x x x

Traslada al registro de los indicadores la palabra almacenada en la cima de la pila; a


continuacin el puntero de pila SP se incrementa en dos.

PUSHF (introduce los indicadores en la pila)


Sintaxis:

PUSHF

Indicadores:

OF DF IF TF SF ZF AF PF CF
- - - - - - - -

Decrementa en dos el puntero de pila y traslada a la cima de la pila el contenido de los


indicadores.

M. D. O. H. Sonia Alvarado Mares

83

Lenguaje Ensamblador
2.1.3 Matemticos.
S U M A S.
AAA (Ajuste ASCII para la suma).
Sintaxis:

AAA

Indicadores:

OF DF IF TF SF ZF AF PF CF
? - - - ? ? x ? x

Convierte el contenido del registro AL en un nmero BCD no empaquetado. Si los cuatro


bits menos significativos de AL son mayores que 9 si el indicador AF est a 1, se suma
6 a AL, 1 a AH, AF se pone a 1, CF se iguala a AF y AL pone sus cuatro bits ms
significativos a 0.
Ejemplo:
ADD
AAA

AL, BL

En el ejemplo, tras la suma de dos nmeros BCD no empaquetados colocados en AL y


BL, el resultado (por medio de AAA) sigue siendo un nmero BCD no empaquetado.

ADC (Suma con acarreo).


Sintaxis:

ADC destino, origen

Indicadores:

OF DF IF TF SF ZF AF PF CF
x - - - x x x x x

Suma los operandos origen, destino y el valor del indicador de acarreo (0 1) y el


resultado lo almacena en el operando destino. Se utiliza normalmente para sumar
nmeros grandes, de ms de 16 bits, en varios pasos, considerando lo que nos llevamos
(el acarreo) de la suma anterior.
Ejemplo:
ADC

AX, BX

ADD (suma).
Sintaxis:

ADD destino, origen

Indicadores:

OF DF IF TF SF ZF AF PF CF
x - - - x x x x x

M. D. O. H. Sonia Alvarado Mares

84

Lenguaje Ensamblador
Suma los operandos origen y destino almacenando el resultado en el operando destino.
Se activa el acarreo si se desborda el registro destino durante la suma.
Ejemplos:
ADD AX, BX
ADD CL, DH

DAA (Ajuste decimal para la suma).


Sintaxis:

DAA

Indicadores:

OF DF IF TF SF ZF AF PF CF
? - - - x x x x x

Convierte el contenido del registro AL en un par de valores BCD: si los cuatro bits menos
significativos de AL son un nmero mayor que 9, el indicador AF se pone a 1 y se suma 6
a AL. De igual forma, si los cuatro bits ms significativos de AL tras la operacin anterior
son un nmero mayor que 9, el indicador CF se pone a 1 y se suma 60h a AL.
Ejemplo:
ADD
DAA

AL, CL

En el ejemplo anterior, si AL y CL contenan dos nmeros BCD empaquetados, DAA hace


que el resultado de la suma (en AL) siga siendo tambin un BCD empaquetado.

INC (Incrementar).
Sintaxis:

INC destino

Indicadores:

OF DF IF TF SF ZF AF PF CF
x - - - x x x x
-

Incrementa el operando destino. El operando destino puede ser byte o palabra.


Obsrvese que esta instruccin no modifica el bit de acarreo (CF) y no es posible detectar
un desbordamiento por este procedimiento (utilcese ZF).
Ejemplos:
INC
INC
INC
INC

AL
ES: [DI]
SS: [BP+4]
WORD PTR CS: [BX+DI+7]

M. D. O. H. Sonia Alvarado Mares

85

Lenguaje Ensamblador
R E S T A S.
AAS (Ajuste ASCII para la resta).
Sintaxis:

AAS

Indicadores:

OF DF IF TF SF ZF AF PF CF
? - - - ? ? x ? x

Convierte el resultado de la sustraccin de dos operandos BCD no empaquetados para


que siga siendo un nmero BCD no empaquetado. Si el nibble inferior de AL tiene un
valor mayor que 9, de AL se resta 6, se decrementa AH, AF se pone a 1 y CF se iguala a
AF. El resultado se guarda en AL con los bits de 4 a 7 puestos a 0.
Ejemplo:
SUB
AAS

AL, BL

En el ejemplo, tras la resta de dos nmeros BCD no empaquetados colocados en AL y


BL, el resultado (por medio de AAS) sigue siendo un nmero BCD no empaquetado.

CMP (Comparacin).
Sintaxis:

CMP destino, origen

Indicadores:

OF DF IF TF SF ZF AF PF CF
x
- - - x x x x x

Resta origen de destino sin retornar ningn resultado. Los operandos quedan inalterados,
paro los indicadores pueden ser consultados mediante instrucciones de bifurcacin
condicional. Los operandos pueden ser de tipo byte o palabra pero ambos de la misma
dimensin.
Ejemplo:
CMP
CMP

BX, MEM_PAL
CH, CL

DAS (Ajuste decimal para la resta).


Sintaxis:

DAS

Indicadores:

OF DF IF TF SF ZF AF PF CF
- - - - x x x x x

Corrige el resultado en AL de la resta de dos nmeros BCD empaquetados, convirtindolo


tambin en un valor BCD empaquetado. Si el nibble inferior tiene un valor mayor que 9 o

M. D. O. H. Sonia Alvarado Mares

86

Lenguaje Ensamblador
AF es 1, a AL se le resta 6, AF se pone a 1. Si el nibble mas significativo es mayor que 9
CF est a 1, entonces se resta 60h a AL y se activa despus CF.
Ejemplo:
SUB
DAS

AL, BL

En el ejemplo anterior, si AL y BL contenan dos nmeros BCD empaquetados, DAS hace


que el resultado de la resta (en AL) siga siendo tambin un BCD empaquetado.

DEC (Decrementar).
Sintaxis:

DEC destino

Indicadores:

OF DF IF TF SF ZF AF PF CF
x - - x x x x
-

Resta una unidad del operando destino. El operando puede ser byte o palabra. Obsrvese
que esta instruccin no modifica el bit de acarreo (CF) y no es posible detectar un
desbordamiento por este procedimiento (utilcese ZF).
Ejemplo:
DEC
DEC

AX
MEM_BYTE

NEG (Negacin).
Sintaxis:

NEG destino

Indicadores:

OF DF IF TF SF ZF AF PF CF
x - - x x x x x

Calcula el valor negativo en complemento a dos del operando y devuelve el resultado en


el mismo operando.
Ejemplo:
NEG

AL

SBB (resta con acarreo).


Sintaxis: SBB destino, origen
Indicadores:

OF DF IF TF SF ZF AF PF CF
x - - x x x x x

Resta el operando origen del operando destino y el resultado lo almacena en el operando


destino. Si est a 1 el indicador de acarreo adems resta una unidad ms. Los operandos
pueden ser de tipo byte o palabra. Se utiliza normalmente para restar nmeros grandes,

M. D. O. H. Sonia Alvarado Mares

87

Lenguaje Ensamblador
de ms de 16 bits, en varios pasos, considerando lo que nos llevamos (el acarreo) de la
resta anterior.
Ejemplo:
SBB
SBB

AX, AX
CH, DH

SUB (Resta).
Sintaxis:

SUB destino, origen

Indicadores:

OF DF IF TF SF ZF AF PF CF
x
- - - x x x x x

Resta el operando destino al operando origen, colocando el resultado en el operando


destino. Los operandos pueden tener o no signo, siendo necesario que sean del mismo
tipo, byte o palabra.
Ejemplos:
SUB
SUB

AL, BL
DX, DX

M U L T I P L I C A C I O N E S.

AAM (Ajuste ASCII para la multiplicacin).


Sintaxis:

AAM

Indicadores:

OF DF IF TF SF ZF AF PF CF
? - - - x x ? x ?

Corrige el resultado en AX del producto de dos nmeros BCD no empaquetados,


convirtindolo en un valor BCD tambin no empaquetado. En AH sita el cociente de
AL/10 quedando en AL el resto de dicha operacin.
Ejemplo:
MUL
AAM

BL

En el ejemplo, tras el producto de dos nmeros BCD no empaquetados colocados en AL y


BL, el resultado (por medio de AAA) sigue siendo, en AX, un nmero BCD no
empaquetado.

M. D. O. H. Sonia Alvarado Mares

88

Lenguaje Ensamblador
IMUL (multiplicacin entera con signo).
Sintaxis: IMUL origen (origen no puede ser operando inmediato en 8086, s en 286)
Indicadores:

OF DF IF TF SF ZF AF PF CF
x
- - - ? ? ? ? x

Multiplica un operando origen con signo de longitud byte o palabra por AL o AX


respectivamente. Si origen es un byte el resultado se guarda en AH (byte ms
significativo) y en AL (menos significativo), si origen es una palabra el resultado es
devuelto en DX (parte alta) y AX (parte baja). Si las mitades ms significativas son
distintas de cero, independientemente del signo, CF y OF son activados.
Ejemplo:
IMUL
IMUL

BX
CH

MUL (multiplicacin sin signo).


Sintaxis:

MUL origen (origen no puede ser operando inmediato)

Indicadores:

OF DF IF TF SF ZF AF PF CF
x - - - ? ? ? ? x

Multiplica el contenido sin signo del acumulador por el operando origen. Si el


operando destino es un byte el acumulador es AL guardando el resultado en AH y AL, si
el contenido de AH es distinto de 0 activa los indicadores CF y OF. Cuando el operando
origen es de longitud palabra el acumulador es AX quedando el resultado sobre DX y AX,
si el valor de DX es distinto de cero los indicadores CF y OF se activan.
Ejemplo:
MUL
MUL
MUL

BYTE PTR DS: [DI]


DX
CL

Desbordamientos.
Este alerta con los desbordamientos en las operaciones aritmticas. Ya que un byte solo
permite el uso de un bit de signo y siete de datos (desde -128 hasta +127), una operacin
aritmtica puede exceder con facilidad la capacidad de un registro de un byte. Y una
suma en el registro AL, que exceda su capacidad puede provocar resultados inesperados.

Byte por byte.


Para multiplicar dos nmeros de un byte, el multiplicando esta en el registro AL y el
multiplicador es un byte en memoria o en otro registro. Para la instruccin MUL DL, la
operacin multiplica el contenido del AL por el contenido del DL. El producto generado

M. D. O. H. Sonia Alvarado Mares

89

Lenguaje Ensamblador
esta en el registro AX. La operacin ignora y borra cualquier informacin que pueda estar
en el AH.

Palabra por palabra.


Para multiplicar dos nmeros de una palabra, el multiplicando esta en el registro AX y el
multiplicador es una palabra en memoria o en otro registro. Para la instruccin MUL DX, la
operacin multiplica el contenido del AX por el contenido del DX. El producto generado es
una palabra doble que necesita dos registros: la parte de orden alto (mas a la izquierda)
en el DX y la parte de orden bajo (mas a la derecha) en el AX. La operacin ignora y borra
cualquier informacin que puede estar en el DX.

Palabra doble por palabra doble.


Para multiplicar dos nmeros de palabras dobles, el multiplicando esta en el registro EAX
y el multiplicador es una palabra doble en memoria o en otro registro. El producto es
generado en el par EDX:EAX. La operacin ignora y borra cualquier informacin que ya
este en el EDX.

En los ejemplos siguientes, el multiplicador esta en un registro, el cual especifica el tipo de


operacin:

M. D. O. H. Sonia Alvarado Mares

90

Lenguaje Ensamblador
INSTRUCCION

MULTIPLICADOR

MUL CL
MUL BX
MUL EBX

byte
palabra
palabra doble

MULTIPLICANDO
AL
AX
EAX

PRODUCTO
AX
DX:AX
EDX:EAX

En los ejemplos siguientes, los multiplicadores estn definidos en memoria:


BYTE1
WORD1
DWORD1
OPERACION

DB
DW
DD

?
?
?

MULTIPLICADOR

MULTIPLIANDO

PRODUCTO

BYTE1
WORD1
DWORD1

AL
AX
EAX

AX
DX:AX
EDX:EAX

MUL BYTE1
MUL WORD1
MUL DWORD1
DIVISIONES.

AAD (Ajuste ASCII para la divisin).


Sintaxis:

AAD

Indicadores:

OF DF IF TF SF ZF AF PF CF
?
- - - x x ? x ?

Convierte dos nmeros BCD no empaquetados contenidos en AH y AL en un dividendo


de un byte que queda almacenado en AL. Tras la operacin AH queda a cero. Esta
instruccin es necesaria ANTES de la operacin de dividir, al contrario que AAM.
Ejemplo:
AAD
DIV BL
En el ejemplo, tras convertir los dos nmeros BCD no empaquetados (en AX) en un
dividendo vlido, la instruccin de dividir genera un resultado correcto.

DIV (Divisin sin signo).


Sintaxis:

DIV origen (origen no puede ser operando inmediato).

Indicadores:

OF DF IF TF SF ZF AF PF CF
?
- - - ? ? ? ? ?

M. D. O. H. Sonia Alvarado Mares

91

Lenguaje Ensamblador
Divide, sin considerar el signo, un nmero contenido en el acumulador y su extensin (AH,
AL si el operando es de tipo byte o DX, AX si el operando es palabra) entre el operando
fuente. El cociente se guarda en AL o AX y el resto en AH o DX segn el operando sea
byte o palabra respectivamente. DX o AH deben ser cero antes de la operacin. Cuando
el cociente es mayor que el resultado mximo que puede almacenar, cociente y resto
quedan indefinidos producindose una interrupcin 0. En caso de que las partes ms
significativas del cociente tengan un valor distinto de cero se activan los indicadores CF y
OF.
Ejemplo:
DIV
DIV

BL
MEM_PAL

IDIV (Divisin entera).


Sintaxis:

IDIV origen (origen no puede ser operando inmediato).

Indicadores:

OF DF IF TF SF ZF AF PF CF
?
- - - ? ? ?
? ?

Divide, considerando el signo, un nmero contenido en el acumulador y su extensin


entre el operando fuente. El cociente se almacena en AL o AX segn el operando sea
byte o palabra y de igual manera el resto en AH o DX. DX o AH deben ser cero antes de
la operacin. Cuando el cociente es positivo y superior al valor mximo que puede
almacenarse (7fh 7fffh), o cuando el cociente es negativo e inferior al valor mnimo que
puede almacenarse (81h u 8001h) entonces cociente y resto quedan indefinidos,
generndose una interrupcin 0, lo que tambin sucede si el divisor es 0.
Ejemplo:
IDIV
IDIV

BL
BX

Las operaciones de divisin bsicas son byte entre byte, palabra entre palabra y palabras
dobles entre palabra dobles.
Palabra entre palabra

Aqu el dividendo esta en el AX y el divisor es un byte en memoria o en otro registro.


Despus de la divisin, el residuo esta en el AH y el cociente esta en el AL. Ya que un
cociente de un byte es muy pequeo -si es sin signo, un mximo de +255 (FFH) y con
signo +127 (7FH)- esta operacin tiene un uso limitado.

M. D. O. H. Sonia Alvarado Mares

92

Lenguaje Ensamblador
Palabra doble entre palabra.
Para esta operacin, el dividendo esta en el par DX:AX y el divisor es una palabra en
memoria o en otro registro. Despus de la divisin, el residuo esta en el DX y el cociente
esta en el AX. El cociente de una palabra permite para datos sin signo un mximo de +32,
767 (FFFFH) y con signo +16, 383 (7FFFH). Tenemos:

Palabra cudruple entre palabra doble.


Al dividir una palabra cudruple entre una palabra doble, el dividendo esta en el par
EDX:EAX y el divisor esta en una palabra doble en memoria o en otro registro. Despus
de la divisin, el residuo esta en el EDX y el cociente en el AEX.

En los ejemplos siguientes, de DIV, los divisores estn en un registro, que determina el
tipo de operacin:
OPERACION
DIV CL
DIV CX
DIV EBX

DIVISOR
byte
palabra
palabra doble

DIVIDENDO
AX
DX:AX
EDX:EAX

COCIENTE
AL
AX
EAX

RESIDUO
AH
DX
EDX

En los ejemplos siguientes de DIV, los divisores estn definidos en memoria:


BYTE1
DB
?
WORD1
DW
?
DWORD1 DD
?
...
DIVISOR
DIVIDENDO

COCIENTE

DIV BYTE1
BYTE1
DIV WORD1
WORD1
DIV DWORD1 DWORD1

AX
DX:AX
EDX:EAX

RESIDUO
AL
AX
EAX

M. D. O. H. Sonia Alvarado Mares

AH
DX
EDX

93

Lenguaje Ensamblador
Ejemplo de programa con instrucciones aritmticas.
TITLE

P13ADD (COM) Operaciones ADD y SUB


.MODEL SMALL
.CODE
ORG 100H
BEGIN:
JMP SHORT MAIN
;---------------------------------------------------------------------------BYTEA
DB
64H
;DATOS
BYTEB
DB
40H
BYTEC
DB
16H
WORDA DW
4000H
WORDB DW
2000H
WORDC DW
1000H
;---------------------------------------------------------------------------MAIN
PROC NEAR
;Procedimiento principal:
CALL
B10ADD
;Llama a la rutina ADD
CALL
C10SUB
;Llama a la rutina SUB
INT
21H
MAIN
ENDP
;
Ejemplos de suma (ADD) de bytes:
;---------------------------------------------------------------------------B10ADD PROC
MOV
AL, BYTEA
MOV
BL, BYTEB
ADD
AL, BL
;registro a registro
ADD
AL, BYTEC
;memoria a registro
ADD
BYTEA, BL
;registro a memoria
ADD
BL, 10H
;inmediato a registro
ADD
BYTEA, 25H
;inmediato a memoria
RET
B10ADD ENDP
;
Ejemplos de resta (SUB) de palabras:
;---------------------------------------------------------C10SUB PROC
MOV
AX, WORDA
MOV
BX, WORDB
SUB
AX,BX
;Registro a registro
SUB
AX,WORDC
;Memora de registro
SUB
WORDA, BX
;Registro de memoria
SUB
BX, 1000H
;Inmediato de registro
SUB
WORDA, 256H ;Inmediato de memoria
RET
C10SUB ENDP
END BEGIN

M. D. O. H. Sonia Alvarado Mares

94

Lenguaje Ensamblador
2.1.4 Ajustes.
CBW (Conversin de byte en palabra).
Sintaxis:
Indicadores:

CBW
OF DF IF TF SF ZF AF PF CF
- - - - - -

Copia el bit 7 del registro AL en todos los bits del registro AH, es decir, expande el signo
de AL a AX como paso previo a una operacin de 16 bits.

CWD (conversin de palabra a doble palabra).


Sintaxis:

CWD

Indicadores:

OF DF IF TF SF ZF AF PF CF
- - - - - -

Expande el signo del registro AX sobre el registro DX, copiando el bit ms significativo de
AH en todo DX.

M. D. O. H. Sonia Alvarado Mares

95

Lenguaje Ensamblador
2.1.5 Comparacin.
CMP (Comparacin).
Sintaxis:

CMP destino, origen

Indicadores:

OF DF IF TF SF ZF AF PF CF
x
- - - x x x x x

Resta origen de destino sin retornar ningn resultado. Los operandos quedan inalterados,
paro los indicadores pueden ser consultados mediante instrucciones de bifurcacin
condicional. Los operandos pueden ser de tipo byte o palabra pero ambos de la misma
dimensin.
Ejemplo:
CMP
CMP

BX, MEM_PAL
CH, CL

CMPS/CMPSB/CMPSW (Compara cadenas).


Sintaxis:

CMPS cadena_destino, cadena_origen


CMPSB (bytes)
CMPSW (palabras)

Indicadores:

OF DF IF TF SF ZF AF PF CF
x - - - x x x x x

Compara dos cadenas restando al origen el destino. Ninguno de los operandos se alteran,
pero los indicadores resultan afectados. La cadena origen se direcciona con registro SI
sobre el segmento de datos DS y la cadena destino se direcciona con el registro DI sobre
el segmento extra ES. Los registros DI y SI se autoincrementan o autodecrementan segn
el valor del indicador DF (vanse CLD y STD) en una o dos unidades, dependiendo de si
se trabaja con bytes o con palabras. Cadena origen y cadena destino son dos operandos
redundantes que slo indican el tipo del dato (byte o palabra) a comparar, es ms cmodo
colocar CMPSB o CMPSW para indicar bytes/palabras. Si se indica un registro de
segmento, ste sustituir en la cadena origen al DS ordinario.
Ejemplo:
LEA SI, ORIGEN
LEA DI, DESTINO
CMPSB

M. D. O. H. Sonia Alvarado Mares

96

Lenguaje Ensamblador
A continuacin se muestra la codificacin del uso del CMPS y sus derivaciones:

TITLE

P12CMPST (COM) Uso de CMPS para operaciones en cadenas


.MODEL

SMALL

.CODE
ORG
100H
BEGIN: JMP
SHORT MAIN
;------------------------------------------------------------------------------------NOM1 DB
'Assemblers' ;Elementos de datos
NOM2 DB
'Assemblers'
NOM3 DB
10 DUP (' ')
;------------------------------------------------------------------------------------MAIN

PROC
NEAR
CLD ;Izquierda a derecha
MOV
CX, 10
LEA
DI, NOM2
LEA
SI, NOM1
REPE
CMPSB
JNE
G20
MOV
BH,01

;Procedimiento principal
;Iniciar para 10 bytes
;Compare NOM1:NOM2
;No es igual, saltarlo
;Igual, fijar BH

G20:
MOV
LEA
LEA
REPE
JE
MOV

CX, 10
DI, NOM3
SI, NOM2
CMPSB
G30
BL, 02

MOV
INT
MAIN ENDP
END

AX, 4C00H
21H

;Iniciar para 10 bytes


;Compare NOM2:NOM3
;Igual, salir
;No es igual, fijar BL

G30:
;Salir a DOS

BEGIN

M. D. O. H. Sonia Alvarado Mares

97

Lenguaje Ensamblador

2 .2

SALTOS.

2.2.1 Incondicionales.
CALL (Llamada a subrutina).
Sintaxis:

CALL destino

Indicadores:

OF DF IF TF SF ZF AF PF CF
- - - - - - -

Transfiere el control del programa a un procedimiento, salvando previamente en la


pila la direccin de la instruccin siguiente, para poder volver a ella una vez
ejecutado el procedimiento. El procedimiento puede estar en el mismo segmento
(tipo NEAR) o en otro segmento (tipo FAR). A su vez la llamada puede ser directa
a una etiqueta (especificando el tipo de llamada NEAR -por defecto- o FAR) o
indirecta, indicando la direccin donde se encuentra el puntero. Segn la llamada
sea cercana o lejana, se almacena en la pila una direccin de retorno de 16 bits o
dos palabras de 16 bits indicando en este ltimo caso tanto el offset (IP) como el
segmento (CS) a donde volver.
Ejemplos:
CALL

PROC1

DIR
CALL

DD
0F000E987H
DWORD PTR DIR

En el segundo ejemplo, la variable dir almacena la direccin a donde saltar. De


esta ltima manera -conociendo su direccin- puede llamarse tambin a un vector
de interrupcin, guardando previamente los flags en la pila (PUSHF), porque la
rutina de interrupcin retornar (con IRET en vez de con RETF) sacndolos.
JMP (Salto).
Sintaxis:

JMP direccin o JMP SHORT direccin

Indicadores:

OF DF IF TF SF ZF AF PF CF
- - - - - - - -

Transfiere el control incondicionalmente a la direccin indicada en el operando. La


bifurcacin puede ser tambin directa o indirecta como anteriormente vimos, pero
adems puede ser corta (tipo SHORT) con un desplazamiento comprendido entre
-128 y 127; o larga, con un desplazamiento de dos bytes con signo. Si se hace un
JMP SHORT y no llega el salto (porque est demasiado alejada esa etiqueta) el
ensamblador dar error. Los buenos ensambladores (como TASM) cuando dan

M. D. O. H. Sonia Alvarado Mares

98

Lenguaje Ensamblador
dos pasadas colocan all donde es posible un salto corto, para economizar
memoria, sin que el programador tenga que ocuparse de poner short. Si el salto
de dos bytes, que permite desplazamientos de 64 Kb en la memoria sigue siendo
insuficiente, se puede indicar con far que es largo (salto a otro segmento).
Ejemplos:
JMP
JMP

ETIQUETA
FAR PTR ETIQUETA

RET / RETF (Retorno de subrutina).


Sintaxis:
Indicadores:

RET [valor] o RETF [valor]


OF DF IF TF SF ZF AF PF CF
- - - - - - - - -

Retorna de un procedimiento extrayendo de la pila la direccin de la siguiente


direccin. Se extraer el registro de segmento y el desplazamiento en un
procedimiento de tipo FAR (dos palabras) y solo el desplazamiento en un
procedimiento NEAR (una palabra). si esta instruccin es colocada dentro de un
bloque PROC-ENDP (como se ver en el siguiente captulo) el ensamblador sabe
el tipo de retorno que debe hacer, segn el procedimiento sea NEAR o FAR. En
cualquier caso, se puede forzar que el retorno sea de tipo FAR con la instruccin
RETF. Valor, si es indicado permite sumar una cantidad valor en bytes a SP antes
de retornar, lo que es frecuente en el cdigo generado por los compiladores para
retornar de una funcin con parmetros. Tambin se puede retornar de una
interrupcin con RETF 2, para que devuelva el registro de estado sin restaurarlo
de la pila.
TITLE

P08JUMP (COM) Uso de JMP para iterar

.MODEL

SMALL

.CODE
MAIN

ORG
PROC
MOV
MOV
MOV

100H
NEAR
AX,01
BX,01
CX,01

ADD
ADD
SHL
JMP
ENDP
END

AX, 01
BX, AX
CX, 1
A20

;Iniciacin de AX,
;BX y
;CX a 01

A20:

MAIN

;Sumar 01 a AX
;Sumar AX a BX
;Multiplicar por dos a CX
;Saltar a la etiqueta A20

MAIN

M. D. O. H. Sonia Alvarado Mares

99

Lenguaje Ensamblador
2.2.2 Condicionales.
Las siguientes instrucciones son de transferencia condicional de control a la
instruccin que se encuentra en la posicin IP+desplazamiento (desplazamiento
comprendido entre -128 y +127) si se cumple la condicin. Algunas condiciones se
pueden denotar de varias maneras. Todos los saltos son cortos y si no alcanza
hay que aparselas como sea. En negrita se realzan las condiciones ms
empleadas. Donde interviene SF se consideran con signo los operandos
implicados en la ltima comparacin u operacin aritmetico-lgica, y se indican en
la tabla como '' (-128 a +127 -32768 a +32767); en los dems casos, indicados
como '+', se consideran sin signo (0 a 255 0 a 65535):
JA/JNBE

Salto si mayor (above), si no menor o igual (not below or equal), si CF=0 y


ZF=0.

JAE/JNB

Salto si mayor o igual (above or equal), si no menor (not below), si CF=0.

JB/JNAE/JC

Salto si menor (below), si no superior ni igual (not above or equal), si


acarreo, si CF=1.
Salto si menor o igual (not below or equal), si no mayor (not above), si
CF=1 ZF=1.

JBE/JNA

JCXZ
JE/JZ
JG/JNLE
JGE/JNL
JL/JNGE

Salto si CX=0.

Salto si menor (less), si no mayor ni igual (not greater or equal), si SF<>OF.

JLE/JNG

Salto si menor o igual (less or equal), si no mayor (not greater), si ZF=0 y


SF<>OF.

JNC
JNE/JNZ
JNO
JNP/JPO
JNS
JO
JP/JPE
JS

Salto si no acarreo, si CF=0.

Salto si igual (equal), si cero (zero), si ZF=1.


Salto si mayor (greater), si no menor ni igual (not less or equal), si ZF=0 y SF=0.
Salto si mayor o igual (greater or equal), si no menor (not less), si SF=0.

Salto si no igual, si no cero, si ZF=0.


Salto si no desbordamiento, si OF=0.
Salto si no paridad, si paridad impar, si PF=0.
Salto si no signo, si positivo, si SF=0.
Salto si desbordamiento, si OF=1.
Salto si paridad, si paridad par, si PF=1.
Salto si signo, si SF=1.

M. D. O. H. Sonia Alvarado Mares

100

Lenguaje Ensamblador

2.3 TIPOS DE CICLOS.


LOOP (bucle).
Sintaxis:
Indicadores:

LOOP desplazamiento
OF DF IF TF SF ZF AF PF CF
- - - - - - -

Decrementa el registro contador CX; si CX es cero, ejecuta la siguiente instruccin, en


caso contrario transfiere el control a la direccin resultante de sumar a IP +
desplazamiento. El desplazamiento debe estar comprendido entre -128 y +127.
Ejemplo:
MOV CX,10
BUCLE: .......
.......
LOOP BUCLE
Con las mismas caractersticas que la instruccin anterior:

LOOPE/LOOPZ

Bucle si igual, si cero. Z=1 y CX<>0

LOOPNE/LOOPNZ Bucle si no igual, si no cero. Z=0 y CX<>0

TITLE

P08LOOP (COM) Ilustracin de LOOP

.MODEL

SMALL

.CODE
MAIN

ORG
PROC
MOV
MOV
MOV
MOV

100H
NEAR
AX,01
BX,01
CX,01
CX,10

ADD
ADD
SHL
LOOP
MOV
ENDP
END

AX, 01
BX, AX
DX, 1
A20
AX, 4C00H

A20:

MAIN

;Iniciacin de AX,
;BX y
;CX a 01
;Iniciar
;Nmero de iteraciones
;Sumar 01 a AX
;Sumar AX a BX
;Multiplicar por dos a DX
;Iterar si es diferente de cero
;Salida a DOS

MAIN

M. D. O. H. Sonia Alvarado Mares

101

Lenguaje Ensamblador

2.4 OPERADORES LGICOS.


AND (y lgico).
Sintaxis:

AND destino, origen

Indicadores:

OF DF IF TF SF ZF AF PF CF
0 - - - x x ? x 0

Realiza una operacin de Y lgico entre el operando origen y destino quedando el


resultado en el destino. Son vlidos operandos byte o palabra, pero ambos del mismo
tipo.
Ejemplos:
AND
AND

AX, BX
BL, BYTE PTR ES:[SI+10H]

NOT (No lgico).


Sintaxis:

NOT destino

Indicadores:

OF DF IF TF SF ZF AF PF CF
- - - - - - - -

Realiza el complemento a uno del operando destino, invirtiendo cada uno de sus bits. Los
indicadores no resultan afectados.
Ejemplo:
NOT

AX

OR (O lgico).
Sintaxis:

OR destino, origen

Indicadores:

OF DF IF TF SF ZF AF PF CF
0 - - - x x ? x 0

Realiza una operacin O lgico a nivel de bits entre los dos operandos,
almacenndose despus el resultado en el operando destino.
Ejemplo:
OR

AX, BX

M. D. O. H. Sonia Alvarado Mares

102

Lenguaje Ensamblador
TEST (Comparacin lgica).
Sintaxis:
Indicadores:

TEST destino, origen


OF DF IF TF SF ZF AF PF CF
0 - - - x x ? x 0

Realiza una operacin Y lgica entre los dos operandos pero sin almacenar el resultado.
Los indicadores son afectados con la operacin.
Ejemplo:
TEST

AL,BH

XOR (O exclusivo).
Sintaxis:
Indicadores:

XOR destino, origen


OF DF IF TF SF ZF AF PF CF
0 - - - x x ? x 0

Operacin OR exclusivo a nivel de bits entre los operandos origen y destino


almacenndose el resultado en este ltimo.
Ejemplo:
XOR

DI, AX

M. D. O. H. Sonia Alvarado Mares

103

Lenguaje Ensamblador

2.5 DESPLAZAMIENTOS.
2.5.1 Lineal.
SAL/SHL (Desplazamiento aritmtico a la izquierda).
Sintaxis:

SAL/SHL destino, contador

Indicadores:

OF DF IF TF SF ZF AF PF CF
x - - - x x ? x x

Desplaza a la izquierda los bits del operando el nmero de bits especificado en el


segundo operando que debe ser CL si es mayor que 1 los bits desplazados.

SAR (Desplazamiento aritmtico a la derecha).


Sintaxis:

SAR destino, contador

Indicadores:

OF DF IF TF SF ZF AF PF CF
x - - - x x ? x x

Desplaza a la derecha los bits del operando destino el nmero de bits especificado en el
segundo operando. Los bits de la izquierda se rellenan con el bit de signo del primer
operando. Si el nmero de bits a desplazar es 1 se puede especificar directamente, si es
mayor se especifica a travs de CL.

Ejemplos:
SAR
SAR

AX, CL
BP, 1

SHR (Desplazamiento lgico a la derecha).


Sintaxis:

SHR destino, contador

Indicadores:

OF DF IF TF SF ZF AF PF CF
x
- - - x x ? x x

M. D. O. H. Sonia Alvarado Mares

104

Lenguaje Ensamblador
Desplaza a la derecha los bits del operando destino el nmero de los bits especificados
en el segundo operando. Los bits de la izquierda se llena con cero. Si el nmero de bits a
desplazar es 1 se puede especificar directamente en el caso en que no ocurra se pone el
valor en CL:

Ejemplos:
SHR
SHR

AX, CL
CL, 1

M. D. O. H. Sonia Alvarado Mares

105

Lenguaje Ensamblador
2.5.2 Circular.
RCL (Rotacin a la izquierda con acarreo).
Sintaxis:

RCL destino, contador

Indicadores:

OF DF IF TF SF ZF AF PF CF
x - - - - - - x

Rotar a la izquierda los bits del operando destino junto con el indicador de acarreo CF el
nmero de bits especificado en el segundo operando. Si el nmero de bits a desplazar es
1, se puede especificar directamente, en caso contrario el valor debe cargarse en CL y
especificar CL como segundo operando. No es conveniente que CL sea mayor de 7, en
bytes; 15, en palabras.

Ejemplos:
RCL
RCL
RCL

AX, 1
AL, CL
DI, 1

RCR (Rotacin a la derecha con acarreo).


Sintaxis:

RCR destino, contador

Indicadores:

OF DF IF TF SF ZF AF PF CF
x
- - - - - - x

Rotar a la derecha los bits del operando destino junto con el indicador de acarreo CF el
nmero de bits especificado en el segundo operando. Si el nmero de bits es 1 se puede
especificar directamente; en caso contrario su valor debe cargarse en CL y especificar CL
como segundo operando:

Ejemplos:
RCR
RCR

BX, CL
BX, 1

M. D. O. H. Sonia Alvarado Mares

106

Lenguaje Ensamblador
ROL (Rotacin a la izquierda).
Sintaxis:

ROL destino, contador

Indicadores:

OF DF IF TF SF ZF AF PF CF
x - - - - - - x

Rota a la izquierda los bits del operando destino el nmero de bits especificado en el
segundo operando, que puede ser 1 CL previamente cargado con el valor del nmero
de veces.

Ejemplos:
ROL
ROL

DX, CL
AH, 1

ROR (Rotacin a la derecha).


Sintaxis:

ROR destino, contador

Indicadores:

OF DF IF TF SF ZF AF PF CF
x - - - - - x

Rota a la derecha los bits del operando destino el nmero de bits especificado en el
segundo operando. Si el nmero de bits es 1 se puede poner directamente, en caso
contrario debe ponerse a travs de CL.

Ejemplos:
ROR
ROR

CL, 1
AX, CL

M. D. O. H. Sonia Alvarado Mares

107

Lenguaje Ensamblador

2.6 PROCESOS DE CONTROL.


NOP (Operacin nula).
Sintaxis:

NOP

Indicadores:

OF DF IF TF SF ZF AF PF CF
- - - - - - -

Realiza una operacin nula, es decir, el microprocesador decodifica la instruccin y pasa


a la siguiente. Realmente se trata de la instruccin XCHG AX,AX.

ESC (Salida a un coprocesador).


Sintaxis:

ESC cdigo_operacin, origen

Indicadores:

OF DF IF TF SF ZF AF PF CF
- - - - - - - -

Se utiliza en combinacin con procesadores externos, tales como los coprocesadores de


coma flotante o de E/S, y abre al dispositivo externo el acceso a las direcciones y
operandos requeridos. Al mnemnico ESC le siguen los cdigos de operacin apropiados
para el coprocesador as como la instruccin y la direccin del operando necesario.
Ejemplo:
ESC

21, AX

HLT (Parada hasta interrupcin o reset).


Sintaxis:

HLT

Indicadores:

OF DF IF TF SF ZF AF PF CF
- - - - - - -

El procesador se detiene hasta que se restaura el sistema o se recibe una


interrupcin. Como en los PC se producen normalmente 18,2 interrupciones de
tipo 8 por segundo (del temporizador) algunos programadores utilizan HLT para
hacer pausas y bucles de retardo. Sin embargo, el mtodo no es preciso y puede
fallar con ciertos controladores de memoria.

M. D. O. H. Sonia Alvarado Mares

108

Lenguaje Ensamblador
LOCK (Bloquea los buses).
Sintaxis:

LOCK

Indicadores:

OF DF IF TF SF ZF AF PF CF
-

Es una instruccin que se utiliza en aplicaciones de recursos compartidos para


asegurar que no accede simultneamente a la memoria ms de un procesador.
Cuando una instruccin va precedida por LOCK, el procesador bloquea
inmediatamente el bus, introduciendo una seal por la patilla LOCK.
WAIT (Espera).
Sintaxis:

WAIT

Indicadores:

OF DF IF TF SF ZF AF PF CF
- - - - - - - -

Provoca la espera del procesador hasta que se detecta una seal en la patilla TEST.
Ocurre, por ejemplo, cuando el coprocesador ha terminado una operacin e indica su
finalizacin. Suele preceder a ESC para sincronizar las acciones del procesador y
coprocesador.

M. D. O. H. Sonia Alvarado Mares

109

Lenguaje Ensamblador
2.6.1 Banderas.
LAHF (Carga AH con los indicadores).
Sintaxis:

LAHF

Indicadores:

OF DF IF TF SF ZF AF PF CF
- - - - - - - -

Carga los bits 7, 6, 4, 2 y 0 del registro AH con el contenido de los indicadores SF,
ZF, AF, PF Y CF respectivamente. El contenido de los dems bits queda sin
definir.
SAHF (copia AH en los indicadores)
Sintaxis:

SAHF

Indicadores:

OF DF IF TF SF ZF AF PF CF
- - - - x x x x x

Transfiere el contenido de los bits 7, 6, 4, 2 y 0 a los indicadores SF, ZF, AF, PF y CF


respectivamente.

CLC (Baja el indicador de acarreo).


Sintaxis:
Indicadores:

CLC
OF DF IF TF SF ZF AF PF CF
- - - - - 0

Borra el indicador de acarreo (CF) sin afectar a ninguno otro.

CLD (Baja el indicador de direccin).


Sintaxis:
Indicadores:

CLD
OF DF IF TF SF ZF AF PF CF
- 0 - - - - - -

Pone a 0 el indicador de direccin DF, por lo que los registros SI y/o DI se


autoincrementan en las operaciones de cadenas, sin afectar al resto de los indicadores.
Es NECESARIO colocarlo antes de las instrucciones de manejo de cadenas si no se
conoce con seguridad el valor de DF. Vase STD.

M. D. O. H. Sonia Alvarado Mares

110

Lenguaje Ensamblador
CLI (Baja indicador de interrupcin).
Sintaxis:

CLI

Indicadores:

OF DF IF TF SF ZF AF PF CF
- - 0 - - - - -

Borra el indicador de activacin de interrupciones IF, lo que desactiva las interrupciones


enmascarables. Es muy conveniente hacer esto antes de modificar la pareja SS:SP en los
8086/88 anteriores a 1983 (vase comentario en la instruccin MOV), o antes de cambiar
un vector de interrupcin sin el apoyo del DOS. Generalmente las interrupciones slo se
inhiben por breves instantes en momentos crticos. Vase tambin STI.

CMC (Complementa el indicador de acarreo).


Sintaxis:

CMC

Indicadores:

OF DF IF TF SF ZF AF PF CF
- - - - - - - x

Complementa el indicador de acarreo CF invirtiendo su estado.

STC (Pone a uno el indicador de acarreo).


Sintaxis:

STC

Indicadores:

OF DF IF TF SF ZF AF PF CF
- - - - - - 1

Pone a 1 el indicador de acarreo CF sin afectar a ningn otro indicador.

STD (Pone a uno el indicador de direccin).


Sintaxis:

STD

Indicadores:

OF DF IF TF SF ZF AF PF CF
- 1 - - - - - -

Pone a 1 el indicador de direccin DF, por lo que los registros SI y/o DI se


autodecrementan en las operaciones de cadenas, sin afectar al resto de los indicadores.
Es NECESARIO colocarlo antes de las instrucciones de manejo de cadenas si no se
conoce con seguridad el estado de DF. Vase tambin CLD.

M. D. O. H. Sonia Alvarado Mares

111

Lenguaje Ensamblador
STI (Pone a uno el indicador de interrupcin).
Sintaxis:

STI

Indicadores:

OF DF IF TF SF ZF AF PF CF
- - 1 - - - - -

Pone a 1 la bandera de desactivacin de interrupciones IF y activa las interrupciones


enmascarables. Una interrupcin pendiente no es reconocida, sin embargo, hasta
despus de ejecutar la instruccin que sigue a STI. Vase tambin CLI.

INT (Interrupcin).
Sintaxis:

INT n (0 <= n <= 255)

Indicadores:

OF DF IF TF SF ZF AF PF CF
- - 0 0 - - - -

Inicializa un procedimiento de interrupcin de un tipo indicado en la instruccin. En la pila


se introduce al llamar a una interrupcin la direccin de retorno formada por los registros
CS e IP y el estado de los indicadores. INT 3 es un caso especial de INT, al ensamblarla
el ensamblador genera un slo byte en vez de los dos habituales; esta interrupcin se
utiliza para poner puntos de ruptura en los programas. Vase tambin IRET y el apartado
1 del captulo VII.
Ejemplo:
INT

21H

INTO (Interrupcin por desbordamiento).


Sintaxis:

INTO

Indicadores:

OF DF IF TF SF ZF AF PF CF
- - 0 0 - - -

Genera una interrupcin de tipo 4 (INT 4) si existe desbordamiento (OF=1). De lo contrario


se contina con la instruccin siguiente.

IRET (Retorno de interrupcin.)


Sintaxis:

IRET

Indicadores:

OF DF IF TF SF ZF AF PF CF
x x x x x x x x x

Devuelve el control a la direccin de retorno salvada en la pila por una interrupcin previa
y restaura los indicadores que tambin se introdujeron en la pila. En total, se sacan las 3
palabras que fueron colocadas en la pila cuando se produjo la interrupcin.

M. D. O. H. Sonia Alvarado Mares

112

Lenguaje Ensamblador
2.6.2

Cadenas.

CMPS/CMPSB/CMPSW (Compara cadenas).


Sintaxis:

CMPS cadena_destino, cadena_origen


CMPSB (bytes)
CMPSW (palabras)

Indicadores:

OF DF IF TF SF ZF AF PF CF
x - - - x x x x x

Compara dos cadenas restando al origen el destino. Ninguno de los operandos se alteran,
pero los indicadores resultan afectados. La cadena origen se direcciona con registro SI
sobre el segmento de datos DS y la cadena destino se direcciona con el registro DI sobre
el segmento extra ES. Los registros DI y SI se autoincrementan o autodecrementan segn
el valor del indicador DF (vanse CLD y STD) en una o dos unidades, dependiendo de si
se trabaja con bytes o con palabras. Cadena origen y cadena destino son dos operandos
redundantes que slo indican el tipo del dato (byte o palabra) a comparar, es ms cmodo
colocar CMPSB o CMPSW para indicar bytes/palabras. Si se indica un registro de
segmento, ste sustituir en la cadena origen al DS ordinario.
Ejemplo:
LEA SI, ORIGEN
LEA DI, DESTINO
CMPSB

LODS/LODSB/LODSW (Cargar cadena).


Sintaxis:

LODS
cadena_origen
LODSB (bytes)
LODSW (palabras)
Indicadores:
OF DF IF TF SF ZF AF PF CF
- - - - - - - - Copia en AL o AX una cadena de longitud byte o palabra direccionada sobre el segmento
de datos (DS) con el registro SI. Tras la transferencia, SI se incrementa o decrementa
segn el indicador DF (vanse CLD y STD) en una o dos unidades, segn se estn
manejando bytes o palabras. Cadena_origen es un operando redundante que slo indica
el tipo del dato (byte o palabra) a cargar, es ms cmodo colocar LODSB o LODSW para
indicar bytes/palabras.
Ejemplo:
CLD
LEA SI, ORIGEN
LODSB

M. D. O. H. Sonia Alvarado Mares

113

Lenguaje Ensamblador
MOVS/MOVSB/MOVSW (Mover cadena).
Sintaxis:

MOVS cadena_destino, cadena_origen


MOVSB (bytes)
MOVSW (palabras)

Indicadores:

OF DF IF TF SF ZF AF PF CF
- - - - - - -

Transfiere un byte o una palabra de la cadena origen direccionada por DS:SI a la cadena
destino direccionada por ES:DI, incrementando o decrementando a continuacin los
registros SI y DI segn el valor de DF (vanse CLD y STD) en una o dos unidades,
dependiendo de si se trabaja con bytes o con palabras. Cadena origen y cadena destino
son dos operandos redundantes que slo indican el tipo del dato (byte o palabra) a
comparar, es ms cmodo colocar MOVSB o MOVSW para indicar bytes/palabras. Si se
indica un registro de segmento, ste sustituir en la cadena origen al DS ordinario.
Ejemplo:
LEA SI, ORIGEN
LEA DI, DESTINO
MOVSW

SCAS/SCASB/SCASW (Explorar cadena).


Sintaxis:

SCAS
cadena_destino
SCASB (bytes)
SCASW (palabras)

Indicadores:

OF DF IF TF SF ZF AF PF CF
x
- - - x x x x x

Resta de AX o AL una cadena destino direccionada por el registro DI sobre el segmento


extra. Ninguno de los valores es alterado pero los indicadores se ven afectados. DI se
incrementa o decrementa segn el valor de DF (vanse CLD y STD) en una o dos
unidades -segn se est trabajando con bytes o palabras- para apuntar al siguiente
elemento de la cadena. Cadena_destino es un operando redundante que slo indica el
tipo del dato (byte o palabra), es ms cmodo colocar SCASB o SCASW para indicar
bytes/palabras.
Ejemplo:
LEA
DI, DESTINO
MOV
AL, 50
SCASB

M. D. O. H. Sonia Alvarado Mares

114

Lenguaje Ensamblador
STOS/STOSB/STOSW (Almacena cadena).
Sintaxis:
Indicadores:

STOS
cadena_destino
STOSB (bytes)
STOSW (palabras)
OF DF IF TF SF ZF AF PF CF
- - - - - - -

Transfiere el operando origen almacenado en AX o AL, al destino direccionado por el


registro DI sobre el segmento extra. Tras la operacin, DI se incrementa o decrementa
segn el indicador DF (vanse CLD y STD) para apuntar al siguiente elemento de la
cadena. Cadena_destino es un operando redundante que slo indica el tipo del dato (byte
o palabra) a cargar, es ms cmodo colocar STOSB o STOSW para indicar
bytes/palabras.
Ejemplo:
LEA
DI, DESTINO
MOV AX, 1991
STOSW

REP/REPE/REPZ/REPNE/REPNZ (Repetir).
REP
repetir operacin de cadena
REPE/REPZ
repetir operacin de cadena si igual/si cero
REPNE/REPNZ
repetir operacin de cadena si no igual (si no 0)
Estas instrucciones se pueden colocar como prefijo de otra instruccin de manejo de
cadenas, con objeto de que la misma se repita un nmero determinado de veces
incondicionalmente o hasta que se verifique alguna condicin. El nmero de veces se
indica en CX. Por sentido comn slo deben utilizarse las siguientes combinaciones:
Prefijo
-------------------REP
REPE/REPZ
REPNE/REPNZ

Funcin
------------------------------------------Repetir CX veces
Repetir CX veces mientras ZF=1
Repetir CX veces mientras ZF=0

Instrucciones
-----------------MOVS, STOS
CMPS, SCAS
CMPS, SCAS

Ejemplos:
1) Buscar el byte 69 entre las 200 primeras posiciones de tabla (se supone tabla en el
segmento ES):
LEA
MOV
MOV

DI, tabla
CX, 200
AL, 69

CLD
REPNE
JE

SCASB
ENCONTRADO

M. D. O. H. Sonia Alvarado Mares

115

Lenguaje Ensamblador
2) Rellenar de ceros 5000 bytes de una tabla colocada en datos (se supone datos en
el segmento ES):
LEA
MOV
MOV
CLD
REP

DI, DATOS
AX, 0
CX, 2500
STOSW

3) Copiar la memoria de pantalla de texto (adaptador de color) de un PC en un buffer


(se supone buffer en el segmento ES):
MOV
MOV
LEA
MOV
MOV
CLD
REP

CX,0B800h
DS,CX
DI,buffer
SI,0
CX,2000
MOVSW

; segmento de pantalla
; en DS
;destino en ES:DI
; copiar desde DS:0
; 2000 palabras
; hacia adelante
; copiar CX palabras

M. D. O. H. Sonia Alvarado Mares

116

Lenguaje Ensamblador
RESUMEN ALFABTICO DE LAS INSTRUCCIONES Y BANDERINES.
Nota: en el efecto de las instrucciones sobre el registro de estado se utilizar la siguiente
notacin:
- bit no modificado
? desconocido o indefinido
x modificado segn el resultado de la operacin
1 puesto siempre a 1
0 puesto siempre a 0
Instruccin
----------------

Sintaxis
---------------------

AAA
AAD
AAM
AAS
ADC dst,fnt
ADD dst,fnt
AND dst,fnt
CALL dsp
CBW
CLC
CLD
CLI
CMC
CMP dst,fnt
CMPS/CMPSB
CMPSW cdst,cfnt
CWD
DAA
DAS
DEC dst
DIV fnt
ESC opcode,fnt
HLT
IDIV fnt
IMUL fnt
IN acum,port
INC dst
INT interrup
INTO
IRET
Jcc (JA, JBE...)
JMP
JCXZ dsp
LAHF
LDS dst,fnt
LEA dst,fnt
LES dst,fnt
LOCK
LODS/LODSB/
LODSW cfnt

AAA
AAD
AAM
AAS
ADC
ADD
AND
CALL
CBW
CLC
CLD
CLI
CMC
CMP

dst,fnt
dst,fnt
dst,fnt
dsp

dst,fnt

CMPS
CWD
DAA
DAS
DEC
DIV
ESC
HLT
IDIV
IMUL
IN
INC
INT
INTO
IRET
Jcc
JMP
JCXZ
LAHF
LDS
LEA
LES
LOCK

cdst,cfnt

LODS

mem

dst
dst
opcode,fnt
fnt
fnt
acum,port
dst
interrup
dsp
dsp
dsp
dst,fnt
dst,fnt
dst,fnt

Efecto sobre los flags


-------------------------OF DF IF TF SF ZF AF PF CF
? - - - ? ? x ? x
? - - - x x ? x ?
? - - - x x ? x ?
? - - - ? ? x ? x
x - - - x x x x x
x - - - x x x x x
0 - - - x x ? x 0
- - - - - - - - - - - - - - - - - - - - - - - - 0
- 0 - - - - - - - - 0 - - - - - - - - - - - - - x
x - - - x x x x x
x
?
x
?
?
x
x
x
-

x
-

0
0
x
-

0
0
x
-

x
x
x
x
?
?
?
x
x
-

x
x
x
x
?
?
?
x
x
-

x
x
x
x
?
?
?
x
x
-

x
x
x
x
?
?
?
x
x
-

x
x
x
?
?
x
x
-

M. D. O. H. Sonia Alvarado Mares

117

Lenguaje Ensamblador
Instruccin
----------------

Sintaxis
---------------------

LOOP
LOOPcc (LOOPE...)
MOV dst,fnt
MOVS/MOVSB/
MOVSW cdst,cfnt
MUL fnt
NEG dst
NOP
NOT dst
OR dst,fnt
OUT port,acum
POP dst
POPF
PUSH dst
PUSHF
RCL dst,cnt
RCR dst,cnt
REP/REPE/REPZ/
REPNE/REPNZ
RET [val]
RETF [val]
ROL dst,cnt
ROR dst,cnt
SAHF
SAL/SHL dst,cnt
SAR dst,cnt
SBB dst,fnt
SCAS/SCASB/
SCASW cdst
SHR dst,cnt
STC
STD
STI
STOS/STOSB/
STOSW cdst
SUB dst,fnt
TEST dst,fnt
WAIT
XCHG dst,fnt
XLAT tfnt
XOR dst,fnt

LOOP
dsp
LOOPcc dsp
MOV
dst,fnt

MOVS
MUL
NEG
NOP
NOT
OR
OUT
POP
POPF
PUSH
PUSHF
RCL
RCR

x
x
0
x
x
x

x
-

x
-

x
-

?
x
x
x
-

?
x
x
x
-

?
x
?
x
-

?
x
x
x
-

x
x
0
x
x
x

x
x
x
x
x

x
x
x
x

x
x
x
x

x
?
?
x

x
x
x
x

x
x
x
x
x
x

REP
RET
RETF
ROL
ROR
SAHF
SAL
SAR
SBB

cdst,cfnt
fnt
fnt
dst
dst,fnt
port,acum
dst
dst
dst,cnt
dst,cnt
[val]
[val]
dst,cnt
dst,cnt
dst,cnt
dst,cnt
dst,fnt

Efecto sobre los flags


--------------------------

SCAS
SHR
STC
STD
STI

cdst
dst,cnt

x
x
-

1
-

x
x
-

x
x
-

x
?
-

x
x
-

x
x
1
-

STOS
SUB
TEST
WAIT
XCHG
XLAT
XOR

cdst
dst,fnt
dst,fnt

x
0
0

x
x
x

x
x
x

x
?
?

x
x
x

x
0
0

dst,fnt
tfnt
dst,fnt

M. D. O. H. Sonia Alvarado Mares

118

S-ar putea să vă placă și