el lenguaje ensamblador

65
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 CÓMO 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.

Upload: danno-mars

Post on 13-Jan-2016

258 views

Category:

Documents


2 download

DESCRIPTION

Codigo para lenguajes de interfaz

TRANSCRIPT

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

CÓMO 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.

2

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.

RAZÓN VENTAJA

1

EL ENSAMBLADOR BRINDA LA OPORTUNIDAD DE CONOCER

MÁS A FONDO LA OPERACIÓN DE LA PC. ESTO PERMITE

IMPLEMENTAR SOFTWARE O HARDWARE DE UNA FORMA

MÁS CONCIENTE (COMPRENDIENDO CÓMO Y POR QUÉ LO

HACE), EN LUGAR DE SEGUIR UNA RECETA FIJA.

2

SE CONSERVA EL CONTROL TOTAL DE LO QUE DEBERA

HACER LA PC, SIEMPRE Y CUANDO ESTA SEA FISICAMENTE

CAPAZ DE HACERLO.

3

LOS PROGRAMAS EN ENSAMBLADOR SON MÁS RÁPIDOS,

MÁS COMPACTOS Y TIENEN MAYOR CAPACIDAD QUE LOS

CREADOS EN OTROS LENGUAJES.

4

SE PUEDEN OPTIMIZAR AL MAXIMO LOS PROGRAMAS

( TANTO EN TAMAÑO COMO EN VELOCIDAD DE

EJECUCIÓN). EN EL CASO DE OTROS LENGUAJES YA EXISTE

CODIGO QUE SE GENERA DE FORMA PREDEFINIDA,

HACIENDO MÚY DIFICIL SU OPTIMIZACION.

3

LA SIGUIENTE TABLA PRESENTA EL TAMAÑO 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 CÓMO 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 código

.EMP: ;Etiqueta el comienzomov ax, @data ;Permite acceso a datosmov ds,ax ;a través de dsmov dx, offset mens ;Prepara para desplegarmov ah,9 ;Invoca la función 9 deint 21h ;la int 21 para desplegarmov ah,4ch ;Invoca la función 4ch deint 21h ;la int 21 para terminarend EMP ;cierra etiqueta de comienzo=====================================================================

4

AHORA QUE SE HA VISTO LA DIFERENCIA ENTRE LENGUAJES,

TAMBIEN ES JUSTO SEÑALAR LOS PROBLEMAS QUE SE TIENEN AL

TRABAJAR CON EL LENGUAJE ENSAMBLADOR:

DESVENTAJA

1

UNA INSTRUCCIÓN MAL INTERPRETADA O UN ERROR DE

LÓGICA EN EL PROGRÁMA PUEDEN CREAR UN CAOS, A

TAL GRADO QUE SERA NECESARIO APAGAR Y ENCENDER

DE NUEVO LA PC.

2

LA INSUFICIENCIA DE CONOCIMIENTOS SOBRE EL

FUNCIONAMIENTO INTERNO DE LA PC PUEDE CAUSAR

EFECTOS IMPREDECIBLES.

3ES NECESARIO AJUSTARSE A UNA CONVENCIÓN

RESPECTO AL USO DE INTERRUPCIONES.

4

DEBE TENERSE PRESENTE QUE EL PROGRAMA PUEDE

VOLVERSE MÁS COMPLEJO CONFORME SE LE AGREGAN

RUTINAS O FUNCIONES ADICIONALES.

SUBSITEMA DE ARITMETICA(SUMA, RESTA,

MULTIPLICACION, DIVISION, AND, OR, OR-EXCLUSIVO,

ETC.)

SUBSITEMA DE CONTROL

(COORDINA TODO)

SUBSITEMA DE MEMORIA

(HASTA 1 MB DE RAM Y/O ROM)

SUBSITEMA DE SALIDA

(PANTALLA, IMPRESORA, PLOTTER,

DISCO, ETC.)

SUBSITEMA DE ENTRADA

(TECLADO, MOUSE, DISCO, JOYSTICK.)

CPU

5

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. ENTRADA2. CONTROL3. ARITMETICA Y LOGICA4. MEMORIA5. SALIDA

6

EN EL SUBSITEMA DE ARITMÉTICA, ES DONDE SE REALIZAN LAS

OPERACIONES ARITMÉTICAS Y LÓGICAS, DESPUÉS 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 NÚMEROS. 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.

7

MEMORIA

EL PROCESADOR ES CAPÁZ 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

DIRECCIÓN 0FFFFF QUE SE ENCUENTRA EN NOTACIÓN 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 MÁS 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 PRECISIÓN.

8

8 BYTES JUNTOS (CUADRUPLE PALABRA) PUEDEN MANEJAR UN VALOR

DE PUNTO FLOTANTE DE DOBLE PRECISION.

REGISTROS

EL PROCESADOR OFRECE UNOS RÁPIDOS ELEMENTOS DE

ALMACENAMIENTO EN UN CHIP, CONOCIDOS COMO REGISTROS.

LOS REGISTROS SON LAS LOCALIDADES DE MEMORIA QUE EL

PROCESADOR PUEDE ACCESAR MÁS RÁPIDO 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

DESCRIPCIÓN

