Organización del microprocesador
A continuación veremos la organización del microprocesador .
MAR: Este es el registro de direcciones de memoria (memory adress register). Debido a que la memoria ram requiere cierto tiempo para encontrar y posicionarse en una dirección, dicha dirección debe estar siempre en las entradas. Este registro funciona como buffer del PC.
PC: Este es un contador (program counter) que sirve para tener la dirección de memoria de la siguiente instrucción o dato que se debe de leer. Esto es, si en la memoria comenzamos con la localidad 0000, el contador, después de apuntar hacia esa dirección y después de haber tomado el dato contenido en la memoria, debe ser incrementado en uno para que contenga un 0001, o sea, apunte a la siguiente dirección de la memoria. En nuestro caso, este contador debe ser capaz de cargar datos en paralelo para poder realizar instrucciones de salto. Por ejemplo, el contador puede tener el numero 0100, y en esa dirección, la memoria contiene una instrucción de salto a la dirección 1000. El PC debe ser capaz de cargar este nuevo número y seguir su cuenta a partir de él.
MBR: Este registro es el buffer de datos de la memoria (memory buffer register). Cuando la memoria se posiciona en una dirección, muestra el contenido en su bus de datos, pero estos datos o contenido cambiaran si se cambia la dirección que se pone en las entradas del bus de direcciones de la memoria. Es por esto que es necesario un buffer de salida en la memoria. También nos servirá como buffer para instrcciones de escritura a la memoria.
IR: Este registro el es registro de instrucciones (instruction register). Cuando el dato contenido en una dirección de memoria es una instrucción (suma, resta, salto, etc.) se manda a este registro para decodificarlo y mandar las señales correctas para realizar dicha instrucción.
ALU: La unidad aritmético lógica es un integrado que puede realizar operaciones aritméticas y operaciones lógicas ya sea con un solo operando o hasta con dos operandos.
Acc: Este es el registro acumulador y es de propósito general. En nuestro caso será utilizado para guardar uno de los operandos del la ALU para llevar a cabo operaciones con dos operandos. El segundo se proporcionará directamente a la ALU desde el MBR.
ROP: Este registro contiene el código de operación de la ALU. Esto es, se requiere de un código binario en las entradas de la ALU para seleccionar qué tipo de operación se quiere llevar a cabo (suma, resta, complemento,etc.).
R: Este registro sirve únicamente para observar el resultado de las operaciones realizadas en la ALU pues está conectado directamente a las salidas.
Generador de tiempos: Es la parte de nuestro microprocesador que se encarga de generar señales de tiempos de acuerdo a la frecuencia de reloj que estemos manejando.
Unidad de control: Es la encargada de generar las señales correctas para realizar las operaciones deseadas por el usuario. Como una analogía tenemos al director de una orquesta.
La idea de esta organización es poder implementar cuatro operaciones básicas que nos servirán para echar a andar al microprocesador. Cuando veamos las instrucciones se comprenderá completamente el por qué de esta organización.
Modos de direccionamiento
Direccionamiento directo
El operando se especifica en la instrucción mediante un campo de dirección de 8 bits. Sólo la RAM interna de datos (primeros 128 bytes) y la zona de SFR se pueden direccionar de esta forma.
Este modo de direccionamiento permite el acceso de fácil y rápido a las zonas de las memoria anteriormente indicadas.
Ejemplo:
ADD A,3BH ;
esta instrucción suma (ADD) al contenido del acumulador el contenido de la posición de memoria 3BH: A <--- (A) + ([3B]).
Direccionamiento indirecto
En este modo de direccionamiento,
Para el direccionamiento de áreas de memoria (tanto internas como externas) de tamaño no superior a 256 bytes, se puede hacer uso de los registros R0 y R1 del banco de registros seleccionado. Si el área de memoria posee un tamaño superior, sólo puede utilizarse el registro DPTR.
Este modo de direccionamiento es especialmente útil para acceder a los 128 bytes altos de la memoria de datos interna (8052) y a la memoria de datos externa. Ejemplos:
ADD A,@R0 ; Si (R0) = 3BH, la operación realizada por esta instrucción será la misma del ejemplo anterior: A <--- (A) + ([3B]).
MOVX @DPTR,A ; Si (DPTR) = 4C2BH, esta instrucción carga el contenido del acumulador en la posición 4C2BH de la memoria de datos externa: [4C2B] <--- (A).
Direccionamiento por registro
Cuando se usa direccionamiento por registro, en el propio código de operación de la instrucción se especifica el registro del banco activo con que se opera mediante un campo de tres bits.
Ejemplo:
MOV Rn,A ; Carga en el registro Rn el contenido del acumulador: Rn <--- (A).
Este direccionamiento ocupa muy poca memoria de programa y permite acceder de manera rápida a los datos más frecuentemente utilizados.

