You are on page 1of 56

1

EL LENGUAJE ENSAMBLADOR
EL LENGUAJE ENSAMBLADOR ES UNA VARIANTE, LEGIBLE PARA EL
SER HUMANO, DEL LENGUAJE DE MAQUINA QUE USAN LAS
COMPUTADORAS PARA EJECUTAR PROGRAMAS. AL MISMO TIEMPO ES LA
MEJOR FORMA QUE SE TIENE PARA COMINICARSE CON LA PC Y CON EL
LENGUAJE DE PROGRAMACION QUE UTILICE.
SI ANTES DE ENTRAR AL ESTUDIO DEL HARDWARE SE ANALIZA LO QUE
ES EL ENSAMBLADOR, SE TENDRA UN PANORAMA MAS AMPLIO DE CMO
FUNCIONA LA PC. ESTE LENGUAJE PROPORCIONA LA FACILIDAD Y LAS
HERRAMIENTAS NECESARIAS PARA TOMAR EL CONTROL DE TODO LO
QUE LA PC PUEDE REALIZAR FISICAMENTE.

EL LENGUAJE ENSAMBLADOR RESULTA


INDISPENSABLE:

CUANDO SE DESEA ESCRIBIR PROGRAMAS QUE CONTROLEN LA


E/S DE LA PC.

CUANDO SE DESEA AGREGAR NUEVAS INTERFACES DE E/S.

PARA ESCRIBIR RUTINAS OPTIMIZADAS DE UN PROCEDIMIENTO


EN ESPECIAL

PARA ESCRIBIR RUTINAS QUE APROVECHEN Y MAXIMICEN EL


USO DEL HARDWARE

EN GENERAL PARA REALIZAR CUALQUIER TAREA QUE NO


PUEDAN LLEVAR
PROGRAMACION.

CABO

LOS

DEMAS

LENGUAJES

DE

VENTAJAS DEL LENGUAJE ENSAMBLADOR


SI NUNCA HA TRABAJADO CON EL LENGUAJE ENSAMBLADOR, SE
PREGUNTARA POR QU NO USAR OTRO LENGUAJE DE LOS QUE
ACTUALMENTE EXISTEN EN AUGE Y OFRECEN INTERFACES AMIGABLES
DE DESARROLLO ?.
EXISTEN VARIAS RAZONES QUE JUSTIFICAN EL USO DEL ENSAMBLADOR
EN LUGAR DE OTROS LENGUAJES.

RAZN

VENTAJA

EL ENSAMBLADOR BRINDA LA OPORTUNIDAD DE CONOCER


MS A FONDO LA OPERACIN DE LA PC. ESTO PERMITE
IMPLEMENTAR SOFTWARE O HARDWARE DE UNA FORMA
MS CONCIENTE (COMPRENDIENDO CMO Y POR QU LO
HACE), EN LUGAR DE SEGUIR UNA RECETA FIJA.

SE CONSERVA EL CONTROL TOTAL DE LO QUE DEBERA


HACER LA PC, SIEMPRE Y CUANDO ESTA SEA FISICAMENTE
CAPAZ DE HACERLO.

LOS PROGRAMAS EN ENSAMBLADOR SON MS RPIDOS,


MS COMPACTOS Y TIENEN MAYOR CAPACIDAD QUE LOS
CREADOS EN OTROS LENGUAJES.

SE PUEDEN OPTIMIZAR AL MAXIMO LOS PROGRAMAS


( TANTO EN TAMAO COMO EN VELOCIDAD DE EJECUCIN).
EN EL CASO DE OTROS LENGUAJES YA EXISTE CODIGO QUE
SE GENERA DE FORMA PREDEFINIDA, HACIENDO MY
DIFICIL SU OPTIMIZACION.

LA SIGUIENTE TABLA PRESENTA EL TAMAO DE ALGUNOS PROGRAMAS QUE SE


REALIZARON EN TRES DIFERENTES LENGUAJES:
LENGUAJE

FUENTE

OBJETO

EJECUTABLE
(.EXE)

V. BASIC

27 Bytes

651 Bytes

12,814 Bytes

V.FOX

22 Bytes

572 Bytes

158,178 Bytes

ENSAMBLADOR

162 Bytes

169 Bytes

543 Bytes

LA CANTIDAD DE BYTES DE LOS ARCHIVOS EJECUTABLES SIEMPRE ES MAYOR QUE LA DE LOS


PROGRAMAS "FUENTE". OBSERVESE CMO EN EL CASO DEL ENSAMBLADOR NO CRECE DEMASIADO.

EL SIGUIENTE PROGAMA DE EJEMPLO DESPLEGARA LA CADENA:


"HOLA QUE TAL !."

Programa
:
===============================================
==============
.mode1 small
;Define el modelo de memoria
.data
.mens db hola que tal !.$
;la cadena que se desplegara
.stack
;Define el area de la pila (stack)
.code
;Comienza el cdigo
.EMP:
;Etiqueta el comienzo
mov ax, @data
;Permite acceso a datos
mov ds,ax
;a travs de ds
mov dx, offset mens
;Prepara para desplegar
mov ah,9
;Invoca la funcin 9 de
int 21h
;la int 21 para desplegar
mov ah,4ch
;Invoca la funcin 4ch de
int 21h
;la int 21 para terminar
end EMP
;cierra etiqueta de comienzo
===============================================
======================

AHORA QUE SE HA VISTO LA DIFERENCIA ENTRE LENGUAJES,


TAMBIEN ES JUSTO SEALAR LOS PROBLEMAS QUE SE TIENEN AL
TRABAJAR CON EL LENGUAJE ENSAMBLADOR:
DESVENTAJ
A

UNA INSTRUCCIN MAL INTERPRETADA O UN ERROR DE


LGICA EN EL PROGRMA PUEDEN CREAR UN CAOS, A
TAL GRADO QUE SERA NECESARIO APAGAR Y ENCENDER
DE NUEVO LA PC.

LA INSUFICIENCIA DE CONOCIMIENTOS SOBRE EL


FUNCIONAMIENTO INTERNO DE LA PC PUEDE CAUSAR
EFECTOS IMPREDECIBLES.

ES NECESARIO AJUSTARSE A UNA


RESPECTO AL USO DE INTERRUPCIONES.

DEBE TENERSE PRESENTE QUE EL PROGRAMA PUEDE


VOLVERSE MS COMPLEJO CONFORME SE LE AGREGAN
RUTINAS O FUNCIONES ADICIONALES.

CONVENCIN

ARQUITECTURA DE UNA COMPUTADORA


UNA COMPUTADORA NO ES OTRA COSA QUE UN DISPOSITIVO QUE
MUVE DATOS DE
UN LUGAR A OTRO, ALGUNAS VECES,
TRANSFORMANDOLOS EN VARIAS FORMAS ARITMETICAS Y LOGICAS.

ES MUY TIL VER A UNA COMPUTADORA COMO


CONSISTENTE DE CINCO SUBSISTEMAS FUNCIONALES:
1.
2.
3.
4.
5.

ENTRADA
CONTROL
ARITMETICA Y LOGICA
MEMORIA
SALIDA

SUBSITEMA DE
ARITMETICA

CPU

(SUMA, RESTA,
MULTIPLICACION, DIVISION,
AND, OR, OR-EXCLUSIVO,
ETC.)

SUBSITEMA DE
ENTRADA
(TECLADO, MOUSE,
DISCO, JOYSTICK.)

SUBSITEMA DE
CONTROL
(COORDINA TODO)

SUBSITEMA DE
MEMORIA
(HASTA 1 MB DE RAM Y/O
ROM)

SUBSITEMA DE
SALIDA
(PANTALLA,
IMPRESORA, PLOTTER,
DISCO, ETC.)

UN

SISTEMA

EN EL SUBSITEMA DE ARITMTICA, ES DONDE SE REALIZAN LAS


OPERACIONES ARITMTICAS Y LGICAS, DESPUS DE EJECUTAR DICHAS
OPERACIONES, ESTE SUBSISTEMA REQUIERE UN LUGAR DONDE
GUARDAR LOS RESULTADOS, Y AQU ES DONDE ENTRA EN JUEGO EL
SUBSISTEMA
DE
MEMORIA
DE
LA
COMPUTADORA,
DANDO
INSTANTANEAMENTE ALMACENAMIENTO ACCESIBLE PARA MUCHOS
CIENTOS DE CARACTERES O NMEROS. LAS COMPUTADORAS TAMBIEN
TIENEN MANEJADORES DE DISCO DURO QUE ES EL ALMACENAMIENTO
PERMANENTE PARA GRANDES CANTIDADES DE DATOS, ESTOS SON
DISPOSITIVOS DE I/O NO PARTE DEL SUBSITEMA DE MEMORIA.
EL SUBSISTEMA DE ENTRADA PERMITE A LOS PROGRAMAS
MANIPULAR DATOS DEL MUNDO EXTERIOR QUE VAN DESDE SIMPLES
TECLASOS O MOVIMIENTOS DEL MOUSE, HASTA BASES DE DATOS
ALMACENADAS EN DISCO.
EL SUBSISTEMA DE SALIDA, PERMITE A LOS PROGRAMAS
DESPLEGAR LOS RESULTADOS EN LA PANTALLA E IMPRESORA,Y MANDAR
DATOS A LOS ARCHIVOS DE DISCO.
FINALMENTE, EL SUBSISTEMA DE CONTROL, MANEJA Y COORDINA
JUNTAS LAS OPERACIONES DE LOS OTROS CUATRO SUBSISTEMAS.
EL SUBSISTEMA DE CONTROL Y EL DE ARITMETICA EN CONJUNTO,
FORMAN LO QUE SE CONOCE COMO LA UNIDAD DE PROCESAMIENTO O
PROCESADOR. UN PROCESADOR ES EL QUE ESTA DENTRO DE
CUALQUIER COMPUTADORA, PROVEE PROCESAMIENTO DE DATOS Y EL
CONTROL DE LOS SUBSISTEMAS DE MEMORIA, ENTRADA Y SALIDA.

MEMORIA
EL PROCESADOR ES CAPZ DE DIRECCIONAR 1 MB DE MEMORA A
UN TIEMPO ( I MB ES 220 1,048,576 LOCALIDADES DE
ALMACENAMIENTO CADA UNA DE 8 BITS DE LONGITUD) . EL PRIMER
BYTE DE MEMORIA EST EN LA DIRECCION 0 Y EL LTIMO EN LA
DIRECCIN 0FFFFF QUE SE ENCUENTRA EN NOTACIN HEXADECIMAL,
O SEA 1,048,575 BASE 10.

UN BYTE (8 BITS) PUEDE CONTENER UN CARACTER O UN VALOR ENTERO


EN EL RANGO 0 A 255. ESTO NO QUIERE DECIR QUE EL PROCESADOR
NO PUEDA MANEJAR VALORES MS GRANDES. 2 BYTES TOMADOS
JUNTOS ( PALABRA) PUEDEN MANEJAR UN VALOR ENTERO EN EL RANGO
DE 0 A 65,535, 4 BYTES TOMADOS JUNTOS (DOBLE PALABRA) PUEDEN
MANEJAR UN VALOR ENTERO EN EL RANGO DE 0 A 4,294,967,295
PUEDE MANEJAR UN VALOR DE PUNTO FLOTANTE DE SIMPLE PRECISIN.