1 LOS REGISTROS DE BANDERA2 LOS REGISTROS DE PROPÓSITO GENERAL3 EL APUNTADOR DE INSTRUCCIONES4 LOS REGISTROS DE SEGMENTO

9

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 CUÁNDO 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 ARITMÉTICA Y LÓGICA.

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 ARITMÉTICAS Y LÓGICAS 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 Overflow (O) Direction (D) Interrupt (I) Sign (S) Zero (Z)DESACTIVADA NV UP DI PL NZACTIVADA OV DN EI NG ZR

Estado Auxiliary (A) Parity (P) Carry (C)DESACTIVADA NA PO NCACTIVADA AC PE CY

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 statusCF, PF, AF, ZF, SF, OF.

· Overflow NV = no hay desbordamientoOV = Sí lo hay

· Direction UP = hacia adelanteDN = hacia atrás

· Interrupts DI = desactivadasEI = activadas

· Sign PL = positivoNG = negativo

· Zero NZ = no es ceroZR = sí lo es

· Auxiliary Carry NA = no hay acarreo auxiliarAC = hay acarreo auxiliar

· Parity PO = paridad nonPE = paridad par

· Carry NC = no hay acarreoCY = sí lo hay

11

Estas 6 últimas banderas representan el resultado de una operación aritméticao lógica. Permiten al programa alterar el curso de ejecución basado en los valores

lógicos que almacenan

· AF Llevar auxiliar = 1, indica que hubo “llevar” del nibble (4 bits) 0 al nibble 1. O un “pedir préstamo” del nibble alto al nibble bajo.

· CF Llevar = 1, cuando ha ocurrido un “llevar” o “pedir préstamo” del resultado (8 o 16 bits)

· OF Sobreflujo = 1, indica que ha ocurrido un sobreflujo aritmético. Esto significa que el tamaño del resultado excede la capacidad de ALMACENAMIENTO del destino y el dígito significativo se perdió.

· SF Signo. Esta bandera se activa cuando el bit más significativo del resultado es 1. Ya que los números binarios negativos son representados usando notación C2, SF refleja el signo del resultado:0 indica +1 indica –

· PF Paridad. Cuando esta bandera está activa, el resultado de la operación tiene un número par de unos. Esta bandera se usa para verificar errores en la transmisión.

· ZF Cero. Esta bandera se activa cuando el resultado de la operación es cero. Las tres banderas de control serán discutidas después durante el curso

· DF = bandera de dirección , SELECCIÓNA 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 interrupción

· TF = bandera de trampa

12

OS REGISTROS DE PROPÓSITO GENERALL

LOS OCHO REGISTROS DE PROPOSITO GENERAL DEL PROCESADOR

(CADA UNO DE 16 BITS DE LONGITUD) ESTAN INVOLUCRADOS EN LA

OPERACIÓN 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 ARITMÉTICA Y LÓGICA, POR EJEMPLO :

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 MÁS EFICIENTE

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.

MOV AX,5

MOV DX,9

ADD AX,DXt

13

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

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,

CUANDO BX ES USADO COMO UN APUNTADOR DE MEMORIA, ESTE

HACE UNA RELACION AL REGISTRO DE SEGMENTO DS.

EL REGISTRO CX

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.

MOV AH,7

MOV AL,AH

INC AL

CARGA AL CON EL CONTENIDO DE LA

DIRECCIÓN DE MEMORIA 9.MOV AX,200MOV DS,AXMOV BX,9MOV AL, [BX]

14

EL REGISTRO CX ESPECIALMENTE ES UN CONTADOR. EN EL

SIGUIENTE EJEMPLO SE DESEA REPETIR UN BLOQUE DE INSTRUCCIONES

10 VECES, ESTO SE LOGRA CON :

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 MÁS COMPACTA Y CON RESULTADOS MÁS RÁPIDOS; LA

INSTRUCCION ES LLAMADA LOOP, ESTA RESTA 1 A CX Y BRINCA SI CX

NO ES CERO, TODO EN UNA INSTRUCCION :

EL REGISTRO DX

EL REGISTRO DX ESTA RELACIONADO CON LA DIVISIÓN Y

MULTIPLICACIÓN; 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 DIVISIÓN, EL RESIDUO DE ESTA ES

MOV CX,10INICIO_DEL_CICLO:

<<INSTRUCCIONES A REPETIR>> SUB CX,1

MOVCX,10INICIO_DEL_CICLO :

<<INSTRUCCIONES A REPETIR>>LOOP INICIO_DEL_CICLO

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.MOVDX,0012MOVAX,3456MOVBX,100DIVBX

CARGA EL VALOR DE 8 BITS ALMACENADO EN LA DIRECCION 20 EN AL.MOVAX,0015MOVDS,AXMOVSI,20MOVAL, [SI]

15

ALMACENADO EN DX (LOS 16 BITS BAJOS DEL DIVIDENDO DEBEN SER

PUESTOS EN AX) Y EL COCIENTE ES GUARDADO EN AX.

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 :

TAMBIEN SI ES UN APUNTADOR USUAL DE MEMORIA CUANDO SE

UTILIZA CON INSTRUCCIONES DE CADENA, POR EJEMPLO :

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.

CLDMOV AX,0MOV DS,AXMOV SI,20LODSB

