Fascículo 3 1 Procesadores Semestre 6 Procesadores Procesadores Semestre 6 Procesadores Tabla de contenido Página Introducción 1 Conceptos previos 2 Logros 2 Mapa conceptual Fascículo 3 3 Lenguaje Ensamblador del microprocesador 3 Instrucciones para el Ensamble del Programa 3 Simulación del programa 5 Etiquetas del lenguaje Assembler 7 Directivas 9 Banderas 12 Operandos y direcciones 13 Stack 15 Formato de las instrucciones 17 Saltos Condicionales e Incondicionales 18 Convenciones en la escritura del código fuente 21 Actividad de trabajo colaborativo 25 Resumen 26 Bibliografía recomendada 27 Nexo 28 Seguimiento al autoaprendizaje 29 Créditos: 1 Tipo de asignatura: Teórico – Práctica Semestre 6 Procesadores Procesadores Copyright©2008 FUNDICIÓN UNIVERSITARIA SAN MARTÍN Facultad de Universidad Abierta y a Distancia, “Educación a Través de Escenarios Múltiples” Bogotá, D.C. Prohibida la reproducción total o parcial sin autorización por escrito del Presidente de la Fundación. La actualización de este fascículo estuvo a cargo de ALEJANDRA CASTILLO Docente tutor – Programa de Ingeniería de Sistemas a Distancia. Sede Bogotá, D.C. Corrección de estilo ADRIANA RODRÍGUEZ VALENCIA. Diseño gráfico y diagramación a cargo de SANTIAGO BECERRA SÁENZ ORLANDO DÍAZ CÁRDENAS Impreso en: GRÁFICAS SAN MARTÍN Calle 61A No. 14-18 - Tels.: 2350298 - 2359825 Bogotá, D.C., Marzo de 2012 Procesadores Semestre 6 Procesadores 1 Introducción Los microcomputadores tienen un lenguaje único que es capaz de reconocer y ejecutar las instrucciones. Este lenguaje es llamado "Lenguaje de Máquina" y pertenece al procesador del microcomputador. El lenguaje de máquina está compuesto por una serie de instrucciones, las cuales son reconocidas y ejecutadas por el procesador. Este lenguaje es un conjunto de números que representan las operaciones realizadas por los componentes internos del procesador. Entonces las instrucciones se encuentran directamente ligadas a la estructura física del procesador y no pueden ser modificadas o cambiadas. Es necesario comprender la arquitectura interna del procesador así como sus instrucciones para programar un procesador. Cada procesador tiene un conjunto de registros internos que puede emplearse de maneras distintas para manipular números binario. Las instrucciones ejecutadas por el procesador generalmente manipulan los datos almacenados en la memoria y los registros de trabajo. Las instrucciones de programa de un procesador se guardan como números binarios en la memoria y se conocen como códigos de operación (op). Los códigos de operación son leídos por la CPU y decodificados para determinar cuál es la instrucción que debe ejecutarse. Cada código de operación se aplica o afecta a otro número, tal como el que está guardado en el "registro de trabajo" o "Acumulador". El número binario al que se aplica la instrucción se conoce como operando. El operando puede ser otro registro o un número binario almacenado en la memoria. Para facilitar la escritura de programas, cada uno de los tipos principales de instrucciones tiene asociado un código alfanumérico corto que ayuda al programador a recordarlos, y estos códigos alfanuméricos se conocen Fascículo No. 3 Semestre 6 Procesadores Procesadores como mnemónicos. Este lenguaje es llamado lenguaje ensamblador y su uso es muy frecuente debido a la facilidad para recordar las instrucciones Conceptos previos Para iniciar el estudio del fascículo 3. Es primordial repasar algunos conceptos sobre la arquitectura de los microprocesadores y Microcontroladores: 1. Los microprocesadores disponen de un registro de estado que contiene “flags” o banderines que informan del resultado de ciertas operaciones lógicas y aritméticas. Determine el significado de los siguientes bits: a. C b. N c. Z d. V 2. En qué consiste un ciclo de Fetch y un ciclo de Execute. 3. ¿Qué son los modos de direccionamiento?. Describa algunos de ellos. 4. ¿Qué funciones tiene un registro de datos? 5. ¿Qué funciones tiene un registro de direcciones? Logros Al finalizar el estudio del presente fascículo, el estudiante debe estar en capacidad de: Tendrá la capacidad de realizar programas en el seudocódigo de assembler y C++ Reconocer la interfaz del lenguaje ensamblador Realizara manejo de registros y banderas Diseñara una lógica estructural con diagramas de sintaxis del objetivo a lograr Conocerá el aplicativo CodeWarrior como compilador Realizara Debug y seguimiento por banderas a los registros al programa Procesadores 2 Fascículo No. 3 Semestre 6 Procesadores Mapa conceptual fascículo 3. Lenguaje ensamblador del microprocesador Instrucciones para el Ensamble del Programa En esta fase se escribe o “redactan” las instrucciones del programa. El programa escrito en un lenguaje de programación (comprensible por el ser humano, aunque se suelen corresponder con lenguajes formales descritos por gramáticas independientes del contexto) no es inmediatamente ejecutado en una computadora. La opción más común es compilar el programa, aunque también puede ser ejecutado mediante un intérprete informático. El código fuente del programa se debe someter a un proceso de transformación para convertirse en lenguaje máquina, interpretable por el procesador. A este proceso se le llama compilación. Por lo general, la creación de un programa ejecutable (un típico .exe para Microsoft Windows) conlleva dos pasos. Fascículo No. 3 Semestre 6 3 Procesadores Procesadores ¿Que son las instrucciones? El set de instrucciones de un microprocesador es el set de entradas binarias que producen acciones definidas durante un ciclo de instrucción. Un set de instrucciones es para el microprocesador lo mismo que una tabla de verdad es para una compuerta lógica, un registro de desplazamiento o un circuito sumador. Por supuesto, las acciones que realiza un microprocesador con cada instrucción, son más complejas que las que realizan los dispositivos y compuertas antes mencionados. Tipos de Instrucciones Las instrucciones de un procesador se pueden agrupar en tres tipos: Instrucciones de Transferencia, Instrucciones de Operación e Instrucciones de Control. A continuación se describirán las características básicas de cada uno de estos grupos: Instrucciones de Transferencia Como su nombre lo indica, este grupo de instrucciones se utiliza para efectuar transferencia de datos entre los registros de la CPU, la memoria y los puertos de E/S. En la tabla 11.6.2 se indica un ejemplo este tipo de instrucciones. Comando Operando Comentario LDA M Carga el registro A con los datos del registro en la posición de memoria M. Tabla 1 Instrucción LDA Instrucciones de Operación Estas instrucciones se emplean para realizar operaciones aritméticas y lógicas entre los registros del procesador y la memoria. Estas operaciones incluyen suma, resta, incremento decremento, complemento, comparación y corrimiento. En la tabla 11.6.3 se muestra un ejemplo de una instrucción de operación. Procesadores 4 Fascículo No. 3 Semestre 6 Procesadores Mnemónico ADD Operando B Comentario Suma el registro B con el registro A y el resultado se almacena en el registro A. Tabla 2 Instrucción ADD Instrucciones de Control el lenguaje Ensamblador y en general en cualquier lenguaje de programación las instrucciones de control juegan un papel muy importante en el flujo de un programa. Su función consiste en alterar el flujo normal del programa, según el estado de ciertos registros del sistema que indican alguna condición después de ejecutar una instrucción. Con este tipo de instrucciones es posible tomar el control del flujo del programa. En la tabla 3 se indica un ejemplo de una instrucción de control. Mnemónico JZ Operando No existe El lenguaje ensamblador, es un lenguaje de programación de bajo nivel para los computadores, microprocesadores, microcontroladores, y otros circuitos integrados programables. Implementa una representación simbólica de los códigos de máquina binarios y otras constantes necesarias para programar una arquitectura dada de CPU y constituye la representación más directa del código máquina específico para cada arquitectura legible por un programador. Esta representación es usualmente definida por el fabricante de hardware, y está basada en los mnemónicos que simbolizan los pasos de procesamiento (las instrucciones), los registros del procesador, las posiciones de memoria, y otras características del lenguaje. Un lenguaje ensamblador es por lo tanto específico a cierta arquitectura de computador física (o virtual). Esto está en contraste con la mayoría de los lenguajes de programación de alto nivel, que, idealmente son portables. Comentario Pasa por alto la siguiente instrucción en el código del programa si el bit del sistema Z=1. Tabla 3 Instrucción JZ La abreviatura JZ corresponde a la frase en inglés Jump If Zero (Saltar si Cero) y la función es evaluar el bit del sistema Z del registro de estado. En caso de estar en 0 se ejecuta normalmente la siguiente instrucción, y en caso de estar en 1 se salta la siguiente instrucción. Este bit del sistema se pone en 1 si una operación anterior dió como resultado 0. Hay mucho más que decir sobre la programación de un procesador que lo mencionado en esta lección; sin embargo, si él es conveniente estudiar un poco sobre diagramas de flujo y programación. Simulación del programa El primer paso se llama compilación (propiamente dicho) y traduce el código fuente escrito, en un lenguaje de programación almacenado en un archivo a código en bajo nivel (normalmente en código objeto no directamente al lenguaje máquina). Fascículo No. 3 Semestre 6 5 Procesadores Procesadores El segundo paso se llama enlazado (del inglés link o linker) se junta el código de bajo nivel generado de todos los ficheros que se han mandado compilar y se añade el código de las funciones que hay en las bibliotecas del compilador para que el ejecutable pueda comunicarse con el sistema operativo y traduce el código objeto a código máquina. Una de las formas para poder llegar a probar nuestro programa sin necesidad de utilizar físicamente un recurso electrónico, es a través de diferentes herramientas tecnológicas ya sean por software o por hardware, para así determinar si nuestra aplicación funciona correctamente; estas herramientas se hacen llamar simuladores. Un simulador es un software capaz de reproducir el comportamiento real de un microcontrolador de manera virtual a partir del código .asm creado. Para ello, se encuentran en el mercado diferentes tipos de simuladores que permiten desarrollar diversos y complejos diseños para programar microcontroladores. Un programa utilitario llamado ensamblador es usado para traducir sentencias del lenguaje ensamblador al código de máquina del computador objetivo. El ensamblador realiza una traducción más o menos isomorfa (un mapeo de uno a uno) desde las sentencias mnemónicas a las instrucciones y datos de máquina. Esto está en contraste con los lenguajes de alto nivel, en los cuales una sola declaración generalmente da lugar a muchas instrucciones de máquina. (Cfr. MOTOROLA, 2012). Muchos sofisticados ensambladores ofrecen mecanismos adicionales para facilitar el desarrollo del programa, controlar el proceso de ensamblaje, y la ayuda de depuración. Particularmente, la mayoría de los ensambladores modernos incluyen una facilidad de macro (descrita más abajo), y son llamados macro ensambladores. Procesadores 6 Fascículo No. 3 Semestre 6 Procesadores Figura 1. Interfaz de programación Assembler Etiquetas del lenguaje Assembler Las instrucciones están divididas en un número de campos, como se muestra debajo. Etiquetas caso Trio Operación movf retlw Sleep Operando 5,w 4 Comentarios ;lee puerto A ;retorna de subrutina ; bajo Consumo Tabla 4 Etiquetas de Lenguaje Assembler El campo del código de operación es el único que nunca puede estar vacío; éste siempre contiene una instrucción o una directiva del Assembler. El campo del operando o dirección puede contener una dirección o un dato, o puede estar en blanco. El campo del comentario o de etiquetas es opcional. El programador asignará una etiqueta a una línea de instrucción o agregará un comentario según su conveniencia: normalmente, para hacer más fácil el uso y la lectura; por ejemplo si va a retomar el trabajo dentro de tres semanas Fascículo No. 3 Semestre 6 7 Procesadores Procesadores Delimitadores: Los campos van separados sólo con espacios y/o tabulaciones. No agregar nunca otros caracteres (comas, puntos, etc ). No utilice espacios extra, particularmente después de comas que separan operandos. ( Ej: movlw 5,w ) No use caracteres delimitadores (espacios y tabulaciones) en nombres o etiquetas. Etiquetas La etiqueta es el primer campo en una línea en lenguaje assembler y puede no existir. Si una etiqueta está presente, el assembler la define como el equivalente a la dirección del 1° byte correspondiente a esa instrucción. Esta etiqueta puede volver a usarse en otro lugar pero como operando de una instrucción. El assembler reemplazará ésta etiqueta por el valor de cuando fue creada. Se usan frecuentemente en las instrucciones de salto. No puede existir más de una etiqueta en el 1° campo de instrucción. No pueden usarse como nombres de etiquetas a palabras ya reservadas por el assembler ( ORG, EQU, etc. ) o nombres de instrucciones ( movlw, call, nop, etc.) Ejemplo: START : : DATO movlw DATO goto START EQU 05h La instrucción goto START causa que la dirección de la instrucción con la etiqueta START (movlw) se cargue en el PC. Por lo tanto ésta instrucción será luego ejecutada. Procesadores 8 Fascículo No. 3 Semestre 6 Procesadores No se permite el uso de números o caracteres no alfabéticos como 1° letra de la etiqueta. Como regla práctica: usar siempre letras, y en mayúscula. Mnemónicos (códigos de operación): La tarea principal del Assembler es la traducción de los códigos de operación en mnemónico en sus equivalentes binarios. El Assembler realiza ésta tarea usando una tabla como si lo haríamos “ a mano” . El Assembler debe hacer algo más que traducir los códigos de operación. También debe determinar cuántos operandos requiere la instrucción y de qué tipo. Esto es un poco complejo; algunas instrucciones (como clrw) no tienen operandos, otras (como sumas o saltos) tienen una, mientras que otras (manipulación de bits o skips) requieren dos. Directivas Algunas instrucciones del lenguaje Assembler no se traducen directamente a instrucciones del lenguaje máquina. Estas instrucciones son directivas para el Assembler; éstas asignan al programa ciertas áreas de memoria, definen símbolos, designan áreas de RAM para almacenamiento de datos temporales, colocan tablas o datos constantes en memoria y permiten referencias a otros programas. Las directivas se utilizan como comandos escritos en el código fuente para realizar un control directo o ahorrar tiempo a la hora de ensamblar. El resultado de incorporar directivas se puede ver en el fichero *.LST, después de ensamblar el programa. Para usar éstas directivas o pseudo-operandos, el programador las coloca en el campo del código de operación, y, si lo requiere la directiva, una dirección o dato en el campo de dirección. Fascículo No. 3 Semestre 6 9 Procesadores Procesadores Las directivas más comunes son: EQU (Equate) ORG (Origin) DEFB (Define Byte) DEFW (Define Word) END (fin del código fuente) EQU (Equate - Equivalente) La directiva EQU permite al programador igualar nombres a datos o direcciones. Esta pseudo-operación se nota EQU. Los nombres utilizados se refieren generalmente a direcciones de dispositivos, datos numéricos, direcciones de comienzo, direcciones fijas, posiciones de bits, etc. PORT_A EQU 5 START EQU 0 CARRY EQU 3 TIEMPO EQU 5 También se puede definir una equivalencia con el nombre de otra equivalencia ya definida. PORT_B EQU PORT_A+1 PORT_C EQU PORT_A+2 FIN EQU START+100 FIN2 ` EQU START+200 El valor del operando debe estar ya definido anteriormente, sino el compilador entregará un error. ORG (Origin - Origen) La directiva origen (se nota ORG) permite al programador especificar la posición de memoria donde programas, subrutinas o datos residirán. Los programas y los datos pueden estar alojados en diferentes áreas de me- Procesadores 10 Fascículo No. 3 Semestre 6 Procesadores moria dependiendo de la configuración de memoria. (Cfr. ANGULO, 1997). Rutinas de comienzo, subrutinas de interrupción y otros programas deben comenzar en locaciones de memoria fijados por la estructura de microprocesador. La directiva ORG hace al compilador colocar el código que le sigue en una nueva dirección de memoria (la salida del compilador no solo coloca los códigos de operación sino también las direcciones de cada instrucción y datos del programa). Usualmente se la utiliza para: reset, programas de servicios de interrupción, almacenamiento en RAM, stack, programa principal, subrutinas. Ejemplo: ORG 00h goto inicializa org 04h ; vector de interrupcion goto interr ORG 05h inicializa movlw 08h ; aquí comienza el programa : DEFB (Define Byte), DEFW (Define Word): Esta directiva le permite al programador ingresar datos fijos en la memoria de programa. Estos datos pueden ser: Tablas de conversión Mensajes Nombres Umbrales Comandos Factores de conversión Identificación de teclas Direcciones de subrutinas Fascículo No. 3 Semestre 6 11 Procesadores Procesadores Esta directiva trata a los datos como parte permanente del programa. El formato es muy simple MENSAJE DEFB DELAY DEFB DATOS DEFW $A100 DEFW $A400 DEFW $0000 DEFB 1,4,9,16,25,36,49,64,81 ` POTENCIA ’M’,’I’,’C’,’R’,’O’,0 10 Banderas Las banderas proveen una manera de obtener información acerca de del estado actual de la máquina y el resultado de procesamiento de una instrucción. Nombre Desbordamiento: Indica cuando el resultado de una operación con signo ha excedido la capacidad del uP. Dirección: Controla la selección de incremento o decremento de los registros DI o SI en las instrucciones de cadenas. Interrupción: habilita la entrada de interrupción. Signo: indica el signo del resultado de la última operación aritmética. Cero: indica si la última operación dio como resultado cero. Acarreo auxiliar: ocurre cuando en una operación aritmética, se produzco un acarreo o un préstamo entre el bit 3 y 4 del resultado. Paridad: es un conteo de unos en la última operación. Acarreo: indica un acarreo o un préstamo en la última operación aritmética, usado también en operaciones de corrimiento y como indicador de error en ciertos programas. Procesadores 12 Estado = 0 NV-No hubo desborde Estado = 1 OV-Desborde UP-Incremento DN-Decremento DI-Interr. anulada EI-Interrupción PL-Positivo NG-Negativo NZ-No Cero ZR-Cero AC-Acarreo NA-Sin Acarreo PO-Impar PE-Par NC-Sin Acarreo CY-Acarreo Fascículo No. 3 Semestre 6 Procesadores Las banderas son espacios de memoria. Bandera Bit Nombre CF 0 Bandera de acarreo (carry flag) PF 2 Bandera de paridad (parity flag) AF 4 Bandera de acarreo auxiliar (adjust flag) ZF 6 Bandera de cero (zero flag) SF 7 Bandera de signo (sign flag) DF 10 Bandera de dirección (direction flag) OF 11 Bandera de desbordamiento (overflow flag) Operandos y direcciones Los ensambladores permiten elegir con libertad el tipo de elemento a colocar en el campo de operando o dirección. Números decimales: La mayoría de los ensambladores asumen todos los números como decimales a no ser que se marquen de otra manera. Por ejemplo: movlw 100 Suma con acarreo Para el caso de sumar números cuya longitud supera a los 16 bits del microprocesador o que su resultado sea mayor que 16 bits, se debe recurrir al uso de la suma con acarreo. Esto significa, que en el caso por ejemplo de sumar dos números de 32 bits, se realiza la suma de los 16 bits menos significativos y luego los 16 bits más significativos junto con el acarreo. Figura 2 Suma con Acarreo Fascículo No. 3 Semestre 6 13 Procesadores Procesadores Figura 3 Registros 16bits para suma ADD: Esta instrucción suma el primer operador con el segundo y al resultado lo guarda en el primer operador, si hubo acarreo lo guarda en Carry. ADC: Realiza la misma operación que ADD incorporando también el Carry en la suma de los operadores. Ejemplo Sumar 2 nro de 32 bits contenidos en AX BX y CX DX respectivamente, guardando el resultado en AX BX. AX BX = 0134A23Bh CX DX = BD02E329h ; sumar dos números de 32 bits name "suma32" org 100h mov ax,0134 mov bx,A23B mov cx,BD02 mov dx,E329 add bx,dx adc ax,cx ret AX BX = BE378564 (Resultado) Procesadores 14 Fascículo No. 3 Semestre 6 Procesadores Stack Lugar de memoria destinado a guardar datos temporales, es una pila (LIFO) Los registros usados por el stack son: SP: Stack Pointer – Puntero del stack SS: Stack Segment – Segmento del stack Quedando la dirección absoluta SS:SP, Funciones que usan el Stack: PUSH: Decrementa el SP en 2 y luego graba 2 bytes al stack. POP: Lee los últimos 2 bytes grabados al Stack e incrementa el SP en 2. También dan uso del Stack: las interrupciones de Hardware y Software y las llamadas a subrutinas. Estado del Stack antes y después del uso de las instrucciones POP y PUSH: Figura 4 Estado del Stack Fascículo No. 3 Semestre 6 15 Procesadores Procesadores Ejemplo Salvar a los registros AX y BX, luego borrar los mismos para finalmente recuperar los datos del Stack ; manejo del stack ; notar el orden en que se recupera los registros name "stack" org 100h mov ax,10 mov bx,20 push ax push bx sub ax,ax sub bx,bx pop bx pop ax ret ; volver al sistema operativo Movimiento (Shift) común y Aritmético Procesadores 16 Fascículo No. 3 Semestre 6 Procesadores Formato de las instrucciones Si bien se pueden realizar corrimiento o rotaciones de 1 o más bits, solo está permitido el de 1 bit en inmediato, en estos casos para un corrimiento de más de un bits, se debe utilizar un registro auxiliar, el CL. (Cfr. MOTOROLA, 2012). Funcionalidad: Ejemplo Usando instrucciones Shift ingresar un número en AX y multiplicarlo por 7 ; multiplicar por 7 name "multip7" org 100h mov ax,023Ah mov bx,ax mov cl,03 shl bx,cl sub bx,ax ret ; volver al sistema operativo Resultado 0F96h Aritmética Entera Instrucciones a usar MUL, IMUL, DIV, IDIV Tamaño Operador 8 bits 16 bits Multiplicando AL AX Multiplicador Byte registro o memoria Palabra registro o memoria Resultado AX DX:AX División Tamaño Operador Dividendo Divisor Resultado Resto 16 bits AX Byte registro o memoria AL AH 32 bits DX:AX Palabra registro o memoria AX DX Fascículo No. 3 Semestre 6 17 Procesadores Procesadores Ejemplo Dividir AX por 7 y Multiplicar BX por 23 ; dividir y multiplicar enteros name "divymul" org 100h mov ax,0100h mov bx,2000h mov cl,7 ; divisor div cl ; dividendo = ax ; divisor = cl mov cx,ax ; guardar resultado y resto en cx mov ax,bx ; multiplicando mov bx,23 ; multiplicador mul bx ; resultado en dx ax ret ; volver al sistema operativo Resultado: división 24h con resto 4h – multiplicación 2E000h Saltos Condicionales e Incondicionales En casi todo programa muchas veces es necesario interrumpir el flujo normal del mismo y saltar a otra porción del código, podemos distinguir dos saltos diferentes: Los condicionales, donde se evalúa una condición y al ser verdadera se produce el salto, es la forma que tiene el ensamblador de realizar IF o estructuras CASE que acostumbrábamos a usar en lenguajes de alto nivel, lo único que aquí lo hacemos en dos pasos, primero comparamos, quedando el resultado en las banderas (ver banderas al comienzo), luego utilizamos alguna de las instrucciones de salto condicional para realizar el salto. El salto incondicional, aquí no hay condición de salto y el mismo se efectúa siempre, es el equivalente al GOTO en lenguajes de alto nivel. Salto Incondicional JMP nn El salto incondicional puede ser dividido en tres tipos. Procesadores 18 Fascículo No. 3 Semestre 6 Procesadores Salto corto, en este tipo de salto el parámetro nn es un byte, pudiendo saltar desde +127 hasta -128 posiciones a partir de la dirección próxima a JMP. (largo: 1 byte instrucción + 1 byte salto = 2 bytes) Salto cercano, el parámetro nn es de dos bytes indicando la dirección del puntero a donde va a saltar. (largo: 1 bytes instrucción + 2 bytes salto = 3 bytes) Salto lejano, nn es de 4 byte, indica la posición absoluta con segmento y puntero del salto. ( largo: 1 byte instrucción + 4 byte salto = 5 bytes ) Generalmente el compilador elije la mejor forma (la más corta) para realizar el salto, no siendo necesario determinar el tipo de salto. Saltos condicionales Este tipo de salto depende de las banderas del uP para realizar el salto, todos estos saltos son solamente corto, no pudiendo saltar con estas instrucciones más allá de +127 – 128 bytes Saltos condicionales para número sin signo Instrucción JA JAE JB JBE Bandera/s C=0yZ=0 C=0 C=1 C=1oZ=1 Descripción Saltar si está por arriba Saltar si está por arriba o es igual Saltar si está por abajo Saltar si está por debajo a igual Saltos condicionales para número con signo Instrucción JG JGE JL JLE JNS JS Fascículo No. 3 Semestre 6 Bandera/s Z=0yS=O S=O S≠O Z=1oS≠O S=0 S=1 Descripción Saltar si es mayor Saltar si es mayor o igual Saltar si es menor Saltar si es menor o igual Saltar si no hay signo Saltar si hay signo 19 Procesadores Procesadores Otros saltos Instrucción JE o JZ JNE o JNZ JC JNC JNO JNP o JPO JO JP o JPE JP o JPE Bandera/s Z=1 Z=0 C=1 C=0 O=0 P=0 P=0 P=1 P=1 Descripción Saltar si no es igual o cero Saltar si no es igual o cero Saltar si hay acarreo Saltar si no hay acarreo Saltar si no hay overflow Saltar si no hay paridad o paridad impar Saltar si hay overflow Saltar si hay paridad o paridad par Saltar si CX = 0 Ejemplo Realizar un programa que: dado un vector de byte ya cargado, busque el final del mismo (byte = 0h) y termine dejando en BX la longitud del mismo. ; Vector name "vector" org 100h mov bx,0 ; en bx tenemos la posición dentro del vector otro: mov al,vec[bx] ; cargamos en AL el elemento del vector indicado en BX inc bx ; incrementamos BX cmp al,0 ; comparamos el elemento del vector con 0 jz fin ; si la comparación es 0 salimos del programa jmp otro ; buscamos otro elemento fin: ret ; volver al sistema operativo vec db "abcdefghijklmnopqrstuvwxyz",0 ; cargar un vector con constantes Loop La instrucción loop se utiliza para realizar bucles, esta instrucción decremento el contador CX y lo compara con cero en caso de no ser cero salta a la dirección indicada en el parámetro, de ser cero continua con la instrucción siguiente. Procesadores 20 Fascículo No. 3 Semestre 6 Procesadores Ejemplo Realizar un programa que: dado un vector de byte ya cargado de 10 elementos, sume los mismos y termine con el resultado de la suma en AX. ; suma name "suma" org 100h mov bx,0 ; en bx tenemos la posición dentro del vector mov cx,10 ; contador del programa para el loop mov ax,0 ; suma mov dx,0 otro: mov dl,vec[bx] ; cargamos en DL el elemento del vector indicado en BX inc bx ; incrementamos BX add ax,dx loop otro ret ; volver al sistema operativo vec db 10,20,2,200,34,44,21,8,10,22; cargar un vector con constantes Convenciones en la escritura del código fuente Para hacer la tarea del programador más grata, se usan algunas convenciones. Cada uno puede adoptar las que más le agraden y ayuden para ser más productivo. En general, las convenciones son cualquier acción que facilita la revisión y comprensión de un programa, especialmente el que uno mismo ha escrito cuando tiene que revisarlo algunos meses después. Comentamos algunas convenciones que usaremos: Los ficheros de código fuente llevarán la extensión *.ASM Los ficheros de listado llevarán la extensión *.LST Los ficheros de código objeto llevarán la extensión *.OBJ Los ficheros de errores llevarán la extensión *.ERR Los ficheros ejecutables en formato Intel Hex llevarán la extensión *.HEX Los nemónicos escritos en mayúscula hacen que el código escrito sea más visible. Comentarios explicando cada línea de código. Fascículo No. 3 Semestre 6 21 Procesadores Procesadores Un párrafo de comentarios explica las rutinas o conjunto de instrucciones ya que los campos de comentarios suelen ser pequeños. El espacio entre caracteres se escribe “ _” . RB0_ES_1 es más fácil de leer que RB0ES1 Recuerde que las convenciones son cualquier cosa que le haga más fácil la lectura y comprensión de su código, como por ejemplo: 1. Una cabecera estandarizada. 2. Colocar las rutinas en el mismo sitio, todas contiguas. 3. Dibujar diagramas de flujo o escribir seudocódigo. Desventajas de Assembler Desventajas del Assembly: El lenguaje assembler no resuelve todos los problemas de programación. Uno de ellos es la tremenda diferencia entre el set de instrucciones del microprocesador y las tareas que el microprocesador debe realizar. Las instrucciones del microprocesador tienden a hacer cosas como: sumar contenidos de dos registros, desplazar el contenido de un acumulador un bit, o colocar un nuevo valor en el contador de programa (PC). Por otro lado, el usuario generalmente quiere que el computador haga cosas como: chequear si un valor analógico leído se exedió de un cierto umbral, buscar y reaccionar ante un comando particular de una consola o teletipo, o activar un relé en el momento apropiado. El programador de lenguaje assembler debe traducir estas tareas a secuencias de simples instrucciones de microprocesador. Esta tradución suele ser dificultosa, consume tiempo de trabajo. (Cfr. ANGULO, 1997). Otro inconveniente es la no portabilidad. Cada microprocesador posee su propio set de instrucciones en el cual está reflejado su arquitectura interna. Un programa en assembler escrito para 6809, no correrá en un 6502, Z80, Procesadores 22 Fascículo No. 3 Semestre 6 Procesadores 8080, o cualquier microprocesador de 16 o 32 bits. Ni siquiera dentro de la misma familia de microcontroladores de Microchip Technology (PICs) existen las mismas instrucciones. Cada modelo tiene un set de instrucciones propio que difiere en algunas instrucciones con los demás. Inclusión de Código Algunos ensambladores permiten incluir código fuente (partes de programas) desde otros archivos. Por ejemplo: INCLUDE DISPLAY.ASM Le dice al compilador que incluya el código que se encuentra en el archivo DISPLAY.ASM como si fuese parte del propio programa. Esto se utiliza para reutilizar códigos realizados con anterioridad. En el ejemplo del siguiente punto lo vemos más claro. Macros: A veces ocurren secuencias de instrucciones particulares en los programas que son repetitivas. Estas secuencias de instrucciones se pueden eliminar utilizando MACROS. Las macros permiten asignarle un nombre a una secuencia de instrucciones. Luego se utiliza el nombre de la macro en el programa como si se usase la secuencia de instrucciones anterior. Las macros no son lo mismo que las subrutinas. El código de las subrutinas aparece una sola vez en un programa y la ejecución del programa salta a la subrutina. En cambio, el ensamblador reemplaza cada ocurrencia del nombre de la macro con la secuencia especificada de instrucciones. Por consiguiente la ejecución del programa no salta a la macro como una subrutina. Fascículo No. 3 Semestre 6 23 Procesadores Procesadores Ejemplo. Archivo “ MULX10.ASM” MULX10 MACRO movf tiempo,w rlf tiempo rlf tiempo rlf tiempo addwf tiempo addwf tiempo ENDM ; comienzo de la macro ; guarda el tiempo en W ; multiplica por 2 ; multiplica por 2 ; multiplica por 2 ; le suma una vez más ; le suma una vez más ; fin de la macro Tabla de Caracteres ASCCI Los códigos ASCII menores a 3210 (0016 a 1F16) son los llamados caracteres de control. No se pueden representar gráficamente, se utilizan como comandos en los dispositivos series y paralelos (terminales, impresoras, etc.) efectuando operaciones como: avance de papel, retorno de carro, fin de transmisión, fin del archivo, etc. Figura 5 Tabla de Caracteres ASCCI 3.1 Realizar la documentación del siguiente código: Este programa muestra la forma de utilizar el puerto paralelo usando los bits de datos como salidas. El programa realiza una secuencia de 8 LEDs conectados en modo source en los pines 2 al 9 y el 19 (CNG o masa) para los cátodos comunes. Procesadores 24 Fascículo No. 3 Semestre 6 Procesadores /* leds.c */ /* Secuencia 8 LEDs conectados al puerto paralelo */ #include <stdio.h> #include <conio.h> #include <dos.h> void main() { /* colocar el valor del puerto que corresponda: 0x278, 0x378, 0x3BC */ int puerto = 0x278; int led = 1; /* apago todos los LEDs */ outportb( puerto, 0 ); /* si se pulsa cualquier tecla termina */ while( kbhit() == 0 ) { /* enciendo el LED */ outportb( puerto, led ); /* siguiente LED (1, 2, 4, 8, 16, 32, 64, 128) */ led = led * 2 ; /* si excede 128 tiene que volver a 1 */ if( led > 128 ) led = 1; } } /* FIN */ 1. Indicar qué está mal en las siguientes instrucciones ensamblador MOVE Temp, #4 ADD.B #1,A3 CMP.L D0, #9 MOVE.B #500,D5 ADD.W +(A2),D3 BEQ.B Bucle 2. Indicar tres aspectos de la arquitectura de un ordenador que pueden influir en la velocidad de ejecución de una instrucción. 3. ¿Cuál era el tamaño de la memoria en la máquina de Von Neuman expresada en K octetos? 4. Encontrar la palabra o frase de la lista que aparece a continuación que mejor se ajusta a las afirmaciones siguientes. Afirmaciones: Otro nombre para procesador Máquina de alto rendimiento con un precio elevado Fascículo No. 3 Semestre 6 25 Procesadores Procesadores Aproximación al diseño hardware o software. El sistema está formado por capas jerárquicas, en las que cada capa de nivel superior oculta detalles de la capa de nivel inferior. Orden individual para un computador. Localización de los programas cuando se están ejecutando, también contiene los datos que se necesitan. Parte activa del computador que sigue las instrucciones del programa al pie de la letra: suma números, examina números, etc. Memoria pequeña rápida que actúa como buffer de la memoria principal Abstracción específica que el hardware proporciona al software de bajo nivel. Palabras: a) ensamblador b) caché c) CPU d) Instrucción e) Arquitectura del repertorio de instrucciones f) Procesador g) Memoria h) Supercomputador El lenguaje ensamblador es un tipo de lenguaje de bajo nivel, se llaman así porque están muy cercanos al hardware del ordenador. Es por ello de el lenguaje ensamblador asigna una abreviatura a c da instrucción en binario (código máquina), de esta forma es más fácil recordar y más difícil equivocarse con las instrucciones o abreviaturas. Una desventaja es que con este lenguaje sigue siendo necesario conocer muy bien el hardware del ordenador. En otras palabras es necesario conocer a fondo la arquitectura de la máquina para la que se va a programar. Fue usado ampliamente en el pasado para el desarrollo de software, pero actualmente sólo se utiliza en contadas ocasiones, especialmente cuando se requiere la manipulación directa del hardware o se pretenden rendimientos inusuales de los equipos. Procesadores 26 Fascículo No. 3 Semestre 6 Procesadores Unidades de información Para que la PC pueda procesar la información es necesario que ésta se encuentre en celdas especiales llamadas registros. Los registros son conjuntos de 8 o 16 flip-flops (basculadores o biestables). Un flip-flop es un dispositivo capaz de almacenar dos niveles de voltaje, uno bajo, regularmente de 0.5 volts y otro alto comúnmente de 5 volts. El nivel bajo de energía en el flip-flop se interpreta como apagado o 0, y el nivel alto como prendido o 1. A estos estados se les conoce usualmente como bits, que son la unidad más pequeña de información en una computadora. A un grupo de 16 bits se le conoce como palabra, una palabra puede ser dividida en grupos de 8 bits llamados bytes, y a los grupos de 4 bits les llamamos nibbles. Sistemas numéricos El sistema numérico que utilizamos a diario es el sistema decimal, pero este sistema no es conveniente para las máquinas debido a que la información se maneja codificada en forma de bits prendidos o apagados; esta forma de codificación nos lleva a la necesidad de conocer el cálculo posicional que nos permita expresar un número en cualquier base que lo necesitemos. J. Mª. Angulo Usategui, E. Martín Cuenca, I. Angulo Martínez, Microcontroladores PIC. La Solución en un Chip. Ed. Paraninfo. ( 1997 ) J. Mª. Angulo Usategui, I. Angulo Martínez, Microcontroladores PIC. Diseño práctico de aplicaciones, Mc Graw Hill [ 1999 ] Fascículo No. 3 Semestre 6 27 Procesadores Procesadores Cherre, Rafael Juan, Lenguaje de Programación en C++, Editorial Macro. Francia, Darío Rafael, Programación Orientada a Objetos, Editorial Acisclo, 2009 Los planteamientos explicados en este fascículo deben ser tenidos en cuenta para el tratamiento de problemas posteriores. En el siguiente fascículo daremos introducción a la descripción interna del Microcontrolador, esto para adentrarnos en funcionalidad, programación, características y variables a programar y prácticas en la plataforma. Procesadores 28 Fascículo No. 3 Semestre 6 Procesadores Seguimientoal autoaprendizaje Procesadores - Fascículo No. 3 Nombre_________________________________________________________ Apellidos ______________________________Fecha ___________________ Ciudad _______________________________Semestre__________________ Resolver: 1. Cómo se detecta el Overflow? 2. Sea X= 1100 0001 un número binario de 8 bits. Especifique en qué consiste el desplazamiento lógico (derecha o izquierda), el desplazamiento aritmético (derEcha/izquierda) y la rotación (derecha/izquierda). Obtenga el resultado de realizar dichas operaciones con el número X e interprete el resultado, cuando sea posible, según X se considere como un número con signo o como un número sin signo. 3. En qué consiste un ciclo de Fetch y un ciclo de Execute. 4. ¿Qué son los modos de direccionamiento?. Describa algunos de ellos. 5. ¿Qué funciones tiene el contador de programa, PC, de un microprocesador? 6. ¿Qué funciones tiene un registro de datos? 7. ¿Qué funciones tiene un registro de direcciones? 8. Si un microprocesador dispone de: a. 16 b. 20 c. 24 d. 32 Líneas en su bus de direcciones, ¿cuántas direcciones físicas distintas puede generar? 9. Representa el esquema de una RAM de 32Kx8 y una ROM de 16Kx8. 10. Definir brevemente: programa fuente, programa objeto, lenguaje ensamblador, lenguaje de máquina y programa ensamblador. Fascículo No. 3 Semestre 6 29 Procesadores Procesadores 11. Describir brevemente los conceptos de puerto y periférico, los métodos de transferencia paralela de datos, y las técnicas de entrada y salida. 12. Comente las técnicas de E/S programada e interrupción en cuanto a recursos necesarios y velocidad de la transferencia de datos. Procesadores 30 Fascículo No. 3 Semestre 6