26.04.2013 Views

LENGUAJE ENSAMBLADOR DEL MICROPROCESADOR

LENGUAJE ENSAMBLADOR DEL MICROPROCESADOR

LENGUAJE ENSAMBLADOR DEL MICROPROCESADOR

SHOW MORE
SHOW LESS

You also want an ePaper? Increase the reach of your titles

YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.

COMPUTACIÓN V<br />

<strong>MICROPROCESADOR</strong>ES Y MICROCOMPUTADORAS<br />

<strong>LENGUAJE</strong> <strong>ENSAMBLADOR</strong> <strong>DEL</strong> <strong>MICROPROCESADOR</strong><br />

1. Registros Internos del Microprocesador<br />

2. Conjunto de Instrucciones (Microprocesadores 8086/8088)<br />

2.1 Instrucciones de Transferencia de Datos<br />

2.2 Instrucciones de Control de Bucles (instrucciones simples)<br />

2.3 Instrucciones de Prueba, Comparación y Saltos<br />

2.4 Instrucciones de Llamado y Retorno de Subrutinas<br />

2.5 Instrucciones Aritméticas<br />

2.6 Instrucciones Lógicas<br />

2.7 Instrucciones de Desplazamiento, Rotación y Adeudos<br />

2.8 Instrucciones de Pila<br />

2.9 Instrucciones de Control del Microprocesador<br />

2.10 Instrucciones de Interrupción<br />

3. Formato de las instrucciones<br />

4. Modos de Direccionamiento y Generación del Código Objeto<br />

4.1 Direccionamiento Inmediato<br />

4.2 Direccionamiento a Registro<br />

4.3 Direccionamiento Directo<br />

4.4 Direccionamiento de Registro Indirecto<br />

4.5 Direccionamiento de Registro Indirecto con Desplazamiento<br />

4.6 Direccionamiento de Registro Indirecto con un Registro Base y un Registro<br />

Índice<br />

4.7 Direccionamiento de Registro indirecto con un registro base, un registro índice<br />

y un registro constante<br />

4.8 Código Objeto del 8086/8088<br />

4.9 Bit W y Campo REG<br />

4.10 Bit D, MOD y R/M<br />

4.11 Código Objeto para el Uso de Registro Base y Registro Índice<br />

4.12 Sumario del Código Objeto<br />

4.13 Interrupciones de los Servicios Básicos de Entrada y Salida (BIOS, por sus siglas<br />

en inglés)<br />

5. Programación en Lenguaje Ensamblador<br />

5.1 Creación de Archivos Fuente<br />

5.2 Procedimientos en Ensamblador<br />

5.3 Procedimiento para Exhibir Números Hexadecimales al Monitor<br />

5.4 Principio de Diseño Modular<br />

5.5 Esqueleto de un Programa en Ensamblador<br />

5.5.1 Directiva: .DATA<br />

5.5.2 Directiva: .MO<strong>DEL</strong> SMALL<br />

5.5.3 Directiva: .DOSSEG<br />

3. <strong>LENGUAJE</strong> <strong>ENSAMBLADOR</strong> <strong>DEL</strong> <strong>MICROPROCESADOR</strong><br />

LUIS URIETA PÉREZ Y PABLO FUENTES RAMOS<br />

3 -1


5.6 Ejercicio 1<br />

5.7 Ejercicio 2<br />

5.8 Ejercicio 3<br />

5.9 Ejercicio 4<br />

5.10 Ejercicio 5<br />

5.11 Ejercicio 6<br />

5.12 Ejercicio 7<br />

5.13 Ejercicio 8<br />

5.14 Ejercicio 9<br />

5.15 Ejercicio 10<br />

5.16 Ejercicio 11<br />

5.17 Ejercicio 12<br />

5.18 Ejercicio 13<br />

5.19 Ejercicio 14<br />

5.20 Ejercicio 15<br />

5.21 Ejercicio 16<br />

5.22 Ejercicio 17<br />

5.23 Ejercicio 18<br />

5.24 Ejercicio 19<br />

5.25 Ejercicio 20<br />

COMPUTACIÓN V<br />

<strong>MICROPROCESADOR</strong>ES Y MICROCOMPUTADORAS<br />

3. <strong>LENGUAJE</strong> <strong>ENSAMBLADOR</strong> <strong>DEL</strong> <strong>MICROPROCESADOR</strong><br />

LUIS URIETA PÉREZ Y PABLO FUENTES RAMOS<br />

3 -2


COMPUTACIÓN V<br />

<strong>MICROPROCESADOR</strong>ES Y MICROCOMPUTADORAS<br />

REGISTROS INTERNOS <strong>DEL</strong> <strong>MICROPROCESADOR</strong><br />

La Unidad Central de Proceso (CPU, por sus siglas en inglés) tiene 14 registros internos<br />

cada uno de 16 bits. Los primeros cuatro, AX, BX, CX y DX, son de uso general<br />

y se pueden usar también como registros de 8 bits. Es decir, AX se puede dividir en AH<br />

y AL (AH es el byte alto, high, y AL es el byte bajo, low) Lo mismo es aplicable a los<br />

otros tres (BX en BH y BL, CX en CH y CL y DX en DH y DL)<br />

Estos son los únicos registros que pueden usarse de modo dual (en 8 o 16 bits)<br />

Los registros de la CPU son conocidos por sus nombres propios, que son:<br />

• AX (acumulador)<br />

• BX (registro base)<br />

• CX (registro contador)<br />

• DX (registro de datos)<br />

• DS (registro del segmento de datos)<br />

• ES (registro del segmento extra)<br />

• SS (registro del segmento de pila)<br />

• CS (registro del segmento de código)<br />

• BP (registro de apuntadores base)<br />

• SI (registro índice fuente)<br />

• DI (registro índice destino)<br />

• SP (registro del apuntador de pila)<br />

• IP (registro del apuntador de siguiente instrucción)<br />

• F (registro de banderas)<br />

El registro AX se usa para almacenar resultados, lectura o escritura desde o<br />

hacia los puertos. El BX sirve como apuntador base o índice. El CX se utiliza en operaciones<br />

de iteración, como un contador que automáticamente se incrementa o decrementa<br />

de acuerdo con el tipo de instrucción usada. El DX se usa como puente para el<br />

acceso de datos.<br />

El DS es un registro de segmento cuya función es actuar como policía donde se<br />

encuentran los datos. Cualquier dato, ya sea una variable inicializada o no, debe estar<br />

dentro de este segmento. La única excepción es cuando tenemos programas del tipo<br />

*.com, ya que en éstos sólo puede existir un segmento. El registro ES tiene el propósito<br />

general de permitir operaciones sobre cadenas, pero también puede ser una extensión<br />

del DS.<br />

El SS tiene la tarea exclusiva de manejar la posición de memoria donde se encuentra<br />

la pila (stack) Esta es una estructura usada para almacenar datos en forma<br />

temporal, tanto de un programa como de las operaciones internas de la computadora<br />

personal (PC, por sus siglas en inglés) En términos de operación interna, la CPU usa este<br />

segmento para almacenar las direcciones de retorno de las llamadas a rutinas. El<br />

registro de segmentos más importante es el CS o segmento de código. Es aquí donde<br />

se encuentra el código ejecutable de cada programa, el cual está directamente ligado a<br />

los diferentes modelos de memoria.<br />

El registro BP (base pointer) se usa para manipular la pila sin afectar al registro<br />

de segmentos SS. Es útil cuando se usa interfaz entre lenguajes de alto nivel y el en-<br />

3. <strong>LENGUAJE</strong> <strong>ENSAMBLADOR</strong> <strong>DEL</strong> <strong>MICROPROCESADOR</strong><br />

LUIS URIETA PÉREZ Y PABLO FUENTES RAMOS<br />

3 -3


COMPUTACIÓN V<br />

<strong>MICROPROCESADOR</strong>ES Y MICROCOMPUTADORAS<br />

samblador. Puesto que dicha interfaz se basa en el concepto de la pila BP, nos permite<br />

acceder parámetros pasados sin alterar el registro de segmento SS. Los registros SI y<br />

DI son útiles para manejar bloques de cadenas en memoria, siendo el primero el índice<br />

fuente y el segundo el índice destino. En otras palabras, SI representa la dirección<br />

donde se encuentra la cadena y DI la dirección donde será copiada.<br />

El registro SP apunta a un área específica de memoria que sirve para almacenar<br />

datos bajo la estructura LIFO (último en entrar, primero en salir), conocida como pila<br />

(stack) El registro IP (instruction pointer) apunta a la siguiente instrucción que será<br />

ejecutada en memoria.<br />

A continuación se describe el significado de cada bit del registro F (banderas)<br />

Todas las banderas apagadas:<br />

NV UP DI PL NZ NA PO NC<br />

Todas las banderas prendidas:<br />

OV DN EI NG ZR AC PE CY<br />

Significado de los bits:<br />

• Overflow NV = no hay desbordamiento<br />

OV = Sí lo hay<br />

• Direction UP = hacia adelante<br />

DN = hacia atrás<br />

• Interrupts DI = desactivadas<br />

EI = activadas<br />

• Sign PL = positivo<br />

NG = negativo<br />

• Zero NZ = no es cero<br />

ZR = sí lo es<br />

• Auxiliary Carry NA = no hay acarreo auxiliar<br />

AC = hay acarreo auxiliar<br />

• Parity PO = paridad non<br />

PE = paridad par<br />

• Carry NC = no hay acarreo<br />

CY = sí lo hay<br />

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

PSW Contiene 9 banderas. Tres banderas de control TF, DF, IF y seis banderas de status<br />

CF, PF, AF, ZF, SF, OF.<br />

Estas 6 últimas banderas representan el resultado de una operación aritmética<br />

o lógica. Permiten al programa alterar el curso de ejecución basado en los valores<br />

lógicos que almacenan.<br />

3. <strong>LENGUAJE</strong> <strong>ENSAMBLADOR</strong> <strong>DEL</strong> <strong>MICROPROCESADOR</strong><br />

LUIS URIETA PÉREZ Y PABLO FUENTES RAMOS<br />

3 -4


COMPUTACIÓN V<br />

<strong>MICROPROCESADOR</strong>ES Y MICROCOMPUTADORAS<br />

• AF Llevar auxiliar = 1, indica que hubo “llevar” del nibble (4 bits) 0 al nibble 1. O un<br />

“pedir préstamo” del nibble alto al nibble bajo.<br />

• CF Llevar = 1, cuando ha ocurrido un “llevar” o “pedir préstamo” del resultado (8 o<br />

16 bits)<br />

• OF Sobreflujo = 1, indica que ha ocurrido un sobreflujo aritmético. Esto significa<br />

que el tamaño del resultado excede la capacidad de ALMACENAMIENTO del destino<br />

y el dígito significativo se perdió.<br />

• SF Signo. Esta bandera se activa cuando el bit más significativo del resultado es 1.<br />

Ya que los números binarios negativos son representados usando notación C2,<br />

SF refleja el signo del resultado:<br />

0 indica +<br />

1 indica -<br />

• PF Paridad. Cuando esta bandera está activa, el resultado de la operación tiene un<br />

número par de unos. Esta bandera se usa para verificar errores en la transmisión.<br />

• ZF Cero. Esta bandera se activa cuando el resultado de la operación es cero.<br />

Las tres banderas de control serán discutidas después durante el curso<br />

• DF = bandera de dirección<br />

• IF = bandera de interrupción<br />

• TF = bandera de trampa<br />

CONJUNTO DE INSTRUCCIONES (Microprocesadores 8086/8088)<br />

Se pueden clasificar en los siguientes grupos:<br />

Instrucciones de Transferencia de Datos.<br />

Estas instrucciones mueven datos de una parte a otra del sistema; desde y hacia la memoria<br />

principal, de y a los registros de datos, puertos de E/S y registros de segmentación.<br />

Las instrucciones de transferencia de datos son las siguientes:<br />

• MOV transfiere<br />

• XCHG intercambia<br />

• IN entrada<br />

• OUT salida<br />

• XLAT traduce usando una tabla<br />

• LEA carga la dirección efectiva<br />

• LDS carga el segmento de datos<br />

• LES carga el segmento extra<br />

• LAHF carga los indicadores en AH<br />

• SAHF guarda AH en los indicadores<br />

• PUSH FUENTE (sp) ‹ fuente<br />

• POP DESTINO destino ‹ (sp)<br />

3. <strong>LENGUAJE</strong> <strong>ENSAMBLADOR</strong> <strong>DEL</strong> <strong>MICROPROCESADOR</strong><br />

LUIS URIETA PÉREZ Y PABLO FUENTES RAMOS<br />

3 -5


Control de Bucles (instrucciones simples)<br />

COMPUTACIÓN V<br />

<strong>MICROPROCESADOR</strong>ES Y MICROCOMPUTADORAS<br />

Éstas posibilitan el grupo de control más elemental de nuestros programas. Un bucle es<br />

un bloque de código que se ejecuta varias veces. Hay 4 tipos de bucles básicos:<br />

o Bucles sin fin<br />

o Bucles por conteo<br />

o Bucles hasta<br />

o Bucles mientras<br />

Las instrucciones de control de bucles son las siguientes:<br />

• INC incrementar<br />

• DEC decrementar<br />

• LOOP realizar un bucle<br />

• LOOPZ ,LOOPE realizar un bucle si es cero<br />

• LOOPNZ,LOOPNE realizar un bucle si no es cero<br />

• JCXZ salta si CX es cero<br />

Instrucciones de Prueba, Comparación y Saltos.<br />

Este grupo es una continuación del anterior, incluye las siguientes instrucciones:<br />

• TEST verifica<br />

• CMP compara<br />

• JMP salta<br />

• JE, JZ salta si es igual a cero<br />

• JNE, JNZ salta si no igual a cero<br />

• JS salta si signo negativo<br />

• JNS salta si signo no negativo<br />

• JP, JPE salta si paridad par<br />

• JNP, JOP salta si paridad impar<br />

• JO salta si hay capacidad excedida<br />

• JNO salta si no hay capacidad excedida<br />

• JB, JNAE salta si por abajo (no encima o igual)<br />

• JNB, JAE salta si no está por abajo (encima o igual)<br />

• JBE, JNA salta si por abajo o igual (no encima)<br />

• JNBE, JA salta si no por abajo o igual (encima)<br />