16

AÚN MEJOR, LAS INSTRUCCIONES DE CADENA PUEDEN SER

REALIZADAS AUTOMATICAMENTE REPITIENDO ESTAS ACCIONES

CUALQUIER NÚMERO 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 :

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

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.

MOV AX,0MOV DS,AXMOV DI,1024ADD BL,[DI]

17

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 :

EN RESUMEN, BP ESTA DISEÑADO 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 CÓMO SP, AX Y BX

CAMBIAN CUANDO EL SIGUIENTE CODIGO ES EJECUTADO, ASUMIENDO

QUE SP ESTA PUESTO INICIALMENTE A 1000 :

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.

PUSH BPMOV BP,SPMOV AX,[BP+4]

18

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.

MOV AX,1PUSH

AXMOV BX,2PUSH

BXPOP AX

19

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 FUNCIÓN) 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.

EL 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 INSTRUCCIÓN ES EJECUTADA, EL IP ES

AVANZADO PARA APUNTAR A LA INSTRUCIÓN EN LA SIGUIENTE

DIRECCIÓN DE MEMORIA QUE NORMALMENTE ES LA INSTRUCCIÓN 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 DIRECCIÓN EN LA CUÁL

RESIDE LA SIGUIENTE INSTRUCCIÓN QUE SERA EJECUTADA; EL

REGISTRO SEGMENTO DE CODIGO (CS) PROVEE UNA BASE PARA LA

DIRECCIÓN Y EL IP PROVEE EL DESPLAZAMIENTO PARA ESTA BASE.

20

LOS 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 SÓLO 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 DIRECCIÓN

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 DESPUÉS SE LE SUMA EL DESPLAZAMIENTO.

21

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

MOV

AX,1000hMOV DS,AXMOV SI,201 h

POR EJEMPLO, CONSIDERESE EL

SIGUIENTE CODIGO:

22

DE DIRECCIONAMIENTO DEL PROCESADOR OPERAN RELATIVAS A

ALGUNO DE LOS REGISTROS SEGMENTO.

EL NOMBRE DEL SEGMENTO MÁS COMÚN ES @DATA EL CUAL SE

REFIERE AL SEGMENTO DE DATOS POR DEFECTO CUANDO LAS

DIRECTIVAS SIMPLIFICADAS DE SEGMENTOS SON USADAS, POR

EJEMPLO:

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 MÁXIMA DE MEMORIA QUE PUEDE SER DIRECCIONADA

CON UN DESPLAZAMIENTO DE 16 BITS.

. MODEL SMALL

. DATA

VAR1 DW 0

.

.

. CODE

MOV AX, @DATA

MOV DS, AX

.

.

END

23

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.

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

24

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.

MODOS DE DIRECCIONAMIENTO

Generación de la dirección de la instrucción.

Todos los registros internos del procesador son de 16 bits. El bus de dirección es de 20 bits, por lo que se usa más de un registro interno para generar la dirección de 20 bits.

Los 2 registros usados para la dirección de la instrucción son el IP y el CS. Se combinan en una forma especial para generar la dirección de 20 bits.

dirección de 20 bits = 1610 * CS + IP

Por ejemplo: Si los registros CS e IP contienen los valores:CS = 1000HIP = 0414 H

La dirección de 20 bits es:1610 * 1000H + 0414H = 10000H + 0414H = 10414H

Esta es la dirección en memoria desde la cual la nueva instrucción debe buscarse.

Al registro IP se le refiere como offset, el registro CS * 1610 apunta a la dirección de inicio o segmento en memoria desde el cual se calcula el offset. La Figura A muestra gráficamente cómo se calcula la dirección de 20 bits.

CS * 16

IP+ Dirección de 20 bits

Bus de direcciónDel sistema

FIGURA A. Cálculo de la dirección de 20 bits

25

Cada dirección 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 instrucción del CPU especifica cuáles 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 continuación se muestran los diferentes modos de direccionamiento tomando como ejemplo la instrucción MOV.

Instrucción MOV

Transfiere uno o dos bytes desde el operando fuente al operando destino. Tiene el siguiente formato:

MOV destino, fuente

DS * 16

DIRECCION DEL SISTEMA DE 20 BITS

+

COUNT = CONSTANTE

26

Direccionamiento Inmediato

El operando fuente aparece en la instrucción. 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 propósito 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 ; AX BXMOV AL, BL ; AL BL

Cuando se usa el direccionamiento de registro, el CPU realiza las operaciones internamente, es decir, no se genera dirección de 20 bits para especificar el operando fuente.

Direccionamiento Directo

Especifica en la instrucción la localidad de memoria que contiene al operando. En este tipo de direccionamiento, se forma una dirección de 20 bits.

Ejemplo:

MOV CX, COUNT

El valor de COUNT es una constante. Es usada como el valor offset en el cálculo de la dirección de 20 bits

El procesador siempre usa un registro de segmento cuando calcula una dirección física.

El registro que se usa para esta instrucción es DS.

En la Figura B, se muestra el cálculo de la dirección desde la cual se tomará el dato que se carga en CX.

27

Este es el segmento por omisión que se usa. Sin embargo, cualquiera de los 4 segmentos puede usarse. Esto se efectúa especificando el registro apropiado en la instrucción.

