Arquitectura de Los Microprocesadores Intel y Su Evolucion(Enviar)

May 14, 2019 | Author: Patty Sanchez | Category: Assembly Language, Digital Electronics, Central Processing Unit, Computing, Tecnología
Share Embed Donate


Short Description

Download Arquitectura de Los Microprocesadores Intel y Su Evolucion(Enviar)...

Description

Evolución del Microprocesador Microprocesador Intel hasta ahora es el fabricante líder de microprocesadores para la PC. Intel ha fijado con firmeza el estándar por el cual se miden todos los procesadores. Intel 8086 y 8088En 1978 Intel introdujo el microprocesador 8086, el cual tenía una velocidad de reloj de477 MHz. Una computadora con 5 MHz tiene 5 millones de ciclos de procesamiento por segundo. El procesador 8088 estaba empacado en un circuito integrado de paquete en línea dual de 40 pines. Intel 80286Para adoptar el Intel 80286 el procesador como se le conocía comúnmente se introdujo a comienzos de 1982 con una velocidad de reloj de 6 MHz Intel 80386, 80386DX y 80386SXEn 1995 Intel saco el 80386 de 16 MHz, comúnmente llamado 386. El microprocesador 386 fue un procesador de 32 bits ensamblado en un paquete PGA de 132 pines, tenia275000 transistores y su velocidad de reloj soportaba más de 5 MIPS Tenía un modo de 32 bits, lo que significa que podía mover datos en bytes palabras De 16 bits, o palabras dobles de 32 bits el 386X se sacó al mercado para suplir la necesidad de un procesador de precio reducido con la potencia del 386DX al costo de un 286.386SLProcesador de 20 MHz. La versión SL, era semejante al 386SX, pero estaba diseñado específicamente específicamente para computadoras computadoras portátiles Intel Intel 80486DX y SX,

Este

procesador tenía más de 12 millones de transistores y generaba 20 MIPS. Este procesador también introdujo algunas innovaciones como la inclusión de la cache del procesador en el chip del procesador. Intel 80486 DX2/DX4Fue presentado en 1992 como 80486DX2. La designación “2” se refería a una técnica llamada overclocking , que permitía que la

velocidad de reloj e un procesador se duplicaran. El 486DX4 también era un producto de overclocking. A los procesadores 486 de 25 MHz y 33 MHz se les aplicaba la técnica de overclocking para triplicar sus velocidades normales de reloj.

AMD 5x 86Los procesadores AMD 5x 86 eran compatibles con las tarjetas madre del 486 pero tenía la capacidad semejante a los primeros procesadores Pentium. Cyrix 5x 86También conocido como el MISE estaba demasiado a competir con el Intel 486 con el cual era compatible con el zócalo Pentium Este nuevo procesador incluía muchas características nuevas, dentro de las que se encontraban caches independientes de 8 bits para datos e instrucciones y una FPU muy rápida. Pentium mantuvo el bus de direcciones de 32 bits del 486 paro agrego un bus de datos de 64 bits. Tecnología MMX. La tecnología MMX es un conjunto de instrucciones que utiliza la matemática matricial, para soportar los algoritmos de comprensión y de comprensión de gráficos y presentaciones graficas en 3D permite que el FPU actué en varias piezas de datos simultáneamente a través de un proceso llamado SIMD. Procesadores Cyrix 6x86Indicaba que el procesador cyrix con ese número de modelo tenis un rendimiento equivalente al procesador Pentium de 200 MHz. Cyrix produjo modelos que oscilaban entre 6x86-P120 y 6x86-P200.Pentium II Se le

denomina comúnmente está disponible con velocidades de reloj de 233 Mhz, 266y 300 MHz. Es excelente para reproducción de multimedia que requiera soporte para videos con movimiento total e imágenes 3D. Celeron Se desarrolló para ser utilizado en computadoras de escritorio y portátiles, sus velocidades entre 333 MHz y 500 Mhz. Xeon Presenta un ramo de opciones de tamaño cache, N2 es capaz de direccionar y atrapar, hasta 64 Gb de memoria con su bus de direcciones de memoria de 36 bits.