8 BYTES JUNTOS (CUADRUPLE PALABRA) PUEDEN MANEJAR UN VALOR DE


PUNTO FLOTANTE DE DOBLE PRECISION.

REGISTROS
EL PROCESADOR OFRECE UNOS RPIDOS ELEMENTOS
ALMACENAMIENTO EN UN CHIP, CONOCIDOS COMO REGISTROS.

DE

LOS REGISTROS SON LAS LOCALIDADES DE MEMORIA QUE EL


PROCESADOR PUEDE ACCESAR MS RPIDO QUE COMO LO HACE CON
LA MEMORIA REGULAR, ESTO ES SOLO PARTE DE LO QUE HACEN ESTOS
REGISTROS ESPECIALES. CADA UNO DE LOS REGISTROS TIENE UNA
NATURALEZA NICA Y PROVEE CIERTAS CAPACIDADES QUE NO
SOPORTAN OTROS REGISTROS O LOCALIZACIONES DE MEMORIA.
LOS REGISTROS SE DIVIDEN EN CUATRO CATEGORIAS:
CATEGOR
A

1
2
3
4

DESCRIPCIN

LOS REGISTROS DE BANDERA


LOS REGISTROS DE PROPSITO GENERAL
EL APUNTADOR DE INSTRUCCIONES
LOS REGISTROS DE SEGMENTO

EL REGISTRO DE BANDERAS
EL REGISTRO DE BANDERA DE 16 BITS CONTIENE TODA LA
INFORMACION PERTINENTE ACERCA DEL ESTADO DEL PROCESADOR Y
DEL RESULTADO DE LAS RECIENTES INSTRUCCIONES.

POR EJEMPLO, SI DESEA SABER CUNDO UNA RESTA PRODUCE UN


RESULTADO DE CERO, SE PUEDE CHECAR LA BANDERA CERO (ZERO
FLAG) -EL BIT Z EN EL REGSTRO BANDERA- INMEDIATAMENTE DESPUES
DE LA INSTRUCCION, SI EST ACTIVADA, SE PODR SABER QUE EL
RESULTADO FUE CERO. OTRAS BANDERAS, COMO LA DE ACARREO
(CARRY) Y DESBORDAMIENTO (OVERFLOW), REPORTAN RESULTADOS
SIMILARES DE LAS OPERACIONES DE ARITMTICA Y LGICA.
OTRAS BANDERAS CONTROLAN LOS MODOS DE OPERACION DE
PROCESADOR. LA BANDERA DE DIRECCION (DIRECTION) CONTROLA LA
DIRECCION EN LA CUAL SE MUEVE LA CADEA DE INSTRUCCIONES, Y LA
BANDERA DE INTERRUPCION (INTERRUPT) CONTROLA DONDE SE
ENCUENTRA EL HARDWARE EXTERNO (TECLADO, MODEM, ETC.) PARA
DETENER TEMPORALMENTE EL CODIGO EN CURSO, PARA QUE LAS
NECESIDADES URGENTES PUEDAN SER ATENDIDAS.
EL REGISTRO DE BANDERAS NO PUEDE SER MODIFICADO O LEIDO
DIRECTAMENTE, ESTE REGISTRO GENERALMENTE ES CONTROLADO POR

10

MEDIO DE INSTRUCCIONES ARITMTICAS Y LGICAS QUE MODIFICAN


CIERTAS BANDERAS; EL CONTENIDO DE CIERTOS BITS DEL REGISTRO DE
BANDERAS AFECTA LA OPERACION DE INSTRUCCIONES COMO JZ, RCR Y
MOVS.
ESTADO DE LAS BANDERAS:
Estado
DESACTIVA
DA
ACTIVADA

Estado
DESACTIVA
DA
ACTIVADA

Overflow
(O)

Direction
(D)

Interrupt (I)

Sign (S)

Zero (Z)

NV

UP

DI

PL

NZ

OV

DN

EI

NG

ZR

Auxiliary
(A)

Parity (P)

Carry (C)

NA

PO

NC

AC

PE

CY

Overflow
Direction
Interrupts
Sign
Zero
Auxiliary Carry
Parity
Carry

NV = no hay desbordamiento
OV = S lo hay
UP = hacia adelante
DN = hacia atrs
DI = desactivadas
EI = activadas
PL = positivo
NG = negativo
NZ = no es cero
ZR = s lo es
NA = no hay acarreo auxiliar
AC = hay acarreo auxiliar
PO = paridad non
PE = paridad par
NC = no hay acarreo
CY = s lo hay

El registro de banderas es un registro de 16 bits, pero no todos los bits se usan.

11

Contiene 9 banderas. Tres banderas de control TF, DF, IF y seis banderas de status
CF, PF, AF, ZF, SF, OF.

Estas 6 ltimas banderas representan el resultado de una operacin aritmtica


o lgica. Permiten al programa alterar el curso de ejecucin basado en los valores
lgicos que almacenan

AF Llevar auxiliar = 1, indica que hubo llevar del nibble (4 bits) 0 al nibble 1. O
un pedir prstamo del nibble alto al nibble bajo.

CF Llevar = 1, cuando ha ocurrido un llevar o pedir prstamo del resultado (8


o 16 bits)
OF Sobreflujo = 1, indica que ha ocurrido un sobreflujo aritmtico. Esto significa
que el tamao del resultado excede la capacidad de ALMACENAMIENTO del destino
y el dgito significativo se perdi.
SF Signo. Esta bandera se activa cuando el bit ms significativo del resultado es 1.
Ya que los nmeros binarios negativos son representados usando notacin C2, SF
refleja el signo del resultado:
0 indica +
1 indica
PF Paridad. Cuando esta bandera est activa, el resultado de la operacin tiene un
nmero par de unos. Esta bandera se usa para verificar errores en la transmisin.
ZF Cero. Esta bandera se activa cuando el resultado de la operacin es cero. Las
tres banderas de control sern discutidas despus durante el curso
DF = bandera de direccin , SELECCINA EL MODO DE INCREMENTO O
DECREMENTO PARA LOS REGISTROS DI y SI cuando se utilizan instrucciones
de cadena 1= registros de decrementan . (derecha izquierda)
0= registros se incrementan.,
IF = bandera de interrupcin
TF = bandera de trampa

12

OS REGISTROS DE
PROPSITO GENERAL

LOS OCHO REGISTROS DE PROPOSITO GENERAL DEL PROCESADOR


(CADA UNO DE 16 BITS DE LONGITUD) ESTAN INVOLUCRADOS EN LA
OPERACIN DE MUCHAS INSTRUCCIONES, COMO FUENTE Y DESTINO DE
CALCULOS Y MOVIMIENTO DE DATOS, COMO APUNTADORES A LA
MEMORIA Y COMO CONTADORES; CADA UNO DE ESTOS REGISTROS
PUEDE ALMACENAR VALORES DE 16 BITS QUE PUEDEN SER CARGADOS
A LA MEMORIA Y DESDE ELLA, Y TAMBIEN PUEDEN SER USADOS EN
OPERACIONES DE ARITMTICA Y LGICA, POR EJEMPLO :

MOV AX,5
MOV DX,9
ADD AX,DX
t

CARGA EL VALOR 5 EN AX, EL 9 EN DX Y SUMA LOS DOS


VALORES ALMACENANDO EL RESULTADO EN EL REGISTRO AX.
CX, SI O CUALQUIERA DE LOS OTROS REGISTROS DE
PROPOSITO GENERAL, PUEDEN SER SUSTITUIDOS ( EN ESTE
EJEMPLO) POR AX O DX Y SE OBTENDRAN IGUALES
RESULTADOS.

EL REGISTRO AX

13

EL REGISTRO AX, ES TAMBIEN CONOCIDO COMO EL ACUMULADOR,


ESTE REGISTRO SE UTILIZA CUANDO SE REALIZAN MULTIPLICACIONES Y
DIVISIONES Y ES EL REGISTRO MS EFICIENTE PARA USARSE EN
ALGUNAS OPERACIONES ARITMETICAS, LOGICAS Y DE MOVIMIENTO DE
DATOS.
LOS 8 BITS BAJOS DEL REGISTRO AX SON CONOCIDOS COMO EL
REGISTRO AL Y LOS 8 BITS ALTOS COMO EL REGISTRO AH.
LOS REGISTROS BX, CX Y DX PUEDEN SER TRATADOS, CADA UNO,
COMO DOS REGISTROS DE 8 BITS. (PARTE ALTA ?H) (Y PARTE BAJA ?L).
MOV AH,7
MOV AL,AH
INC AL

PONE AH EN 7, COPIA EL VALOR A AL Y LE SUMA UNO A AL, EL


RESULTADO FINAL ES AX = 7u 100-.
LOS REGISTROS BX, CX Y DX PUEDEN SERVIR EN FORMA
SIMILAR AL EJEMPLO ANTERIOR.

EL REGISTRO BX
EL REGISTRO BX PUEDE APUNTAR A LOCALIZACIONES DE
MEMORIA, UN VALOR DE 16 BITS ALMACENADO EN BX PUEDE SER
USADO COMO PARTE DE LA DIRECCION DE UNA LOCALIDAD DE
MEMORIA PARA SU ACCESO,

MOV
MOV
MOV
MOV

AX,200
DS,AX
BX,9
AL, [BX]

CARGA AL CON EL CONTENIDO DE LA


DIRECCIN DE MEMORIA 9.

CUANDO BX ES USADO COMO UN APUNTADOR DE MEMORIA, ESTE


HACE UNA RELACION AL REGISTRO DE SEGMENTO DS.

14

EL REGISTRO CX
EL REGISTRO CX ESPECIALMENTE ES UN CONTADOR. EN EL
SIGUIENTE EJEMPLO SE DESEA REPETIR UN BLOQUE DE INSTRUCCIONES
10 VECES, ESTO SE LOGRA CON :

MOV
CX,10
INICIO_DEL_CICLO:
<<INSTRUCCIONES A
REPETIR>>
SUB ENTRE
CX,1
LAS INSTRUCCIONES
LA ETIQUETA

INICIO_DEL_CICLO Y LA
INSTRUCCION JNZ, SON EJECUTADAS REPETIDAMENTE HASTA QUE CX SE
HACE CERO. NOTESE QUE DOS INSTRUCCIONES - SUB CX,1 Y JNZ
INICIO_DEL_CICLO - SON REQUERIDAS EN ORDEN PARA DECREMENTAR
CX Y REGRESAR A INICIO_DEL_CICLO SI CX AUN NO ES CERO.
DECREMENTAR Y REGRESAR AL INICIO DEL CICLO ES USADO
FRECUENTEMENTE, POR LO QUE SE PUEDE UTILIZAR UNA INSTRUCCION
ESPECIAL MS COMPACTA Y CON RESULTADOS MS RPIDOS; LA
INSTRUCCION ES LLAMADA LOOP, ESTA RESTA 1 A CX Y BRINCA SI CX
NO ES CERO, TODO EN UNA INSTRUCCION :

MOV CX,10
INICIO_DEL_CICLO :
<<INSTRUCCIONES
REPETIR>>
LOOP INICIO_DEL_CICLO