Por ejemplo, suponiendo que se desea usar el registro ES en lugar del DS:

MOV CX, ES: COUNTDireccionamiento de Registro Indirecto

Con el modo de direccionamiento de registro índice, la dirección offset de 16 bits está contenida en un registro base o registro índice. Esto es, la dirección 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 dirección de 20 bits.

Otra vez, debe usarse un registro de segmento para generar la dirección final. El valor de 16 bits en SI se combina con el segmento apropiado para generar la dirección.

Direccionamiento relativo a la base

En esta modalidad, la dirección del operando se obtiene al aumentar un desplazamiento a los siguientes registros: BX o BP. En este caso, los registros deben contener la dirección de offset.

Ejemplo:

MOV AX, [BX+2]a

28

Para calcular una dirección de memoria, el offset indicado por el registro de BX se toma en función al registro de segmentos DS, y el desplazamiento indicado por el registro BP se toma en función al registro de segmento SS.

Direccionamiento indexado directo

Este tipo de direccionamiento incluye a los dos modos de direccionamiento anteriores. La dirección 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 nemotécnico para esta construcción es:

MOV AX, COUNT [DI]

Si: COUNT = 0378H DI = 04FAH 0872H

Entonces, la dirección offset de 16 bits es 0872H

Direccionamiento base indexado

Este es el modo de direccionamiento más complejo. Es idéntico al modo de direccionamiento anterior, excepto que se suma una constante.

Ejemplo: Suponiendo que se tienen los siguientes valores en los registros:

DI = 0367HBX = 7890HCOUNT = 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 dirección offset de 16 bits es 7C09H. La dirección completa en 20 bits se calcula de la expresión:

1610 * DS + 7C09H

Si el DS contiene 3000H, la dirección completa de 20 bits es:

ADD (SUMA SIN ACARREO). ADC (SUMA CON ACARREO).INC (INCREMENTO). TRABAJAN CON DOS OPERANDOS.TRABAJA CON UN OPERANDO.

29

30000H + 7C09H = 37C09H

EXAMEN UNIDAD 2

PERACIONES ARITMÉTICAS BÁSICASO

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:

LA INSTRUCCIÓN ADD

SUMA EL OPERANDO FUENTE AL DESTINO Y DEJA EL RESULTADO EN EL

DESTINO.

ADD destino,fuente

30

POR EJEMPLO, LA INSTRUCCIÒN ADD DX,5 SUMARÀ AL REGISTRO DX EL

OPERANDO INMEDIATO 5 Y DEJARÀ EL RESULTADO EN EL REGISTRO DX. LA

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

LA INSTRUCCIÓN ADC

SUMA EL OPERANDO FUENTE AL DESTINO MÁS EL POSIBLE ACARREO DE LA OPERACIÓN 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 INSTRUCCIÓN ADC O SUMA CON ACARREO. DICHA INSTRUCCIÓN

REALIZA LA SUMA Y AUTOMÁTICAMENTE 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:

31