AMD K6Fue desarrollado para competir con el Pentium MMX, el AMD K6, lo supera en rendimiento, velocidad y precio. Cyrix 6x86MX y Cyrix III Contiene un conjunto de instrucciones MMX tiene una velocidad de rendimiento P-166a P-366El cyrix III funciona a velocidades de reloj de 433, 466, 500 y 533 MHz Procesadores AMD K5-2 y K 6-111Se encuentran disponibles con velocidades de reloj entre 266 y 550 MHz. El procesador K6-III contiene 256 K de cache N2 y velocidades de reloj entre 400 y600 MHz. Intel Pentium III Contiene 9.5 millones de transistores un cache N1 de 32K y 512 K de cache N2. Se encuentra disponible con velocidades de reloj entre 450 MHz y 1 GHz y esta ensamblado en un paquete de conectores laterales de borde único de segunda generación denominada SECC2La mayoría de las tarjetas madre que soportan un procesador Pentium II que pueden

actualizarse a Pentium III; sin embargo, pueden requerir una

actualización Flash BIOSAMD ATHLON Se enorgullece de contener 22 millones de transistores que soportan el MMX de Intel y el 3DNow de AMD y funciones FPU mejoradas. Tiene la capacidad de decodificar más instrucciones simultáneamente que el Pentium II, con 256 Kb de cache N2 y 128Kb de cache N1 en el chip. Intel Pentium 4Disponible con velocidades de procesador de 1.3 a 1.5 Ghz. Utiliza una nueva microarquitectura llamada NET-BURST, la cual contiene un bus de sistema de 400 MHz, cache avanzado integrada en la tarje, matemáticas mejoradas de punto flotante y soporte de multimedia y tecnología de híper-canalización. Soporta el uso del RDRAM de canal dual.

 Arquitectura de los microprocesadores de Intel Si nos referimos a la familia Intel, de los 2.100 transistores del 4004 en 1970, que con solo 46 instrucciones funcionaba a unos 800 KHz, se pasó a los 29.000 transistores del 8086 en 1979 a 14 MHz; y en 1999 a los 8.200.000 transistores del Pentium III a 2 GHz.

 Arquitectura de los microprocesadores desde el 8086 al Pentium 4

Registro de propósito general  (general-purpose register): Son aquellos sobre los que no existe restricción en cuanto a su utilización. Pueden ser empleados como fuente o destino de datos, como contador, como puntero de localidades de memoria o de elementos de E/S.

Registros apuntadores e índice Registro puntero de la pila (stack pointer SP): Contiene la dirección de la memoria donde se almacenó el último dato de la PILA o STACK. •

REGISTRO ÍNDICE (index register): También contiene una dirección y es utilizado como puntero. El uso de este registro permite que los programas sean más flexibles, ya que para acceder a distintas localidades de memoria, basta especificar un valor que sumado al contenido del registro índice da la dirección real.

Registros de segmentos Un registro de segmento se utiliza para alinear en un límite de párrafo o dicho de otra forma codifica la dirección de inicio de cada segmento y su dirección en un registro de segmento supone cuatro bits 0 a su derecha. Un registro de segmento tiene 16 bits de longitud y facilita un área de memoria para direccionamientos conocidos como el segmento actual. Los registros de segmento son: CS (código), DS (datos), SS (pila), ES , FS y GS.

Registro de estado o de bandera (flag) y sus señalizadores Es un registro de 16 bits, de los cuales nueve sirven para indicar el estado actual de la máquina y el resultado del procesamiento. Muchas instrucciones aritméticas y de comparación cambian el estado de las banderas y apoyándose en ellas se pueden tomar decisiones para determinar la acción subsecuente. La tabla contiene 16 posiciones (de 0 a 15), que son los 16 bits del registro de banderas, numeradas de derecha a izquierda. La posición 0 la encontraremos a la derecha y la posición 15 a la izquierda. - - - - OF DF IF TF SF ZF - AF - PF - CF Los bits de las banderas son las siguientes:



