• JL, JNGE salta si menor que (no mayor o igual)<br />

• JNL, JGE salta si no menor que (mayor o igual)<br />

• JLE, JNG salta si menor que o igual (no mayor)<br />

• JNLE, JG salta si no menor que o igual (mayor)<br />

Instrucciones de Llamado y Retorno de Subrutinas.<br />

Para que los programas resulten eficientes y legibles tanto en lenguaje ensamblador como<br />

en lenguaje de alto nivel, resultan indispensables las subrutinas:<br />

• CALL llamada a subrutina<br />

• RET retorno al programa o subrutina que llamó<br />

3. <strong>LENGUAJE</strong> <strong>ENSAMBLADOR</strong> <strong>DEL</strong> <strong>MICROPROCESADOR</strong><br />

LUIS URIETA PÉREZ Y PABLO FUENTES RAMOS<br />

3 -6


Instrucciones Aritméticas.<br />

COMPUTACIÓN V<br />

<strong>MICROPROCESADOR</strong>ES Y MICROCOMPUTADORAS<br />

Estas instrucciones son las que realiza directamente el 8086/8088<br />

a. Grupo de adición:<br />

• ADD suma<br />

• ADC suma con acarreo<br />

• AAA ajuste ASCII para la suma<br />

• DAA ajuste decimal para la suma<br />

b. Grupo de sustracción:<br />

• SUB resta<br />

• SBB resta con acarreo negativo<br />

• AAS ajuste ASCII para la resta<br />

• DAS ajuste decimal para la resta<br />

c. Grupo de multiplicación:<br />

• MUL multiplicación<br />

• IMUL multiplicación entera<br />

• AAM ajuste ASCII para la multiplicación<br />

d. Grupo de división:<br />

• DIV división<br />

• IDIV división entera<br />

• AAD ajuste ASCII para la división<br />

e. Conversiones:<br />

• CBW pasar octeto a palabra<br />

• CWD pasar palabra a doble palabra<br />

• NEG negación<br />

f. Tratamiento de cadenas:<br />

Permiten el movimiento, comparación o búsqueda rápida en bloques de datos:<br />

• MOVC transferir carácter de una cadena<br />

• MOVW transferir palabra de una cadena<br />

• CMPC comparar carácter de una cadena<br />

• CMPW comparar palabra de una cadena<br />

• SCAC buscar carácter de una cadena<br />

• SCAW buscar palabra de una cadena<br />

• LODC cargar carácter de una cadena<br />

• LODW cargar palabra de una cadena<br />

• STOC guardar carácter de una cadena<br />

• STOW guardar palabra de una cadena<br />

3. <strong>LENGUAJE</strong> <strong>ENSAMBLADOR</strong> <strong>DEL</strong> <strong>MICROPROCESADOR</strong><br />

LUIS URIETA PÉREZ Y PABLO FUENTES RAMOS<br />

3 -7


COMPUTACIÓN V<br />

<strong>MICROPROCESADOR</strong>ES Y MICROCOMPUTADORAS<br />

• REP repetir<br />

• CLD poner a 0 el indicador de dirección<br />

• STD poner a 1 el indicador de dirección<br />

Instrucciones Lógicas.<br />

Son operaciones bit a bit que trabajan sobre octetos o palabras completas:<br />

• NOT negación<br />

• AND producto lógico<br />

• OR suma lógica<br />

• XOR suma lógica exclusiva<br />

Instrucciones de Desplazamiento, Rotación y Adeudos.<br />

Básicamente permiten multiplicar y dividir por potencias de 2<br />

• SHL, SAL desplazar a la izquierda (desplazamient o aritmético)<br />

• SHR desplazar a la derecha<br />

• SAR desplazamiento aritmético a la derecha<br />

• ROL rotación a la izquierda<br />

• ROR rotación a la derecha<br />

• RCL rotación con acarreo a la izquierda<br />

• RCR rotación con acarreo a la derecha<br />

• CLC borrar acarreo<br />

• STC poner acarreo a 1<br />

Instrucciones de Pila.<br />

Una de las funciones de la pila del sistema es la de salvaguardar (conservar) datos (la<br />

otra es la de salvaguardar las direcciones de retorno de las llamadas a subrutinas):<br />

• PUSH introducir<br />

• POP extraer<br />

• PUSHF introducir indicadores<br />

• POPF extraer indicadores<br />

Instrucciones de Control del microprocesador.<br />

Hay varias instrucciones para el control de la CPU, ya sea a ella sola, o en conjunción con<br />

otros procesadores:<br />

• NOP no operación<br />

• HLT parada<br />

• WAIT espera<br />

• LOCK bloquea<br />

• ESC escape<br />

3. <strong>LENGUAJE</strong> <strong>ENSAMBLADOR</strong> <strong>DEL</strong> <strong>MICROPROCESADOR</strong><br />

LUIS URIETA PÉREZ Y PABLO FUENTES RAMOS<br />

3 -8


Instrucciones de Interrupción.<br />

COMPUTACIÓN V<br />

<strong>MICROPROCESADOR</strong>ES Y MICROCOMPUTADORAS<br />

• STI poner a 1 el indicador de interrupción<br />

• CLI borrar el indicador de interrupción<br />

• INT interrupción<br />

• INTO interrupción por capacidad excedida (desbordamiento)<br />

• IRET retorno de interrupción<br />

Las instrucciones de transferencia condicional del control del programa se<br />

pueden clasificar en 3 grupos:<br />

1. Instrucciones usadas para comparar dos enteros sin signo:<br />

a. JA o JNBE. Salta si está arriba o salta si no está abajo o si no es igual (jump if above o<br />

jump if not below or equal) El salto se efectúa si la bandera ce CF = 0 o si la bandera<br />

de ZF = 0<br />

b. JAE o JNB. Salta si está arriba o es igual o salta si no está abajo (jump if above or equal o<br />

jump if not below) El salto se efectúa si CF = 0.<br />

c. JB o JNAE. Salta si está abajo o salta si no está arriba o si no es igual (jump if below or<br />

equal o jump if not above or equal) El salto se efectúa si CF = 1.<br />

d. JBE o JNA. Salta si está abajo o si es igual o salta si no está arriba (jump if below or equal<br />

o jump if not above) El salto se efectúa si CF = 1.<br />

e. JE o JZ. Salta si es igual o salta si es cero (jump equal o jump if zero) El salto se efectúa<br />

si ZF = 1 (también se aplica a comparaciones de enteros con signo)<br />

f. JNE o JNZ. Salta si no es igual o salta si no es cero (jump if not equal o jump if not zero) El<br />

salto se efectúa si ZF = 0 (también se aplica a comparaciones de enteros con<br />

signo)<br />

2. Instrucciones usadas para comparar dos enteros con signo:<br />

a. JG o JNLE. Salta si es más grande o salta si no es menor o igual (jump if greater o jump if<br />

not less or equal) El salto se efectúa si ZF = 0 o OF = SF.<br />

b. JGE o JNL. Salta si es más grande o igual o salta si no es menor que (jump if greater or<br />

equal o jump if not less) El salto se efectúa si SF = OF.<br />

c. JL o JNGE. Salta si es menor que o salta si no es mayor o igual (jump if less o jump if not<br />

greater or equal) El salto se efectúa si SF = OF.<br />

d. JLE o JNG. Salta si es menor o igual o salta si no es más grande (jump if less or equal o<br />

jump if not greater) El salto se efectúa si ZF = 1 o SF = OF.<br />

3. Instrucciones usadas según el estado de banderas:<br />

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

b. JNC Salta si no hay acarreo (jump if not carry) El salto se efectúa si CF = 0.<br />

c. JNO Salta si no hay desbordamiento (jump if not overflow) El salto se efectúa si OF<br />

= 0.<br />

d. JNP o JPO Salta si no hay paridad o salta si la paridad en non. El salto se efectúa si PF<br />

= 0.<br />

e. JNS Salta si el signo está apagado (jump if not sign) El salto se efectúa si SF = 0.<br />

f. JO Salta si hay desbordamiento (jump if overflow) El salto se efectúa si OF = 1.<br />

g. JP o JPE Salta si hay paridad o salta si la paridad es par (jump if parity o jump if parity<br />

even) El salto se efectúa si PF = 1.<br />

h. JS Salta si el signo está prendido (jump if sign set) El salto se efectúa si SF = 1.<br />

Las comparaciones con signo van de acuerdo con la interpretación que usted le<br />

quiera dar a los bytes o palabras de su programa. Por ejemplo, suponga que tiene un<br />

3. <strong>LENGUAJE</strong> <strong>ENSAMBLADOR</strong> <strong>DEL</strong> <strong>MICROPROCESADOR</strong><br />

LUIS URIETA PÉREZ Y PABLO FUENTES RAMOS<br />

3 -9


COMPUTACIÓN V<br />

<strong>MICROPROCESADOR</strong>ES Y MICROCOMPUTADORAS<br />

byte cuyo valor es 11111111 en binario y que desea compararlo con otro cuyo valor es<br />

00000000. ¿Es 11111111 mayor que 00000000? SÍ y NO, eso depende de la interpretación<br />

que usted le quiera dar. Si trabaja con números enteros sin signo SÍ LO SERÁ,<br />

pues 255 es mayor que 0. Por el contrario, si tiene signo entonces SERÁ MENOR puesto<br />

que –1 es siempre menor que 0.<br />

Lo anterior lleva a seleccionar las instrucciones de comparación y de salto de<br />

acuerdo con la interpretación que se les dé a los bytes o palabras; reflexione sobre este<br />

punto.<br />

Los saltos condicionales se encuentran limitados al rango de –128 a +127 bytes<br />

como máxima distancia, ya sea adelante o hacia atrás. Si desea efectuar un salto a<br />

mayores distancias es necesario crear una condición mixta entre saltos condicionales y<br />

no condicionales.<br />

Iteraciones.<br />

Con los saltos condicionales y no condicionales se pueden crear estructuras de<br />

iteración bastante complejas, aunque existen instrucciones específicas para ello tal<br />

como loop.<br />

Esta instrucción es muy útil cuando se va a efectuar cierto bloque de instrucciones<br />

un número finito de veces. He aquí un ejemplo:<br />

CUENTA: DW, 100<br />

.<br />

..<br />

MOV CX, CUENTA<br />

ITERA:<br />

.<br />

.<br />

LOOP ITERA<br />

El bloque de instrucciones que se encuentra entre la etiqueta ITERA y la instrucción<br />

loop será ejecutado hasta que el registro CX sea igual a 0. Cada vez que se ejecuta<br />

la instrucción loop, el registro CX es decrementado en 1 hasta llegar a 0. Esta instrucción<br />

tiene la limitante de que debe encontrarse en el rango de +128 a –127 (máximo<br />

número de bytes entre ITERA y loop)<br />

Iteraciones condicionales<br />

Existen otras dos variantes de la instrucción loop. Las instrucciones loope y<br />

loopz decrementan CX e iteran si CX = 0 y ZF = 1, mientras que loopne y looppnz<br />

iteran si CX „ 0 y ZF „ 0. Un punto importante es que al decrementarse CX las banderas<br />

NO RESULTAN AFECTADAS. Por lo tanto, le corresponde a usted afectarlas dentro del<br />

bloque de iteración.<br />

3. <strong>LENGUAJE</strong> <strong>ENSAMBLADOR</strong> <strong>DEL</strong> <strong>MICROPROCESADOR</strong><br />

LUIS URIETA PÉREZ Y PABLO FUENTES RAMOS<br />

3 -10


FORMATO DE LAS INSTRUCCIONES<br />

pos:<br />

COMPUTACIÓN V<br />

<strong>MICROPROCESADOR</strong>ES Y MICROCOMPUTADORAS<br />

Cada instrucción en lenguaje ensamblador del 8088 está compuesta de 4 cam-<br />

etiqueta operación operando comentario<br />

El campo comentario se utiliza para propósitos de documentación y es opcional.<br />

Campo etiqueta: Una etiqueta debe comenzar con un carácter alfabético y puede contener<br />

hasta 31 caracteres, incluyendo:<br />

• Letras de la A a la Z<br />

• Números del 0 al 9<br />

• Los símbolos especiales: - $ . @ %<br />

No se puede utilizar un nombre que coincida con una palabra reservada o<br />

directiva del ensamblador. Si el nombre incluye un punto, entonces el punto<br />

debe ser el primer carácter.<br />

Campo operación: Contiene el nemotécnico de la instrucción, que es de 2 a 6 caracteres.<br />

Campo operando: Contiene la posición o posiciones donde están los datos que van a ser manipulados<br />

por la instrucción.<br />

Campo comentario: Se utiliza para documentar el código fuente del ensamblador. Debe separarse<br />

del último campo por al menos un espacio e iniciar con ;.<br />

Cuando inicia un comentario en una línea ésta deberá tener en la primera<br />

columna el carácter ;.<br />

MODOS DE DIRECCIONAMIENTO Y GENERACIÓN <strong>DEL</strong> CÓDIGO OBJETO<br />

Generación de la dirección de la instrucción.<br />

Todos los registros internos del 8086/8088 son de 16 bits. El bus de dirección<br />

es de 20 bits, por lo que se usa más de un registro interno para generar la dirección de<br />

20 bits.<br />

Los 2 registros usados para la dirección de la instrucción son el IP y el CS. Se<br />

combinan en una forma especial para generar la dirección de 20 bits.<br />

dirección de 20 bits = 1610 * CS + IP<br />

Por ejemplo: Si los registros CS e IP contienen los valores:<br />

CS = 1000H<br />

IP = 0414 H<br />

3. <strong>LENGUAJE</strong> <strong>ENSAMBLADOR</strong> <strong>DEL</strong> <strong>MICROPROCESADOR</strong><br />

LUIS URIETA PÉREZ Y PABLO FUENTES RAMOS<br />

3 -11


La dirección de 20 bits es:<br />

COMPUTACIÓN V<br />

<strong>MICROPROCESADOR</strong>ES Y MICROCOMPUTADORAS<br />

1610 * 1000H + 0414H = 10000H + 0414H = 10414H<br />

Esta es la dirección en memoria desde la cual la nueva instrucción debe buscarse.<br />

Al registro IP se le refiere como offset, el registro CS * 1610 apunta a la dirección<br />

de inicio o segmento en memoria desde el cual se calcula el offset. La Figura A<br />