SE SUMARÁN 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 11101100 01100000 E C 6 0 ADD ADDPB2 11101110 10000000 E E 8 0 -------------------------------- --------------- 11011010 11100000 D A E 0 (LA BANDERA DE ACARREO SERÍA 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 0 0 5 3 ADC ADCPA2 00000000 00110110 0 0 3 6 -------------------------------- ------------ 00000000 10001010 0 0 8 A

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

11011010 11100000 (correspondiente a la palabra baja). SU EQUIVALENTE EN

HEXADECIMAL SERÍA 8ADAE0 Y EN DECIMAL 9,100,000.

SUB (RESTA SIN ACARREO). SBB (RESTA CON ACARREO).DEC (DECREMENTO). TRABAJAN CON DOS OPERANDOS.TRABAJA CON UN OPERANDO.

32

NOTE QUE EL RESULTADO SE DEJA EN EL FORMATO PALABRA ALTA:PALABRA

BAJA. EL MÉTODO EN SÍ NO ES COMPLICADO, VEAMOS EL CODIGO

NECESARIO PARA IMPLEMENTAR EL EJEMPLO ANTERIOR:

MOV AX, EC60 palabra baja de la cantidad AADD AX, EE80 suma a AX la palabra baja de la cantidad B se genera un acarreo (CF se activa)

MOV DX, 0053 palabra alta de la cantidad AADC DX, 0036 suma a DX la palabra alta de la cantidad B y también le suma el acarreo (CF = 1) el resultado queda en el registro par DX:AX

LA INSTRUCCIÓN INC

UNA DE LAS OPERACIONES DE SUMA MÀS USADA ES LA DE INCREMENTAR

EN UNO CUALQUIER REGISTRO O LOCALIDAD DE MEMORIA. PARA ESTE

PROPÒSITO SIRVE LA INSTRUCCIÒN INC (USA UN SOLO OPERANDO Y LO

INCREMENTA EN UNO). INC AX REALIZARÌA LA OPERACIÒN DE AX = AX +1.

ADVIERTA QUE SE AHORRA EL USO DE LA INSTRUCCIÒN ADD AX,1, PUES

INC ES MÀS RÀPIDA EN EJECUCIÒN 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 SÓLO CON UNO.

DICHAS INSTRUCCIONES SON:

LA INSTRUCCIÓN SUB

33

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 INSTRUCCIÓN SBB

LE RESTA AL OPERANDO DE DESTINO EL OPERANDO FUENTE, INCLUYENDO

EL ACARREO.

SBB destino,fuente

PARA ESTA INSTRUCIÓN SE PUEDE APLICAR EL MISMO ALGORITMO

SEÑALADO EN LA SUMA PARA TRABAJAR CON CANTIDADES DE 32 BITS. LO

ÚNICO QUE CAMBIA ES EL ORDEN DE OPERACIÓN SOBRE LAS PALABRAS.

EN LUGAR DE TENER PA1 + PB1 SE TENDRÍA PA1 - PB1; EN LUGAR DE TENER

PA2 + PB2 SE TENDRÍA PA2 - PB2, Y EN LUGAR DE USAR LA INSTRUCCIÓN

ADC SE USARÍA SBB, RESTA CON ACARREO.

EJEMPLO:

MOV AX, EC60 palabra baja de la cantidad ASUB AX, EE80 resta a AX la palabra baja de la cantidad B se genera un acarreo (CF se activa)

MOV DX, 0053 palabra alta de la cantidad ASBB DX, 0036 resta a DX la palabra alta de la cantidad B y también le resta el acarreo (CF = 1) el resultado queda en el registro par DX:AX

34

LA INSTRUCCIÓN DEC

LA INSTRUCCIÓN DEC SE UTILIZA PARA DECREMENTAR UN OPERANDO EN

UNA UNIDAD, DEC AX REALIZARÌA LA OPERACIÒN DE AX = AX - 1.

MULTIPLICACIONES

SE TIENEN DOS INSTRUCCIONES PARA MULTIPLICAR VALORES, ESTAS SON:

LA INSTRUCCIÓN MUL

EXISTEN DOS FROMAS DE MULTIPLICAR, MULTIPLICACIÓN DE 8 BITS Y

MULTIPLICACION DE 16 BITS.

MULTIPLICACIÓN 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 10028B7:0100 MOV AL,FF ;pone en AL el máximo valor representable de 8 bits28B7:0102 MOV CL,6 ;y lo multiplica por 6 dejando el resultado en28B7:0104 MUL CL ;el registro AX.28B7:0106 INT 2028B7:0108-G 106

AX=05FA BX=0000 CX=0006 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000DS=28B7 ES=28B7 SS=28B7 CS=28B7 IP=0106 OV UP EI PL NZ AC PE CY28BB7:0106 CD20 INT 20

EN ESTE TÍPO DE MULTIPLICACIÓN, EL MULTIPLICANDO SIEMPRE SE

ENCUENTRA EN EL REGISTRO AL Y EL MULTIPLICADOR ES EL OPERANDO

MUL (MULTIPLICACIÓN SIN SIGNO). IMUL (MULTIPLICACIÓN CON SIGNO).

35

ORIGEN (CL EN ESTE EJEMPLO) Y EL RESULTADO SE ALMACENARÁ EN EL

REGISTRO AX. (OPERANDO * AL = AX)

MULTIPLICACIÓN 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 10028B7:0100 MOV AX, FFFF ;pone 65535 en AX28B7:0103 MOV CX, FFFF ;pone 65535 en CX28B7:0106 MUL CX ;multiplica las dos cantidades y deja el resultado28B7:0108 INT 20 ;en el registro par DX:AX28B7:010A-G 108

AX=0001 BX=0000 CX=FFFF DX=FFFE SP=FFEE BP=0000 SI=0000 DI=0000DS=28B7 ES=28B7 SS=28B7 CS=28B7 IP=0108 OV UP EI NG NZ AC PO CY28B7: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 TÍPO DE MULTIPLICACIÓN, 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 INSTRUCCIÓN 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.

36

C:\DEBUG-A 10028B7:0100 MOV AL,-128B7:0102 MOV CL,628B7:0104 MUL CL28B7:0106 MOV AL,-128B7:0108 IMULCL28B7:010A INT 2028B7:010C-G 104

AX=00FF BX=0000 CX=0006 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000DS=28B7 ES=28B7 SS=28B7 CS=28B7 IP=0104 NV UP EI PL NZ NA PO NC28B7:0104 F6E1 MUL CL

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

(FFh) Y 6, RESPECTIVAMENTE.

-G 106AX=05FA BX=0000 CX=0006 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000DS=28B7 ES=28B7 CS=28B7 CS=28B7 IP=0106 OV UP EI PL NZ AC PE CY28B7: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 10AAX=FFFA BX=0000 CX=0006 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000DS=28B7 ES=28B7 SS=28B7 CS=28B7 IP=010A NV UP EI NG NZ AC PE NC28B7:010A CD20 INT 20

USANDO LA INSTRUCCION IMUL SE OBTIENE COMO RESULTADO FFFA

HEXADECIMAL, QUE ES EL COMPLEMENTO A dos DEL NÚMERO POSITIVO

6 Y POR ENDE ES IGUAL A -6.

ALOPERANDO AXAH

37

PARA COMPROBARLO SIGAMOS LOS PASOS DEL COMPLEMENTO A dos,

EL NÚMERO 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:

LA INSTRUCCIÓN DIV

EXISTEN DOS FROMAS DE DIVISIÓN, DIVISIÓN DE 8 BITS Y DIVISIÓN DE 16

BITS.

DIVISIÓN 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,

EJEMPLO:

DIV (DIVISIÓN SIN SIGNO). IDIV (DIVISIÓN CON SIGNO).

AXOPERANDO DX:AXDX

38

C:\DEBUG-A 100250E:0100 MOV AX,00FF250E:0103 MOV BL,8250E:0105 DIV BL250E:0108 INT 20250E:0109

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

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

Y EL RESIDUO EN EL REGISTRO AH

DIVISIÓN 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,

EJEMPLO:

C:\DEBUG-A100250E:0100 MOV AX,FFFF250E:0103 MOV BX,2250E:0106 DIV BX250E:0108 INT 20250E:010A

-G108

39

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

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

RESIDUO EN EL REGISTRO DX (1).

LA INSTRUCCIÓN IDIV

ESTA INSTRUCCIÓN 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, SEGÚN EL OPERANDO SEA DE UN BYTE O DE UNA PALABRA. EL RESIDUO SE ALMACENA EN EL REGISTRO AH O DX.

EJEMPLO:

C:\DEBUG-A 100250E:0100 MOV AX,FFED ; dividendo = -19250E:0103 MOV BL,2 ; divisor = 2250E:0105 IDIV BL250E:0108 INT 20250E:0109

-G 108AX=01F7 BX=0008 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000DS=250E ES=250E SS=250E CS=250E IP=0107 NV UP EI PL NZ AC PO NC250E: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).