OF (overflow, desbordamiento):  Indica desbordamiento del bit de mayor orden después de una operación aritmética de números con signo (1=existe overflow; 0=no existe overflow). Para operaciones sin signo, no se toma en cuenta esta bandera. DF (dirección):  Controla la selección de incremento o decremento de los registros SI y DI en las operaciones con cadenas de caracteres (1=decremento automático; 0=incremento). La bandera DF se controla con las instrucciones STD y CLD. IF (interrupción):  Controla el disparo de las interrupciones (1=habilita las interrupciones; 0=deshabilita las interrupciones). La interrupción no enmascarable es la única que no puede ser bloqueada por esta bandera. El estado de la bandera IF se controla con las instrucciones STI y CLI. TF (trampa): Permite la operación del procesador en modo de depuración (paso a paso) SF (signo): Contiene el signo resultante de una operación aritmética (0=positivo; 1=negativo). ZF (cero): Indica el resultado de una operación aritmética o de comparación (0=resultado diferente de cero; 1=resultado igual a cero). AF (acarreo auxiliar):  Contiene el acarreo del bit 3. Esta bandera se prueba con las instrucciones DAA y DAS para ajustar el valor de AL después de una suma o resta BCD. PF (paridad):  Indica si el número de bits 1, del byte menos significativos de una operación, es par (0=número de bits 1 es impar; 1=número de bits 1 es par). CF (acarreo): Contiene el acarreo del bit de mayor orden después de una operación aritmética; también almacena el contenido del último bit en una operación de desplazamiento o de rotación.

Direccionamiento de la memoria en tiempo real El modo real (también llamado modo de dirección real en los manuales de Intel) es un modo de operación del 80286 y posteriores CPUs compatibles de la arquitectura x86. El modo real está caracterizado por 20 bits de espacio de direcciones segmentado (significando que solamente se puede direccionar 1 MB de memoria), acceso directo del software a las rutinas del BIOS y el hardware periférico, y no tiene conceptos de protección de memoria o multitarea a nivel de hardware. Todos los CPUs x86 de las series del 80286 y posteriores empiezan en modo real al encenderse el computador; los CPUs 80186 y anteriores tenían solo un modo operacional, que era equivalente al modo real en chips posteriores. Puesto que una especificación de diseño primaria de los microprocesadores x86 es que sean completamente compatibles hacia atrás con el software escrito para todos los chips x86 antes de ellos, el chip 286 fue hecho para iniciarse en ‘ modo real ‘ –  es decir, en un modo que tenía apagadas las nuevas

características de protección de memoria, de modo que pudieran correr sistemas operativos escritos para microprocesadores más viejos. Al día de hoy, incluso los más recientes CPUs x86 se inician en modo real al encenderse, y pueden correr el software escrito para cualquier chip anterior. Bajo el modo real no existe ningún mecanismo para tener varias tareas ejecutándose concurrentemente, aunque si se pueden tener varios programas cargados en memoria al mismo tiempo, pero inactivos. En el modo real se puede lograr un pequeño grado de multitarea si interceptamos algunos de los vectores de interrupción que se ejecutan periódicamente, como el temporizador, e insertamos una rutina de usuario bajo esa interrupción. Como puede verse, este tipo de multitarea no tiene ni punto de comparación con la que ofrece el modo protegido del 80386.En el modo real no se puede controlar que un programa, por ejemplo, no pueda acceder a una zona específica de memoria. Un programa en modo real puede acceder a cualquier dirección de memoria direccionable por el procesador, con lo que un programa maligno puede modificar estructuras del sistema operativo o redireccionar vectores de interrupción y tener un control total sobre el sistema. Debido a esta escasa protección que se ofrece en el modo real, aparecen los temibles virus informáticos y otros programas malignos. Tras conocer el modo protegido y haber trabajado con él, me atrevo a afirmar que es imposible realizar un virus para un sistema operativo que trabaje en modo protegido, siempre y cuando ese sistema operativo no deje ninguna puerta de entrada libre al usuario para controlar el sistema. Todas las interrupciones hardware y software son controladas por el procesador en el modo real leyendo de una tabla de interrupciones que se encuentran en las primeras posiciones de memoria física. Cuando se produce una interrupción, se lee de la tabla anterior la dirección donde encontrar su rutina de tratamiento. Como cualquier programa pude acceder a cualquier dirección de memoria, pude manipular esta área de memoria e interceptar diversos vectores de interrupción y apuntarlas a rutinas propias, con lo que cualquier programa puede controlar el sistema según desee.