muestra gráficamente cómo se calcula la dirección de 20 bits.<br />

CS*16<br />

IP<br />

Cada dirección generada por el 8086/8088 usa uno de los 4 registros de segmento.<br />

Este registro de segmento es recorrido 4 bits hacia la izquierda antes de ser<br />

sumado al offset.<br />

La instrucción del CPU especifica cuáles registros internos se usan para generar<br />

el offset.<br />

Vamos a ver los diferentes modos de direccionamiento tomando como ejemplo<br />

la instrucción MOV.<br />

Instrucción MOV<br />

Transfiere un byte desde el operando fuente al operando destino. Tiene el siguiente formato:<br />

MOV destino, fuente<br />

Direccionamiento Inmediato<br />

El operando fuente aparece en la instrucción. Un ejemplo, es el que mueve un valor<br />

constante a un registro interno.<br />

MOV AX, 568<br />

Direccionamiento a Registro<br />

+ Dirección de 20 bits Bus de dirección<br />

Del sistema<br />

FIGURA A. Cálculo de la dirección de 20 bits<br />

Indica que el operando a ser usado está contenido en uno de los registros internos de<br />

propósito general del CPU. En el caso de los registros AX, BX, CX o DX los registros<br />

pueden ser de 8 a 16 bits<br />

3. <strong>LENGUAJE</strong> <strong>ENSAMBLADOR</strong> <strong>DEL</strong> <strong>MICROPROCESADOR</strong><br />

LUIS URIETA PÉREZ Y PABLO FUENTES RAMOS<br />

3 -12


Ejemplos:<br />

MOV AX, BX ; AX ‹ BX<br />

MOV AL, BL ; AL ‹ BL<br />

COMPUTACIÓN V<br />

<strong>MICROPROCESADOR</strong>ES Y MICROCOMPUTADORAS<br />

Cuando usamos direccionamiento a registro, el CPU realiza las operaciones internamente,<br />

es decir, no se genera dirección de 20 bits para especificar el operando fuente.<br />

Direccionamiento Directo<br />

Especifica en la instrucción la localidad de memoria que contiene al operando. En este tipo<br />

de direccionamiento, se forma una dirección de 20 bits.<br />

Ejemplo:<br />

MOV CX, COUNT<br />

El valor de COUNT es una constante. Es usada como el valor offset en el cálculo de la<br />

dirección de 20 bits<br />

El 8086/8088 siempre usa un registro de segmento cuando calcula una dirección física.<br />

¿Cuál registro se debe usar para esta instrucción? Respuesta: DS<br />

En la Figura B, se muestra el cálculo de la dirección desde la cual se tomará el dato que<br />

se carga en CX.<br />

Este es el segmento por omisión que se usa. Sin embargo, cualquiera de los 4 segmentos<br />

puede usarse. Esto se efectúa especificando el registro apropiado en la instrucción.<br />

Por ejemplo, suponga que deseamos usar el registro ES en lugar del DS:<br />

MOV CX, ES: COUNT<br />

DS*16 COUNT = CONSTANTE<br />

3. <strong>LENGUAJE</strong> <strong>ENSAMBLADOR</strong> <strong>DEL</strong> <strong>MICROPROCESADOR</strong><br />

LUIS URIETA PÉREZ Y PABLO FUENTES RAMOS<br />

+<br />

DIRECCIÓN <strong>DEL</strong> SISTEMA DE 20 BITS<br />

Cuando accedamos datos, el registro DS se usa con un offfset para calcular la dirección de 20 bits,<br />

éste es el segmento por omisión. Puede ser invalidado por usar un prefijo de segmento en la instrucción.<br />

Ejemplo:<br />

MOV CX, ES: COUNT<br />

FIGURA B. Uso del segmento de datos y una constante para desplazamiento<br />

3 -13


Direccionamiento de Registro Indirecto<br />

COMPUTACIÓN V<br />

<strong>MICROPROCESADOR</strong>ES Y MICROCOMPUTADORAS<br />

Con el modo de direccionamiento de registro índice, la dirección offset de 16 bits está<br />

contenida en un registro base o registro índice. Esto es, la dirección reside en el registro<br />

BX, BP, SI o DI.<br />

Ejemplo:<br />

MOV AX, [SI]<br />

El valor de 16 bits contenido en el registro SI debe ser el offset usado para calcular la dirección<br />

de 20 bits.<br />

Otra vez, debe usarse un registro de segmento para generar la dirección final. El valor de<br />

16 bits en SI se combina con el segmento apropiado para generar la dirección.<br />

Direccionamiento de Registro Indirecto con Desplazamiento<br />

Este tipo de direccionamiento incluye a los dos modos de direccionamiento anteriores. La<br />

dirección offset de 16 bits se calcula sumando el valor de 16 bits especificado en un registro<br />

interno y una constante.<br />

Por ejemplo, si usamos el registro interno DI y el valor constante (desplazamiento), donde<br />

COUNT ha sido previamente definido, el nemotécnico para esta construcción es:<br />

MOV AX, COUNT [DI]<br />

Si: COUNT = 0378H<br />

DI = 04FAH<br />

0872H<br />

Entonces, la dirección offset de 16 bits es 0872H<br />

Direccionamiento de Registro Indirecto con un Registro Base y un Registro Índice<br />

Este modo de direccionamiento usa la suma de dos registros internos para obtener la dirección<br />

offset de 16 bits a usarse en el cálculo de la dirección de 20 bits.<br />

Ejemplos:<br />

MOV [BP] [DI], AX ; el offset es BP + DI<br />

MOV AX, [BX] [SI] ; el offset es BX + SI<br />

Direccionamiento de Registro Índice Indirecto con un Registro Base, un Registro Índice y<br />

un Registro Constante<br />

Este es el modo de direccionamiento más complejo. Es idéntico al modo de direccionamiento<br />

anterior, excepto que se suma una constante.<br />

Ejemplo: Suponga que tenemos los siguientes valores en los registros:<br />

DI = 0367H<br />

BX = 7890H<br />

COUNT = 0012H<br />

7C09H<br />

3. <strong>LENGUAJE</strong> <strong>ENSAMBLADOR</strong> <strong>DEL</strong> <strong>MICROPROCESADOR</strong><br />

LUIS URIETA PÉREZ Y PABLO FUENTES RAMOS<br />

3 -14


COMPUTACIÓN V<br />

<strong>MICROPROCESADOR</strong>ES Y MICROCOMPUTADORAS<br />

Este modo de direccionamiento indica que el offset especificado por la suma de DI + BX<br />

+ COUNT sea usado para mover el dato en memoria en el registro AX.<br />

MOV AX, COUNT [BX] [DI]<br />

La dirección offset de 16 bits es 7C09H. La dirección completa en 20 bits se calcula de<br />

la expresión:<br />

1610*DS + 7C09H<br />

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

3000H + 7C09H = 37C09H<br />

Código Objeto del 8086/8088<br />

Como programador, debes escribir los nemotécnicos. El código objeto es generado<br />

por la computadora (son los bytes que ejecuta el CPU) Con el conjunto de instrucciones<br />

del 8086/8088, cada tipo de modo de direccionamiento puede requerir un<br />

número diferente de bytes. En los ejemplos siguientes proporcionaremos el número de<br />

bytes requeridos por cada modo de direccionamiento.<br />

Bit W y campo REG<br />

La instrucción MOV AX, 568H<br />

Indica mover inmediatamente al registro interno AX el valor 568H. El registro interno puede<br />

ser de 1 byte o de una palabra. Esta instrucción requiere 2 o 3 bytes, como se indica<br />

en la Figura C.<br />

El primer byte contiene los bits más significativos (MSB) como 1011. El próximo bit es W.<br />

W indica: 1 para word<br />

0 para byte<br />

1011 W REG DATA<br />

Esto es, si el registro destino es de 16 bits o de 8 bits.<br />

Los siguientes 3 bits del primer byte, campo REG, determinan cuál registro está involucrado.<br />

La Figura D, muestra el código de selección del registro.<br />

REG<br />

000<br />

001<br />

010<br />

011<br />

100<br />

101<br />

110<br />

1 BYTE 1 o 2 BYTES<br />

FIGURA C. Uso del bit N y del campo REG.<br />

REGISTRO DE<br />

16 BITS<br />

AX<br />

CX<br />

DX<br />

BX<br />

SP<br />

BP<br />

SI<br />

REGISTRO<br />

DE 8 BITS<br />

AL<br />

CL<br />

DL<br />

BL<br />

AH<br />

CH<br />

DH<br />

3. <strong>LENGUAJE</strong> <strong>ENSAMBLADOR</strong> <strong>DEL</strong> <strong>MICROPROCESADOR</strong><br />

LUIS URIETA PÉREZ Y PABLO FUENTES RAMOS<br />

3 -15


COMPUTACIÓN V<br />

<strong>MICROPROCESADOR</strong>ES Y MICROCOMPUTADORAS<br />

REGISTRO DE REGISTRO<br />

REG<br />

16 BITS DE 8 BITS<br />

111 DI BH<br />

FIGURA D. Registro involucrado en la operación<br />

Campo DATA. Si el registro de destino es de 1 byte, el dato debe estar en el segundo byte<br />

de la instrucción. Si el destino es de una palabra, el segundo byte de la instrucción son<br />

los 8 bits menos significativos (lsb) del dato, el tercer byte de la instrucción son los 8 bits<br />

más significativos (MSB) del dato. La siguiente tabla, muestra los nemotécnicos 2 o 3<br />

bytes<br />

Bit D, MOD y R/M<br />

NEMOTÉCNICO CÓDIGO OBJETO<br />

MOV AX, 568 Instrucción de 3 bytes<br />

B8<br />

68<br />

05<br />

MOV AL, 56<br />

instrucción de 2 bytes<br />

B0<br />

56<br />

En este ejemplo, moveremos datos desde memoria o moveremos un registro hacia o<br />

desde otro registro. Usaremos una instrucción como:<br />

MOV AX, BX<br />

Esta instrucción es de 2 bytes porque no nos referimos a memoria. Los bytes aparecerán<br />

como lo muestra la Figura E:<br />

1000 10 DW MOD REG R/M<br />

1 er BYTE<br />

FIGURA E.<br />

2 do BYTE<br />

El primer byte contiene los 2 bits menos significativos como DW. El bit W es para word=1<br />

o para byte=0. La D es para indicar si el dato será almacenado en el operando especificado<br />

por los campos MOD y R/M (D = 0) o si va a ser almacenado en el registro especificado<br />

por el campo REG (D = 1)<br />

La Figura F muestra las asignaciones para MOD y R/M. Note en la descripción de<br />

MOD=11, el campo R/M es codificado con un formato de registro. Este formato se mostró<br />

en la Figura D.<br />

3. <strong>LENGUAJE</strong> <strong>ENSAMBLADOR</strong> <strong>DEL</strong> <strong>MICROPROCESADOR</strong><br />

LUIS URIETA PÉREZ Y PABLO FUENTES RAMOS<br />

3 -16


COMPUTACIÓN V<br />

<strong>MICROPROCESADOR</strong>ES Y MICROCOMPUTADORAS<br />

Registros base e índice especificados por R/M<br />

para operandos en memoria (MOD 11)<br />

R/M REGISTRO BASE REGISTRO ÍNDICE<br />

000<br />

001<br />

010<br />

011<br />

100<br />

101<br />

110<br />

111<br />

BX<br />

BX<br />

BP<br />

BP<br />

NINGUNO<br />

NINGUNO<br />

BP<br />

BX<br />

SI<br />

DI<br />

SI<br />

DI<br />

SI<br />

DI<br />

NINGUNO<br />

NINGUNO<br />

MOD DESPLAZAMIENTO COMENTARIO<br />

00 CERO<br />

01 8 BITS contenido<br />

del próximo byte de<br />

la instrucción, signo<br />

extendido a 16 bits<br />

10 16 bits contenidos en<br />

los próximos 2 bytes<br />

de la instrucción<br />

La instrucción contiene<br />

un byte adicional<br />

La instrucción contiene<br />

2 bytes adicionales<br />

11 Registro R/M<br />

Si MOD = 00 y R/M = 110, entonces<br />

1. Lo expuesto arriba no se aplica<br />

2. La instrucción contiene 2 bytes adicionales<br />

3. La dirección offset es contenida en esos bytes<br />

FIGURA F. Definiciones para el código objeto del 8086/8088 de los campos MOD y R/M<br />

Para esta instrucción deseamos almacenar el dato en el registro AX. Por lo tanto el bit D<br />

= 0. Esto significa que el dato debe ser almacenado en la localidad especificada por los<br />

campos MOD y R/M. Por lo tanto, MOD = 11. El campo R/M = 000, indicando que el registro<br />

AX es el destino para los datos. El campo REG para el segundo byte de datos es 011<br />

indicando que el registro BX es el registro fuente a ser utilizado. El segundo byte de la<br />

instrucción es 11 011 000 = D8. Por lo que el código objeto para la instrucción es:<br />

MOV AX, BX es 89<br />

D8<br />

Código Objeto para el uso de Registro Base y Registro Índice<br />

Examinemos un último ejemplo para generar código objeto para el 8086/8088. En éste<br />

vamos a calcular el código objeto para la instrucción:<br />

MOV CX, COUNT [BX] [SI]<br />

Esta instrucción es de 4 bytes, como se muestra en la Figura G:<br />

1000 10 DW MOD REG R/M Add LOW Add HIGH<br />

1er. BYTE 2o. BYTE 3er. BYTE 4o. BYTE<br />

FIGURA G. Formato del código objeto para una instrucción como:<br />

MOV CX, COUNT [BX] [SI]<br />

3. <strong>LENGUAJE</strong> <strong>ENSAMBLADOR</strong> <strong>DEL</strong> <strong>MICROPROCESADOR</strong><br />

LUIS URIETA PÉREZ Y PABLO FUENTES RAMOS<br />

3 -17


COMPUTACIÓN V<br />

<strong>MICROPROCESADOR</strong>ES Y MICROCOMPUTADORAS<br />

El primer byte de la Figura G, debe tener el bit D=1. Esto es debido a que el destino para<br />

el dato debe ser especificado por el campo REG en el segundo byte. El bit W=1. porque<br />

es una transferencia de palabra. El primer byte es:<br />

10001011 = 8B<br />

En el segundo byte, ya que estamos usando una constante que requiere 16 bits, el campo<br />

