Está en la página 1de 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. 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

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 V. BASIC V.FOX ENSAMBLADOR

FUENTE 27 Bytes 22 Bytes 162 Bytes

OBJETO 651 Bytes 572 Bytes 169 Bytes

EJECUTABLE (.EXE) 12,814 Bytes 158,178 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
(SUMA, RESTA, MULTIPLICACION, DIVISION, AND, OR, OR-EXCLUSIVO, ETC.)

CPU

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

SUBSITEMA DE CONTROL
(COORDINA TODO)

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

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

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 DESCRIPCIN

1 2 3 4

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

Overflow (O)
NV OV

Direction (D)
UP DN

Interrupt (I)
DI EI

Sign (S)
PL NG

Zero (Z)
NZ ZR

Estado
DESACTIVADA ACTIVADA

Auxiliary (A)
NA AC

Parity (P)
PO PE

Carry (C)
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 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

AN

MEJOR,

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

POR EJEMPLO, CONSIDERESE EL SIGUIENTE CODIGO:

MOV MOV MOV MOV

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

+
IP

Direccin de 20 bits

Bus de direccin Del sistema

FIGURA A. Clculo de la direccin de 20 bits

Cada direccin generada por el procesador usa uno de los 4 registros de segmento. Este registro de segmento es recorrido 4 bits hacia la izquierda antes de ser sumado al offset.

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:
MOV AX, BX MOV AL, BL ; AX BX ; AL BL

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

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

El valor de COUNT es una constante. Es usada como el valor offset en el clculo de la direccin de 20 bits 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

O
SUMAS

PERACIONES ARITMTICAS BSICAS

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

MOV DX, 0053 ADC DX, 0036

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). DEC (DECREMENTO).

TRABAJAN CON DOS OPERANDOS. TRABAJA CON UN OPERANDO.

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

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

MOV DX, 0053 SBB DX, 0036

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 0001FFFE (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 IDIV

(DIVISIN SIN SIGNO). (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 CLC STC rotacin a la izquierda rotacin a la derecha rotacin con acarreo a la izquierda rotacin con acarreo a la derecha 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 0

Admite los siguientes formatos:


SAL/SHL reg, 1 SAL/SHL mem, 1 SAL/SHL reg, CL SAL/SHL mem, CL desplaza 1 vez el contenido de reg desplaza tantas veces el contenido de reg como indique CL.

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

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

Admite los siguientes formatos:


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

Afecta a todos los bit del registro de estado.

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 SHR mem, CL desplaza 1 vez el contenido de reg desplaza tantas veces el contenido de reg como Indique CL.

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

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

CF

Admite los siguientes formatos:


RCL reg, 1 RCL mem, 1 RCL reg, CL RCL mem, CL Afecta a los bit OF, CF del registro de estado. desplaza 1 vez el contenido de reg desplaza tantas veces el contenido de reg como Indique CL.

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 RCR mem, CL desplaza 1 vez el contenido de reg desplaza tantas veces el contenido de reg como Indique CL.

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

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 ROL mem, CL desplaza 1 vez el contenido de reg desplaza tantas veces el contenido de reg como Indique CL.

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

CF

Admite los siguientes formatos:


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

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

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

2-

3-

4-

5-

6-

48

INSRUCCIONES USADAS PARA COMPARA DOS ENTEROS CON SIGNO 1JG 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. 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. 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. 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.

2-

3-

4-

INSTRUCCIONES USADAS SEGN EL ESTADO DEL REGISTRO DE BANDERAS 123JC- Salta si hay acarreo (jump if carry). El salto se efecta si CF=1. JNC- Salta si no hay acarreo (jump if not carry). El salto se efecta si CF=0. JNO- Salta si no hay desbordamiento (jump if no overflow). El salto se efecta si OF=0 JNP O JPO- salta si no hay paridad o salta si la paridad es non. El salto se efecta si pf=0 JNS- salta si el signo esta apagado (jump if not sign). El salto se efecta si sf=0. JO- salta si hay desbordamiento (jump if overflow). El salto se efecta si OF=1. 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. JS- Salta si el signo esta prendido (jump if sign set). El salto se efecta si SF=1.

4-

567-

8-

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

También podría gustarte