Direccionamiento de memoria en modo protegido. El direccionamiento de memoria en modo protegido (a partir del 80286 y posteriores) permite acceder a datos y programas localizados por encima y dentro del primer megabyte de memoria. Para direccionar esta sección extendida el sistema de memoria se requiere un cambio en el esquema de direccionamiento de segmento más desplazamiento usado en el modo real. Cuando los datos y programa se direccionan la memoria extendida, se sigue utilizando la dirección de desplazamiento para acceder a la información en el

segmento de memoria. Una diferencia consiste en la dirección del segmento ya que no existe en modo protegido. En lugar de una dirección de segmento, el registro de segmento contiene un SELECTOR que elige un descriptor de una tabla. El descriptor específica la ubicación del segmento en memoria, su longitud y sus derechos de acceso. Dado que el registro de segmento y la dirección de desplazamiento aún acceden a la memoria, las instrucciones del modo protegido son idénticas a las de modo real. De hecho, la mayoría de los programas escritos para funcionar en modo real funcionarán sin cambios en el modo protegido. La diferencia entre los dos modos e s la forma en que el microprocesador interpreta el registro de segmento para acceder al segmento de memoria. Otra diferencia, en los 80386 y posteriores, es que en modo protegido la dirección de desplazamiento puede ser un número de 32 bits en vez de utilizar uno de 16 bits como en modo real. Es por esto que puede direccionar hasta 4 Gb de longitud. El SELECTOR, ubicado en el registro del segmento, elige uno de 8192 descriptores en una de las dos tablas de descriptores. El DESCRIPTOR especifica la ubicación, la longitud y los derechos de acceso del segmento de memoria, aunque no directamente como en el modo real. Por ejemplo, en el modo real, si CS=0008H, el segmento de código inicia en la localidad 00080H. En modo protegido, este número de segmento puede direccionar cualquier localidad de memoria en todo el sistema para el segmento de código. Existen dos tablas de descriptores utilizadas con los registros de segmentos: una contiene descriptores globales y otra, descriptores locales. Los descriptores globales contienen las definiciones de los segmentos que se aplican a todos los programas, mientras que los descriptores locales son generalmente exclusivos de una aplicación. Podríamos llamar descriptor de sistema a un descriptor global, y descriptor de aplicación a uno local. Cada tabla de descriptores contendrá 8192 entradas, por lo tanto una aplicación podría disponer en cualquier momento de 16.384 descriptores. Puesto que un descriptor describe un segmento de memoria, esto permite que puedan ser descriptos hasta 16.384 segmentos de una aplicación.

Los registros invisibles para los programas Los registros invisibles para el programa no son diseccionados directamente por el software, motivo por el cual reciben este nombre (TR, LDTR, GDTR,IDTR)

La parte invisible de estos registros recibe el nombre de caché ( no se debe confundir con los niveles 1 o 2 encontradas en el microprocesador). Cada vez que se cambia el

número en el registro de segmento, la parte del registro de segmentos invisible para el programa es cargada en la dirección base., el límite y los derechos de acceso. Cuando se escribe un nuevo número en un registro, el microprocesador accede a la tabla de descriptores y carga el descriptor en la caché invisible para el programa de forma parte del registro del segmento. El descriptor se mantiene ahí y es usado para acceder al segmento de memoria hasta que el número de segmento es cambiado nuevamente. Esto permite al microprocesador acceder repetidamente a un segmento de memoria sin consultar en cada ocasión la tabla de descriptores (de ahí el término caché).