MOD = 10. Refiriendo a la Figura F, ésta indica que el desplazamiento debe ser formateado<br />

en 2 bytes y deben seguir a este segundo byte. El próximo campo para el segundo<br />

byte es el campo de registro (REG) Ya que debemos usar el registro CX, este valor debe<br />

ser 001 (esto se obtiene de la Figura D)<br />

Finalmente, el campo R/M. Ya que el campo MOD 11, este campo debe especificar<br />

cuál registro base y cuál registro de índice están siendo usados para generar la dirección<br />

offset de 16 bits. En nuestro caso, usamos el campo [BX + SI + DESPLAZAMIENTO]<br />

• Esto corresponde a R/M = 000, ver Figura F<br />

• El segundo byte es 1000 1000 = 88<br />

• El tercer y cuarto byte corresponden al desplazamiento<br />

• En este caso, el valor de COUNT = 0345H. Los últimos 2 bytes son 4503H<br />

Esto da el siguiente código objeto total para la instrucción:<br />

MOV CX, COUNT [BX] [SI] 8BH<br />

88H<br />

45H<br />

03H<br />

Sumario del Código Objeto<br />

Una pregunta que surge al programador ¿Debo conformar los campos D, W, REG,<br />

MOD y R/M, en cada instrucción? NO, la computadora lo hace (el lenguaje ensamblador<br />

lo genera) Esta sección se presentó para permitirle al programador un mejor entendimiento<br />

del trabajo interno del microprocesador 8086/8088<br />

Interrupciones de los Servicios Básicos de Entrada y Salida (BIOS, por sus siglas en inglés)<br />

FUNCIÓN INT 21<br />

• (AH)=1 ENTRADA DESDE EL TECLADO<br />

Esta función espera a que se digite un carácter en el teclado. Muestra el carácter en la<br />

pantalla (eco) y retorna el código ASCII en el registro AL.<br />

(AL) = carácter leído desde el teclado<br />

Ejemplo:<br />

MOV AH, 1<br />

INT 21h ;AL = dato ASCII leído desde el teclado<br />

• (AH)=2 SALIDA EN EL EXHIBIDOR (display)<br />

3. <strong>LENGUAJE</strong> <strong>ENSAMBLADOR</strong> <strong>DEL</strong> <strong>MICROPROCESADOR</strong><br />

LUIS URIETA PÉREZ Y PABLO FUENTES RAMOS<br />

3 -18


COMPUTACIÓN V<br />

<strong>MICROPROCESADOR</strong>ES Y MICROCOMPUTADORAS<br />

Despliega un carácter en la pantalla. Algunos caracteres tienen un significado especial:<br />

o 7 CAMPANA: Suena durante un segundo<br />

o 8 BACKSPACE: Mueve el cursor hacia la izquierda un carácter<br />

o 9 TABULADOR: Mueve el tabulador a su próxima posición (cada 8 caracteres)<br />

o 0Ah LF: Mueve el cursor a la siguiente línea<br />

o 0Dh CR: Mueve el cursor al inicio de la línea corriente<br />

o (DL): Carácter a desplegar en la pantalla<br />

Ejemplo: Desplegar un carácter<br />

MOV DL, 40 ; carácter a desplegar<br />

MOV AH, 2<br />

INT 21h ; aparece en la posición corriente del cursor<br />

; el carácter contenido en DL<br />

Ejemplo: Hacer que suene la campana 2 segundos<br />

MOV DL, 7 ; DL = campana<br />

MOV AH, 02<br />

INT 21h ; 1 segundo<br />

INT 21h ; 1 segundo<br />

• (AH)=8 ENTRADA DESDE EL TECLADO SIN ECO<br />

Lee un carácter desde el teclado, pero no se despliega en la pantalla<br />

(AL) = carácter leído desde el teclado<br />

MOV AH, 08<br />

INT 21h ;AL = carácter<br />

• (AH)=9 DESPLIEGA UNA CADENA DE CARACTERES<br />

Despliega en la pantalla la cadena apuntada por el par de registros DS:DX. Debemos<br />

marcar el fin de la cadena con el carácter “$”<br />

DS:DX apuntan a la cadena que se va a desplegar<br />

• (AH)=0A h LEE UNA CADENA<br />

3. <strong>LENGUAJE</strong> <strong>ENSAMBLADOR</strong> <strong>DEL</strong> <strong>MICROPROCESADOR</strong><br />

LUIS URIETA PÉREZ Y PABLO FUENTES RAMOS<br />

CURSOR<br />

Lee una cadena de caracteres desde el teclado ¿Dónde queda la información?<br />

3 -19


COMPUTACIÓN V<br />

<strong>MICROPROCESADOR</strong>ES Y MICROCOMPUTADORAS<br />

• (AH)=25h ACTIVA EL VECTOR DE INTERRUPCIÓN<br />

Activa un vector de interrupción, para que apunte a una nueva rutina<br />

(AL) = número de interrupción<br />

ES:BX dirección del manipulador de interrupciones<br />

• (AH)=35h CONSIGUE VECTOR DE INTERRUPCIÓN<br />

Consigue la dirección de la rutina de servicio para el número de interrupción dado<br />

en AL<br />

(AL) = número de interrupción<br />

ES:BX dirección del manipulador de interrupción<br />

• (AH)=4Ch SALIDA AL DOS<br />

Retorna al DOS. Trabaja para ambos archivos *.com y *.Exe. Recuerde que INT<br />

20h trabaja solamente para archivos *.com<br />

(AL) = código de retorno, normalmente activo a 0, pero se puede activar a cualquier<br />

otro número y usar los comandos del DOS, IF y ERRORLEVEL, para detectar<br />

errores<br />

PROGRAMACIÓN EN <strong>LENGUAJE</strong> <strong>ENSAMBLADOR</strong><br />

Los archivos deben terminar con la extensión “ASM”. Las letras minúsculas trabajan<br />

igual que las mayúsculas, pero durante el presente trabajo se utilizarán mayúsculas<br />

para evitar confusión entre el número 1 y la minúscula l, el 0 (cero) y la letra O.<br />

Considérense las siguientes líneas de un programa:<br />

.MO<strong>DEL</strong> SMALL<br />

.CODE<br />

MOV AH, 2H<br />

MOV DL, 2AH<br />

INT 21H<br />

INT 20H<br />

END<br />

Una H después de cada número indica al ensamblador que los números son<br />

hexadecimales. Recuerde que DEBUG asume que todos los números son hexadecimales<br />

pero el ensamblador asume que todos los números son decimales.<br />

El ensamblador puede confundir números con etiquetas, para evitar esto coloque<br />

un 0 (cero) antes de un número hexadecimal que inicie con una letra.<br />

Ejemplo:<br />

MOV DL, ACH ; AC es una etiqueta<br />

MOV DL, 0ACH ; AC es un número hexadecimal<br />

3. <strong>LENGUAJE</strong> <strong>ENSAMBLADOR</strong> <strong>DEL</strong> <strong>MICROPROCESADOR</strong><br />

LUIS URIETA PÉREZ Y PABLO FUENTES RAMOS<br />

3 -20


COMPUTACIÓN V<br />

<strong>MICROPROCESADOR</strong>ES Y MICROCOMPUTADORAS<br />

Con el fin de hacer más legibles los programas, usaremos el tabulador para el<br />

espaciado.<br />

A las directivas del ensamblador se les llama también pseudo-operaciones.<br />

Se les conoce como directivas porque en lugar de generar instrucciones, proporcionan<br />

información y direcciones al ensamblador.<br />

La pseudo-operación END marca el fin del archivo fuente.<br />

Creación de Archivos Fuente<br />

El ensamblador puede usar archivos fuente que contengan caracteres ASCII<br />

estándar. Considere que no todos los procesadores de texto escriben archivos en disco<br />

usando solamente los caracteres ASCII estándar. Antes de ensamblar un programa<br />

verifique que esté en código ASCII.<br />

Puede ver caracteres extraños en el programa. Muchos procesadores de texto<br />

agregan información de formateo adicional en el archivo. El ensamblador los trata como<br />

errores. Utilice la versión no documento de su procesador de texto. También se requiere<br />

una línea en blanco después de la instrucción END<br />

Para ensamblar el programa:<br />

A>MASM PROGRAMA;<br />

MICROSOFT ® MACRO ASSEMBLER VERSION 5.10<br />

COPYRIGHT © MICROSOFT CORP 1981, 1988. ALL RIGHTS RESERVED<br />

49822 + 219323 BYTES SYMBOL SPACE FREE<br />

0 WARNING ERRORS<br />

0 SEVERE ERRORS<br />

A><br />

El ensamblador crea un archivo intermedio *.OBJ el cual contiene nuestro programa<br />

e información adicional usada por otro programa llamado LINKER .<br />

Encadenar al archivo *.OBJ<br />

A>LINK ARCHIVO;<br />

Microsoft ® Overlay Linker Version 3.64<br />

copyright © microsoft corp 1983-1988. All rights reserved<br />

LINK : warning L4021: No Stack Segment<br />

Hemos creado nuestro archivo *.EXE. Ahora sí necesitamos crear nuestra versión<br />

*.COM. El archivo EXE2BIN.EXE del DOS convierte un archivo EXE a un archivo<br />

BIN.<br />

A>EXE2BIN ARCHIVO ARCHIVO.COM<br />

A><br />

3. <strong>LENGUAJE</strong> <strong>ENSAMBLADOR</strong> <strong>DEL</strong> <strong>MICROPROCESADOR</strong><br />

LUIS URIETA PÉREZ Y PABLO FUENTES RAMOS<br />

3 -21


COMPUTACIÓN V<br />

<strong>MICROPROCESADOR</strong>ES Y MICROCOMPUTADORAS<br />

Si listamos los archivos que hemos creado, obtendríamos:<br />

A>DIR ARCHIVO.*<br />

Volume in drive A has no label<br />

directory of A:\<br />

archivo.ASM 100<br />

archivo.OBJ 200<br />

archivo. EXE 600<br />

archivo.COM 50<br />

Recuerde los detalles del DEBUG.<br />

A>DEBUG ARCHIVO.COM<br />

- U<br />

397F:0100 B402 MOV AH, 02<br />

397F:0102 B22A MOV DL, 2A<br />

397F:0104 CD21 INT 21<br />

397F:0106 CD20 INT 20<br />

Note que las dos primeras y la última línea no aparecen en el listado. Se eliminan<br />

en la versión final del lenguaje de máquina porque son directivas y éstas son para<br />

documentación. El ensamblador toma en cuenta esta documentación a costa de más<br />

líneas de código.<br />

Comentarios. Para comentar una línea ponga el “;”. Todo lo que está después del “;” el ensamblador<br />

lo considera como comentario.<br />

Etiquetas. Pueden tener hasta 31 caracteres y pueden contener letras, números y cualesquiera<br />

de los siguientes símbolos:<br />

¿ interrogación<br />

. punto<br />

@ arroba<br />

_ subrayado<br />

$ dólar<br />

Las etiquetas no deben iniciar con un número decimal y el punto se utiliza solamente<br />

como el primer carácter.<br />

Una de las principales diferencias entre el DEBUG y el ensamblador reside en las<br />

etiquetas. Recuerde que con DEBUG debemos hacer el cálculo nosotros. El ensamblador<br />

refiere a etiquetas y él calcula el desplazamiento.<br />

Cuando ponemos : después de una etiqueta, decimos que la etiqueta es cercana<br />

(NEAR). El término NEAR tiene que ver con los segmentos.<br />

Procedimientos en ensamblador<br />

El ensamblador asigna direcciones a las instrucciones. Cada vez que hacemos<br />

un cambio al programa, debemos ensamblar nuevamente dicho programa. Considérese<br />

el siguiente programa:<br />

3. <strong>LENGUAJE</strong> <strong>ENSAMBLADOR</strong> <strong>DEL</strong> <strong>MICROPROCESADOR</strong><br />

LUIS URIETA PÉREZ Y PABLO FUENTES RAMOS<br />

3 -22


.MO<strong>DEL</strong> SMALL<br />

.CODE<br />

COMPUTACIÓN V<br />

<strong>MICROPROCESADOR</strong>ES Y MICROCOMPUTADORAS<br />

PRINT _A_J PROC<br />

MOV DL, “A” ; inicia con el carácter A<br />

MOV CX, 10 ; imprime 10 caracteres<br />

PRINT _LOOP:<br />

CALL WRITE _CHAR ; imprime carácter<br />

INC DL ; siguiente carácter del alfabeto<br />

LOOP PRINT _LOOP ; continua<br />

MOV AH, ACh ; retorna al DOS<br />

INT 21h<br />

PRINT _A_J ENDP<br />

WRITE _CHAR PROC<br />

MOV AH, 02 ; activa el código de la función para sacar CHAR<br />

INT 21h ; imprime el carácter que está en DL<br />

RET : retorna de este procedimiento<br />

WRITE _CHAR ENDP<br />

END PRINT _A_J<br />

PROC y ENDP son directivas para definir procedimientos. PROC define el inicio y<br />

ENDP define el final.<br />

En este ejemplo, tenemos 2 procedimientos; por lo tanto, necesitamos indicarle al ensamblador<br />

cuál debe usar como el procedimiento principal (donde debe el microprocesador<br />

iniciar la ejecución de nuestro programa) La directiva END indica al ensamblador<br />

cual es el procedimiento principal. El procedimiento principal puede estar en cualquier<br />

lugar del programa. Sin embargo como estamos tratando con archivos *.COM, debemos<br />

colocar primero el procedimiento principal.<br />

NOTA: Si encuentras algún mensaje de error que no reconozcas, verifica que hayas digitado<br />

el programa adecuadamente. Si aún falla, consulta el manual del ensamblador<br />

Después, usa el DEBUG para desensamblar el programa y ver cómo el ensamblador<br />

pone los procedimientos juntos.<br />

C> DEBUG PRINT:A_J.COM<br />

Procedimiento para exhibir números decimales en el monitor<br />

Digita el siguiente programa y nómbralo VIDEO_IO.ASM.<br />

.MO<strong>DEL</strong> SMALL<br />

.CODE<br />

TEST_WRITE_HEX PROC<br />

MOV DL, 3Fh ; prueba con 3Fh<br />

CALL WRITE_HEX<br />

INT 20h MOV AH, 4Ch<br />