EL REGISTRO DX
EL REGISTRO DX ESTA RELACIONADO CON LA DIVISIN Y
MULTIPLICACIN; CUNADO SE DIVIDE UN DIVIDENDO DE 32 BITS POR UN

15

DIVISOR DE 16 BITS, LOS 16 BITS SUPERIORES DEL DIVIDENDO DEBEN


SER PUESTOS EN DX; DESPUES DE LA DIVISIN, EL RESIDUO DE ESTA ES
ALMACENADO EN DX (LOS 16 BITS BAJOS DEL DIVIDENDO DEBEN SER
PUESTOS EN AX) Y EL COCIENTE ES GUARDADO EN AX.

LA INSTRUCCION DIV BX VA A HACER QUE SE MOVDX,0012


DIVIDA AL PAR DE REGISTROS DX Y AX ENTRE BX, O SEA 0012

MOVAX,3456
MOVBX,100
DIVBX

DE FORMA SIMILAR, CUANDO SE MULTIPLICAN DOS FACTORES DE


16 BITS, LOS 16 BITS SUPERIORES DEL PRODUCTO SON ALMACENADOS
EN DX Y LOS 16 BITS BAJOS EN AX.

EL REGISTRO SI

AL IGUAL QUE EL REGISTRO BX, EL REGISTRO SI PUEDE SER


USADO COMO UN APUNTADOR DE MEMORIA, POR EJEMPLO :
MOVAX,0015
MOVDS,AX
MOVSI,20
MOVAL, [SI]

CARGA EL VALOR DE 8 BITS ALMACENADO EN 20 EN AL.

TAMBIEN SI ES UN APUNTADOR USUAL DE MEMORIA CUANDO SE UTILIZA


CON INSTRUCCIONES DE CADENA, POR EJEMPLO :
CLD
MOV AX,0
MOV DS,AX
MOV SI,20
LODSB

NO SOLO CARGA AX CON EL VALOR EN LA


DIRECCION DE MEMORIA APUNTADO POR SI, SINO
QUE TAMBIEN SUMA 1 A SI. ESTO PUEDE RESULTAR
MUY EFECTIVO CUANDO SE DESEAN ACCESAR
SECUENCIALMENTE LOCALIDADES DE MEMORIA,
COMO UNA CADENA DE TEXTO.

16

AN MEJOR, LAS INSTRUCCIONES DE CADENA PUEDEN SER


REALIZADAS
AUTOMATICAMENTE
REPITIENDO
ESTAS
ACCIONES
CUALQUIER NMERO DE VECES, DE TAL MANERA QUE, UNAS SIMPLES
INSTRUCCIONES PUEDEN REALIZAR CIENTOS DE ACCIONES.

EL REGISTRO DI
EL REGISTRO DI ES MUY PARECIDO AL REGISTRO SI EN LO QUE SE
REFIERE A QUE PUEDE SER USADO COMO UN APUNTADOR DE MEMORIA
Y ADEMAS TIENE PROPIEDADES ESPECIALES CUANDO ES USADO CON
LAS POTENTES INSTRUCCIONES DE CADENA, POR EJEMPLO :
MOV AX,0
MOV DS,AX
MOV
DI,1024

SUMA EL VALOR DE 8 BITS ALMACENADO EN LA


DIRECCION 1024 A BL; EL REGISTRO DI TAMBIEN
SIRVE COMO UN APUNTADOR AL DESTINO DE LA
MEMORIA.

EL REGISTRO BP
AL IGUAL QUE BX, SI Y DI, EL REGISTRO BP PUEDE SER USADO
COMO UN APUNTADOR DE MEMORIA, PERO CON UNA DIFERENCIA,
MIENTRAS QUE BX, SI Y DI NORMALMENTE ACTUAN COMO
APUNTADORES DE MEMORIA RELATIVOS AL REGISTRO DE SEGMENTO
DS, BP APUNTA RELATIVO A SS (EL REGISTRO DE SEGMENTO DE PILA),
LA PILA RESIDE EN EL SEGMENTO APUNTADO POR SS (STACK SEGMENT).
POR OTRO LADO, LOS DATOS NORMALMENTE RESIDEN EN EL SEGMENTO
APUNTADO POR DS (DATA SEGMENT); BX, SI Y DI USUALMENTE

17

APUNTAN AL SEGMENTO DE DATOS, NO ES UNA FORMA EFICIENTE USAR


BX, SI O DI PARA APUNTAR A PARAMETROS PASADOS A LA PILA PORQUE
LA PILA NORMALMENTE ESTA EN UN SEGMENTO DIFERENTE, BP
SOLUCIONA ESTE PROBLEMA DANDO DIRECCION DENTRO DEL
SEGMENTO DE PILA, POR EJEMPLO :

PUSH
BP
MOV BP,SP
MOV AX,
[BP+4]

ACCESA EL SEGMENTO DE PILA Y CARGA AX CON


EL PRIMER PARAMETRO PASADO POR UNA
LLAMADA EN LENGUAJE DE ALTO NIVEL A UNA
RUTINA DE ENSAMBLADOR.

EN RESUMEN, BP ESTA DISEADO PARA DAR SOPORTE A PARAMETROS,


VARIABLES LOCALES Y OTRAS NECESIDADES DE DIRECCIONAMIENTO DE
MEMORIA USADOS EN LA PILA.

EL REGISTRO SP

EL REGISTRO SP, TAMBIEN CONOCIDO COMO STACK POINTER, ES


EL ULTIMO DE LOS REGISTROS DE PROPOSITO GENERAL Y SIEMPRE ES
DEDICADO A UN PROPOSITO ESPECIFICO, MANTENER LA PILA, ESTA PILA
ES UN AREA DE MEMORIA DENTRO DE LA CUAL LOS VALORES PUEDEN
SER ALMACENADOS Y DESPUES RECUPERADOS EN UN MODO DE ULTIMA
ENTRADA PRIMERA SALIDA.
EL REGISTRO SP APUNTA SIEMPRE AL TOPE DE LA PILA, QUE ES LA
LOCALIDAD EN LA CUAL SERA PUESTO EL SIGUIENTE VALOR QUE SERA
ALMACENADO. LA ACCION DE PONER VALORES EN LA PILA ES CONOCIDA
COMO PUSHING Y LO REALIZA LA INSTRUCCION PUSH, SIMILARMENTE,
LA ACCION DE RECUPERAR UN VALOR DE LA PILA ES CONOCIDA COMO
POPPING Y LO REALIZA LA INSTRUCCION POP.

18

POR EJEMPLO, LA SIGUIENTE FIGURA ILUSTRA CMO SP, AX Y BX


CAMBIAN CUANDO EL SIGUIENTE CODIGO ES EJECUTADO, ASUMIENDO
QUE SP ESTA PUESTO INICIALMENTE A 1000 :

MOV AX,1
PUSH
AX
MOV BX,2
PUSH
BX
POP AX

AUNQUE EL PROCESADOR PERMITE ALMACENAR VALORES EN SP Y


SUMARLE Y RESTARLE VALORES A SP COMO SI FUESE OTRO REGISTRO
DE PROPOSITO GENERAL, NUNCA DEBE HACER ESTO A MENOS DE QUE
SEPA EXACTAMENTE LO QUE SE EST HACIENDO; SI CAMBIA SP SE ESTA

19

CAMBIANDO LA LOCALIZACION DEL TOPE DE LA PILA Y ESTO PUEDE


CAUSAR UN DESASTRE.
POR QU ?,
PORQUE PUSHING Y POPPING NO ES LA NICA
FORMA DE USAR LA PILA; SIEMPRE QUE SE HACE UNA LLAMADA A UNA
SUBRUTINA O REGRESA DE ELLA (PROCEDIMIENTO O FUNCIN) LA PILA
ES USADA; TAMBIEN ALGUNAS PARTES DEL SISTEMA COMO EL TECLADO
Y EL SISTEMA DE RELOJ USAN LA PILA CUANDO INTERRUMPEN AL
PROCESADOR PARA REALIZAR SUS FUNCIONES, LO QUE QUIERE DECIR
QUE LA PILA PUEDE SER NECESITADA EN CUALQUIER MOMENTO, SI SE
CAMBIA SP ENTONCES EL DATO CORRECTO A EXTRAER DE LA PILA NO
SERA EL CORRECTO CUANDO OTROS ELEMENTOS DEL SISTEMA LO
REQUIERAN.

L APUNTADOR DE INSTRUCCIONES
(IP)

ESTE APUNTADOR SIEMPRE CONTIENE EL DESPLAZAMIENTO DE LA


MEMORIA EN EL CUAL SE ENCUENTRA LA SIGUIENTE INSTRUCCION A
SER EJECUTADA, CUANDO LA INSTRUCCIN ES EJECUTADA, EL IP ES
AVANZADO PARA APUNTAR A LA INSTRUCIN EN LA SIGUIENTE
DIRECCIN DE MEMORIA QUE NORMALMENTE ES LA INSTRUCCIN QUE
SE EJECUTARA; ALGUNAS INSTRUCCIONES, COMO LAS CALL Y JUMP
(LLAMADAS Y SALTOS) CAUSAN QUE IP SEA CARGADO CON UN NUEVO
VALOR PARA ENCONTRAR EL CODIGO CORRESPONDIENTE.
EL IP NO PUEDE SER ESCRITO O LEIDO DIRECTAMENTE, Y ESTE
POR SI SOLO, NO ESPECIFICA TOTALMENTE LA DIRECCIN EN LA CUL
RESIDE LA SIGUIENTE INSTRUCCIN QUE SERA EJECUTADA; EL REGISTRO
SEGMENTO DE CODIGO (CS) PROVEE UNA BASE PARA LA DIRECCIN Y
EL IP PROVEE EL DESPLAZAMIENTO PARA ESTA BASE.

20

OS REGISTROS DE
SEGMENTO

EL PROCESADOR ES CAPAZ DE DIRECCIONAR UN MB DE MEMORIA;


UN DIRECCIONAMIENTO DE MEMORIA DE 20 BITS ES REQUERIDO PARA
DIRECCIONAR TODAS LAS LOCALIDADES DE MEMORIA EN UN MB DE
ESPACIO; SIN EMBARGO, EL PROCESADOR SLO USA APUNTADORES DE
MEMORIA DE 16 BITS.
COMO EJEMPLO SE TIENE EL REGISTRO DE 16 BITS BX QUE PUEDE
SER USADO COMO APUNTADOR A LA MEMORIA. COMO LE HACE
ENTONCES EL PROCESADOR PARA DIRECCIONAR UN ESPACIO DE 20
BITS CON UN APUNTADOR DE 16 BITS?
LA RESPUESTA ES QUE EL PROCESADOR USA UN ESQUEMA DE
DIRECCIONAMIENTO DE DOS PARTES, LOS APUNTADORES DE 16 BITS
SON USADOS, PERO ESTOS SOLO FORMARON PARTE DE LA DIRECCIN
COMPLETA DE MEMORIA, CADA APUNTADOR DE MEMORIA DE 16 BITS, O
DESPLAZAMIENTO DE MEMORIA, ES COMBINADO CON EL CONTENIDO DE

21

UN REGISTRO DE SEGMENTO DE 16 BITS PARA