El GDTR (registro de tabla de descriptores globales) y el IDTR (registro de tabla de descriptores de interrupción) contienen la dirección base y límite de la tabla de descriptores. El límite de cada tabla de descriptores es de 16 bits debido a que la máxima longitud de la tabla es de 64 KB. Cuando se desea la operación en modo protegido, la dirección y el límite de la tabla de descriptores globales son cargados en el GDTR. Antes de usar el modo protegido, debe inicializarse también la tabla de descriptores de interrupción y el IDTR.

La ubicación de la tabla de descriptores locales es seleccionada de la tabla de descriptores globales (uno de los descriptores se configura para direccionar la tabla de descriptores locales).

Para acceder a la tabla de descriptores locales, LDTR (registro de la tabla de descriptores locales) es cargado con un selector, al igual que un registro de segmento es cargado con un selector. Este selector accede a la tabla de descriptores globales y carga la dirección de base, el límite y los derechos de acceso de la tabla de descriptores hacia la parte caché del LDTR.

El TR (registro de tarea) contiene un selector, el cual accede a un descriptor que define una tarea. Una tarea es con frecuencia un procedimiento o un programa de aplicación. El descriptor para el procedimiento o programa es almacenado en la tabla de descriptores globales, de forma que el acceso pueda se controlado por medio de los niveles de privilegio. El registro de tarea permite la conmutación de contexto o de tarea en aprox. 17

us. La conmutación de tareas se efectúa en lapsos razonablemente cortos y permite a los sistemas multitareas cambiar una tarea a otra de manera simple y ordenada.

Diferentes modos de direccionamiento Diferentes arquitecturas de computadores varían mucho en cuanto al número de modos de direccionamiento que ofrecen desde el hardware. Eliminar los modos de direccionamiento más complejos podría presentar una serie de beneficios, aunque podría requerir de instrucciones adicionales, e incluso de otro registro. Se ha comprobado que el diseño de CPUs segmentadas es mucho más fácil si los únicos modos de direccionamiento que proporcionan son simples. La mayoría de las máquinas RISC disponen de apenas cinco modos de direccionamiento simple, mientras que otras máquinas CISC tales como el DEC VAX tienen más de una docena de modos de direccionamiento, algunos de ellos demasiado complejos. El mainframe IBM System/360 disponía únicamente de tres modos de direccionamiento; algunos más fueron añadidos posteriormente para el System/390. Cuando existen solo unos cuantos modos, estos van codificados directamente dentro de la propia instrucción (Un ejemplo lo podemos encontrar en el IBM/390, y en la mayoría de los RISC). Sin embargo, cuando hay demasiados modos, a menudo suele reservarse un campo específico en la propia instrucción, para especificar dicho modo de direccionamiento. El DEC VAX permitía múltiples operandos en memoria en la mayoría de sus instrucciones, y reservaba los primeros bits de cada operando para indicar el modo de direccionamiento de ese operando en particular. Incluso en computadores con muchos modos de direccionamiento, algunas medidas realizadas a programas indican que los modos más simples representan cerca del 90% o más de todos los modos de direccionamiento utilizados. Dado que la mayoría de estas medidas son obtenidas a partir de códigos de alto nivel generados a partir de compiladores, nos da una idea de las limitaciones que presentan los compiladores que se utilizan.

-

Implícito

En este modo de direccionamiento no es necesario poner ninguna dirección de forma explícita, ya que en el propio código de operación se conoce la dirección del (de l os) operando(s) al (a los) que se desea acceder o con el (los) que se quiere operar. Supongamos una arquitectura de pila, las operaciones aritméticas no requieren direccionamiento explícito por lo que se ponen como: - add - sub ... ¿Por qué? Porque cuando se opera con dos datos en esta arquitectura se sabe que son los dos elementos del tope de la pila: Ejemplo de una pila 1 2 3 4 5 6 RB se comporta como una dirección de memoria a la que se le sumará el desplazamiento.