TEST_WRITE_HEX ENDP ; retorna al DOS INT 21h<br />

3. <strong>LENGUAJE</strong> <strong>ENSAMBLADOR</strong> <strong>DEL</strong> <strong>MICROPROCESADOR</strong><br />

LUIS URIETA PÉREZ Y PABLO FUENTES RAMOS<br />

3 -23


PUBLIC WRITE_HEX<br />

COMPUTACIÓN V<br />

<strong>MICROPROCESADOR</strong>ES Y MICROCOMPUTADORAS<br />

;este procedimiento convierte el byte en el registro DL a hex<br />

;y escribe los dos dígitos hexadecimales en la posición corriente<br />

;del cursor<br />

; DL byte a ser convertido a hexadecimal<br />

;usa a: WRITE_HEX_DIGIT<br />

WRITE_HEX PROC<br />

PUSH CX ; almacena registros usados en este procedimiento<br />

PUSH DX<br />

MOV DH, DL ; hacemos una copia del byte<br />

MOV CX, 4<br />

SHR DL, CX<br />

CALL WRITE_HEX_DIGIT ;despliega el primer dígito hexadecimal<br />

MOV DL, DH ; vamos con el nibble bajo<br />

AND DL, 0Fh ; elimina el nibble alto<br />

CALL WRITE_HEX_DIGIT ; despliega al segundo dígito hexadecimal<br />

POP DX<br />

POP CX<br />

RET<br />

WRITE_HEX ENDP<br />

PUBLIC WRITE_HEX<br />

;este procedimiento convierte los 4 bit menos significativos de DL a un dígito hexadecimal<br />

;y lo escribe en la pantalla<br />

; DL los 4 bits menos significativos contienen el número a ser impreso<br />

;usa a: WRITE_CHAR<br />

WRITE_HEX_DIGIT PROC<br />

PUSH DX<br />

CPM DL, 10 ; ¿es el nibble


END TEST_WRITE_HEX<br />

COMPUTACIÓN V<br />

<strong>MICROPROCESADOR</strong>ES Y MICROCOMPUTADORAS<br />

En este programa, hay una nueva directiva PUBLIC la cual indica al ensamblador que<br />

genere información adicional al LINKER. El LINKER nos permite traer partes separadas<br />

de nuestro programa, ensamblarlas desde diferentes archivos fuente en un solo programa.<br />

La directiva PUBLIC informa al ensamblador que el procedimiento nombrado<br />

después de PUBLIC debe ser hecho público o disponible a los procedimientos de otros<br />

archivos.<br />

Esqueleto de un programa en ensamblador<br />

Para referencia futura, lo mínimo que requiere un programa en ensamblador es:<br />

.MO<strong>DEL</strong> SMALL<br />

.CODE<br />

NOMBRE_PROCEDIMIENTO PROC<br />

INSTRUCCIONES<br />

MOV AH, 4Ch<br />

INT 20h INT 21h<br />

END<br />

Directiva: .DATA<br />

NOMBRE_PROCEDIMIENTO ENDP<br />

Declara un segmento de datos que se usa para variables de memoria. El segmento<br />

creado por .DATA es _DATA.<br />

Directiva: .MO<strong>DEL</strong> SMALL<br />

Se considera un programa como SMALL cuando contiene hasta 64K de código y 64K<br />

de datos.<br />

Ya que .DATA y .STACK son datos, se ponen en un solo segmento cuando se usa el<br />

modelo de memoria MO<strong>DEL</strong> SMALL.<br />

DS, SS<br />

DGROUP<br />

_DATA<br />

STACK<br />

3. <strong>LENGUAJE</strong> <strong>ENSAMBLADOR</strong> <strong>DEL</strong> <strong>MICROPROCESADOR</strong><br />

LUIS URIETA PÉREZ Y PABLO FUENTES RAMOS<br />

El agrupamiento de los segmentos STACK y<br />

DATA en un solo segmento es controlado por<br />

un mecanismo del ensamblador llamado<br />

GROUPS.<br />

El ensamblador crea un grupo llamado<br />

DGROUP que a su vez crea un solo segmento<br />

con .DATA y STACK.<br />

3 -25


Directiva: .DOSSEG<br />

COMPUTACIÓN V<br />

<strong>MICROPROCESADOR</strong>ES Y MICROCOMPUTADORAS<br />

Causa que el STACK SEGMENT se cargue en memoria después del DATA SEG-<br />

MENT; hay una razón para esto. El segmento de datos que creamos tiene datos que<br />

necesitan estar en el archivo *.EXE, así que puedan ser copiados en memoria cuando<br />

nuestro programa está “corriendo”. De igual forma, el STACK necesita tomar espacio en<br />

memoria, pero la memoria del STACK no necesita estar inicializada (solamente el<br />

SS:SP tiene que activarse)<br />

De esta forma, poniendo el STACK SEGMENT después del DATA SEGMENT no necesitamos<br />

espacio en el disco para el STACK.<br />

La directiva DOSSEG indica al ensamblador que queremos los segmentos de nuestro<br />

programa cargado en un orden específico (el segmento de código primero y el STACK<br />

al último)<br />

Veamos lo expuesto en un ejemplo:<br />

Obtener la suma de 10 datos y desplegar el resultado en la pantalla.<br />

DOSSEG<br />

.MO<strong>DEL</strong> SMALL<br />

.STACK ; asigna un STACK de 1K<br />

. DATA<br />

PUBLIC DATOSSUM<br />

DATOSSUM DB 01h, 02h, 03h, 04h, 05h ; datos que vamos<br />

DB 06h, 07h, 08h, 09h, OAh ; a procesar<br />

.CODE<br />

.SUMA PROC<br />

ACUMULA:<br />

MOV AX, DGROUP<br />

MOV DS, AX<br />

XOR BX, BX ; índice de acceso al área de datos<br />

XOR DL, DL ; acumulador de datos<br />

MOV CX, OAh ; número de datos a procesar<br />

ADD DL, DATOSSUM [BX]<br />

INC BX<br />

LOOP ACUMULA<br />

MOV AH, 02h<br />

; DL contiene el resultado<br />

; despliega el resultado<br />

INT 21h ; AL = dato a desplegar<br />

MOV AH, 4Ch ;<br />

INT 21h ; salida al DOS<br />

SUMA ENDP<br />

END<br />

Los siguientes ejercicios propuestos, son con el fin de mostrar el uso del conjunto<br />

de instrucciones del microprocesador y sus modos de direccionamiento.<br />

3. <strong>LENGUAJE</strong> <strong>ENSAMBLADOR</strong> <strong>DEL</strong> <strong>MICROPROCESADOR</strong><br />

LUIS URIETA PÉREZ Y PABLO FUENTES RAMOS<br />

3 -26


COMPUTACIÓN V<br />

<strong>MICROPROCESADOR</strong>ES Y MICROCOMPUTADORAS<br />

Empezamos a usar instrucciones básicas y modos de direccionamiento básicos<br />

y vamos aumentando la complejidad de las instrucciones y de los modos de direccionamiento<br />

en forma tal que al concluir los ejercicios hayamos cubierto un 80% del<br />

conjunto de instrucciones de la máquina.<br />

Para cada ejercicio está propuesta la solución en un diagrama de flujo, después<br />

se muestra la codificación en lenguaje ensamblador y para los usuarios de la utilería<br />

DEBUG del DOS, se muestra la codificación en lenguaje de máquina.<br />

Todos los programas con DEBUG inician en la localidad 100 y los comandos a<br />

utilizar son: R (registro), T (ejecución paso a paso) y E (examina y cambia memoria)<br />

Con estos comandos, podemos ejecutar cualquiera de los programas.<br />

Con el fin de aprovechar el lenguaje ensamblador, también se muestra la codificación<br />

y la ejecución en el Turbo Ensamblador de Borlan.<br />

EJERCICIO 1. El contenido de la localidad 0200 tiene un dato de 8 bits. Realizar un<br />

programa que coloque en la localidad de memoria 0201 el nibble (4<br />

bits) más significativo, tomando en cuenta que el nibble menos significativo<br />

debe ser 0.<br />

SOLUCIÓN<br />

Se puede ver gráficamente el contenido de las localidades 0200 y 0201 para comprender<br />

mejor el enunciado:<br />

200<br />

201<br />

Podemos hacerlo con la operación AND, donde:<br />

bn • 1 = bn<br />

bn • 0 = 0<br />

Diagrama de flujo:<br />

b7 b6 b5 b4<br />

b7 b6 b5 b4<br />

B3 b2 b1 b0<br />

0 0 0 0<br />

MÁSCARA<br />

AL ‹ [200]<br />

AL ‹ AL and F0<br />

[201] ‹ AL<br />

3. <strong>LENGUAJE</strong> <strong>ENSAMBLADOR</strong> <strong>DEL</strong> <strong>MICROPROCESADOR</strong><br />

LUIS URIETA PÉREZ Y PABLO FUENTES RAMOS<br />

FIN<br />

3 -27


Codificación en lenguaje ensamblador:<br />

COMPUTACIÓN V<br />

<strong>MICROPROCESADOR</strong>ES Y MICROCOMPUTADORAS<br />

MASCARA:<br />

MOV AL, [200] ;mueve el contenido de la localidad 200 a AL<br />

AND AL, F0 ;coloca 1111 0000 en AL<br />

MOV [201], AL ;mueve el contenido de AL a la localidad 201<br />

MOV AH, 4C ;mueve el contenido de 4C a AH<br />

INT 21<br />

Codificación en lenguaje máquina:<br />

Ejecución:<br />

0100 A0 00 20<br />

0103 24 F0<br />

9105 A2 01 02<br />

0108 4B 4C<br />

010A CD 21<br />

• R<br />

• T<br />

• T<br />

• T<br />

• T<br />

• E<br />

EJERCICIO 2.<br />

3. <strong>LENGUAJE</strong> <strong>ENSAMBLADOR</strong> <strong>DEL</strong> <strong>MICROPROCESADOR</strong><br />

LUIS URIETA PÉREZ Y PABLO FUENTES RAMOS<br />

3 -28


COMPUTACIÓN V<br />

<strong>MICROPROCESADOR</strong>ES Y MICROCOMPUTADORAS<br />

EJERCICIO 3. Realizar un programa que coloque en la localidad de memoria 202 el número<br />

menor de los contenidos en las localidades 200 y 201. Considere<br />

números sin signo.<br />

NOTA: El DEBUG asume que los datos son hexadecimales, mientras que el ensamblador<br />

considera que son decimales. En caso de usar el ensamblador<br />

agregar H al final del dato.<br />

Gráficamente, se tiene:<br />

200<br />

201<br />

202<br />

Diagrama de flujo:<br />

Codificación en lenguaje ensamblador:<br />

N1<br />

N2<br />

COMPARA: MOV AL, [200]<br />

CMP AL, [201]<br />

JNB SII<br />

MOV AL, [201]<br />

SII: MOV [202], AL<br />

MOV AH, 4C<br />

INT 21<br />

SOLUCIÓN<br />

El menor de los dos<br />

Si empleamos el DEBUG, podemos utilizar el comando ASSEMBLY e iniciar en la localidad<br />

de memoria 100; o bien, podemos utilizar la tabla de instrucciones y codificar directamente<br />

en lenguaje de máquina empleando el comando E, que permite capturar en<br />

hexadecimal el programa.<br />

3. <strong>LENGUAJE</strong> <strong>ENSAMBLADOR</strong> <strong>DEL</strong> <strong>MICROPROCESADOR</strong><br />

LUIS URIETA PÉREZ Y PABLO FUENTES RAMOS<br />

SII<br />

COMPARA<br />

AL ‹ [200]<br />

AL vs [201]<br />

AL ‡ [201]<br />

SI<br />

[202] ‹ AL<br />

FIN<br />

NO<br />

(1)<br />

(2)<br />

(4)<br />

(5)<br />

AL ‹ [201]<br />

(3)<br />

3 -29


Codificación en lenguaje máquina:<br />

0100 A0 00 02<br />

0103 3A 06 01 02<br />

0107 73 03<br />

0109 A0 01 02<br />

010C A2 02 02<br />

010F B4 4C<br />

0111 CD 21<br />

COMPUTACIÓN V<br />

<strong>MICROPROCESADOR</strong>ES Y MICROCOMPUTADORAS<br />

Para ejecutar el programa, cargamos el registro IP con el valor de inicio del programa,<br />

escribiendo:<br />

_R IP 100 ¿ después con el comando _T (Trace) ejecutamos paso a paso el programa.<br />

EJERCICIO 4. Sumar 2 números binarios de 24 bits y almacenar el resultado a partir de<br />

la localidad de memoria 0206h. Los bits menos significativos de los números<br />

empiezan en las localidades 0200h y 0203h.<br />

SOLUCIÓN<br />

Se puede ver gráficamente el contenido de las localidades 0200h a 0208h para comprender<br />

mejor el enunciado:<br />

200<br />

201<br />

202<br />

203<br />

204<br />

205<br />

206<br />

207<br />

208<br />

N0<br />

N1<br />

N2<br />

M0<br />

M1<br />

M2<br />

Codificación en lenguaje ensamblador:<br />

+<br />

N0 + M0<br />

N1 + M1 + C<br />

N2 + M2 + C<br />

SUMA:<br />

MOV AL, [200] ;mover el contenido de la localidad 200 a AL<br />

ADD AL, [203] ;sumar el contenido de la localidad 201 a AL 8 LSB<br />

MOV [206], AL ;mover el contenido de AL a la localidad 206<br />

MOV AL, [201] ;mover el contenido de la localidad 201 a AL<br />

ADC AL, [204] ;sumar el contenido de la localidad 204 con AL 2º BYTE<br />

MOV [207], AL ;mover el contenido de AL a la localidad 207<br />

MOV AL, [202] ;mover el contenido de la localidad 202 a AL<br />

ADC AL, [205] ;sumar el contenido de la localidad 205 con AL 8 MSB<br />

MOV [208], AL ;mover el contenido de AL a la localidad 208<br />

RET<br />

NOTA: Observe que en las instrucciones de MOVer no se afecta ninguna bandera del PSW.<br />

[200] se refiere al contenido de la dirección 200.<br />

3. <strong>LENGUAJE</strong> <strong>ENSAMBLADOR</strong> <strong>DEL</strong> <strong>MICROPROCESADOR</strong><br />

