Descarga la aplicación para disfrutar aún más
Vista previa del material en texto
1 Electrónica II – UTN FRRo-Federico Ferroggiaro, Luis Paradiso ELECTRÓNICA II ING. FEDERICO FERROGGIARO ING LUIS PARADISO 2 Electrónica II – UTN FRRo-Federico Ferroggiaro, Luis Paradiso DESARROLLO DE SOFTWARE PARA LOS MICROPROCESADORES Los microprocesadores trabajan en código de máquina pero los programadores lo hacen en lenguajes más cercanos al lenguaje humano. Cuando se programa en Lenguaje de Máquina o Lenguaje Objeto, hay que pensar en cómo la máquina resuelve el problema, consecuentemente hay que conocer a fondo la estructura del microprocesador y, además, hay que preguntarse cómo resolver el problema. Cuando se programa en Lenguajes de Bajo Nivel, como son los lenguajes numéricos y el Assembly, hay que preguntarse lo mismo que en el caso de trabajar en Lenguaje de Máquina. Esto implica que debe darse ubicación en memoria principal a cada dato e instrucción del programa, es decir, hay que dar direccionamiento absoluto a todos los componentes del programa. Además hay que conocer la estructura física del microprocesador. Los microprocesadores trabajan con dos conceptos: Registro-Registro(RR) y Registro- Memoria(RM). Al trabajar con el microprocesador 8086 hay que definir su estructura física. Como puede verse en la figura siguiente los registros son 14(catorce), nos centraremos, en primera instancia, en los registros AX, BX, CX y DX que son registros de datos. Figura 1: Juego de Registros del microprocesador INTEL 8086 3 Electrónica II – UTN FRRo-Federico Ferroggiaro, Luis Paradiso Además se tienen los siguientes registros de 16 bits: Registros Indices SI y DI Registros Punteros SP y BP Registros Segmentos: CS, DS, SS y ES Registros de Control: IP(Instruction Pointer) que es el contador de programa Flags(Banderas) cuyos bits llamados banderas sirven para que el microprocesador tome decisiones. El registro IP es el llamado contador de programa y contiene la dirección de la próxima instrucción a transferir desde memoria principal a un registro que no está en el esquema que es el Registro de Instrucción, que debe contener la instrucción que se está ejecutando. Los registros de datos o generales son de 16 bits pero están divididos en dos registros de 8 bits cada uno, de esta manera pueden manejar datos de 8 bits o de 16 bits. En el registro AX se tienen dos registros de 8 bits, el AH(que significa A High(alto)) y el AL(que significa A Low(Bajo)). De igual manera vale para BX, CX y DX.- INSTRUCCIONES Y MODOS DE DIRECCIONAMIENTO Las instrucciones en los microprocesadores de estructura CICS como es el 8086 presenta distintas longitudes o tamaños según la manera que se direccionan los operandos que intervienen. El modo de direccionamiento más sencillo es el R-R llamado Direccionamiento modo Registro, la sintaxis de la instrucción es: OPERACIÓN destino,fuente Por ejemplo si queremos Mover(copiar) un dato que está en el registro BX al registro AX, debemos escribir: MOV AX, BX Operación destino fuente Si antes de ejecutar la operación se tiene (AX) = 0F y (BX) = 1D, esto se lee contenido de Registro AX es 0F y el contenido de BX es 1D. En general, el paréntesis denota contenido de …. Luego de ejecutada la instrucción MOV, los contenidos de los registros son: (AX) = 1D y (BX) = 1D Si la intrucción hubiera sido: MOV BX, AX , y los valores iniciales los antes indicados, luego de ejecutada la instrucción, los registros tendrían los siguientes contenidos: (AX) = 0F y (BX) = 0F 4 Electrónica II – UTN FRRo-Federico Ferroggiaro, Luis Paradiso Los sets o repertorios de instrucciones de los microprocesadores incluyen instrucciones de tipo matemático tal como sumar, restar, etc. En el 8086 la suma de dos registros tiene el mnemónico ADD. La instrucción tiene el formato: OPERACIÓN Primer Operando y Resultado, Segundo Operando Si se tiene ADD AX , BX Significa (AX) = (AX) + (BX) La suma del contenido de dos registros queda como contenido del registro del primer operando. Si (AX) = 07 y (BX) = 23 (Los contenidos de los registros se expresan en hexadecimal) ADD AX, BX (AX) + (BX) = (AX) 07 + 23 = (AX) 2A = (AX) y (BX) = 23 Si se quisiera hacer un programa que sumara tres números de 8 bits que se encuentran en los registros AL, AH, BL y restarle un número que se encuentra en CH, colocar el resultado en DX y luego detenerse, las instrucciones deberían tener la siguiente secuencia: (1) Colocar (DL) = 00 (2) MOV AL, DL Se mueve el 00 al interior de (AH) (3) ADD AL, AH (AL) = (AL) + (AH) (4) ADD AL, BL (AL) = (AL) + (BL) (5) MOV DX, AL Se mueve o copia el resultado a (DX) (6) HLT La máquina se detiene También pueden existir movimientos y operaciones entre los registros y posiciones de memoria, por ejemplo, si deseamos sumar el contenido de la memoria A001 con el contenido del registro AX, debemos saber que el resultado siempre queda en el registro y que el modo de trabajo será R-M, registro-memoria. Los microprocesadores trabajan con los conceptos RR y RM pero no trabajan con el concepto MM.- Volviendo a la operación que hemos enunciado la instrucción sería ADD AX, [A001] Y esto significa que al contenido del registro AX se le adiciona el contenido de la posición de memoria A001, si (AX) era antes de la operación 45AF y el contenido de A001(esta forma de direccionar datos se llama directa) era 01(notemos que cada posición de memoria contiene 8 bits), el resultado de la ejecución de la instrucción es: (AX) + [A001] ----- 45AF + 01 = 45B0 ----- (AX) = 45B0 5 Electrónica II – UTN FRRo-Federico Ferroggiaro, Luis Paradiso Supongamos que deseamos restar dos números que se encuentran en memoria principal de la computadora y dejar el resultado en una tercera posición de memoria. No tenemos ningún operando que trabaje con el concepto de MM, luego tiene que intervenir un registro. Sean los contenidos de las posiciones de memoria [A001] = 03 y [A002] = 02 y deseamos colocar el resultado en A003. (1) MOV AL, [A001] Esta instrucción coloca (AL) = 03 (2) SUB AL, [A002] Esta instrucción hace que (AL) = 01 (3) MOV [A003], AL Esta instrucción hace que [A003] = 01 (4) HLT La máquina se detiene La secuencia de instrucciones y datos que permiten realizar la operación deseada recibe el nombre de programa fuente en Assembly.- El problema que hemos resuelto era lineal, no había opciones ni toma de decisiones. Supongamos que el problema que se nos plantea es la resta de dos números que están en memoria principal, si el resultado de la resta, es positivo o cero, hay que restarle uno y parar, si es negativo hay sumarle 1 y parar. Debido a que las instrucciones de un programa se encuentran todas apiladas en los registros de la memoria principal, es necesario seguir un camino lineal en un caso y saltar algunas instrucciones en otro caso, para esto se tienen las instrucciones de SALTO(JUMP) en el repertoriode instrucciones del microprocesador. Los saltos pueden ser CONDICIONALES(salte si …) o INCONDICIONALES(salte sí o sí). Los saltos rompen la secuencia natural de un programa, para ello cambian el contenido del IP, y para saber si se debe o no saltar, el microprocesador consulta el registro de FLAGS(ver figura 1) el cual tiene los bits que se indican en la figura 2. Figura 2. Bits bandera que pertenecen al Registro Flags (Banderas) 6 Electrónica II – UTN FRRo-Federico Ferroggiaro, Luis Paradiso Las banderas Z y S son las que se utilizan mayormente en problemas habituales. Volvamos al problema que se encuentra en el párrafo recuadrado de la página anterior. DATOS [A000] = 01 [A001] = 03 [A002] = 05 [A003] = 12 PROGRAMA EN ASSEMBLY (1) MOV DX, [A000] (2) SUB CX, CX (3) MOV AX, [A001] (4) SUB AX, [A002] (5) CMP AX, CX Esta instrucción compara el contenido del registro AX con el contenido del registro de CX y posiciona la bandera S para poder tomar decisiones (6) JGE SUMAR Si el resultado de la comparación indica que el valor que se encuentra en AX es cero o positivo(mayor que cero), el programa continúa en SUMAR, pero si es negativo sigue la secuencia normal. (7) ADD AX,DX PEPE (8) HALT SUMAR (9) SUB AX,DX (10) JMP PEPE Salto incondicional a la posición indicada simbólicamente como PEPE. El repertorio de instrucciones del microprocesador 8086 ofrece otras instrucciones además de las vistas. Direccionamiento inmediato Hay instrucciones que contienen el segundo dato de la operación dentro de la misma, éstas se llaman INSTRUCCIONES DE DIRECCIONAMIENTO INMEDIATO, por ejemplo si quiero poner en 0 el registro CX se genera la instrucción: MOV CX, 0000 Si se quiere sumar al registro AL un valor 0C se puede generar la instrucción: ADD AL, 0C 7 Electrónica II – UTN FRRo-Federico Ferroggiaro, Luis Paradiso Direccionamiento modo registro Son las instrucciones en las cuales ambos datos se encuentran en registros, por ejemplo ADD AX, BX Ya vimos que esto significa la suma del contenido AX con el contenido del registro BX y el resultado queda en el registro AX. (AX) = 3456 (en hexadecimal) y (BX) = 23B5 (en hexadecimal) antes de la ejecución de la instrucción, será: (AX) = 580B (en hexadecimal) y (BX) = 23B5 (en hexadecimal) después de la ejecución de la instrucción. INC SI Incrementa el contenido del registro SI en una unidad, por ejemplo: (SI) = 2345(hexadecimal) antes de la ejecución de la instrucción (SI) = 2346(hexadecimal) después de la ejecución de la instrucción Direccionamiento calculado o indirecto La memoria que puede direccionar un microprocesador se encuentra limitada por el tamaño de su IP, es decir del Puntero de Instrucción o Contador de Programa. En el caso del 8086 el IP es de 16 bits, consecuentemente tendrá una capacidad de direccionamiento de: En cada dirección se encuentra alojado 1 byte, es decir, 8 bits. Si se define como Tamaño Máximo de Memoria a: En nuestro caso: TMM = 2E16 x 8 bits Si lo queremos expresar en KBy: TMM = 2E16 x 8 bits 2E10 byte x 8 bits KBy byte K = 2E16 (capacidad de direcccionamiento) Es decir que existe 2E16 combinaciones distintas de ceros y unos que significan direcciones de memoria principal distintas. TMM = K x lo que direcciona 8 Electrónica II – UTN FRRo-Federico Ferroggiaro, Luis Paradiso Como esta capacidad de memoria es insuficiente, los diseñadores del Intel 8086 han trabajado de manera segmentada o paginada. Esto significa que imaginan a la memoria principal como consistente en varias páginas de 64 KBy. Para direccionar las instrucciones de un programa se utiliza el contenido del registro CS(segmento de Código), ver Figura 1. Además se toma en cuenta el contenido del IP. Supongamos que (CS) = 4D00 y el contenido de IP es B000, la instrucción que se está direccionando se calcula: (CS) + (IP) Dirección buscada 4D00 + B000 58000 Direccionamiento Directo En general podemos decir que los datos que debe procesar un microprocesador en cualquier programa, están localizados en memoria principal. Diremos que se está trabajando en modo directo cuando las instrucciones tienen en su campo fuente o campo destino la dirección donde se encuentra el dato o donde se debe asignar el resultado de una operación. Supongamos que queremos mover un dato que se encuentra en las posiciones de memoria principal 34FA y 34FB, en el INTEL 8086 los datos se ubican: Memoria contenido es el 34FA 03 Byte menos significativo del dato 34FB 00 Byte más significativo del dato Si se ejecuta la instrucción: MOV AX, [34FA] Después que ella se ejecuta, se copia 0003 en el registro AX. Es importante destacar el efecto que tiene en la sintaxis de la instrucción la presencia de los corchetes que encierran la dirección de memoria. Justamente estos corchetes indican el contenido de la dirección especificada. Si se tiene que ejecutar la instrucción: MOV [34AF], AX y (AX) = 235B TMM = 64 KBy 9 Electrónica II – UTN FRRo-Federico Ferroggiaro, Luis Paradiso En este caso se ordena transferir(copiar) el contenido del registro AX a la dirección 34FA y la siguiente, recordemos que cada dirección es de un byte. Luego de la ejecución de la instrucción, la memoria principal queda con los siguientes contenidos que pueden verse en el mapa Memoria Contenido Significa 34FA 5B Byte menos significativo del dato 34FB 23 Byte más significativo del dato RESOLUCIÓN DE UN PROBLEMA Ejemplo nº 1 Las computadoras han sido concebidas para resolver problemas mediante programas, los mismos son una secuencia ordenada lógicamente de instrucciones y datos. Cuando el programador debe resolver un problema primero tiene que definir el problema que se resolvera y cómo se quiere la solución del mismo, luego hace un diagrama de flujo, que es una manera gráfica de mostrar la secuencia de pasos que realiza la máquina para resolver un problema, luego se hace el programa en Assembly. Supongamos que queremos resolver la resta de dos números de 8 bits que se encuentran en memoria principal y el resultado lo deseamos colocar en la posición de memoria 34AF.- Supongamos que los datos se encuentran en 3456 y 3490.- Acabamos de resolver la parte de definir el problema. Ahora hay que hacer el DIAGRAMA DE FLUJO Cuando se programa en Assembly conviene hacer previamente al programa fuente, un diagrama que indica el flujo de datos dentro del microprocesador, es una manera simbólica y gráfica de ver la secuencia de las instrucciones en el programa. SímbolosSignificado Indica operación de la computadora Vincula bloques de operación Bloque de toma de decisiones 10 Electrónica II – UTN FRRo-Federico Ferroggiaro, Luis Paradiso En el problema que nos ocupa debemos primero colocar uno de los datos en un registro, debido a que el microprocesador trabaja con el concepto RM (registro-memoria). Nº Símbolo de unión de procesos Principio y fin de programa Símbolo de Impresión Nº Conector de Página Conector de diagramas START Colocar el Minuendo en el Registro AL Restar el sustraendo Colocar el resultado en la posición de memoria 34 AF 1 1 Parar 11 Electrónica II – UTN FRRo-Federico Ferroggiaro, Luis Paradiso Programa en Assembly: Referencia Instrucción Comentarios MOV AL, [3456] Se movió el minuendo al registro SUB AL, [ 3490] Se realiza la resta MOV [34AF], AL Se colocó el resultado en memoria HLT Fin de programa Ejemplo nº 2 Restar dos números que se encuentran en memoria principal, según el mapa de memoria que se adjunta. Si el resultado es positivo sumar 1 y parar. Si el resultado es negativo, sumar 2 y parar. Si el resultado es cero sumar 3 y parar. Mapa de memoria Posición de memoria contenido AA00 3(dato 1) AA01 x(dato 2) AA02 1 AA03 2 AA04 3 Comenzar (M) (AH) (M1) (BH) ((AH) - (BH)) (AH) 1 12 Electrónica II – UTN FRRo-Federico Ferroggiaro, Luis Paradiso ¿Es menor a cero? 1 Sumar 1 PARAR Es igual a Cero? Sumar 2 NO 1 Sumar 3 1 1 SI NO SI 13 Electrónica II – UTN FRRo-Federico Ferroggiaro, Luis Paradiso Programa en Assembly: Referencia Instrucción Comentarios MOV AH, [AA00] Se movió el minuendo al registro MOV BH, [AA01] Se movió el sustraendo a otro Reg. SUB AH, BH Se realiza la resta JLE NEG Salto por inferior o negativo ADD AH, [AA02] Se suma 1 al resultado de la resta PARAR HLT Fin de Programa NEG JZ ZERO Salto por cero a ZERO ADD AH, [AA03] Se suma 2 al resultado de la resta JMP PARAR salto incondicional a PARAR ZERO ADD AH, [AA04] Se suma 3 al resultado de la resta JMP PARAR Ejemplo nº 3 Dada una lista de datos(tabla) que comienza en la posición de memoria A000 y termina en la posición de memoria A003 inclusive, sumar los contenidos de la misma y colocar el resultado en la posición B000 y luego parar. Mapa de memoria Posición de memoria contenido AA00 01 AA01 02 AA02 03 AA03 04 AA04 AB Lo primeros que debemos hacer es el diagrama de flujo: COMENZAR (AX) [A000] (AX) + [A001] (AX) 1 1 11 1 (AX) + [A002] (AX) (AX) + [A003] (AX) [B000] (AX) STOP 14 Electrónica II – UTN FRRo-Federico Ferroggiaro, Luis Paradiso Programa en Assembly: Referencia Instrucción Comentarios MOV AX, [A000] Se movió el PRIMER dato de la tabla al registro ADD AX, [A001] SE SUMÓ EL SEGUNDO VALOR DE LA TABLA ADD AX, [A002] SE SUMÓ EL TERCER VALOR DE LA TABLA ADD AX, [A003] SE SUMÓ EL ÚLTIMO VALOR DE LA TABLA MOV [B000], AX SE COLOCA EL RESULTADO EN MEMORIA PRINCIPAL HLT Fin de Programa Este programa se puede generalizar mediante el uso del registro SI como registro puntero a la tabla y un contador para saber si hemos llegado al final de la tabla. Primeramente hagamos el diagrama de flujo: START (SI)(Puntero) A000 NOTA: SE COLOCA LA DIREC- CIÓN DEL PRIMER VALOR DE LA TABLA EN PUNTERO. (CX)(CONTADOR) 04 NOTA: SE COLOCA EN EL CONTADOR LA CANTIDAD DE VALORES QUE TIENE LA TABLA (AX) 00 NOTA: SE COLOCA EN CERO EL REGISTRO QUE SERVIRÁ PARA GUARDAR LA SUMA (AX) (AX) + [Puntero] NOTA: SE SUMA EL REGISTRO CON EL CONTENIDO DE LA POSICIÓN DE MEMORIA QUE SE ENCUENTRA EN EL PUNTERO. 1 1 15 Electrónica II – UTN FRRo-Federico Ferroggiaro, Luis Paradiso Programa en Assembly: Referencia Instrucción Comentarios MOV SI, [A000] Se define el puntero MOV AX, 0 Se limpia el lugar de la suma MOV CX, 04 Se define el contador SEGUIR ADD AX, [SI] Se suma un dato al total INC SI Puntero a la siguiente posición DEC CX Se baja en 1 el contenido de CX JNZ SEGUIR Salto por no cero a SEGUIR MOV [B000], AX Trasfiereresultado HLT Fin de Programa 1 (PUNTERO) (PUNTERO) + 1 NOTA: SE INCREMENTA EN 1 LA DIRECCIÓN CONTENIDA EN EL PUNTERO, PASA A LA SIGUIENTE DIRECCIÓN DE LA TABLA (CONTADOR) (CONTADOR) - 1 NOTA: SE DECREMENTA EL CONTADOR EN UNA UNIDAD CONTADOR = 0 ? 1 NO [B000] (AX) STOP NOTA: SI NO SE LLEGÓ AL FINAL DE LA TABLA SE DEBERÁ SUMAR EL SIGUIENTE VALOR SI NOTA: SE DESPLAZA EL VALOR DE LA SUMA A LA MEMORIA PRINCIPAL. 16 Electrónica II – UTN FRRo-Federico Ferroggiaro, Luis Paradiso En el ejemplo anterior se sabe la cantidad de valores que tiene la tabla, pero podría darse el caso de no saberse el mismo, se deberá colocar, entonces, algún valor que indique que la tabla terminó, por ejemplo, si todos los valores son positivos y distintos de cero colocar como "bandera" un valor negativo o un cero. Ejemplo nº 4 Dada una lista de datos(tabla) todos positivos y distintos de cero, que comienza en la posición de memoria A000 y termina en un valor cero, sumar los contenidos de la misma y colocar el resultado en la posición B000 y luego parar.
Compartir