-

Respecto a un registro índice

Es similar al anterior, lo único que es el contenido del registro índice el que indica el desplazamiento que se produce a partir de una dirección de memoria que se pasa también como argumento a la orden que utiliza este modo de direccionamiento. Aunque en esencia son dos modos equivalentes. La EA se calcula como la suma del contenido del registro índice y una dirección de memoria: EA = RI+DM RI = registro índice DM = dirección de memoria -> RI se comporta como un offset === Indexado respecto a una base === Se trata de una combinación de los dos anteriores y consiste en calcular la dirección efectiva como: EA = RI+RB+DM -> Las siglas significan lo mismo que en el caso anterior.

-

Respecto al contador de programa

Consiste en dirección una posición de memoria usando como registro base al contador de programa (PC), el funcionamiento es análogo al direccionamiento respecto a registro base con la salvedad de que, en este caso, el offset puede ser también negativo. -

Indexado con autoincremento/autodecremento

Es un modo de direccionamiento análogo al indexado, explicado anteriormente. La única diferencia es que permite un incremento o decremento de l a dirección final o el registro índice según los siguientes casos: -> Indexado con autopreincremento: Incrementa el registro índice primero (se incrementa un valor, según el tamaño del objeto dire ccionado) y luego calcula la EA al igual que e l direccionamiento indexado. -> Indexado con autoposincremento: Calcula la dirección efectiva y después incrementa esta. -> Indexado con autopredecremento: Decrementa el registro índice y después calcula la dirección efectiva. -> Indexado con autoposdecremento: Calcula la dirección efectiva y después decrementa esta.

Instrucción de salto con direccionamiento absoluto

-

Consiste en cargar en el PC el valor que se especifica en la orden de salto, p.e:  jmp 0xAB ----> Carga 0xAB en PC

-

Instrucción de salto con direccionamiento relativo

Es parecida a la especificada anteriormente la diferencia es que el salto es relativo al PC, pongamos un ejemplo: Supongamos que PC vale = 0x0A, si nosotros interpretamos la instrucción jr +03, saltaremos tres posiciones posteriores a PC (también podría ser -03 y serían posiciones anteriores). Pero, ¡cuidado! si esa instrucción estaba en la posición 0x0A la dirección de PC a incrementar será la inmediatamente posterior (ya que PC se incrementa automáticamente después de leer la instrucción), por lo que quedaría: PC = 0x0B ---> nuevo PC = 0x0B+0x03 = 0x0E, con lo que el PC quedaría como 0x0E.

Que es el lenguaje ensamblador y como nace dentro del microprocesador El lenguaje ensamblador, o assembler (assembly language en inglés) 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. 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. 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. Fue usado principalmente en los inicios del desarrollo de software, cuando aún no se contaba con potentes lenguajes de alto nivel y los recursos eran limitados. Actualmente se utiliza con frecuencia en ambientes académicos y de investigación, especialmente cuando se requiere la manipulación directa de hardware, altos rendimientos, o un uso de recursos controlado y reducido. Muchos dispositivos programables (como los microcontroladores) aún cuentan con el ensamblador como la única manera de ser manipulados.

Instrucciones en lenguaje ensamblador ACALL realiza una llamada incondicional a la subrutina situada en la dirección indicada. ACALL incrementa el PC (Program Counter) dos veces para obtener la dirección de la siguiente instrucción, luego guarda dicha dirección en la pila (el byte de menor peso en primer lugar). En consecuencia el apuntador de pila (SP o Stack Pointer) incrementa su valor en 2. Posteriormente el control del programa se transfiere a la dirección indicada en la instrucción. La dirección de salto, o nuevo valor para el PC se obtiene uniendo a los 5 bits de mayor peso del PC ya incrementado, los bits 7-5 del código de operación y el segundo byte de la instrucción.