CF 0

40

INSTRUCCIONES DE DESPLAZAMIENTO Y ROTACIÓN.

· SHL, SAL desplazar a la izquierda (desplazamiento aritmético)· SHR desplazar a la derecha· SAR desplazamiento aritmético a la derecha

· ROL rotación a la izquierda· ROR rotación a la derecha· RCL rotación con acarreo a la izquierda· RCR rotación con acarreo a la derecha

· CLC borrar acarreo· STC 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.

Admite los siguientes formatos:

SAL/SHL reg, 1 desplaza 1 vez el contenido de reg

CF

CF0

CF

41

SAL/SHL mem, 1SAL/SHL reg, CL 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.

Admite los siguientes formatos:

SAR reg, 1 desplaza 1 vez el contenido de regSAR mem, 1SAR reg, CL desplaza tantas veces el contenido de reg como

indique CL.SAR mem, 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.

Admite los siguientes formatos:

SHR reg, 1 desplaza 1 vez el contenido de regSHR mem, 1SHR reg, CL 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 rotación a la izquierda de los bits del operando a través del bit CF (acarreo) del registro de estado.

CF

CF

42

Admite los siguientes formatos:

RCL reg, 1 desplaza 1 vez el contenido de regRCL mem, 1RCL reg, CL 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 rotación a la derecha de los bits de operando a través del bit CF del registro de estado.

Admite los siguientes formatos:

RCR reg, 1 desplaza 1 vez el contenido de regRCR mem, 1RCR reg, CL 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 rotación 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.

Admite los siguientes formatos:

ROL reg, 1 desplaza 1 vez el contenido de regROL mem, 1ROL reg, CL desplaza tantas veces el contenido de reg como

Indique CL.ROL mem, CL

CF

43

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

ROR realiza la rotación 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.

Admite los siguientes formatos:

ROL reg, 1 desplaza 1 vez el contenido de regROL mem, 1ROL reg, CL 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 números potencia de dos (2, 4, 8,16, 32, 64 y 128), de manera más eficiente que las instrucciones MUL y DIV.

Ejemplo:

MOV AX, 40hMOV CL, 2SHL AX, CL

; es equivalente y más eficiente que:

MOV AX, 40hMOV DX, 00hMOV BX, 04hMUL BX

44

CICLOS

Las instrucciones de CICLOS se usan para realizar estructuras repetitivas, y utilizan el registro CX como contador.

LOOP

Esta instrucción hace que el programa salte a la dirección especificada (salto dentro del segmento), mientras que CX sea distinto de 0 y decrementa CX en 1 en cada iteración.

LOOP salto

Ejemplo:

MOV CX, 100 ; este bucle se repite 100COMIENZO: … ; inicio del ciclo… ; instrucciones a ejecutar dentro del cicloLOOP COMIENZO ; final del ciclo

En el fragmento anterior, el bloque de instrucciones que se encuentra entre la etiqueta COMIENZO y la instrucción LOOP será ejecutado hasta que el registro CX sea igual a cero. Cada vez que se ejecuta la instrucción LOOP, el registro CX es decrementado en uno hasta llegar a cero. Esta instrucción también tiene la limitante de que debe encontrarse en el rango de +128 a -127 (máximo número de bytes entre COMIENZO y LOOP).

45

LOOPNE/LOOPNZ Esta instrucción salta a la dirección especificada mientras que CX sea distinto de 0 y si la bandera de cero esta desactivada ZF = 0.

LOOPNE/LOOPNZ salto

Esta instrucción proporciona una ruptura del bucle adicional.

