El Lenguaje Ensamblador
-
Upload
danno-mars -
Category
Documents
-
view
258 -
download
2
description
Transcript of El Lenguaje Ensamblador
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