DIRECCIONAMIENTO DE MEMORIA TOTAL DE 20 BITS.

FORMAR

UN

LOS SEGMENTOS Y
DESPLAZAMIENTOS SON
COMBINADOS COMO SIGUE :
EL VALOR DEL SEGMENTO
ES DESVIADO 4 BITS A LA
IZQUIERDA (O MULTIPLICADO
POR 16) Y DESPUS SE LE
SUMA EL DESPLAZAMIENTO.

POR EJEMPLO, CONSIDERESE EL


SIGUIENTE CODIGO:

MOV
AX,1000h
MOV DS,AX
MOV SI,201 h

AQU EL REGISTRO SEGMENTO DS ES PUESTO A 1000h , Y SI ES


PUESTO A 201h, LOS CUALES SE REPRESENTN COMO EL PAR:
SEGMENTO : DESPLAZAMIENTO O SEA 1000:201h
LA
DIRECCION
DL
((1000h*16)+201).

ES

CARGADA

DESDE

((DS*16)+SI)

OTRA FORMA DE VER ESTO ES, DESVIAR SIMPLEMENTE EL VALOR


DEL SEGMENTO A LA IZQUIERDA 4 BITS O UN DIGITO HEXADECIMAL, LO
CUAL ES LO MISMO QUE MULTIPLICAR POR 16 :

22

10000
+ 201
10201
SE PUEDE VER AHORA QUE LOS PROGRAMAS PUEDEN SOLO
ACCESAR UN MB COMPLETO DE MEMORIA DE ESPACIO USANDO EL PAR
SEGMENTO:DESPLAZAMIENTO, TODAS LAS INSTRUCCIONES Y MODOS
DE DIRECCIONAMIENTO DEL PROCESADOR OPERAN RELATIVAS A
ALGUNO DE LOS REGISTROS SEGMENTO.

EL NOMBRE DEL SEGMENTO MS COMN ES @DATA EL CUAL SE


REFIERE AL SEGMENTO DE DATOS POR DEFECTO CUANDO LAS
DIRECTIVAS SIMPLIFICADAS DE SEGMENTOS SON USADAS, POR EJEMPLO:

. MODEL SMALL
. DATA
VAR1 DW 0
.
.
. CODE
MOV AX, @DATA
MOV DS, AX
.
.
END

CARGA DS PARA QUE APUNTE AL SEGMENTO DE DATOS POR


DEFECTO QUE SE UTILIZA Y EL CUAL RESIDE VAR1.

23

SOLO BLOCKS DE MEMORIA DE 64 KB SON DIRECCIONABLES


RELATIVOS A UN REGISTRO DE SEGMENTO A LA VEZ, PORQUE, 64KB ES
LA CANTIDAD MXIMA DE MEMORIA QUE PUEDE SER DIRECCIONADA
CON UN DESPLAZAMIENTO DE 16 BITS.

EL REGISTRO CS
EL REGISTRO CS APUNTA AL INICIO DE LOS 64 KB DE MEMORIA
(BLOCK), SEGMENTO DE CODIGO EN EL CUAL RESIDE LA SIGUIENTE
INSTRUCCION QUE SERA EJECUTADA Y QUE SE ENCUENTRA EN EL
DESPLAZAMIENTO ESPECIFICADO POR IP, ESTO ES, EN LA DIRECCION
SEGMENTO:DESPLAZAMIENTO CS:IP.
EL REGISTRO CS PUEDE SER CAMBIADO POR UN NUMERO DE
INSTRUCIONES INCLUYENDO CIERTOS SALTOS, LLAMADAS Y RETORNOS.

EL REGISTRO DS
EL REGISTRO DS APUNTA AL INICIO DEL SEGMENTO DE DATOS, EL
CUAL ES UN BLOCK DE 64 KB. NORMALMENTE LOS DESPLAZAMIENTOS
DE MEMORIA INVOLUCRAN A BX, SI O DI OPERANDO RELATIVOS A DS .
EL SEGMENTO DE DATOS ES BASICAMENTE LO QUE SU NOMBRE INDICA,
EL SEGMENTO EN EL CUAL RESIDE EL JUEGO DE DATOS EN CURSO.

EL REGISTRO ES
EL REGISTRO ES APUNTA AL INICIO DEL BOLCK DE MEMORIA
CONOCIDO COMO EL SEGMENTO EXTRA, COMO SU NOMBRE IMPLICA, EL
SEGMENTO EXTRA NO ESTA DEDICADO A ALGUN PROPOSITO, PERO ESTA
DISPONIBLE PARA LAS NECESIDADES QUE SE PRESENTEN, ALGUNAS
VECES, ESTE SEGMENTO ES USADO PARA HACER UN BLOCK ADICIONAL
DE 64 KB DISPONIBLE PARA ALMACENAMIENTO DE DATOS, PERO EL
ACCESO A ESTE ES MENOS EFICIENTE QUE EL ACCESO AL SEGMENTO DE
DATOS.

24

DONDE FUNCIONA REALMENTE EL SEGMENTO EXTRA ES CUANDO


SE USAN LAS INSTRUCCIONES DE CADENAS, TODAS ESTAS
INSTRUCCIONES QUE ESCRIBEN A LA MEMORIA USAN ES:DI COMO LA
DIRECCION
DE
MEMORIA;
ESTO
QUIERE
DECIR
QUE
ES
EXTREMADAMENTE UTIL COMO EL SEGMENTO DE DESTINO PARA
BLOQUES COPIADOS, COMPARACION DE CADENAS, BUSQUEDAS EN
MEMORIA Y BORRADO DE BLOQUES DE MEMORIA.

EL REGISTRO SS
EL REGISTRO SS APUNTA AL INICIO DEL SEGMENTO DE PILA, LAS
INSTRUCCIONES COMO : PUSHES, POPS, CALLS Y RETURNS, TRABAJAN
CON ESTE SEGMENTO PORQUE SP ES SOLO CAPAZ DE DIRECCIONAR
MEMORIA EN ESTE SEGMENTO. COMO YA SE HA DICHO ANTES, EL
REGISTRO BP TAMBIEN OPERA RELATIVO AL SEGMENTO DE PILA, ESTO
PERMITE QUE BP SEA USADO PARA DIRECCIONAR PARAMETROS Y
VARIABLES QUE ESTAN ALMACENADOS EN LA PILA.

ODOS DE
DIRECCIONAMIENTO

Generacin de la direccin de la instruccin.


Todos los registros internos del procesador son de 16 bits. El bus de direccin
es de 20 bits, por lo que se usa ms de un registro interno para generar la
direccin de 20 bits.
Los 2 registros usados para la direccin de la instruccin son el IP y el CS. Se
combinan en una forma especial para generar la direccin de 20 bits.
direccin de 20 bits = 1610 * CS + IP

Por ejemplo: Si los registros CS e IP contienen los valores:


CS = 1000H

25

IP = 0414 H

La direccin de 20 bits es:


1610 * 1000H + 0414H = 10000H + 0414H = 10414H
Esta es la direccin en memoria desde la cual la nueva instruccin debe
buscarse.
Al registro IP se le refiere como offset, el registro CS * 1610 apunta a la direccin
de inicio o segmento en memoria desde el cual se calcula el offset. La Figura A
muestra grficamente cmo se calcula la direccin de 20 bits.
CS * 16

IP

Direccin de 20 bits

Bus de direccin
Del sistema

FIGURA A. Clculo de la direccin de 20 bits

Cada direccin generada por el procesador usa uno de los 4 registros de


segmento.
Este registro de segmento es recorrido 4 bits hacia la izquierda antes de ser
sumado al offset.
La instruccin del CPU especifica cules registros internos se usan para generar
el offset.
Se tienen siete modos de direccionamiento que son:

DIRECCIONAMIENTO

INMEDIATO
DE REGISTRO
DIRECTO
DE REGISTRO INDIRECTO
RELATIVO A LA BASE
INDEXADO DIRECTO
BASE INDEXADO

26

A continuacin se muestran los diferentes modos de direccionamiento tomando


como ejemplo la instruccin MOV.
Instruccin MOV
Transfiere uno o dos bytes desde el operando fuente al operando destino. Tiene el
siguiente formato:
MOV destino, fuente

Direccionamiento Inmediato
El operando fuente aparece en la instruccin. Un ejemplo, es el que mueve un valor
constante a un registro interno.
MOV AX, 568

Direccionamiento de Registro
Indica que el operando a ser usado est contenido en uno de los registros internos de
propsito general del CPU. En el caso de los registros AX, BX, CX o DX los registros
pueden ser de 8 a 16 bits

Ejemplos:
MOV AX, BX
MOV AL, BL

; AX BX
; AL BL

Cuando se usa el direccionamiento de registro, el CPU realiza las operaciones


internamente, es decir, no se genera direccin de 20 bits para especificar el
operando fuente.

Direccionamiento Directo
Especifica en la instruccin la localidad de memoria que contiene al operando. En
este tipo de direccionamiento, se forma una direccin de 20 bits.
Ejemplo:
MOV CX, COUNT

El valor de COUNT es una constante. Es usada como el valor offset en el clculo de


la direccin de 20 bits

27

El procesador siempre usa un registro de segmento cuando calcula una direccin


fsica.
El registro que se usa para esta instruccin es DS.
En la Figura B, se muestra el clculo de la direccin desde la cual se tomar el dato
que se carga en CX.

DS * 16

COUNT = CONSTANTE

+
DIRECCION DEL SISTEMA DE 20 BITS

FIGURA B. Uso del segmento de datos y una constante para desplazamiento

Este es el segmento por omisin que se usa. Sin embargo, cualquiera de los 4
segmentos puede usarse. Esto se efecta especificando el registro apropiado en la
instruccin.
Por ejemplo, suponiendo que se desea usar el registro ES en lugar del DS:
MOV CX, ES: COUNT

Direccionamiento de Registro Indirecto


Con el modo de direccionamiento de registro ndice, la direccin offset de 16 bits
est contenida en un registro base o registro ndice. Esto es, la direccin reside en el
registro BX, BP, SI o DI.
Ejemplo:
MOV AX, [SI]

El valor de 16 bits contenido en el registro SI debe ser el offset usado para calcular la
direccin de 20 bits.
Otra vez, debe usarse un registro de segmento para generar la direccin final. El
valor de 16 bits en SI se combina con el segmento apropiado para generar la
direccin.

Direccionamiento relativo a la base

28

En esta modalidad, la direccin del operando se obtiene al aumentar un


desplazamiento a los siguientes registros: BX o BP. En este caso, los registros
deben contener la direccin de offset.
Ejemplo:
MOV AX, [BX+2]

a
Para calcular una direccin de memoria, el offset indicado por el registro de BX se
toma en funcin al registro de segmentos DS, y el desplazamiento indicado por el
registro BP se toma en funcin al registro de segmento SS.

Direccionamiento indexado directo


Este tipo de direccionamiento incluye a los dos modos de direccionamiento anteriores.
La direccin offset de 16 bits se calcula sumando el valor de 16 bits especificado en
un registro interno y una constante.
Por ejemplo, si se usa el registro interno DI (o SI) y el valor constante
desplazamiento), donde COUNT ha sido previamente definido, el nemotcnico para
esta construccin es:

MOV AX, COUNT [DI]

Si: COUNT = 0378H


DI = 04FAH
0872H

Entonces, la direccin offset de 16 bits es 0872H

Direccionamiento base indexado


Este es el modo de direccionamiento ms complejo. Es idntico al modo de
direccionamiento anterior, excepto que se suma una constante.
Ejemplo: Suponiendo que se tienen los siguientes valores en los registros:
DI
= 0367H
BX
= 7890H
COUNT = 0012H
7C09H

Este modo de direccionamiento indica que el offset especificado por la suma de DI +


BX + COUNT sea usado para mover el dato en memoria en el registro AX.

29

MOV AX, COUNT [BX] [DI]

La direccin offset de 16 bits es 7C09H. La direccin completa en 20 bits se calcula


de la expresin:
1610 * DS + 7C09H

Si el DS contiene 3000H, la direccin completa de 20 bits es:


30000H + 7C09H = 37C09H

EXAMEN UNIDAD 2

PERACIONES ARITMTICAS
BSICAS

SUMAS
EXISTEN TRES INSTRUCIONES QUE SE PUEDEN USAR EN LAS SUMAS; DOS DE
ELLAS FUNCIONAN CON DOS OPERANDOS Y UNA SOLO CON UNO. DICHAS
INSTRUCCIONES SON:

ADD (SUMA SIN ACARREO).


ADC (SUMA CON ACARREO).
INC (INCREMENTO).

TRABAJAN CON DOS OPERANDOS.


TRABAJA CON UN OPERANDO.

30

LA INSTRUCCIN ADD
SUMA EL OPERANDO FUENTE AL DESTINO Y DEJA EL RESULTADO EN EL
DESTINO.
ADD destino,fuente
POR EJEMPLO, LA INSTRUCCIN ADD DX,5 SUMAR AL REGISTRO DX EL
OPERANDO INMEDIATO 5 Y DEJAR EL RESULTADO EN EL REGISTRO DX. LA
INSTRUCCIN PUEDE REALIZAR OPERACIONES DE SUMA ENTRE REGISTROS
Y DATOS INMEDIATOS, ENTRE REGISTROS Y LOCALIDADES DE MEMORIA O
ENTRE REGISTRO Y REGISTRO. OTRO EJEMPLO ES:
MOV
MOV
ADD

DX,5
CX,6
DX,CX

LA INSTRUCCIN ADC
SUMA EL OPERANDO FUENTE AL DESTINO MS EL POSIBLE ACARREO DE LA
OPERACIN ANTERIOR Y DEJA EL RESULTADO EN EL OPERANDO DESTINO.
ADC destino,fuente
CUANDO DESEE OPERAR SOBRE CANTIDADES GRANDES (QUE NECESITEN
MAS DE 16 BITS DE ALMACENAMIENTO EN EL RESULTADO), ES MUY UTIL
USAR LA INSTRUCCIN ADC O SUMA CON ACARREO. DICHA INSTRUCCIN
REALIZA LA SUMA Y AUTOMTICAMENTE TOMA EN CUENTA EL ACARREO;
GENERALMEMNTE USA 32 BITS PARA SUS OPERACIONES (LAS
OPERACIONES SE REALIZAN SOBRE EL REGISTRO PAR DX:AX). EL
PROCESO ES COMO SIGUE:
PRIMERO: SE SUMAN LAS PALABRAS BAJAS DE LOS OPERANDOS PARA
OBTENER LA PALABRA BAJA DEL RESULTADO DE 32 BITS.

31

SEGUNDO: SE SUMAN LAS PALABRAS ALTAS DE LOS OPERANDOS,


INCLUYENDO EL BIT DE ACARREO, PARA CONSEGUIR LA PALABRA ALTA
DEL RESULATADO DE 32 BITS. EL RESULTADO FINAL SE TIENE EN EL
REGISTRO DX:AX.
A CONTINUACION SE PRESENTA UN EJEMPLO Y EL ALGORITMO GENERAL:
SE SUMARN LAS CANTIDADES A Y B, DONDE A=5,500,000 Y B= 3,600,000.
EST CLARO QUE EL RESULTADO OCUPAR MAS DE 16 BITS; POR LO TANTO,
ES NECESARIO OPERAR CON 32 BITS (DOS REGISTROS DE 16 BITS).
TRADUCIENDO DICHAS CANTIDADES A HEXADECIMAL SE TIENE QUE LA
CANTIDAD (A) ES IGUAL A 53EC60 Y LA CANTIDAD (B) ES IGUAL A 36EE80.
SEPARANDO EN BITS DICHAS CANTIDADES:
A = 00000000
01010011 11101100
01100000 (5,500,000)
------------PA1------------ ------------PB1------------00
53
EC
60
B = 00000000
00110110 11101110
10000000 (3,600,000)
------------PA2------------ -------------PB2------------00
36
EE
80

DONDE PA1 ES LA PALABRA ALTA Y PB1 ES LA PALABRA BAJA DE LA


CANTIDAD A DE 32 BITS. PA2 Y PB2 ES LO MISMO PARA LA CANTIDAD B. EL
ALGORITMO DEFINE LOS SIGUIENTES PASOS:
1. SUME LAS PALABRAS BAJAS DE A y B. EL RESULTADO SERA LA PALABRA
BAJA DE LA SUMA FINAL DE A y B:
PB1
PB2

11101100 01100000
ADD
11101110 10000000
-------------------------------11011010 11100000

EC 60
ADD
EE 80
--------------DA E0
(LA BANDERA DE ACARREO SERA 1)

2. SUME LAS PALABRAS ALTAS DE A y B. EL RESULTADO SERA LA PALABRA


ALTA DE LA SUMA FINAL DE A y B:
PA1

00000000 01010011
ADC

00 53
ADC

32
PA2

00000000 00110110
-------------------------------00000000 10001010

00 36
-----------00 8A

EL RESULTADO FINAL SER 00000000 10001010 (correspondiente a la palabra alta) y


11011010 11100000 (correspondiente a la palabra baja). SU EQUIVALENTE EN
HEXADECIMAL SERA 8ADAE0 Y EN DECIMAL 9,100,000.
NOTE QUE EL RESULTADO SE DEJA EN EL FORMATO PALABRA ALTA:PALABRA
BAJA. EL MTODO EN S NO ES COMPLICADO, VEAMOS EL CODIGO
NECESARIO PARA IMPLEMENTAR EL EJEMPLO ANTERIOR:
MOV AX, EC60
ADD AX, EE80

palabra baja de la cantidad A


suma a AX la palabra baja de la cantidad B
se genera un acarreo (CF se activa)

MOV DX, 0053


ADC DX, 0036

palabra alta de la cantidad A


suma a DX la palabra alta de la cantidad B y tambin le suma
el acarreo (CF = 1)
el resultado queda en el registro par DX:AX

LA INSTRUCCIN INC
UNA DE LAS OPERACIONES DE SUMA MS USADA ES LA DE INCREMENTAR
EN UNO CUALQUIER REGISTRO O LOCALIDAD DE MEMORIA. PARA ESTE
PROPSITO SIRVE LA INSTRUCCIN INC (USA UN SOLO OPERANDO Y LO
INCREMENTA EN UNO). INC AX REALIZARA LA OPERACIN DE AX = AX +1.
ADVIERTA QUE SE AHORRA EL USO DE LA INSTRUCCIN ADD AX,1, PUES
INC ES MS RPIDA EN EJECUCIN Y OCUPA UN BYTE, MIENTRAS QUE ADD
AX,1 OCUPA 3 BYTES.

RESTAS
EXISTEN TRES INSTRUCIONES QUE SE PUEDEN USAR EN LAS RESTAS; DOS
DE ELLAS FUNCIONAN CON DOS OPERANDOS Y UNA SLO CON UNO. DICHAS
INSTRUCCIONES SON:

33

SUB (RESTA SIN ACARREO).


SBB (RESTA CON ACARREO).
DEC (DECREMENTO).

TRABAJAN CON DOS OPERANDOS.


TRABAJA CON UN OPERANDO.

LA INSTRUCCIN SUB
RESTA AL OPERANDO DE DESTINO EL OPERANDO FUENTE Y DEJA EL
RESULTADO EN EL DESTINO.
SUB destino,fuente
POR EJEMPLO, SUB AX,DX LE RESTA AL REGISTRO AX EL CONTENIDO DEL
REGISTRO DX Y DEJA EL RESULTADO EN AX.

LA INSTRUCCIN SBB
LE RESTA AL OPERANDO DE DESTINO EL OPERANDO FUENTE, INCLUYENDO
EL ACARREO.
SBB destino,fuente
PARA ESTA INSTRUCIN SE PUEDE APLICAR EL MISMO ALGORITMO
SEALADO EN LA SUMA PARA TRABAJAR CON CANTIDADES DE 32 BITS. LO
NICO QUE CAMBIA ES EL ORDEN DE OPERACIN SOBRE LAS PALABRAS.
EN LUGAR DE TENER PA1 + PB1 SE TENDRA PA1 - PB1; EN LUGAR DE TENER
PA2 + PB2 SE TENDRA PA2 - PB2, Y EN LUGAR DE USAR LA INSTRUCCIN ADC
SE USARA SBB, RESTA CON ACARREO.
EJEMPLO:

34
MOV AX, EC60
SUB AX, EE80

palabra baja de la cantidad A


resta a AX la palabra baja de la cantidad B
se genera un acarreo (CF se activa)

MOV DX, 0053


SBB DX, 0036

palabra alta de la cantidad A


resta a DX la palabra alta de la cantidad B y tambin le resta
el acarreo (CF = 1)
el resultado queda en el registro par DX:AX

LA INSTRUCCIN DEC
LA INSTRUCCIN DEC SE UTILIZA PARA DECREMENTAR UN OPERANDO EN
UNA UNIDAD, DEC AX REALIZARA LA OPERACIN DE AX = AX - 1.

MULTIPLICACIONES
SE TIENEN DOS INSTRUCCIONES PARA MULTIPLICAR VALORES, ESTAS SON:

MUL (MULTIPLICACIN SIN SIGNO).

IMUL

(MULTIPLICACIN CON SIGNO).

LA INSTRUCCIN MUL
EXISTEN DOS FROMAS DE MULTIPLICAR, MULTIPLICACIN DE 8 BITS Y
MULTIPLICACION DE 16 BITS.

MULTIPLICACIN DE 8 BITS: EN ESTA FORMA NO SE PUEDE OBTENER UN


RESULTADO MAYOR A 16 BITS Y ESTE RESULTADO SE ENCONTRAR EN EL
REGISTRO AX, EJEMPLO:
C:\ DEBUG
-A 100
28B7:0100 MOV AL,FF
28B7:0102 MOV CL,6
28B7:0104 MUL CL
28B7:0106 INT 20
28B7:0108
-G 106

;pone en AL el mximo valor representable de 8 bits


;y lo multiplica por 6 dejando el resultado en
;el registro AX.

35

AX=05FA BX=0000 CX=0006 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000


DS=28B7 ES=28B7 SS=28B7 CS=28B7 IP=0106 OV UP EI PL NZ AC PE CY
28BB7:0106 CD20 INT 20