LOOPE/LOOPZ

Esta instrucción actúa como la anterior pero la condición adicional es ZF = 1.

LOOPE/LOOPZ salto

JCXZ

Esta instrucción 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 instrucción JMP, que provoca un salto hacia un punto de destino (una localidad definida en la memoria). Dicha instrucción altera el flujo de ejecución del programa sin tomar en cuenta el estado de las banderas.

Existen diferentes formatos para la instrucción de salto, y cada uno se aplica a un uso específico. El destino de la instrucción puede estar en el mismo segmento (intrasegmento) o en otro diferente (intersegmento). Para saltos intersegmento, la instrucción se arma o codifica en cinco bytes (uno para la instrucción, 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 instrucción y dos para el desplazamiento en la localidad de destino). De esto se infiere que la localidad de destino no puede estar más allá de 65535 bytes desde donde se encuentra la instrucción JMP, ya sea hacia adelante o hacia atrás.

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 atrás. Este formato solo requiere dos bytes (uno para la instrucción 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 más significativo para

46

determinar el signo. Si el bit más 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 común 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 código; esto se debe a que dichos programas deben contener los datos y el código 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 instrucción 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:

47

PUBLIC SALTE..SALTE:..

En arch2.asm desea hacer referencia a la etiqueta "SALTE" que se encuentra en arch1.asm; en este caso tendríamos 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 instrucción de comparación como CMP. Dichas instrucciones se pueden clasificar en tres diferentes categorías:

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

48

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 efectúa 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 efectúa 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 efectúa 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 efectúa si ZF=1 (también 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 efectúa si ZF=0 (también se aplica a comparaciones de enteros con signo).

INSRUCCIONES USADAS PARA COMPARA DOS ENTEROS CON SIGNO

1- JG O JNLE- Salta si es más grande o salta si no es menor o igual (jump if greater o jump if not less or equal). El salto se efectúa si ZF=0 o OF=SF.

2- JGE O JNL- Salta si es más grande o igual o salta si no es menor que ( jump if greater or equal o jump if not less). El salto se efectúa 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 efectúa si SF es diferente de OF.

4- JLE O JNG- Salta si es menor o igual o salta si no es más grande (jump if less or equal o jump if not greater). El salto se efectúa si ZF=1 o SF es diferente de OF.

INSTRUCCIONES USADAS SEGÚN EL ESTADO DEL REGISTRO DE BANDERAS

49

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

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

3- JNO- Salta si no hay desbordamiento (jump if no overflow). El salto se efectúa si OF=0

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

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

6- JO- salta si hay desbordamiento (jump if overflow). El salto se efectúa 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 efectúa si PF=1.

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

Anteriormente se mencionó que existen 16 diferentes instrucciones condicionales, pero tomando en cuenta las recién descritas encontrara 18. La razón es que las instrucciones JC y JB son idénticas, 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 interpretación 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 interpretación que se le quiera dar. si trabaja con números 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 comparación y de salto de acuerdo con la interpretación 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 máxima distancia, ya sea hacia adelante o hacia atrás. si desea efectuar un salto a mayores distancias es necesario crear una condición mixta entre saltos condicionales y no condicionales.

50

ESTILO DE PROGRAMACIÓN

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 código fuente. Como en cualquier otro lenguaje, el código fuente del lenguaje ensamblador tiene una sintaxis predefinida.

Cada sentencia de lenguaje ensamblador está compuesta de cuatro campos:

Campo nombre Campo operación Campo operando Campo comentario.Conocer los campos para la realización de un programaEs la estrucutra para realización de programa

Sin embargo, ciertas instrucciones del ensamblador no utilizan todos los campos. El campo comentario existe para expresar propósitos o documentación de programación interna y es opcional.

51

CAMPO NOMBRE

El campo del nombre, algunas veces denominado el campo rotulo, asigna un nombre simbólico a la dirección de comienzo de memoria real de una instrucción y elimina la necesidad de seguir la pista de direcciones de las instrucciones. Esto es especialmente útil al generar código reubicable.

Al utilizar una referencia simbólica, 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 automáticamente con la colocación del código. Aunque a cualquier instrucción se le puede dar un nombre, este campo esta habitualmente reservado para aquellas instrucciones que serán referenciadas en las definiciones de datos, constantes, segmentos, lazos, bifurcaciones y llamadas a subrutinas.

Un nombre debe comenzar con un caracter alfabético y puede contener hasta 31 caracteres, incluyendo:

-todas las letras de la a a la z. -dígitos numéricos del 0 al 9. -los símbolos especiales siguientes: - $ . ? @ %

Debe tenerse precaución 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 posición de memoria que es accesible por programa; y el contenido de esta posición de memoria puede cambiar durante la ejecución. Las definiciones de variables incluyen información sobre la dirección de posiciones de memoria, tipos de datos y tamaño. Las variables pueden ser utilizadas como operando en formas simple, indexada o estructurada.

RÓTULOS

Los nombres aplicados a instrucciones ejecutables en los programas de aplicación son referenciados como código relativo. Un nombre, o rotulo en este caso, tiene tres atributos:

1. dirección de segmento, 2. desplazamiento de segmento y 3. descriptor de accesibilidad near o far.

La CPU puede direccionar un rotulo particular de dos formas:

52

Primera forma:

Si el rotulo que se está referenciando esta en el mismo segmento del código, entonces solamente se necesita el desplazamiento de segmento para localizar la orden, en este caso, podríamos decir que el tipo del rotulo era near. Para definir un rótulo como near, inmediatamente después 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 instrucción referenciada en el mismo segmento de código.

En este ejemplo, el rótulo está explícitamente definido como near al usar el rotulo de la pseudo-op.

Segunda forma:

Para direccionar un rótulo requiere la dirección del segmento y la dirección del desplazamiento. Este es el caso en que la sentencia del ensamblador a referenciar no está en el mismo segmento de código, 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 también utilizados para rotular equate y procedure y sentencias external, como se ve en los siguientes ejemplos:

diez equ far 10 imprime proc far extrn randm: far

CONSTANTES

Los nombres también pueden ser dados a posiciones de memoria que contienen valores inicializados que no cambian durante la ejecución 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 están seguidos por una letra b. por ejemplo:

NUMERO EQU 00001000B

53

DECIMAL: Las constantes decimales contienen una serie de dígitos del 0 al 9 y están opcionalmente seguidas por la letra d. una serie de dígitos se considera como un número decimal a menos que cambie la base, ejemplo:

LUGAR EQU 40D

HEXADECIMAL: Las constantes hexadecimales contienen una serie de dígitos 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 dígitos del 0 al 9, esto indica al compilador que el valor es un número y no posiblemente una referencia de rótulo o nombre de variable. Si el valor hexadecimal comienza con una de las letras de la a a la f, entonces añadiendo un 0 al principio se eliminara esta ambigüedad interpretada por el compilador, una declaración de constantes hexadecimal seria:

QUINTO EQU 32H VALOR EQU OFFH

En este ejemplo, el 0 fue añadido para indicar al ensamblador que ffH era un número hexadecimal, no un rótulo o nombre de variable.

OCTAL: Las constantes octales contienen los dígitos 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 más de dos caracteres, la pseudooperaciòn db (definir byte) debe ser utilizada. Si la cadena de caracteres contiene sólo uno o dos caracteres, entonces pueden ser utilizadas las pseudos-ops dd, dq, dt o dw. Por ejemplo:

INICIO DD `B`NOMBRE DB "J WILLIAMS"

PUNTO FLOTANTE: Este tipo de dato representa valores en notación científica 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 dígitos 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 dígitos del 0 al 9. La constante debe contener un número total de dígitos que igualen a 8, 16 o 20, a menos que el primer dígito sea un 0, en este caso, el número total de dígitos 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

54

EQUATES: Un rótulo en el campo de nombre puede ser asignado al valor de una expresión 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 ejecución del programa. Si se utiliza la pseudo-op signo =, el valor de la constante puede ser cambiado durante la ejecución del programa. Por ejemplo:

SCRADD EQU [BP + 16] BASNUM = 1980

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

CAMPO OPERACIÓN

El campo de operación contiene un nemotécnico para una instrucción real del microprocesador, el nemotécnico es una "ayuda de memoria" de dos a seis caracteres. En lugar de ser un valor binario o hexadecimal para una instrucción máquina, el nemotécnico es una abreviatura en inglés, el nemotécnico de operación hace el código más fácil de leer y comprender y es solamente una tabla de conversión interna del valor binario de código máquina real. Una operación o nemotécnico puede representar una instrucción máquina, macroinstrucción o pseudo-operaciòn, por ejemplo:

INICIAL: MOV AX,19H

INICIAL es el rótulo y MOV es la operación. Siguiendo al campo de operación se encuentra el campo de operando. Cada operación no sólo le dice al ensamblador qué instrucción debe ejecutar sino cuántas operaciones se necesitan y de qué tipo.

Una operación puede contener una referencia a una macro. Tal referencia indica al ensamblador cómo procesar una secuencia predefinida de código, esto hace que el ensamblador genere instrucciones en código fuente como si estuviesen en la parte original del programa, por ejemplo:

DOS__INT MACRO SERVICIO__ID

Esta operación avisa al ensamblador y le indica que el código siguiente es parte de la definición macro. Una pseudo-operaciòn, abreviadamente pseudo-op, habitualmente no produce código máquina pero en su lugar dirige al ensamblador para que realice ciertas operaciones sobre datos, listados de código, bifurcaciones y macros.

CAMPO OPERANDO

55

El campo de operandos contiene la posición o posiciones donde están los datos que van a ser manipulados por la instrucción, la instrucción puede requerir uno o dos operandos, si hay dos operandos, éstos están separados por una coma (,).

Cuando una operación 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 más útiles. El campo comentario se utiliza para documentar internamente el código fuente del ensamblador y son útiles sólo al listar el código fuente. Si un comentario se incluye con una instrucción de operación, 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 líneas de código fuente que no son comprensibles inmediatamente. por ejemplo:

MOV AH,45H ;PARÁMETRO 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 número 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 byteDW 2 bytes = una palabraDD 4 bytes = una doble palabraDF, DP 6 bytes = una palabra de puntero lejano (386)DQ 8 bytes = una cuádruple palabraDT 10 bytes