LUIS URIETA PÉREZ Y PABLO FUENTES RAMOS<br />

_E 200 AA AA AA<br />

_E<br />

_E<br />

203<br />

206<br />

BB BB BB<br />

00 00 00<br />

65 66 66<br />

Para introducir los datos, usamos la<br />

instrucción E (examina y/o cambia el<br />

contenido de la localidad de memoria<br />

3 -30


COMPUTACIÓN V<br />

<strong>MICROPROCESADOR</strong>ES Y MICROCOMPUTADORAS<br />

AA AA AA = 1010 1010 1010 1010 1010 1010<br />

BB BB BB = 1011 1011 1011 1011 1011 1011<br />

Acarreos 111 111 111 111 111 1<br />

0110 0110 0110 0110 0110 0101<br />

EJERCICIO 5. Uso del registro CX como contador. Vamos a mover los 8 bits menos<br />

significativos del registro BL al registro BH.<br />

Diagrama de flujo:<br />

Sean los datos iniciales:<br />

BX = BH y BL = 43A6<br />

La instrucción que usaremos será RLC BX, 1, 8 veces. Para este tipo<br />

de repeticiones usaremos al registro CX como contador.<br />

NO<br />

Codificación en lenguaje ensamblador:<br />

ROTA8: MOV BX, 43A6 ;(1)<br />

MOV CX, 08 ;(2)<br />

OTRAVEZ: RLC BX, 1 ;(3)<br />

LOOP OTRAVEZ ;(4)<br />

MOV AH, 4C ;(5)<br />

INT 21 ;(6)<br />

SOLUCIÓN<br />

ROTA8<br />

BX ‹ 43A6<br />

CX ‹ 08<br />

RLC BX, 1<br />

CX ‹ CX - 1<br />

¿CX = 0?<br />

3. <strong>LENGUAJE</strong> <strong>ENSAMBLADOR</strong> <strong>DEL</strong> <strong>MICROPROCESADOR</strong><br />

LUIS URIETA PÉREZ Y PABLO FUENTES RAMOS<br />

FIN<br />

SI<br />

número inicial<br />

continua<br />

loop<br />

3 -31


COMPUTACIÓN V<br />

<strong>MICROPROCESADOR</strong>ES Y MICROCOMPUTADORAS<br />

NOTA: Observar que en (4) ponemos LOOP OTRAVEZ y como es un salto hacia atrás el DE-<br />

BUG pone un …………….<br />

Codificación en lenguaje máquina:<br />

0100 B3 A6 43 ;(1)<br />

0103 B9 08 00 ;(2)<br />

0106 D1 D3 ;(3)<br />

0108 E2 FC ;(4)<br />

010A B4 4C ;(5)<br />

010C CD 21 ;(6)<br />

NOTA: En 0108 saltamos hacia atrás 4 localidades de memoria, es decir:<br />

0000 0100<br />

Como el salto es hacia atrás, lo ponemos como negativo en notación complemento a 2,<br />

es decir:<br />

C1 = 1111 1011<br />

+1<br />

C2 = 1111 1100<br />

F C<br />

Cuando saltamos hacia delante el número es positivo. Para salto corto usamos 8 bits y<br />

para salto largo 16 bits.<br />

EJERCICIO 7. Calcular la suma verificación de una serie de datos. La longitud de la<br />

serie de datos está en la localidad 201h y la serie comienza en la localidad<br />

202h. Almacenar la suma verificación en la localidad 200h. La<br />

suma verificación se forma haciendo la suma O exclusiva entre todos<br />

los números de la serie.<br />

200<br />

201<br />

202<br />

Diagrama de flujo:<br />

SUGERENCIA: Utilice CX como contador.<br />

Suma verificación<br />

longitud<br />

inicio<br />

SOLUCIÓN<br />

SUMA VERIF<br />

CH ‹ 0<br />

CL ‹ [201]<br />

BX ‹ 202<br />

AL ‹ [BX]<br />

3. <strong>LENGUAJE</strong> <strong>ENSAMBLADOR</strong> <strong>DEL</strong> <strong>MICROPROCESADOR</strong><br />

LUIS URIETA PÉREZ Y PABLO FUENTES RAMOS<br />

Dirección de inicio<br />

3 -32


Codificación en lenguaje ensamblador:<br />

COMPUTACIÓN V<br />

<strong>MICROPROCESADOR</strong>ES Y MICROCOMPUTADORAS<br />

SUMAVERIF:<br />

MOV CH, 0 ;poner 0 en CH<br />

MOV CL, [201] ;mover el contenido de la localidad 201 a CL<br />

MOV BX, 200 ;mover el contenido de 200 a BX<br />

MOV AL, [BX] ;mover el contenido de BX a AL<br />

SUMAO: INC BX ;incrementar BX<br />

XOR AL, [BX] ;O exclusiva contenidos AL y BX<br />

DEC CX ;decrementar CX<br />

LOOP SUMAO<br />

MOV [200], AL ;mover el contenido de AL a la localidad 200<br />

RET<br />

Codificación en lenguaje máquina:<br />

0100 B5 00<br />

0102 8A 0E 01 02<br />

0106 3B 02 02<br />

0108 4B<br />

0109 8A 07<br />

010C 43<br />

010D 32 07<br />

010F E2 F8<br />

0111 A2 00 02<br />

0114<br />

0116<br />

B4<br />

CD<br />

4C<br />

21<br />

Retorno al DOS<br />

BX ‹ BX + 1<br />

AL ‹ AL ¯ BX<br />

CX ‹ CX - 1<br />

¿CX = 0?<br />

[200] ‹ AL<br />

Si utilizamos la tabla de instrucciones y sus respectivos códigos de DEBUG, podemos capturar<br />

en lenguaje de máquina el programa. Estando en DOS teclear:<br />

C>DEBUG¿<br />

_E 100¿ Introducimos el programa. Para ejecutarlo, colocamos 100 en el registro IP:<br />

_R IP,100¿ después, para ejecutar el programa paso a paso usamos el comando T:<br />

_T¿ etc.<br />

3. <strong>LENGUAJE</strong> <strong>ENSAMBLADOR</strong> <strong>DEL</strong> <strong>MICROPROCESADOR</strong><br />

LUIS URIETA PÉREZ Y PABLO FUENTES RAMOS<br />

NO<br />

FIN<br />

SI<br />

3 -33


COMPUTACIÓN V<br />

<strong>MICROPROCESADOR</strong>ES Y MICROCOMPUTADORAS<br />

EJERCICIO 8. Calcular la suma de una serie de números de 16 bits. La longitud de la<br />

serie está en la localidad de memoria 0202 y la serie empieza en la localidad<br />

de memoria 0203. Almacenar la suma en las localidades de<br />

memoria 0200 y 0201. Considere que la adición puede estar contenida<br />

en 16 bits<br />

200<br />

201<br />

202<br />

203<br />

204<br />

205<br />

206<br />

207<br />

208<br />

Diagrama de flujo:<br />

8 bits menos significativos<br />

8 bits más significativos<br />

Longitud = 3<br />

01 (bits menos significativos)<br />

02 (bits más significativos)<br />

01 (bits menos significativos)<br />

02 (bits más significativos)<br />

01 (bits menos significativos)<br />

02 (bits más significativos)<br />

SOLUCIÓN<br />

3. <strong>LENGUAJE</strong> <strong>ENSAMBLADOR</strong> <strong>DEL</strong> <strong>MICROPROCESADOR</strong><br />

LUIS URIETA PÉREZ Y PABLO FUENTES RAMOS<br />

NO<br />

INICIO<br />

CL ‹ [202]<br />

CH ‹ 0<br />

BX ‹ 203<br />

AX ‹ 0<br />

N0<br />

N1<br />

N2<br />

CARRY ‹ 0<br />

AX ‹ AX + [BX] + carry<br />

BX ‹ BX + 2<br />

CX ‹ CX - 1<br />

¿CX = 0?<br />

CONTADOR<br />

3 -34


Codificación en lenguaje ensamblador:<br />

INICIO: CLC<br />

MOV CH, 0<br />

MOV CL, [202]<br />

MOV BX, 203<br />

MOV AX, 0<br />

RETORNO: ADC AX, [BX]<br />

INC BX<br />

LOOP RETORNO<br />

MOV [200], AX<br />

END<br />

COMPUTACIÓN V<br />

<strong>MICROPROCESADOR</strong>ES Y MICROCOMPUTADORAS<br />

Codificación en lenguaje máquina: Usamos el DEBUG para ejecutar el programa en lenguaje<br />

de máquina<br />

0100 F8 CLC<br />

0101 B5 00 MOV CH, 0<br />

0103 8A 0E 02 02 MOV CL, [202]<br />

0107 B3 03 02 MOV BX, 203<br />

010A B8 00 00 MOV AX, 0<br />

010D 13 07 ADC AX, [BX]<br />

010F 83 C3 02 ADD BX, 2<br />

0112 E2 F9 LOOP, RETORNO<br />

0114 A3 00 20 MOV [200], AX<br />

EJERCICIO 9. Determinar el número de elementos que sean positivos, negativos y cero.<br />

La longitud del bloque está en la localidad 0203, el bloque inicia en la<br />

localidad 0204. En la localidad 0200 deposite el número de elementos<br />

negativos, en la 0201 el número de elementos ceros y en la 0202 el<br />

número de elementos positivos.<br />

En forma gráfica, se tiene:<br />

200<br />

201<br />

202<br />

203<br />

204<br />

Número de elementos NEGATIVOS<br />

Número de elementos CERO<br />

Número de elementos POSITIVOS<br />

LONGITUD<br />

INICIO<br />

[200] ‹ AL<br />

[201] ‹ AH<br />

SOLUCIÓN<br />

3. <strong>LENGUAJE</strong> <strong>ENSAMBLADOR</strong> <strong>DEL</strong> <strong>MICROPROCESADOR</strong><br />

LUIS URIETA PÉREZ Y PABLO FUENTES RAMOS<br />

FIN<br />

SI<br />

3 -35


Diagrama de flujo:<br />

negativos<br />

NO<br />

INICIO<br />

[200] ‹ 0<br />

[201] ‹ 0<br />

[202] ‹ 0<br />

CH ‹ 0<br />

CL ‹ [203]<br />

BX ‹ 204h<br />

AL ‹ [BX]<br />

AL vs 00<br />

AL ‡ 0<br />

[200] ‹ [200]+1<br />

BX ‹ BX+1<br />

CX ‹ CX-1<br />

CX = 0<br />

FIN<br />

Codificación en lenguaje ensamblador:<br />

COMPUTACIÓN V<br />

<strong>MICROPROCESADOR</strong>ES Y MICROCOMPUTADORAS<br />

Z = 1<br />

INICIO: MOV AL, 00h<br />

MOV [200], AL<br />

MOV [201], AL<br />

MOV [202], AL<br />

MOV CH, AL<br />

MOV CL, [203]<br />

MOV BX, 0204<br />

MOV AL, [BX]<br />

RETORNO: CMP AL, 00h<br />

JGE SII ;SI es palabra reservada<br />

INC [200]<br />

SIGUE: INC BX ;SI índice fuente<br />

LOOPNZ RETORNO<br />

FIN: RET<br />

SII: JNZ NO<br />

INC [201]<br />

JMP SIGUE<br />

3. <strong>LENGUAJE</strong> <strong>ENSAMBLADOR</strong> <strong>DEL</strong> <strong>MICROPROCESADOR</strong><br />

LUIS URIETA PÉREZ Y PABLO FUENTES RAMOS<br />

NO<br />

SI<br />

SI<br />

cero<br />

SI<br />

NO<br />

[201] ‹ [201]+1 [202] ‹ [202]+1<br />

positivos<br />

3 -36


NO: INC [202]<br />

JMP SIGUE<br />

COMPUTACIÓN V<br />

<strong>MICROPROCESADOR</strong>ES Y MICROCOMPUTADORAS<br />

EJERCICIO 10. Encontrar al elemento más pequeño de un bloque de datos. La longitud<br />

del bloque está en la localidad 4001 y el bloque inicia en la localidad<br />

4002. Almacene el resultado en la localidad 4000, considerando números<br />

sin signo.<br />

Gráficamente, se tiene:<br />

4000<br />

4001<br />

4002<br />

Diagrama de flujo<br />

MENOR<br />

LONGITUD<br />

X<br />

DATO 1<br />

DATO 2<br />

DATO n<br />

N<br />

O<br />

SOLUCIÓN<br />

MENOR<br />

DI ‹ 4002<br />

AL ‹ [DI]<br />

CL ‹ [4001]<br />

CH ‹ 00<br />

DI ‹ DI+1<br />

AL vs [DI]<br />

AL ‹ [DI]<br />

CX ‹ CX-1<br />

¿CX = 0?<br />

4000 ‹[AL]<br />

3. <strong>LENGUAJE</strong> <strong>ENSAMBLADOR</strong> <strong>DEL</strong> <strong>MICROPROCESADOR</strong><br />

LUIS URIETA PÉREZ Y PABLO FUENTES RAMOS<br />

FIN<br />

‡<br />

SI<br />

<<br />

CX = conta-<br />

Y<br />

3 -37


Codificación en lenguaje ensamblador:<br />

COMPUTACIÓN V<br />

<strong>MICROPROCESADOR</strong>ES Y MICROCOMPUTADORAS<br />

MENOR: MOV DI, 4002<br />

MOV AL, [DI]<br />

MOV CL, [4001]<br />

MOV CH, 0<br />

X: INC DI<br />

CMP AL, [DI]<br />

JB Y ;JL para números con signo<br />

MOV AL, [DI]<br />

Y: LOOP X<br />

MOV [4000], AL<br />

END<br />

EJERCICIO 11. Determinar cuántos bits valen 1 en el contenido de la localidad de memoria<br />

200. Almacene el resultado en la localidad 201<br />

Gráficamente, se tiene:<br />

200<br />

201<br />

Diagrama de flujo<br />

DATO<br />

# DE UNOS DE DATO<br />

X<br />

N<br />

O<br />

SOLUCIÓN<br />

UNOS<br />

[201] ‹ 0<br />

AL ‹[200]<br />

CX ‹ 0008<br />

Rotamos hacia la<br />

izquierda AL REG<br />

¿C =<br />

[201] ‹ [201]+1<br />

CX ‹ CX-1<br />

¿CX = 0?<br />

3. <strong>LENGUAJE</strong> <strong>ENSAMBLADOR</strong> <strong>DEL</strong> <strong>MICROPROCESADOR</strong><br />

LUIS URIETA PÉREZ Y PABLO FUENTES RAMOS<br />

FIN<br />

SI<br />

SI<br />

N<br />

O<br />

Y<br />

3 -38


Codificación en lenguaje ensamblador:<br />

MENOR: MOV AL, 00h<br />

MOV [201], AL<br />

MOV AL, [200]<br />

MOV CX, 0008h<br />

X: ROL AL<br />

JNC Y<br />

INC [201]<br />

Y: LOOP X<br />

END<br />

COMPUTACIÓN V<br />

<strong>MICROPROCESADOR</strong>ES Y MICROCOMPUTADORAS<br />

EJERCICIO 12. Determinar la longitud de un mensaje ASCII. Los caracteres son de 7<br />

bits, el octavo es 0. La cadena de caracteres en la cual viene incluido<br />

el mensaje inicia en la localidad 201. El mensaje inicia con STX (02h)<br />

y finaliza con ETX (03h) Colocar la longitud del mensaje en la localidad<br />

200 (no contar STX ni ETX)<br />

Gráficamente, se tiene:<br />

200<br />

201<br />

202<br />

203<br />

Diagrama de flujo<br />

LONGITUD <strong>DEL</strong> MENSAJE<br />

INICIO 02h ´STX´<br />

FINAL 03h ´ETX´<br />

X<br />

SOLUCIÓN<br />

LONGITUD <strong>DEL</strong> MENSAJE<br />

LONG<br />

[200] ‹ 00<br />

DI ‹ 202<br />

AL ‹ [DI]<br />

AL vs ´ETX´<br />

¿Z = 1?<br />

N<br />

O<br />

[200] ‹ [200]+1 FIN<br />

DI ‹ DI+1<br />

3. <strong>LENGUAJE</strong> <strong>ENSAMBLADOR</strong> <strong>DEL</strong> <strong>MICROPROCESADOR</strong><br />

LUIS URIETA PÉREZ Y PABLO FUENTES RAMOS<br />

SI<br />

3 -39


Codificación en lenguaje ensamblador:<br />

LONG: MOV [200], 00h<br />

MOV DI, 0202h<br />

X: MOV AL, [DI]<br />

CMP AL, ´ETX´<br />

JE FIN<br />

INC [200]<br />

INC DI<br />

JMP X<br />

FIN: END<br />

COMPUTACIÓN V<br />

<strong>MICROPROCESADOR</strong>ES Y MICROCOMPUTADORAS<br />

EJERCICIO 13. Investigar una cadena de caracteres ASCII para determinar el último<br />

carácter distinto del blanco. La cadena empieza en la localidad 202 y<br />

finaliza con CR (0Dh) Colocar la dirección del último carácter diferente<br />

del espacio en la localidad 200 y 201.<br />

Gráficamente, se tiene:<br />

200<br />

201<br />

202<br />

Diagrama de flujo<br />

INICIA CADENA<br />

0Dh ´CR´<br />

X<br />

SOLUCIÓN<br />

LONGITUD DE LA CADENA<br />

3. <strong>LENGUAJE</strong> <strong>ENSAMBLADOR</strong> <strong>DEL</strong> <strong>MICROPROCESADOR</strong><br />

LUIS URIETA PÉREZ Y PABLO FUENTES RAMOS<br />

DIR<br />

SI ‹ 202<br />

AL ‹ [SI]<br />

AL vs ´CR´<br />

AL = ´CR´<br />

AL vs ´SPACE´<br />

AL = ´SPACE´<br />

No<br />

No<br />

SI ‹ SI+1 SI ‹ SI-1<br />

Si<br />

Si<br />

[200] ‹ SI<br />

FIN<br />

3 -40


Codificación en lenguaje ensamblador:<br />

COMPUTACIÓN V<br />

<strong>MICROPROCESADOR</strong>ES Y MICROCOMPUTADORAS<br />

DIR: MOV SI, 202<br />

X: MOV AL, [SI]<br />

CMP AL, 0dh ;AL vs ´CR´<br />

JE Almacena<br />

CMP AL, 20h ;AL vs ´SPACE´<br />

JE ANTESALM<br />

INC SI<br />

JMP X<br />

ANTESALM: DEC SI<br />

ALMACENA: MOV 200, SI<br />

END<br />

EJERCICIO 14. Reemplazar todos los dígitos que están a la derecha del punto decimal<br />

por caracteres blancos. La cadena inicia en la localidad 201 y consiste<br />

de números decimales codificados en ASCII y un posible punto decimal<br />

(2Eh) La longitud está en la localidad 200. Si no aparece punto<br />

decimal, asuma que está implícito en el lado derecho.<br />

NOTA: En ASCII los decimales 0,…,9 se representan como 30,…,39.<br />

3. <strong>LENGUAJE</strong> <strong>ENSAMBLADOR</strong> <strong>DEL</strong> <strong>MICROPROCESADOR</strong><br />

LUIS URIETA PÉREZ Y PABLO FUENTES RAMOS<br />

3 -41


Gráficamente, se tiene:<br />

Diagrama de flujo<br />

R1<br />

200<br />

201<br />

NO<br />

LONGITUD DE LA CADENA<br />

INICIA CADENA<br />

2E<br />

20h<br />

20h<br />

20h<br />

20h<br />

COMPUTACIÓN V<br />

<strong>MICROPROCESADOR</strong>ES Y MICROCOMPUTADORAS<br />

PUNTO<br />

BX ‹ 201<br />

CH ‹ 0<br />

CL ‹ [200]<br />

AL ‹ [BX]<br />

AL vs 2E<br />

BX ‹ BX+1<br />

CX ‹ CX-1<br />

FIN<br />

SOLUCIÓN<br />

PUNTO DECIMAL<br />

BLANCOS<br />

3. <strong>LENGUAJE</strong> <strong>ENSAMBLADOR</strong> <strong>DEL</strong> <strong>MICROPROCESADOR</strong><br />

LUIS URIETA PÉREZ Y PABLO FUENTES RAMOS<br />

AH ‹ 20<br />

BX‹BX+1<br />

[BX] ‹ AH<br />

CX ‹ CX-1<br />

Z = 1 CX = 0<br />

CX = 0<br />

SI<br />

NO<br />

SII<br />

FIN<br />

AH = BLANCO<br />

SI<br />

NO<br />

R2<br />

3 -42


Codificación en lenguaje ensamblador:<br />

PUNTO: MOV BX, 201<br />

MOV CL, [0200]<br />

MOV CH, 00h<br />

RI: MOV AL, [BX]<br />

CMP AL, 2Eh<br />

JZ SII<br />

INC BX<br />

LOOP R1<br />

END<br />

SII: MOV AH, 20h<br />

R2: INC BX<br />

MOV [BX], AH<br />

DEC CX<br />

JNZ R2<br />

END<br />

COMPUTACIÓN V<br />

<strong>MICROPROCESADOR</strong>ES Y MICROCOMPUTADORAS<br />

EJERCICIO 15. Verificar la paridad par de caracteres ASCII. La longitud de la cadena<br />

está en la localidad 201h e inicia en la 202h. Si la paridad de todos<br />

los caracteres de la cadena es correcta, borrar el contenido de la localidad<br />

200h; en caso contrario colocar FF<br />

Gráficamente, se tiene:<br />

200<br />

201<br />

202<br />

AL = DATO<br />

00 si la paridad es correcta<br />

FF si la paridad es incorrecta<br />

Longitud de la cadena<br />

Inicia la cadena<br />

Fin de la cadena<br />

SOLUCIÓN<br />

b7 b6 b5 b4 b3 b2 b1 b0 Contamos los UNOS<br />

Si contador = par Correcto<br />

Si contador = non Incorrecto<br />

3. <strong>LENGUAJE</strong> <strong>ENSAMBLADOR</strong> <strong>DEL</strong> <strong>MICROPROCESADOR</strong><br />

LUIS URIETA PÉREZ Y PABLO FUENTES RAMOS<br />

3 -43


Diagrama de flujo<br />

X<br />

NO<br />

COMPUTACIÓN V<br />

<strong>MICROPROCESADOR</strong>ES Y MICROCOMPUTADORAS<br />

PARIDAD<br />

3. <strong>LENGUAJE</strong> <strong>ENSAMBLADOR</strong> <strong>DEL</strong> <strong>MICROPROCESADOR</strong><br />

LUIS URIETA PÉREZ Y PABLO FUENTES RAMOS<br />

Rutina de verificación de paridad<br />

BX ‹ 202 PILA ‹ CX<br />

CH ‹ 0<br />

CL ‹ [201]<br />

AL ‹ [BX]<br />

S_PARIDAD<br />

BX ‹BX+1<br />

CX ‹CX-1<br />

CX = 0<br />

FIN<br />

SI<br />

Verifica y marca<br />

con 00 o FF la<br />

localidad 200<br />

S_PARIDAD<br />

CX ‹ 8<br />

AH ‹ 0<br />

AL fi (C)<br />

C = 1<br />

AH ‹ AH+1<br />

CX ‹ CX-1<br />

C = 0<br />

AH fi (C)<br />

C = 1<br />

[200] ‹ FF<br />

CX ‹ PILA<br />

Retorno de<br />

subrutina<br />

SI<br />

SI<br />

SI<br />

NO<br />

NO<br />

NO<br />

R2<br />

3 -44


Codificación en lenguaje ensamblador:<br />

Paridad:<br />

PARIDAD: MOV BX, 202<br />

MOV CH, 00<br />

MOV CL, [201]<br />

MOV AL, [BX]<br />

X: CALL S_PARIDAD<br />

INC BX<br />

LOOPNZ X<br />

END<br />

Rutina de verificación de paridad:<br />

S_PARIDAD: PUSH CX<br />

MOV CX, 0008h<br />

MOV AX,00h<br />

R2: RCR AL<br />

JNC SII<br />

ADD AH, 01h<br />

SII: LOOPNZ R2<br />

RCR AH<br />

JNC NO<br />

MOV [0200], FFh<br />

NO: POP CX<br />

RET<br />

COMPUTACIÓN V<br />

<strong>MICROPROCESADOR</strong>ES Y MICROCOMPUTADORAS<br />

EJERCICIO 16. Comparar dos cadenas de caracteres ASCII para determinar cuál sigue<br />

a la otra en orden alfabético. La longitud de las cadenas está en la localidad<br />

201. Una cadena inicia en la localidad 202 y la otra en la localidad<br />

252. Si la cadena que inicia en la localidad 202 es menor o igual<br />

a la otra cadena, borrar la localidad 200, en caso contrario almacenar<br />

FF en la localidad 200.<br />

Gráficamente, se tiene:<br />

200<br />

201<br />

202<br />

252<br />

SOLUCIÓN<br />

00 si la cadena 1 es menor o igual a la cadena 2<br />

FF si la cadena 1 es mayor que la cadena 2<br />

Longitud de las cadenas<br />

Inicia la cadena 1<br />

Inicia la cadena 2<br />

NOTA: En lugar de utilizar los dos registros de índice, vamos a utilizar un apuntador más<br />

un desplazamiento.<br />

3. <strong>LENGUAJE</strong> <strong>ENSAMBLADOR</strong> <strong>DEL</strong> <strong>MICROPROCESADOR</strong><br />

LUIS URIETA PÉREZ Y PABLO FUENTES RAMOS<br />

3 -45


Diagrama de flujo<br />

Codificación en lenguaje ensamblador:<br />

COMPUTACIÓN V<br />

<strong>MICROPROCESADOR</strong>ES Y MICROCOMPUTADORAS<br />

COMPARA: SUB [200], [200] ;asumimos que cadena 1 es menor o igual a cadena 2<br />

MOV DI, 0202h ;DI apunta al inicio de la cadena 1<br />

MOV CH, 00h ;CX igual a la longitud de las cadenas<br />

MOV CL, [0201]<br />

R: MOV AL, [DI]<br />

CMP AL, [DI+10h] ;apunta a la otra cadena<br />

JNC NO<br />

INC DI<br />

LOOPNZ R<br />

END<br />

NO: JB SII<br />

MOV [0200], FFh<br />

SII: END<br />

EJERCICIO 17.<br />

R<br />

COMPARA<br />

[200] ‹ 00<br />

DI ‹ 202<br />

CH ‹ 00<br />

CL ‹ [0201]<br />

Z = 1<br />

DI ‹ DI+1<br />

CX = 0<br />

3. <strong>LENGUAJE</strong> <strong>ENSAMBLADOR</strong> <strong>DEL</strong> <strong>MICROPROCESADOR</strong><br />

LUIS URIETA PÉREZ Y PABLO FUENTES RAMOS<br />

No<br />

Si<br />

AL‹ [DI]<br />

AL vs [DI+10h]<br />

CX ‹ CX-1<br />

FIN<br />

SI<br />

NO<br />

SIGNO = -<br />

[200] ‹ FF<br />

NO<br />

SII<br />

3 -46


Tablas.<br />

COMPUTACIÓN V<br />

<strong>MICROPROCESADOR</strong>ES Y MICROCOMPUTADORAS<br />

La instrucción XLAT realiza la traducción a través de una tabla de búsqueda. La<br />

tabla se debe cargar en memoria y la dirección de inicio (base) se guarda en el registro<br />

BX antes de utilizar esta instrucción.<br />

Si los datos de esta tabla son A(0), A(1), … , A(255), un valor i en AL se reemplaza<br />

por el valor A(i) al ejecutarse XLAT.<br />

Funcionamiento de la instrucción XLAT.<br />

Los contenidos de los registros BX y AL se suman para obtener la dirección de una posición<br />

de memoria y el contenido de dicha posición se copia en AL.<br />

La instrucción XLAT traduce datos de 8 bits; por lo tanto, están restringidos a un rango de<br />

0 a 255.<br />

BX fi A(0)<br />

A(1)<br />

A(2)<br />

A(3)<br />

A(i)<br />

BX + AL =Dirección de una posición de memoria<br />

El contenido de dicha posición se copia en AL<br />

EJERCICIO 18. Conversión del código GRAY a código GRAY-EXCESO 3, sin utilizar la<br />

instrucción XLAT.<br />

SOLUCIÓN<br />

La tabla funcional para la conversión de códigos, se muestra a continuación:<br />

DEC<br />

5000 0<br />

1<br />

2<br />

3<br />

4<br />

5<br />

6<br />

7<br />

8<br />

9<br />

10<br />

11<br />

12<br />

13<br />

14<br />

15<br />

Código GRAY<br />

Código GRAY<br />

EXCESO 3<br />

G3 G2 G1 G0 GE3 GE2 GE1 GE0<br />

3. <strong>LENGUAJE</strong> <strong>ENSAMBLADOR</strong> <strong>DEL</strong> <strong>MICROPROCESADOR</strong><br />

LUIS URIETA PÉREZ Y PABLO FUENTES RAMOS<br />

0<br />

0<br />

0<br />

0<br />

0<br />

0<br />

0<br />

0<br />

1<br />

1<br />

1<br />

1<br />

1<br />

1<br />

1<br />

1<br />

0<br />

0<br />

0<br />

0<br />

1<br />

1<br />

1<br />

1<br />

1<br />

1<br />

1<br />

1<br />

0<br />

0<br />

0<br />

0<br />

0<br />

0<br />

1<br />

1<br />

1<br />

1<br />

0<br />

0<br />

0<br />

0<br />

1<br />

1<br />

1<br />

1<br />

0<br />

0<br />

0<br />

1<br />

1<br />

0<br />

0<br />

1<br />

1<br />

0<br />

0<br />

1<br />

1<br />

0<br />

0<br />

1<br />

1<br />

0<br />

0<br />

0<br />

0<br />

0<br />

0<br />

1<br />

1<br />

1<br />

1<br />

1<br />

1<br />

1<br />

1<br />

0<br />

0<br />

0<br />

AH AL DATO<br />

0<br />

1<br />

1<br />

1<br />

1<br />

1<br />

1<br />

1<br />

1<br />

0<br />

0<br />

0<br />

0<br />

0<br />

0<br />

0<br />

1<br />

1<br />

1<br />

0<br />

0<br />

0<br />

0<br />

1<br />

1<br />

1<br />

1<br />

0<br />

0<br />

0<br />

0<br />

1<br />

0<br />

0<br />

1<br />

1<br />

0<br />

0<br />

1<br />

1<br />

0<br />

0<br />

1<br />

1<br />

0<br />

0<br />

1<br />

1<br />

3 -47


COMPUTACIÓN V<br />

<strong>MICROPROCESADOR</strong>ES Y MICROCOMPUTADORAS<br />

Si consideramos que esta tabla de valores se encuentra almacenada a partir de la localidad<br />

5000h, podemos comparar el contenido del acumulador contra cada uno de los contenidos<br />

de las localidades, hasta encontrar la que acople.<br />

Cuando se encuentra el acoplamiento, los 4 bits menos significativos de esa localidad son<br />

el resultado de la conversión.<br />

Diagrama de flujo<br />

Codificación en lenguaje ensamblador:<br />

R<br />

GRAY_GEX3<br />

SI ‹ 5000<br />

AH ‹ [SI]<br />

LSR AH, Y<br />

AH vs AL<br />

AH = AL<br />

SI ‹ SI+1<br />

GRAY_GEX3: MOV SI, 5000h ;dirección de inicio de la tabla<br />

R: MOV AH, [SI] ;obtenemos GRAY en los 4 bits<br />

LSR AH ;menos significativos<br />

LSR AH<br />

LSR AH<br />

LSR AH<br />

CMP AH, AL<br />

JE CONVIERTE<br />

INC SI<br />

JMP R<br />

CONVIERTE: MOV AH, [SI] ;obtenemos la conversión en los<br />

AND AH,0Hh ;4 bits menos significativos de AH<br />

END<br />

3. <strong>LENGUAJE</strong> <strong>ENSAMBLADOR</strong> <strong>DEL</strong> <strong>MICROPROCESADOR</strong><br />

LUIS URIETA PÉREZ Y PABLO FUENTES RAMOS<br />

NO<br />

SI<br />

AH ‹ [SI]<br />

AH ‹AH .AND. 0F<br />

FIN<br />

3 -48


Errores de programación frecuentes.<br />

COMPUTACIÓN V<br />

<strong>MICROPROCESADOR</strong>ES Y MICROCOMPUTADORAS<br />

1. Invertir el orden de sus operandos<br />

2. Utilizar las banderas en forma incorrecta<br />

3. Considerar la lógica en forma errónea<br />

4. Confundir direcciones y datos<br />

5. Manejar erróneamente matrices y cadenas. El problema suele encontrarse en<br />

que se exceden los límites<br />

6. Organizar el programa en forma inadecuada. Inicio de contadores, apuntadores,<br />

no almacenar resultados, etc.<br />

La mejor manera de acelerar los programas del microprocesador consiste en<br />

reducir el número de saltos.<br />

Ejemplos de solución de problemas utilizando software y hardware.<br />

Ejemplo 1. Se tiene un convertidor analógico/digital (A/D) y se desea leer la información<br />

cada segundo hasta tener 100 valores, los cuales deben almacenarse<br />

en una tabla de datos. Además,<br />

• Calcular el valor promedio de los valores leídos e indicarlo en un exhibidor<br />

numérico.<br />

• Obtener el valor mínimo y desplegarlo en un exhibidor numérico.<br />

• Adquirir el valor máximo y presentarlo en un exhibidor numérico.<br />

• Iniciar nuevamente el ciclo después de una hora.<br />

SOLUCIÓN<br />

• Se necesita una memoria de acceso aleatorio (RAM) para los valores leídos del convertidor<br />

A/D.<br />

• Se requieren tres puertos paralelos de entrada/salida (E/S) para los exhibidores<br />

numéricos correspondientes a VMÁX, VMÍN y VPROM.<br />

• Se necesita un puerto de E/S para el convertidor A/D.<br />

• Se requiere una memoria de programable de sólo lectura (PROM) para el programa.<br />

El diagrama a bloques de la siguiente figura, muestra la solución:<br />

mP 8088<br />

AB DB<br />

AB = Bus de Dirección<br />

DB = Bus de Datos<br />

RAM<br />

1 Kx8<br />

100 VALORES<br />

PROM<br />

1 Kx8<br />

PROGRAMA<br />

3. <strong>LENGUAJE</strong> <strong>ENSAMBLADOR</strong> <strong>DEL</strong> <strong>MICROPROCESADOR</strong><br />

LUIS URIETA PÉREZ Y PABLO FUENTES RAMOS<br />

3 -49


Configuración de los<br />

Circuitos Integrados<br />

RAM<br />

ROM<br />

Diagrama de flujo<br />

COMPUTACIÓN V<br />

<strong>MICROPROCESADOR</strong>ES Y MICROCOMPUTADORAS<br />

8255<br />

8255<br />

3. <strong>LENGUAJE</strong> <strong>ENSAMBLADOR</strong> <strong>DEL</strong> <strong>MICROPROCESADOR</strong><br />

LUIS URIETA PÉREZ Y PABLO FUENTES RAMOS<br />

PA<br />

PB<br />

PC<br />

PA<br />

PB<br />

PC<br />

8<br />

VMÍN<br />

VPROM<br />

VMÁX<br />

CONVERTIDOR<br />

A/D<br />

NO USADOS<br />

Localidades<br />

Las primeras de 1K<br />

Las últimas de 1K<br />

8255 Dirección<br />

40<br />

41<br />

E/S<br />

42<br />

43<br />

8255 Dirección<br />

50<br />

51<br />

52<br />

53<br />

CAD.ASM<br />

INICIACION<br />

100 VALORES<br />

V_MIN<br />

1<br />

EXHIBIDORES NUMÉRICOS<br />

Contenido<br />

VMIN = PA<br />

VPROM = PB<br />

VMÁX = PC<br />

C A/D = CONTROL<br />

Contenido<br />

C A/D = PA<br />

No usado = PB<br />

No usado = PC<br />

CONTROL<br />

Define puerto de entrada y puertos de salida<br />

Lee 100 valores del convertidor A/D cada<br />

segundo<br />

Obtiene el valor mínimo<br />

3 -50


COMPUTACIÓN V<br />

<strong>MICROPROCESADOR</strong>ES Y MICROCOMPUTADORAS<br />

Ejemplo 2. Se tienen 2 máquinas herramientas que aceptan información en código<br />

Gray y en código Exceso-3. La máquina que les proporciona la información<br />

trabaja en código binario y alimenta cada segundo un dato, consistente<br />

en 2 nibbles.<br />

Resuelva el problema de conversión de código con un microprocesador.<br />

SOLUCIÓN<br />

La solución del hardware (mecamática) se presenta en el siguiente diagrama a<br />

bloques:<br />

mP<br />

AB DB<br />

V_MAX Obtiene el valor máximo<br />

V_PROM Obtiene el valor promedio<br />

DESPLIEGA Pone en los exhibidores numéricos los valores<br />

calculados<br />

RETARDO_1H Temporiza una hora y volvemos nuevamente<br />

a ejecutar el proceso<br />

AB Bus de Dirección<br />

DB Bus de Datos<br />

PROM<br />

1Kx8<br />

8255<br />

REGISTRO<br />

DE<br />

CONTROL<br />

3. <strong>LENGUAJE</strong> <strong>ENSAMBLADOR</strong> <strong>DEL</strong> <strong>MICROPROCESADOR</strong><br />

LUIS URIETA PÉREZ Y PABLO FUENTES RAMOS<br />

PA<br />

PB<br />

PC<br />

8<br />

8<br />

8<br />

MÁQUINA 1<br />

BINARIO<br />

MÁQUINA 2<br />

GRAY<br />

MÁQUINA 3<br />

EXC-3<br />

3 -51


Configuración de los<br />

Circuitos Integrados<br />

Diagrama de flujo<br />

COMPUTACIÓN V<br />

<strong>MICROPROCESADOR</strong>ES Y MICROCOMPUTADORAS<br />

Localidades<br />

PROM Las últimas de 1K<br />

8255 Dirección<br />

40<br />

41<br />

E/S<br />

42<br />

43<br />

CONV .ASM<br />

INICIACION<br />

LEE DATO BIN<br />

CONV_GRAY<br />

Ejemplo 3. Cierto proceso debe llevarse a cabo en forma secuencial cada segundo<br />

por cada paso. El proceso se realiza empezando por A, después B, a<br />

continuación C y finalmente D. Si se efectúa en el orden indicado deberá<br />

activarse desde el inicio un diodo emisor de luz (LED, por sus siglas en inglés)<br />

verde y al finalizar el proceso, retornar al programa principal.<br />

Si el proceso no se lleva a cabo en el orden mencionado, lo llevaremos al<br />

estado ERROR y se debe activar un LED rojo para indicar esta condición.<br />

El circuito deberá permanecer en ese estado hasta que se aplique<br />

un pulso de RESET retornando al estado inicial.<br />

3. <strong>LENGUAJE</strong> <strong>ENSAMBLADOR</strong> <strong>DEL</strong> <strong>MICROPROCESADOR</strong><br />

LUIS URIETA PÉREZ Y PABLO FUENTES RAMOS<br />

Contenido<br />

MAQ1 = PA Entrada<br />

MAQ2 = PB Salida<br />

MAQ3 = PC Salida<br />

CONTROL<br />

Define puerto A como entrada y los puertos B<br />

y C como salida<br />

Lee dato binario de la máquina 1<br />

Se convierte dato a código GRAY, usando<br />

tablas de conversión y se pone el resultado en<br />

la máquina 2<br />

CONV_EXC3 Se convierte dato a código EXC3, usando tablas<br />

de conversión y se pone el resultado en la<br />

máquina 3<br />

UN_SEG Temporizamos un segundo y volvemos a iniciar<br />

el proceso<br />

3 -52


COMPUTACIÓN V<br />

<strong>MICROPROCESADOR</strong>ES Y MICROCOMPUTADORAS<br />

SOLUCIÓN<br />

Para la parte del hardware, proponemos un sistema mínimo conteniendo una PROM de<br />

2Kx8 y un adaptador de periféricos en paralelo 8255, como se muestra en el siguiente<br />

diagrama a bloques:<br />

mP<br />

AB DB<br />

AB Bus de Dirección<br />

DB Bus de Datos<br />

a1, a0<br />

PROM<br />

2Kx8<br />

8255<br />

REGISTRO<br />

DE<br />

CONTROL<br />

Vamos a ubicar la PROM en las últimas localidades del espacio de direccionamiento y al<br />

8255 en las primeras localidades del espacio de ENTRADA/SALIDA, como se indica en<br />

la siguiente tabla:<br />

Dirección<br />

de E/S<br />

Puerto<br />

0 A Entrada<br />

1 B Salida<br />

2 C No usado<br />

3 Registro de control<br />

Se deben leer los 4 sensores conectados al puerto A cada segundo.<br />

3. <strong>LENGUAJE</strong> <strong>ENSAMBLADOR</strong> <strong>DEL</strong> <strong>MICROPROCESADOR</strong><br />

LUIS URIETA PÉREZ Y PABLO FUENTES RAMOS<br />

PA<br />

PB<br />

PC<br />

En los 4 bits más significativos cone ctamos<br />

los sensores de los procesos<br />

En el bit más significativo conectamos<br />

el LED verde y en el segundo bit más<br />

significativo el rojo<br />

No se usa<br />

3 -53


Diagrama de estados:<br />

Subrutinas requeridas:<br />

INICIACIÓN<br />

ACTIVA_ROJO<br />

ACTIVA_VERDE<br />

UN_SEGUNDO<br />

Diagrama de flujo<br />

COMPUTACIÓN V<br />

<strong>MICROPROCESADOR</strong>ES Y MICROCOMPUTADORAS<br />

1/verde 1/verde 1/verde 1/verde<br />

INICIO A B C D<br />

RESET<br />

Apaga rojo<br />

Apaga verde<br />

0/rojo<br />

INICIACION<br />

AL ‹<br />

[03] ‹ AL<br />

RET<br />

0/rojo 0/rojo<br />

ERROR<br />

Puerto A = ENTRADA<br />

Puerto B = SALIDA<br />

Puerto C = NO USADO<br />

3. <strong>LENGUAJE</strong> <strong>ENSAMBLADOR</strong> <strong>DEL</strong> <strong>MICROPROCESADOR</strong><br />

LUIS URIETA PÉREZ Y PABLO FUENTES RAMOS<br />

0/rojo<br />

3 -54

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!