EN ESTE TPO DE MULTIPLICACIN, EL MULTIPLICANDO SIEMPRE SE


ENCUENTRA EN EL REGISTRO AL Y EL MULTIPLICADOR ES EL OPERANDO
ORIGEN (CL EN ESTE EJEMPLO) Y EL RESULTADO SE ALMACENAR EN EL
REGISTRO AX.
(OPERANDO * AL = AX)

MULTIPLICACIN DE 16 BITS: EN ESTA FORMA NO SE PUEDE OBTENER UN


RESULTADO MAYOR A 32 BITS Y ESTE RESULTADO SE ENCONTRAR EN EL
REGISTRO PAR DX:AX, EJEMPLO:

C:\DEBUG
-A 100
28B7:0100 MOV AX, FFFF
28B7:0103 MOV CX, FFFF
28B7:0106 MUL CX
28B7:0108 INT 20
28B7:010A
-G 108

;pone 65535 en AX
;pone 65535 en CX
;multiplica las dos cantidades y deja el resultado
;en el registro par DX:AX

AX=0001 BX=0000 CX=FFFF DX=FFFE SP=FFEE BP=0000 SI=0000 DI=0000


DS=28B7 ES=28B7 SS=28B7 CS=28B7 IP=0108 OV UP EI NG NZ AC PO CY
28B7:0108 CD20
INT 20

EL RESULTADO EN HEXADECIMAL SE ENCUENTRA DENTRO DEL


REGISTRO PAR DX:AX Y ES FFFE0001 (FFFE CONTENIDO DEL REGISTRO
DX Y 0001 CONTENIDO DEL REGISTRO AX ).
EN ESTE TPO DE MULTIPLICACIN, EL MULTIPLICANDO SIEMPRE SE
ENCUENTRA EN EL REGISTRO AX Y EL MULTIPLICADOR ES EL OPERANDO
ORIGEN (CX EN ESTE EJEMPLO) Y EL RESULTADO SE ALMACENAR EN EL
REGISTRO PAR DX:AX. .
(OPERANDO * AX = DX:AX)

LA INSTRUCCIN IMUL

36

LA INSTRUCCION IMUL PERMITE LA MULTIPLICACION ENTRE DOS


CANTIDADES DE 8 0 16 BITS CON SIGNO (SI EL BIT MAS SIGNIFICATIVO
DEL BYTE O PALABRA ES 1, ENTONCES LA CANTIDAD SE CONSIDERA
NEGATIVA). EL SIGUIENTE ES UN EJEMPLO DONDE SE INVOLUCRAN LAS
DOS INSTRUCCIONES MUL e IMUL.
C:\DEBUG
-A 100
28B7:0100
28B7:0102
28B7:0104
28B7:0106
28B7:0108
28B7:010A
28B7:010C
-G 104

MOV AL,-1
MOV CL,6
MUL CL
MOV AL,-1
IMUL CL
INT 20

AX=00FF BX=0000 CX=0006 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000


DS=28B7 ES=28B7 SS=28B7 CS=28B7 IP=0104 NV UP EI PL NZ NA PO NC
28B7:0104 F6E1
MUL CL

SE VER QUE LOS REGISTROS AL y CL CONTENGAN LOS VALORES -1


(FFh) Y 6, RESPECTIVAMENTE.
-G 106
AX=05FA
BX=0000
CX=0006
DX=0000
SP=FFEE
BP=0000
SI=0000 DI=0000
DS=28B7 ES=28B7 CS=28B7 CS=28B7 IP=0106 OV UP EI PL NZ
AC PE CY
28B7:0106 B0FF
MOV AL,FF

EL RESULTADO DE LA MULTIPLICACION DE -1 * 6 SE ENCUENTRA EN EL


REGISTRO AX. TENGA EN CUENTA QUE AL USAR LA INSTRUCCION MUL
SE REALIZA LA OPERACION SIN SIGNO; ES DECIR, EL RESULTADO SERA
EL DE MULTIPLICAR 255 * 6, QUE SERA IGUAL A 1530 DECIMAL O 5FA
HEXADECIMAL (QUE ES LO INDICADO POR EL REGISTRO AX).
-G 10A
AX=FFFA
BX=0000
CX=0006
DX=0000
SP=FFEE
BP=0000
SI=0000 DI=0000
DS=28B7 ES=28B7 SS=28B7 CS=28B7 IP=010A NV UP EI NG NZ
AC PE NC
28B7:010A CD20
INT 20

37

USANDO LA INSTRUCCION IMUL SE OBTIENE COMO RESULTADO FFFA


HEXADECIMAL, QUE ES EL COMPLEMENTO A dos DEL NMERO POSITIVO
6 Y POR ENDE ES IGUAL A -6.
PARA COMPROBARLO SIGAMOS LOS PASOS DEL COMPLEMENTO A dos,
EL NMERO ORIGINAL ES 6. LA REPRESENTACION BINARIA ABSOLUTA
DE 6 ES 00000110. CONVIRTIENDO TODOS LOS CEROS A UNOS, Y
VICEVERSA, SE OBTIENE 11111001 Y FINALMENTE, SUMANDOLE UNO AL
RESULTADO ANTERIOR SE OBTIENE 11111010, QUE ES EQUIVALENTE A
FA HEXADECIMAL. EL FF HEXADECIMAL REPRESENTA EL VALOR TOTAL
DEL REGISTRO AX Y FORMA PARTE DEL RESULTADO FINAL.

DIVISIONES
SE TIENEN DOS INSTRUCCIONES PARA DIVIDIR VALORES, ESTAS SON:

DIV (DIVISIN SIN SIGNO).

IDIV (DIVISIN CON SIGNO).

LA INSTRUCCIN DIV
EXISTEN DOS FROMAS DE DIVISIN, DIVISIN DE 8 BITS Y DIVISIN DE 16
BITS.

DIVISIN DE 8 BITS: PARA UN DIVISOR DE 8 BITS SE ESPERA UN


DIVIDENDO DE 16 BITS EN EL REGISTRO AX, EL COCIENTE SE ALMACENA
EN EL REGISTRO AL Y EL RESIDUO EN AH,

AL
OPERANDO AX
AH

38

EJEMPLO:
C:\DEBUG
-A 100
250E:0100
250E:0103
250E:0105
250E:0108
250E:0109

MOV
MOV
DIV
INT

AX,00FF
BL,8
BL
20

-G 108
AX=071F BX=0008 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000
DS=250E ES=250E SS=250E CS=250E IP=0107 NV UP EI PL NZ AC PO NC
250E:0107 CD20 INT 20

COMO SE PUEDE NOTAR, EL COCIENTE SE ENCUENTRA EN EL REGISTRO AL Y


EL RESIDUO EN EL REGISTRO AH

DIVISIN DE 16 BITS: PARA UN DIVISOR DE 16 BITS SE ESPERA UN


DIVIDENDO DE 32 BITS EN EL REGISTRO PAR DX:AX, SIENDO LA PALABRA
ALTA DX Y LA PALABRA BAJA AX, EL COCIENTE SE ALMACENA EN EL
REGISTRO AX Y EL RESIDUO EN DX,

AX
OPERANDO DX:AX
DX

EJEMPLO:
C:\DEBUG
-A100

39
250E:0100
250E:0103
250E:0106
250E:0108
250E:010A

MOV
MOV
DIV
INT

AX,FFFF
BX,2
BX
20

-G108
AX=7FFF BX=0002 CX=0000 DX=0001 SP=FFEE BP=0000 SI=0000 DI=0000
DS=250E ES=250E SS=250E CS=250E IP=0108 NV UP EI PL NZ AC PO NC
250E:0108 CD20 INT 20

EL COCIENTE SE ENCUENTRA EN EL REGISTRO AX (32767 o 7FFF) Y EL


RESIDUO EN EL REGISTRO DX (1).

LA INSTRUCCIN IDIV
ESTA INSTRUCCIN DIVIDE, CONSIDERANDO EL SIGNO, EL REGISTRO AX O
EL REGISTRO PAR DX:AX POR EL OPERANDO ORIGEN. EL RESULTADO SE
ALMACENA EN AL O AX, SEGN EL OPERANDO SEA DE UN BYTE O DE UNA
PALABRA. EL RESIDUO SE ALMACENA EN EL REGISTRO AH O DX.

EJEMPLO:
C:\DEBUG
-A 100
250E:0100
250E:0103
250E:0105
250E:0108
250E:0109

MOV
MOV
IDIV
INT

AX,FFED
BL,2
BL
20

; dividendo = -19
; divisor = 2

-G 108
AX=01F7 BX=0008 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000
DS=250E ES=250E SS=250E CS=250E IP=0107 NV UP EI PL NZ AC PO NC
250E:0107 CD20 INT 20

COMO SE PUEDE NOTAR, EL COCIENTE SE ENCUENTRA EN EL REGISTRO AL


(F7 = -9) Y EL RESIDUO EN EL REGISTRO AH (01).

40

INSTRUCCIONES DE DESPLAZAMIENTO Y ROTACIN.


SHL, SAL desplazar a la izquierda (desplazamiento aritmtico)
SHR
desplazar a la derecha
SAR
desplazamiento aritmtico a la derecha
ROL
ROR
RCL
RCR

rotacin a la izquierda
rotacin a la derecha
rotacin con acarreo a la izquierda
rotacin con acarreo a la derecha

CLC
STC

borrar acarreo
poner acarreo a 1

41

SAL/SHL realiza desplazamiento a la izquierda del primer operando tantos bits como
indique el segundo operando, introduciendo un 0 y guardando el bit que sale en el bit CF el
registro de estado.
CF

Admite los siguientes formatos:


SAL/SHL reg, 1
SAL/SHL mem, 1
SAL/SHL reg, CL
SAL/SHL mem, CL

desplaza 1 vez el contenido de reg


desplaza tantas veces el contenido de reg como
indique CL.

Afecta a los bit OF, CF del registro de estado.


SAR realiza el desplazamiento a la derecha del operando, repitiendo el bit de signo y
guardando el resultado en el bit CF del registro de estado.
CF

Admite los siguientes formatos:


SAR reg, 1
SAR mem, 1
SAR reg, CL
SAR mem, CL

desplaza 1 vez el contenido de reg


desplaza tantas veces el contenido de reg como
indique CL.

Afecta a todos los bit del registro de estado.


SHR realiza el desplazamiento a la derecha del operando, introduciendo un 0 y guardando
el resultado en el bit CF del registro de estado.
0

CF

Admite los siguientes formatos:


SHR reg, 1
SHR mem, 1
SHR reg, CL
SHR mem, CL

desplaza 1 vez el contenido de reg


desplaza tantas veces el contenido de reg como
Indique CL.

42

Afecta a los bit OF, CF del registro de estado.


RCL realiza la rotacin a la izquierda de los bits del operando a travs del bit CF (acarreo)
del registro de estado.
CF

Admite los siguientes formatos:


RCL reg, 1
RCL mem, 1
RCL reg, CL
RCL mem, CL

desplaza 1 vez el contenido de reg


desplaza tantas veces el contenido de reg como
Indique CL.

Afecta a los bit OF, CF del registro de estado.

RCR realiza la rotacin a la derecha de los bits de operando a travs del bit CF del registro
de estado.

CF

Admite los siguientes formatos:


RCR reg, 1
RCR mem, 1
RCR reg, CL

desplaza 1 vez el contenido de reg


desplaza tantas veces el contenido de reg como
Indique CL.

RCR mem, CL

Afecta a los bit OF, CF del registro de estado.


ROL realiza la rotacin a la izquierda de los bits del operando, ignorando el bit CF del
registro de estado, aunque en CF se almacena el bit que se rota.

CF

43

Admite los siguientes formatos:


ROL reg, 1
ROL mem, 1
ROL reg, CL
ROL mem, CL

desplaza 1 vez el contenido de reg


desplaza tantas veces el contenido de reg como
Indique CL.

Afecta a los bit OF, CF del registro de estado.


ROR realiza la rotacin a la derecha de los bits del operando, ignorando el bit CF del
registro de estado, aunque en CF se almacena el bit que se rota.

CF

Admite los siguientes formatos:


ROL reg, 1
ROL mem, 1
ROL reg, CL

desplaza 1 vez el contenido de reg


desplaza tantas veces el contenido de reg como
Indique CL.

ROL mem, CL

Afecta a los bit OF, CF del registro de estado.


Las instrucciones SHL/SAL y SAR se suelen usar para hacer multiplicaciones y divisiones,
respectivamente, por nmeros potencia de dos (2, 4, 8,16, 32, 64 y 128), de manera ms
eficiente que las instrucciones MUL y DIV.
Ejemplo:
MOV AX, 40h
MOV CL, 2
SHL AX, CL
; es equivalente y ms eficiente que:
MOV AX, 40h
MOV DX, 00h
MOV BX, 04h

44

MUL BX

CICLOS
Las instrucciones de CICLOS se usan para realizar estructuras repetitivas, y utilizan el
registro CX como contador.
LOOP
Esta instruccin hace que el programa salte a la direccin especificada (salto dentro del
segmento), mientras que CX sea distinto de 0 y decrementa CX en 1 en cada iteracin.
LOOP salto
Ejemplo:

45

MOV CX, 100


COMIENZO:

LOOP COMIENZO

;
;
;
;

este bucle se repite 100


inicio del ciclo
instrucciones a ejecutar dentro del ciclo
final del ciclo

En el fragmento anterior, el bloque de instrucciones que se encuentra entre la etiqueta


COMIENZO y la instruccin LOOP ser ejecutado hasta que el registro CX sea igual a cero.
Cada vez que se ejecuta la instruccin LOOP, el registro CX es decrementado en uno hasta
llegar a cero. Esta instruccin tambin tiene la limitante de que debe encontrarse en el
rango de +128 a -127 (mximo nmero de bytes entre COMIENZO y LOOP).
LOOPNE/LOOPNZ
Esta instruccin salta a la direccin especificada mientras que CX sea distinto de 0 y si la
bandera de cero esta desactivada ZF = 0.
LOOPNE/LOOPNZ salto

Esta instruccin proporciona una ruptura del bucle adicional.


LOOPE/LOOPZ
Esta instruccin acta como la anterior pero la condicin adicional es ZF = 1.
LOOPE/LOOPZ salto
JCXZ

Esta instruccin realiza un salto si CX = 0.


JCXZ salto

Ninguna de estas instrucciones afectan al registro de estado.


Hasta aqu es el examen

TRANSFERENCIA DE CONTROL NO CONDICIONADA


Esta transferencia de control se logra con la instruccin JMP, que provoca un salto hacia
un punto de destino (una localidad definida en la memoria). Dicha instruccin altera el flujo
de ejecucin del programa sin tomar en cuenta el estado de las banderas.
Existen diferentes formatos para la instruccin de salto, y cada uno se aplica a un uso
especfico. El destino de la instruccin puede estar en el mismo segmento (intrasegmento)
o en otro diferente (intersegmento). Para saltos intersegmento, la instruccin se arma o
codifica en cinco bytes (uno para la instruccin, dos para el segmento de destino y dos para
el desplazamiento en la localidad de destino). Los saltos intrasegmento requieren de tres

46

bytes (uno para la instruccin y dos para el desplazamiento en la localidad de destino). De


esto se infiere que la localidad de destino no puede estar ms all de 65535 bytes desde
donde se encuentra la instruccin JMP, ya sea hacia adelante o hacia atrs.
Existe un formato adicional que se usa en saltos intrasegmento cuyo punto de destino no
est mas all de +127 bytes hacia adelante o -128 bytes hacia atrs. Este formato solo
requiere dos bytes (uno para la instruccin y el otro para el desplazamiento). El byte del
desplazamiento se considera un byte con signo, de ah la limitante de +127 o -128.
Recuerde que los bytes (o palabras) con signo utilizan el bit ms significativo para
determinar el signo. Si el bit ms significativo es uno, el valor se considera negativo; de lo
contrario, ser positivo. Ejemplo:
ORG 100H
EMPIEZA:
JMP PROGPRIN
DB

"ESTE ES UN FRAGMENTO DE CODIGO$"

PROGPRIN:
..
..
END EMPIEZA
En el ejemplo anterior se aprecia el uso comn de un salto no condicional intrasegmento.
En el caso de los programas .COM es necesario saltar sobre el rea de datos y llegar a la
etiqueta de comienzo del cdigo; esto se debe a que dichos programas deben contener los
datos y el cdigo en un solo segmento.

..
..
JMP SHORT ETIQUETA
..
..
ETIQUETA:
En el caso anterior, el formato JMP SHORT ETIQUETA es un salto intrasegmento a la
localidad "etiqueta", cuya distancia desde la instruccin JMP no es mayor de 127 bytes.
En caso contrario, el ensamblador desplegar un mensaje de error.

47

Los saltos intersegmentos se especifican de igual manera que los intrasegmento,


con la nica diferencia de que la etiqueta debe ser declarada como externa con el
calificador FAR (lejos) o con un operando FAR PTR (apuntador lejano, usando la
directiva EXTRN). Ejemplo:
Suponga que tiene dos archivos arch1.asm y arch2.asm, y que el primero contiene lo
siguiente:
PUBLIC
.
.
SALTE:
.
.

SALTE

En arch2.asm desea hacer referencia a la etiqueta "SALTE" que se encuentra en arch1.asm;


en este caso tendramos que arch2.asm contiene:
EXTRN SALTE: FAR
.
.
JMP SALTE
.
.
La etiqueta es declarada externa (EXTRN) y lejana (FAR) porque se encuentra en otro
archivo (arch1.asm) que ser enlazado con arch2.asm.

TRANSFERENCIA DE CONTROL CONDICIONADA


La "inteligencia" de un programa est determinada por la capacidad que tiene de tomar
decisiones con base en ciertas condiciones.
La familia de procesadores 80x86 tiene 16 instrucciones de salto condicionales;
estas instrucciones generalmente siguen a alguna instruccin de comparacin como CMP.
Dichas instrucciones se pueden clasificar en tres diferentes categoras:
1. Las que se usan para comparar DOS ENTEROS SIN SIGNO.
2. Las que sirven para comparar DOS ENTEROS CON SIGNO.

48

3. Las que dependen del ESTADO QUE GUARDE EL REGISTRO DE


BANDERAS.

ISTRUCCIONES USADAS PARA COMPARAR DOS ENTEROS SIN SIGNO


1-

JA O JNBE- Salta si est arriba o salta si no est abajo o si no es igual (jump if


above o jump if not below or equal). El salto se ejecuta si la bandera CF=0 y
ZF=0.

2-

JAE O JNB- Salta si est arriba o es igual o salta si no est abajo (jump if above or
equal o jump if not below). El salto se efecta si CF=0.

3-

JB O JNAE- Salta si esta abajo o salta si no est arriba o si no es igual (jump if


below o jump if not above or equal). El salto se efecta si CF=1

4-

JBE O JNA- Salta si est abajo o si es igual o salta si no est arriba ( jump if
below or equal o jump if not above). El salto se efecta si CF=1 o ZF=1.

5-

JE O JZ- Salta si es igual o salta si es cero (jump if equal o jump if zero). El salto
se efecta si ZF=1 (tambin se aplica a comparaciones de enteros con signo).

6-

JNE O JNZ- Salta si no es igual o salta si no es cero (jump if not equal o jump if
not zero). El salto se efecta si ZF=0 (tambin se aplica a comparaciones de
enteros con signo).

INSRUCCIONES USADAS PARA COMPARA DOS ENTEROS CON SIGNO


1-

JG O JNLE- Salta si es ms grande o salta si no es menor o igual (jump if greater o


jump if not less or equal). El salto se efecta si ZF=0 o OF=SF.

2-

JGE O JNL- Salta si es ms grande o igual o salta si no es menor que (jump if


greater or equal o jump if not less). El salto se efecta si SF=OF.

3-

JL O JNGE- Salta si es menor que o salta si no es mayor o igual (jump if less o


jump if not greater or equal). El salto se efecta si SF es diferente de OF.

49

4-

JLE O JNG- Salta si es menor o igual o salta si no es ms grande (jump if less or


equal o jump if not greater). El salto se efecta si ZF=1 o SF es diferente de OF.

INSTRUCCIONES
BANDERAS

USADAS

SEGN

EL ESTADO

DEL REGISTRO

DE

1-

JC- Salta si hay acarreo (jump if carry). El salto se efecta si CF=1.

2-

JNC- Salta si no hay acarreo (jump if not carry). El salto se efecta si CF=0.

3-

JNO- Salta si no hay desbordamiento (jump if no overflow). El salto se efecta si


OF=0

4-

JNP O JPO- salta si no hay paridad o salta si la paridad es non. El salto se efecta si
pf=0

5-

JNS- salta si el signo esta apagado (jump if not sign). El salto se efecta si sf=0.

6-

JO- salta si hay desbordamiento (jump if overflow). El salto se efecta si OF=1.

7-

JP O JPE- Salta si hay paridad o salta si la paridad es par (jump if parity o jump if
parity even). El salto se efecta si PF=1.

8-

JS- Salta si el signo esta prendido (jump if sign set). El salto se efecta si SF=1.

Anteriormente se mencion que existen 16 diferentes instrucciones condicionales,


pero tomando en cuenta las recin descritas encontrara 18. La razn es que las
instrucciones JC y JB son idnticas, as como JNC y JAE (note que coinciden por las
mismas condiciones).
Un punto adicional que vale la pena mencionar en cuanto a las comparaciones con
signo, es que son necesarias y van de acuerdo con la interpretacin que se le quiera dar a
los bytes o palabras del programa. por ejemplo, suponga que tiene un byte cuyo valor es
11111111 en binario y que desea compararlo con otro cuyo valor es 00000000, "es
11111111 mayor que 00000000 ?", si y no, eso depende de la interpretacin que se le
quiera dar. si trabaja con nmeros enteros sin signo, s lo ser, pues 255 es mayor que 0,
por el contrario, si tiene signo entonces ser menor puesto que -1 es siempre menor que
cero.
Lo anterior lleva a seleccionar las instrucciones de comparacin y de salto de acuerdo con
la interpretacin que se les d a los bytes o palabras. As mismo, es muy importante
advertir que los saltos condicionales se encuentran limitados al rango de -128 a +127
bytes como mxima distancia, ya sea hacia adelante o hacia atrs. si desea efectuar un

