Sei sulla pagina 1di 55

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 A CABO LOS DEMAS LENGUAJES DE PROGRAMACION.

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,
OPTIMIZACION.

HACIENDO

MY

DIFICIL

SU

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:
DESVENTAJA

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 CONVENCIN RESPECTO


AL USO DE INTERRUPCIONES.

DEBE TENERSE PRESENTE QUE EL PROGRAMA PUEDE


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

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 UN SISTEMA 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.)

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:
CATEGORA

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
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.

10

ESTADO DE LAS BANDERAS:


Estado
DESACTIVADA
ACTIVADA

Estado
DESACTIVADA
ACTIVADA

Overflow (O)

Direction (D)

Interrupt (I)

Sign (S)

Zero (Z)

NV
OV

UP
DN

DI
EI

PL
NG

NZ
ZR

Auxiliary (A)

Parity (P)

Carry (C)

NA
AC

PO
PE

NC
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.


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

11

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
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

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).

13

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.

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 CX,1
JNZ INICIO_DEL_CICLO

14

LAS INSTRUCCIONES ENTRE 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 A 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
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.

MOV
MOV
MOV
DIV

DX,0012
AX,3456
BX,100
BX

LA INSTRUCCION DIV BX VA A HACER QUE SE DIVIDA AL PAR DE


REGISTROS DX Y AX ENTRE BX, O SEA 00123456/100 = 1234 QUE ES
EL RESULTADO EN AX Y 56 QUE ES EL RESULTADO EN DX.

15

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 :
MOV
MOV
MOV
MOV

AX,0015
DS,AX
SI,20
AL, [SI]

CARGA EL VALOR DE 8 BITS ALMACENADO EN LA


DIRECCION 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

AN

MEJOR,

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.
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.

16

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
MOV
MOV
ADD

AX,0
DS,AX
DI,1024
BL,[DI]

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 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.

17

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.
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 :

18

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

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
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.

19

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
UN REGISTRO DE SEGMENTO DE 16 BITS PARA FORMAR UN
DIRECCIONAMIENTO DE MEMORIA TOTAL DE 20 BITS.

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.

21

MOV
MOV
MOV
MOV

POR EJEMPLO, CONSIDERESE EL


SIGUIENTE CODIGO:

AX,1000h
DS,AX
SI,201 h
DL,[SI]

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 ES CARGADA DESDE ((DS*16)+SI) ((1000h*16)+201).

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 :
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:

22

. 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.
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.

23

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

EL
DE
EL
EL

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.
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.

24

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
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

Direccin de 20 bits

IP

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.

25

La instruccin del CPU especifica cules registros internos se usan para generar
el offset.
Se tienen siete modos de direccionamiento que son:

INMEDIATO
DE REGISTRO
DIRECTO
DIRECCIONAMIENTO

DE REGISTRO INDIRECTO
RELATIVO A LA BASE
INDEXADO DIRECTO
BASE INDEXADO

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

26

Ejemplos:
; AX BX
; AL BL

MOV AX, BX
MOV 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
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

27

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

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]

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:

28

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.
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

29

PERACIONES ARITMTICAS
BSICAS

O
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.

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 DX,5
MOV CX,6
ADD DX,CX

30

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.

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
------------PA1-----------00
53

11101100
01100000 (5,500,000)
------------PB1------------EC
60

B = 00000000
00110110 11101110
10000000 (3,600,000)
------------PA2------------ -------------PB2------------00
36
EE
80

31

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
PA2

00000000 01010011
ADC
00000000 00110110
-------------------------------00000000 10001010

00 53
ADC
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

32

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:

SUB (RESTA SIN ACARREO).


SBB (RESTA CON ACARREO).

TRABAJAN CON DOS OPERANDOS.

DEC (DECREMENTO).

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.

33

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:
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).

34

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.

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

35

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
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.

36

-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

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).

37

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

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

38

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
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.

39

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

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

desplaza 1 vez el contenido de reg


desplaza tantas veces el contenido de reg como
indique CL.

SAL/SHL mem, 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

desplaza 1 vez el contenido de reg


desplaza tantas veces el contenido de reg como
indique CL.

SAR mem, CL

Afecta a todos los bit del registro de estado.

41

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

desplaza 1 vez el contenido de reg


desplaza tantas veces el contenido de reg como
Indique CL.

SHR mem, CL

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

desplaza 1 vez el contenido de reg


desplaza tantas veces el contenido de reg como
Indique CL.

RCL mem, 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

42

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

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.


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.

43

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
MOV
MOV
MUL

AX, 40h
DX, 00h
BX, 04h
BX

44

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:
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.

45

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
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.

46

..
..
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.
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.

47

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.
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).

48

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.

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 USADAS SEGN EL ESTADO DEL REGISTRO DE


BANDERAS
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).

49

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
salto a mayores distancias es necesario crear una condicin mixta entre saltos
condicionales y no condicionales.

50

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

Campo comentario.

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.

51

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
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

52

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

10

CONSTANTES
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,

53

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

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

54

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

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

55

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
DW
DD
DF, DP
DQ
DT

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

Potrebbero piacerti anche