ADD suma el valor del operando al valor del Acumulador, y deja el resultado en el Acumulador. El valor del operando no resulta afectado. El bit de acarreo (C) se pone a uno si hay llevada desde el bit 7. Es decir, si el resultado de la suma pasa de 255. En caso contrario el bit C se pone a cero. El bit de acarreo auxiliar (AC) se pone a uno si hay llevada desde el bit 3. Es decir si el nibble bajo del resultado pasa de 15. En caso contrario el bit AC se pone a cero. El bit de rebasamiento (OV) se pone a uno si hay llevada desde el bit 6, o desde el bit 7, pero no de ambos. En caso contrario se pone a cero. En otras palabras, si al sumar dos números enteros, el flag OV toma valor 1, ello significa que el resultado se encuentra fuera del rango de los enteros de 8 bits, que va desde -128 hasta +127.

ADDC suma el valor del operando, el bit de acarreo C, y el valor del Acumulador, y deja el resultado en el Acumulador. El valor del operando no resulta afectado. El bit de acarreo (C) se pone a uno si hay llevada desde el bit 7. Es decir, si el resultado de la suma pasa de 255. En caso contrario el bit C se pone a cero. El bit de acarreo auxiliar (AC) se pone a uno si hay llevada desde el bit 3. Es decir si el nibble bajo del resultado pasa de 15. En caso contrario el bit AC se pone a cero. El bit de rebasamiento (OV) se pone a uno si hay llevada desde el bit 6, o desde el bit 7, pero no de ambos. En caso contrario se pone a cero. En otras palabras, si al sumar dos números enteros, el flag OV toma valor 1, ello significa que el resultado se encuentra fuera del rango de los enteros de 8 bits, que va desde -128 hasta +127.

AJMP realiza un salto a la dirección indicada de la memoria de código. La dirección de salto, o nuevo valor para el PC (Program Counter) se obtiene uniendo a los 5 bits de mayor peso del PC (incrementado dos veces), los bits 7-5 del código de operación y el segundo byte de la instrucción. Como la instrucción AJMP sólo afecta a los 11 bits de menor peso del PC, la llamada siempre se produce a una dirección de memoria de código situada dentro del bloque de 2K al que pertenece el primer byte de la instrucción que sigue al AJMP.

ANL realiza la operación "AND" bit a bit, entre operando1 yoperando2, dejando el resultado en operando1. El valor del operando2 no resulta afectado.

Nota: Cuando se utiliza esta instrucción para modificar un puerto de salida, el valor inicial del dato del puerto se lee del latch de salida, no de las patillas del puerto.

CJNE compara la magnitud de operando1 y operando2 y salta si sus valores no son iguales. Si ambos operandos son iguales, el programa continúa con la siguiente instrucción a CJNE. La dirección a donde saltar se obtiene sumando el offset (tercer byte de la instrucción), al PC (Program Counter) después de que éste se haya incrementado hasta el comienzo de la siguiente instrucción. El offset representa una cantidad entera con signo, y permite saltos de hasta 127 posiciones hacia adelante, y hasta 128 posiciones hacia atrás, sobre la dirección de comienzo de la siguiente instrucción. La instrucción no modifica  ninguno de los dos operandos. El flag de acarreo (C) se pone a uno si el valor del primer operando es menor que el segundo operando. En caso contrario el bit C se pone a 0.

CLR A pone a cero el acumulador. CLR bit pone a cero el bit indicado. CLR puede operar con el bit C o con cualquier bit direccionable de forma directa.

CPL A complementa el contenido del acumulador. Cada bit del acumulador que esté a "1" se pondrá a "0" y al revés.

La instrucción DAA ajusta el contenido del acumulador a un número BCD. Su funcionamiento se realiza en dos fases: En la primera, si el bit AC vale 1, o si el nibble bajo del acumulador es mayor que 9, se añade 06H al acumulador. Esta operación puede poner a 1 el C, pero no puede ponerlo a 0. Si después de la primera fase el bit C vale 1, o si el nibble alto del acumulador es mayor que 9, se añade 60H al acumulador. La instrucción DAA debe utilizarse siempre después de una suma (ADD o ADDC), y no puede emplearse después de una resta (SUBB).