Organizacion de las memorias
Subrutinas e interrupcion
Las subrutinas facilitan la estructuración del programa. Cuando el programa principal llama a una subrutina para que ésta se ejecute, la subrutina procesa su programa hasta el final. El sistema retorna luego el control al segmento del programa principal desde donde se llamó a la subrutina.
Las subrutinas sirven para estructurar o dividir el programa en bloques más pequeños y, por tanto, más fáciles de gestionar. Los bloques más pequeños facilitan la comprobación y la eliminación de errores tanto en las subrutinas como en el programa entero.
Con las subrutinas también la CPU se puede utilizar más eficientemente, llamando al bloque sólo cuando se necesite, y no ejecutar todos los bloques en todos los ciclos.
La operación Llamar subrutina transfiere el control a la subrutina, se puede utilizar con o sin parámetros.
En cada llamada a subrutina se pueden utilizar 16 parámetros de entrada/salida como máximo.
Los valores de los parámetros se asignan de la siguiente forma a la memoria local en la subrutina:
- Los valores se asignan a la memoria local en el orden indicado por la operación Llamar subrutina, comenzando dichos parámetros en L0.
- De uno a ocho valores binarios consecutivos se asignan a un sólo byte comenzando en Lx.0 hasta Lx.7.
- Los valores de byte, palabra y doble palabra se asignan a la memoria local en bytes (LBx, LWx, LDx).
En la operación "Llamar subrutina" con parámetros, éstos deben concordar exactamente con las variables definidas en la tabla de variables locales de la subrutina. Los parámetros se deben organizar de la siguiente forma:
- Los parámetros de entrada.
- Los parámetros de entrada/salida.
- Los parámetros de salida.
Interrupciones
Una interrupción es un mecanismo que permite ejecutar un bloque de instrucciones interrumpiendo la ejecución de un programa, y luego restablecer la ejecución del mismo sin afectarlo directamente. De este modo un programa puede ser interrumpido temporalmente para atender alguna necesidad urgente del computador y luego continuar su ejecución como si nada hubiera pasado.
Interrupciones internas de hardware
Las interrupciones internas son generadas por ciertos eventos que surgen durante la ejecución de un programa.
Este tipo de interrupciones son manejadas en su totalidad por el hardware y no es posible modificarlas.
Un ejemplo claro de este tipo de interrupciones es la que actualiza el contador del reloj interno de la computadora, el hardware hace el llamado a esta interrupción varias veces durante un segundo para mantener la hora actualizada.
Interrupciones de software
Las interrupciones de software pueden ser activadas directamente por el ensamblador invocando al número de interrupción deseada con la instrucción INT.
El uso de las interrupciones nos ayuda en la creación de programas, utilizandolas nuestros programas son más cortos, es más fácil entenderlos y usualmente tienen un mejor desempeño debido en gran parte a su menor tamaño.
Este tipo de interrupciones podemos separarlas en dos categorias: las interrupciones del sistema operativo DOS y las interrupciones del BIOS.