50

salto a mayores distancias es necesario


condicionales y no condicionales.

crear una condicin mixta entre saltos

ESTILO DE PROGRAMACIN
Un programa en lenguaje ensamblador es una serie de sentencias ejecutables que le dicen al
ensamblador que operaciones tiene que realizar. Esta serie de sentencias, a menudo, se
denominan cdigo fuente. Como en cualquier otro lenguaje, el cdigo fuente del lenguaje
ensamblador tiene una sintaxis predefinida.
Cada sentencia de lenguaje ensamblador est compuesta de cuatro campos:
Campo nombre Campo operacin Campo operando
Conocer los campos para la realizacin de un programa

Campo comentario.

51

Es la estrucutra para realizacin de programa


Sin embargo, ciertas instrucciones del ensamblador no utilizan todos los campos. El campo
comentario existe para expresar propsitos o documentacin de programacin interna y es
opcional.

CAMPO NOMBRE
El campo del nombre, algunas veces denominado el campo rotulo, asigna un nombre
simblico a la direccin de comienzo de memoria real de una instruccin y elimina la
necesidad de seguir la pista de direcciones de las instrucciones. Esto es especialmente til
al generar cdigo reubicable.
Al utilizar una referencia simblica, el programador permite al enlazador (linker)
seleccionar en qu sitio de memoria ser cargado el programa en lenguaje ensamblador.
Todas las referencias a instrucciones pueden entonces variar automticamente con la
colocacin del cdigo. Aunque a cualquier instruccin se le puede dar un nombre, este
campo esta habitualmente reservado para aquellas instrucciones que sern referenciadas en
las definiciones de datos, constantes, segmentos, lazos, bifurcaciones y llamadas a
subrutinas.
Un nombre debe comenzar con un caracter alfabtico y puede contener hasta 31
caracteres, incluyendo:
-todas las letras de la a a la z.
-dgitos numricos del 0 al 9.
-los smbolos especiales siguientes: - $ . ? @ %
Debe tenerse precaucin al seleccionar un nombre, no se puede utilizar un nombre que
coincida con una palabra reservada o directivo del ensamblador. Si el nombre incluye un
punto (.) , entonces el punto debe ser el primer caracter.
VARIABLES
Un nombre de variable representa una posicin de memoria que es accesible por programa;
y el contenido de esta posicin de memoria puede cambiar durante la ejecucin. Las
definiciones de variables incluyen informacin sobre la direccin de posiciones de
memoria, tipos de datos y tamao. Las variables pueden ser utilizadas como operando en
formas simple, indexada o estructurada.
RTULOS

52

Los nombres aplicados a instrucciones ejecutables en los programas de aplicacin son


referenciados como cdigo relativo. Un nombre, o rotulo en este caso, tiene tres atributos:
1. direccin de segmento,
2. desplazamiento de segmento y
3. descriptor de accesibilidad near o far.
La CPU puede direccionar un rotulo particular de dos formas:
Primera forma:
Si el rotulo que se est referenciando esta en el mismo segmento del cdigo, entonces
solamente se necesita el desplazamiento de segmento para localizar la orden, en este caso,
podramos decir que el tipo del rotulo era near. Para definir un rtulo como near,
inmediatamente despus del rotulo se colocan dos puntos (:) o la pseudo-op near puede ser
usada:
ciclo:
Los dos puntos (:), como se muestra, indican al ensamblador que esta es una instruccin
referenciada en el mismo segmento de cdigo.
En este ejemplo, el rtulo est explcitamente definido como near al usar el rotulo de la
pseudo-op.
Segunda forma:
Para direccionar un rtulo requiere la direccin del segmento y la direccin del
desplazamiento. Este es el caso en que la sentencia del ensamblador a referenciar no est en
el mismo segmento de cdigo, en este caso, el rotulo se define como far.
codigo

label

far

En el ejemplo mostrado, la pseudo-op "label" fue utilizada con el atributo far. Los
atributos far pueden ser tambin utilizados para rotular equate y procedure y sentencias
external, como se ve en los siguientes ejemplos:
diez
imprime
extrn

equ
far
proc far
randm: far

CONSTANTES

10

53

Los nombres tambin pueden ser dados a posiciones de memoria que contienen valores
inicializados que no cambian durante la ejecucin del programa, estos valores inicializados
se denominan constantes, las constantes pueden ser de ocho tipos.
BINARIA: Las constantes binarias contienen una serie de ceros (0) y unos (1) y estn
seguidos por una letra b. por ejemplo:
NUMERO EQU 00001000B

DECIMAL: Las constantes decimales contienen una serie de dgitos del 0 al 9 y estn
opcionalmente seguidas por la letra d. una serie de dgitos se considera como un nmero
decimal a menos que cambie la base, ejemplo:
LUGAR EQU 40D

HEXADECIMAL: Las constantes hexadecimales contienen una serie de dgitos del 0 al 9


e incluyen las letras de la a a la f, seguidas de la letra h. el primer caracter debe ser uno de
los dgitos del 0 al 9, esto indica al compilador que el valor es un nmero y no
posiblemente una referencia de rtulo o nombre de variable. Si el valor hexadecimal
comienza con una de las letras de la a a la f, entonces aadiendo un 0 al principio se
eliminara esta ambigedad interpretada por el compilador, una declaracin de constantes
hexadecimal seria:
QUINTO EQU
VALOR EQU

32H
OFFH

En este ejemplo, el 0 fue aadido para indicar al ensamblador que ffH era un nmero
hexadecimal, no un rtulo o nombre de variable.
OCTAL: Las constantes octales contienen los dgitos del 0 al 7 seguidos por la letra o o q,
por ejemplo:
CANTIDAD EQU 6O 6Q

CARACTER: Las constantes de caracteres pueden contener cualquier caracter ASCII


encerrado entre comillas simples o dobles. Si una constante contiene ms de dos caracteres,
la pseudooperacin db (definir byte) debe ser utilizada. Si la cadena de caracteres contiene
slo uno o dos caracteres, entonces pueden ser utilizadas las pseudos-ops dd, dq, dt o dw.
Por ejemplo:
INICIO
DD
NOMBRE DB

`B`
"J WILLIAMS"

PUNTO FLOTANTE: Este tipo de dato representa valores en notacin cientfica decimal
y no est soportado por el small assembler de IBM . por ejemplo:
SENO DD O.322E-1

54

REAL HEXADECIMAL: Esta es una constante que contiene los dgitos del 0 al 9 y las
letras de la a a la f, seguidas por la letra r. igual que las constantes hexadecimales, el primer
caracter debe ser uno de los dgitos del 0 al 9. La constante debe contener un nmero total
de dgitos que igualen a 8, 16 o 20, a menos que el primer dgito sea un 0, en este caso, el
nmero total de dgitos debe ser uno mayor (9,17 21). Este tipo de dato tampoco est
soportado por el small assembler de IBM. por ejemplo:
NUMERO_DE_HORAS

DD OFAB12345R

EQUATES: Un rtulo en el campo de nombre puede ser asignado al valor de una


expresin del campo de operando utilizando la pseudo-op equ o el signo igual (=). La
pseudo-op equ asigna a la variable una constante que no puede cambiar durante la
ejecucin del programa. Si se utiliza la pseudo-op signo =, el valor de la constante puede
ser cambiado durante la ejecucin del programa. Por ejemplo:
SCRADD
BASNUM

EQU [BP + 16]


= 1980

En el primer ejemplo, scradd equ [bp + 16], el nombre scradd puede ser sustituido en lugar
de la expresin ndice [bp + 16]. Igualmente, -basnum- se le puede reasignar un nuevo
valor mientras el programa estaba en ejecucin.

CAMPO OPERACIN
El campo de operacin contiene un nemotcnico para una instruccin real del
microprocesador, el nemotcnico es una "ayuda de memoria" de dos a seis caracteres. En
lugar de ser un valor binario o hexadecimal para una instruccin mquina, el nemotcnico
es una abreviatura en ingls, el nemotcnico de operacin hace el cdigo ms fcil de leer y
comprender y es solamente una tabla de conversin interna del valor binario de cdigo
mquina real. Una operacin o nemotcnico puede representar una instruccin mquina,
macroinstruccin o pseudo-operacin, por ejemplo:
INICIAL:

MOV

AX,19H

INICIAL es el rtulo y MOV es la operacin. Siguiendo al campo de operacin se


encuentra el campo de operando. Cada operacin no slo le dice al ensamblador qu
instruccin debe ejecutar sino cuntas operaciones se necesitan y de qu tipo.
Una operacin puede contener una referencia a una macro. Tal referencia indica al
ensamblador cmo procesar una secuencia predefinida de cdigo, esto hace que el
ensamblador genere instrucciones en cdigo fuente como si estuviesen en la parte original
del programa, por ejemplo:
DOS__INT

MACRO

SERVICIO__ID

55

Esta operacin avisa al ensamblador y le indica que el cdigo siguiente es parte de la


definicin macro. Una pseudo-operacin, abreviadamente pseudo-op, habitualmente no
produce cdigo mquina pero en su lugar dirige al ensamblador para que realice ciertas
operaciones sobre datos, listados de cdigo, bifurcaciones y macros.

CAMPO OPERANDO
El campo de operandos contiene la posicin o posiciones donde estn los datos que van a
ser manipulados por la instruccin, la instruccin puede requerir uno o dos operandos, si
hay dos operandos, stos estn separados por una coma (,).
Cuando una operacin requiere dos operandos, el primer operando se denomina operando
destino y el segundo se denomina operando fuente. Operaciones de transferencia de datos,
registros, almacenamiento inmediato y almacenamiento de memoria son ejemplos de
instrucciones que requieren dos operandos, por ejemplo:
MOV

AX,8

Este es un ejemplo de operando inmediato. Aqu, el dato a ser manipulado se incluye como
operando fuente y se desplaza al registro AX, u operando destino.

CAMPO COMENTARIO
El campo comentario es el ltimo de los cuatro campos y puede ser uno de los ms tiles.
El campo comentario se utiliza para documentar internamente el cdigo fuente del
ensamblador y son tiles slo al listar el cdigo fuente. Si un comentario se incluye con una
instruccin de operacin, entonces debe estar separado del ltimo campo por al menos un
espacio en blanco y comenzar con un punto y coma (;), un comentario debe ser utilizado
para describir aquellas lneas de cdigo fuente que no son comprensibles inmediatamente.
por ejemplo:
MOV AH,45H

;PARMETRO PARA LEER UN CARACTER

ALMACENAMIENTO
Un programa es simplemente una secuencia de bytes (visto desde el punto de vista del
procesador), al igual que el rea de datos que maneja, y dichos bytes se encuentran
ubicados en alguna parte de la memoria. El procesador no hace distinciones entre un
nmero entero y una cadena de caracteres, simplemente los trata como localidades de
memoria. Por otro lado, el ensamblador permite distinguir entre formatos y cantidad de
bytes por almacenar, se puede solicitar el almacenamiento como se indica:
DB

1 byte

56

DW
DD
DF, DP
DQ
DT

2 bytes = una palabra


4 bytes = una doble palabra
6 bytes = una palabra de puntero lejano (386)
8 bytes = una cudruple palabra
10 bytes