DEC decrementa en una unidad el valor del operando. Si el valor a decrementar es 0, entonces el resultado será 0xFF, aunque el bit C no resulta afectado por ello. Nota: Cuando se utiliza esta instrucción para modificar un puerto de salida, el valor inicial del dato del puerto se lee del latch de salida, no de las patillas del puerto.

DIV AB vide (división entera) el contenido del acumulador entre el contenido del registro B. El cociente se deja en el acumulador y el resto se deja en el registro B. Si inicialmente el registro B tiene valor 0, tras la división el contenido del acumulador y del registro B es indeterminado, y se activa el flag OV. El flag Carry (C) siempre se pone a 0.

DJNZ decrementa el operando y si el nuevo valor es distinto de cero, se produce el salto. Si el valor del operando es cero, el programa continúa con la siguiente instrucción a DJNZ. La dirección a donde saltar se obtiene sumando el offset (último byte de la instrucción), al PC (Program Counter) después de que éste se haya incrementado hasta el comienzo de la siguiente instrucción. El offset representa una cantidad entera con signo, y permite saltos de hasta 127 posiciones hacia adelante, y hasta 128 posiciones hacia atrás, sobre la dirección de comienzo de la siguiente instrucción.

INC incrementa en una unidad el valor del operando. Si el valor a incrementar es 0FFH, entonces el resultado será 0, aunque el bit C no resulta afectado por ello. Nota: Cuando se utiliza esta instrucción para modificar un puerto de salida, el valor inicial del dato del puerto se lee del latch de salida, no de las patillas del puerto.

LCALL realiza una llamada incondicional a la subrutina situada en la dirección indicada. LCALL incrementa el PC (Program Counter) tres veces para obtener la dirección de la siguiente instrucción, luego guarda dicha dirección en la pila (el byte de menor peso en primer lugar). En consecuencia el apuntador de pila (SP o Stack Pointer) incrementa su valor en 2. Posteriormente el control del programa se transfiere a la dirección indicada en la instrucción.

LJMP realiza un salto incondicional a la dirección de 16 bits indicada en los dos últimos bytes de la instrucción. El destino puede ser cualquier posición de los 64 Kbytes de memoria de código.

MOV copia el valor de operando2 en operando1. El valor de operando2 no resulta afectado. Ambos operandos pertenecen a la RAM interna. Ningún f lag resulta afectado, salvo que el movimiento se realice hacia el registro PSW que contiene los flags. Nota_1: MOV A,ACC no es una instrucción válida. Experimentalmente se ha comprobado que se trata de una instrucción de dos bytes que se ejecuta en un solo ciclo máquina y que parece dejar siempre el contenido del acumulador a 0xFF. Nota_2: En el caso de "MOV direc1,direc2", los operandos se almacenan en orden inverso. Así la instrucción formada por los bytes 85H, 20H, 50H indica "Mover el contenido de la dirección 20H de RAM Interna a la dirección 50H de RAM Interna.

XCHD A,@Ri intercambia el nibble bajo (bits 3-0) del acumulador con el nibble bajo de la posición de RAM interna cuya dirección está contenida en el registro Ri. Los nibbles altos de ambos operandos no se ven afectados.

?? Byte : El 8051 soporta 255 códigos de operación. El código de operación 0xA5 es el único que no corresponde a ninguna función documentada. Como no está documentada ni definida no se recomienda su uso. Sin embargo según nuestra experiencia con un µC PCF80C552 podemos afirmar que se trata de una instrucción de dos bytes que se ejecuta en un solo ciclo máquina. Aparte de la demora introducida no se ha observado ninguna otra acción.

View more...

Comments

Copyright ©2017 KUPDF Inc.
SUPPORT KUPDF