Está en la página 1de 11

Arquitectura de

microprocesadores y
microcontroladores

Guía
Quinto semestre
Segundo Parcial
Arq. De Micros Parte 1
1.-Algo de conceptos:
Apilar (No confundir con concatenar): Poner en paralelo muchos registros, formando memorias.

Debug – Debugear – Emular- Depurar: Es simular el programa que se va ejecutar, paso a paso,
analizando sus respectivos estados lógicos y representaciones de las señales de entrada o salida y los
resultados de estas señales en el circuito o dispositivos del sistema.

Transparencia: La información de los latches (del los flipflops de los registros de las memorias…) siempre
es visible al usuario y siempre está disponible para su lectura.

Referenciar: Llevar a una entrada o salida a un potencial de voltaje (tierra o Vcc por ejemplo), una línea al
aire NO está referenciada a nadita de nada.

PullUp: Referenciar a Vcc, sirve para levantar el voltaje de una señal al nivel lógico 1 y reducir ruido.

PullDown: Referenciar a Gnd, sirve para tener un nivel lógico 0 y evitar el estado flotante (Tercer estado o
alta impedancia).

Arquitectura: Es la estructura y organización en la que está construido el sistema.

Procesar: Realizar operaciones aritméticas-lógicas con datos.

Bifurcar: Es hacer que el sistema pueda decidir cual es el camino mas corto y fácil para resolver un
problema, se dice que un sistema que bifurca es un sistema inteligente.

Firmware: Es el software nativo en el dispositivo con el cual opera, es el software de interfaz e


interacción.

Conmutar: Llevar a un dispositivo de un estado lógico a otro, o sea, la puesta a 0 o la puesta a 1 podrían
ser “sinónimos” de conmutar.
En la primer guía puse “llevar un transistor a zona de corte o zona de saturación…”
Recuerda que corte =0 y saturación =1 lógicos

---- Primer parcial ---

La celda binaria es la unidad mínima de almacenamiento de información

El bit es la unidad mínima de representación de información

Concatenar 4 celdas binarias forman un nibble, con 8 un byte.

Concatenando 2 bytes nos da un Word.

2 words dan un double Word y asi te la sigues…

1
Arq. De Micros Parte 2
1.-ALU (Arithmetical-Logic Unit, Unidad Aritmético-Lógica)
Dentro del Z80 existe la ALU, es un dispositivo que trabaja instrucciones de 8 bits, la ALU se encarga de
las funciones lógicas y de matemáticas del procesador. Internamente la ALU tiene muchos circuitos
integrados que en su mayoría ya conocemos; compuertas lógicas, sumadores, multiplexores, es como un
repertorio de funciones. BUS de datos

Entrada de datos
Y esto es básicamente un
procesador, básico, pero
clk clk

OC
RTemp1 RTemp2 OC
procesa

Flags ALU
Control

En RTemp1 y RTemp2 entran dos datos diferentes con los cuales se van a realizar operaciones, la
operación a realizar se selecciona con la entrada de control.
Por ejemplo, si queremos sumar 10010110 + 11010111 el primer sumando se ingresa en RTemp1 y el
segundo en RTemp2, con la entrada de la unidad de control se le da la instrucción de suma, pero puede
ser resta, o una función lógica, o transformar ambos datos o solo uno, para eso están las instrucciones
disponibles para el procesador.
La unidad de control recibe direcciones directas desde la memoria del sistema para saber que diablos
hacer con la información que le llega o realizar otras funciones como el control de salida de la ALU o el
control de los buses internos del z80.

Las banderas (Flags), son una clase de condicionales que acompañan al resultado de alguna operación,
son digamos “etiquetas” que clasifican el tipo de resultado, el Z80 maneja flags de 8 bits de ancho.
Digamos, restas dos números y el resultado es negativo, entonces se envía una flag de que el resultado
que se muestra es en realidad negativo.

Las funciones de la ALU del z80 son las siguientes:


-Suma -Resta -OR -AND -XOR -Reset (Puesta a 0)

-Incremento -Decremento -Test (comprobar un bit) -Comparar (Entre bits) -Set (Puesta a 1)

-Rotar información (Desplazar el valor de los bits de información hacia la izquierda o derecha)

Ejemplo:

Y a grandes rasgos, eso es la ALU.

2
Arq. De Micros Parte 3
2.-El Microprocesador z80 Entrada y salida del
Nuestro queridísimo z80… bus de datos

Así es por dentro: B


u
f
Bus de datos (8 bit bidireccional) f
e
r
MUX MUX
RegInstr
A F
B C B’ C’ A’ F’
I R RegTmp

D E D’ E’
Decodific

H L H’ L
AcuTmp

Secuencia
-dor
Reg IX
Reg IY ALU
SP
PC + Salida del bus
±1 ±1 Sumador de direcciones
B
u
f
Bus de direcciones (16 bit solo de salida) f
e
r

B
u
f
Bus de direcciones (Bidireccional) f
La explicación: e
r
Registros internos: Entrada y salida del
Banco principal y Banco Alterno bus de control

Son registros interconectados entre si, se pueden pasar información de uno a otro. Se utilizan para
guardar información necesaria para después recuperarla a lo largo de la ejecución del programa.
El banco principal y el alterno NO pueden ser utilizados al mismo tiempo, solo uno a la vez.

Acumuladores:
Aquí es donde se realizan casi todas las funciones que se le presentan al procesador, es un registro
simple. El segundo acumulador funciona como “respaldo” del primero.

Registros de Flags:
Es donde se van almacenando las banderas de los resultados de las operaciones que realiza la ALU con
los datos que vienen de los acumuladores.

Registros de uso especifico del procesador (Registros que el procesador va utilizando automáticamente)
Stack Pointer (SP):
Es un registro que almacena información en forma de Stack (Pila en inglés) (Similar a la RAM, que va
almacenando datos como le van llegando), sirve para realizar subrutinas (funciones secundarias dentro
del programa).

Program Counter (PC):


Es el registro que va guardando las direcciones que el procesador va ejecutando, trabaja junto a un
contador en incremento. Conecta directamente con la memoria. 3
Arq. De Micros Parte 4
2.-El Microprocesador z80 Cont.
Registros de uso especifico del procesador (Registros que el procesador va utilizando automáticamente)
Registros de índices (IX e IY):
Sirven para manejar datos para tablas de datos., con estos empezaríamos a ver bases de datos… pero
esa es otra historia para mas tarde.

Registro de Refresh (R):


Contiene la dirección del registro que se va a “refrescar” (Actualizar el valor del registro deseado, luego
veremos esa función)

Registro de interrupción (I):


Sirve para almacenar información de la instrucción que se está ejecutando para después interrumpir la
ejecución, a veces utilizado al esperar la respuesta o la disponibilidad de un periférico.

Bloque de suma (El sumador en forma de V, el que se parece a la ALU, pero no es ALU, no le puse color
porque el amarillo no se ve):
Sirve para desplazar las instrucciones de los registros de índice (IX)

El encapsulado de hasta la izquierda es la unidad de control, tiene tanto entradas como salidas, algunas
sirven para controlar los buses internos del procesador, y otras sirven para el control del sistema general.
En el 4to apartado se ven mas a fondo estas funciones.
3.-Nuevas instrucciones para ASM!
add a,<hex>h; Suma al contenido del acumulador la constante en hex

sub a,<hex>h; Resta al contenido del acumulador la constante en hex.

RRL; | RRF; Rota el contenido del registro, RRL hacia la izquierda, RRF a la derecha

inc a; Incrementa en 1 al acumulador.

dec a; Decrementa en 1 al acumulador.

and a,<hex>h; Función lógica AND entre el valor de a y <hex> bit por bit.

or a,<hex>h; Función lógica OR entre el valor de a y <hex> bit por bit.

xor a,<hex>h; Función lógica XOR entre el valor de a y <hex> bit por bit.

set a,<hex>h; Al bit <hex> del registro a lo ajusta a 1

reset a,<hex>h; Al bit <hex> del registro a lo ajusta a 0

cp a,<hex>h; Compara el valor de a contra <hex>

test a,<hex>h; Prueba el estado del bit, verifica que tipo de bandera tiene para continuar.
4
Arq. De Micros Parte 5
4.-El encapsulado del z80
Ahora si veremos para que sirve cada bus del z80 y que función tiene cada terminal del encapsulado
que conocemos:

MI A0
MREQ Todo mundo sabe para que
Terminales del
IORQ … Bus de
diablos son los terminales del
control del direcciones
sistema
RD bus de direcciones y del bus de
WR A15
RFSH
datos… se supone.

HALT D0 Están las terminales para la


Terminales del WAIT alimentación y el pulso de reloj
control del CPU INT … Bus de datos necesario para que el CPU
NMI
RESET D7
pueda realizar la secuencia de
las instrucciones.
Terminales del (Recuerda que el z80 maneja
control del BUS BUSREQ CLK
interno del CPU BUSACK +5V voltajes TTL)
GND

Cada terminal hace lo siguiente:


Las terminales de control del sistema indican lo que está haciendo el procesador:

MI: Indica que el cpu está ejecutando un ciclo de máquina.


MREQ: (Memory Request) Indica que el cpu está interactuando con las memorias, ya sea escritura o lectura.
IORQ: (In/Ouy Request) Indica que el cpu está interactuando con los dispositivos de los puertos de salida..
RD: (Read) El procesador está leyendo una la memoria
WR: (Write) El procesador está escribiendo en la memoria
RFSH: (Refresh) El cpu está refrescando memoria DRAM.

Las del control del CPU:


HALT: Detiene las funciones de un periférico externo a través de hardware
WAIT: Detiene la ejecución del programa para esperar la respuesta de un periférico.
INT: Señal para interrumpir la ejecución de un programa y esperar a un periférico de alta velocidad, pero tiene una
prioridad mascarable (alta prioridad o provocadas por el usuario)
NMI: Lo mismo que INT, pero de interrupción NO mascarable (baja prioridad o no deseadas)
RESET: Fija todos los registros a 0 y las direcciones a 0, porque la primera vez que se enciende el sistema, puede
haber incertidumbre en los registros debido a su aleatoriedad en el tercer estado.

Control del bus interno del CPU:


BUSREQ: Sirve para solicitar activar el BUS interno del CPU
BUSACK: Sirve para cuando se utilice la DMA (Direct Memory Access), para memorias masivas (De muchos MB),
indica que el sistema está listo para hacer un DMA.

Para que estas entradas funcionen correctamente, necesitan tener un nivel TTL correcto, si hay anomalías en los
voltajes se puede perder información, en caso de anomalías se necesita “Bufferear” la línea para levantar voltajes o
reducir el ruido.

CLK: El reloj sincroniza todas las funciones del procesador


Y un ultimo concepto importante: Vector de memoria = Dirección de memoria 5
Guía exclusiva de
programación en ASM

MiniGuía
Quinto semestre
Segundo Parcial
Programar like a boss Parte 1
1.-Inicio
Para generar el código fuente y escribir el programa, básicamente solo necesitas abrir el notepad.exe o
puedes escribir en Word, pero es mas recomendable el notepad.

Guardas el archivo como “<nombre del programa sin espacios y no mayor a 8 caracteres,duh>.ASM “ en
la misma carpeta que donde están los compiladores. (La dirección recomendada es C:\progsz80\ )

Recuerda, el archivo ASM es tu código fuente, pero éste no es el que funciona así shido. Pero para allá
vamos

2.-Escribir el código, comandos y sintaxis.


Al fin de cada comando se le agrega un punto y coma sin espacio de separación, a menos que se pida
lo contrario, el punto y coma cierran el comando. Lo que le siga a la línea después del punto y coma se
interpreta como comentario (O sea se abren como pistache).
Lo que está del mismo color significa que va todo junto, sin espacios.

1.-Inicio del programa


.org <hex>h; <hex> Es la dirección de la primer localidad que el procesador va a
ejecutar en hexadecimal (Hexadecimal de 4 cifras). Casi siempre será
.org 0000h; o tal vez .org 0040h, porque 0040h? Porque quiero :3
2.-Fin del programa
.end No lleva punto y coma al final, esto cierra el programa, no hace mas, nadie
lo quiere.

3.-Cargar una constante cte a un registro r.


ld <r>,<cte>h; Es lo básico, r determina a que registro del procesador se cargara la
constante que se requiere.
El valor de r es alfabético, o sea, el registro 1 es a, el registro 2 es b y así.
Cte se escribe en hexadecimal, y es meramente un valor numérico.
Cte mínimo tendrá dos cifras.
Si Cte será de valor 255 ó FF en hexadecimal, se le agrega un cero:
Está correcto asi:
ld a,40h; (Carga al registro ‘a’ el valor ‘40h’ (64))
ld c,08h; (Cuida el 0 antes del 8, Cte debe ser mínimo de
dos cifras, aunque la primera sea cero)
ld b,0ffh; (Este es el único caso hasta ahora donde se tiene que poner
una tercer cifra, solo si Cte=255 (FFh) se le pone un cero
antes)
Está incorrecto asi:
ld a,040h; (En realidad este no es incorrecto, pero no se recomienda)
ld c,8h;
ld b,ffh;

Físicamente, la instrucción ld manda la información a los registros y acumuladores del cpu, NO A LA


MEMORIA RAM NI A LA ROM.
Programar like a boss Parte 2
2.-Escribir el código, comandos y sintaxis. Cont.
Al fin de cada comando se le agrega un punto y coma sin espacio de separación, a menos que se pida
lo contrario, el punto y coma cierran el comando. Lo que le siga a la línea después del punto y coma se
interpreta como comentario (O sea se abren como pistache).
Lo que está del mismo color significa que va todo junto, sin espacios.

4.-Enviar el valor de un registro r a un puerto hex


out (<hex>h),<r>; <hex> Es la dirección en hexadecimal del puerto de salida
deseado, físicamente en el sistema mínimo son las salidas del
control de puertos.
En nuestro sistema mínimo <hex> comprende el siguiente
rango: del 00h hasta 0Fh, pero solo se pueden controlar 8
puertos:
00h y 01h = Puerto 0
02h y 03h = Puerto 1
04h y 05h = Puerto 2
06h y 07h = Puerto 3
08h y 09h = Puerto 4
0Ah y 0Bh = Puerto 5
0Ch y 0Dh = Puerto 6
0Eh y 0Fh = Puerto 7
La variable <r> será el acumulador fuente de la información
que se enviará, o sea que primero r debe estar cargado con
algo o enviara ceros.
<hex> es el destino
<r> es el remitente
Ejemplo:
ld e,40h; (Carga al acumulador e la cte 40h)
out (0Ch),e; (Envía al puerto 6 (0Ch) el contenido de e)
Espacio del Tabulador
5.-Etiquetas de contenido
<nombre de la etiqueta> >instrucción;
>otra instrucción; Todo esto
>mas instrucciones hermosas; pertenece a la
>esta de aquí nadie la quiere; primer etiqueta

<nombre de otra etiqueta> >el resto de instrucciones; La primer


>otra de ejemplo :3; etiqueta termina
donde empieza
la siguiente
Las etiquetas sirven para identificar rutinas dentro del programa, cosa necesitaremos para las funciones
for y los infinity loops.

El nombre de la etiqueta puede ser cualquiera que quepa en 8 caracteres o menos, NO PUEDEN TENER
ESPACIOS.
Programar like a boss Parte 3
2.-Escribir el código, comandos y sintaxis. Cont.
6.-Decrementar el valor registrado en un acumulador
dec <r>; La función de decremento hará que el valor registrado en el
acumulador r se le reste un uno.
Por ejemplo:
ld d,40h; (ahora d = 40h)
dec d; (ahora d = 40h -1h = 3Fh, en decimal, 64-1=63)
7.-Jump o salto según valor 0
jp nz,<etiqueta a saltarse>;
Esta instrucción requiere tener un decremento y una etiqueta
antes para que funcione bien.
Se utiliza para generar ciclos o loops, normalmente con fines
de hacer una clase de delay o espera
Esta instrucción hace que un ciclo se repita hasta que el valor
del decremento superior de como resultado un cero.
Un ejemplo: de loop con el salto.:
En verde se muestra lo que pasa si a es
ld a,03H; diferente de cero
ciclo1 dec a;
jp nz,ciclo1; En rojo se muestra lo que pasa si a es al fin
decrementado a cero
>otra instrucción;
Esta línea de código hace lo siguiente:
Primero se carga la constante 03h al acumulador a,
Luego decrementa a en 1, o sea que al 3 le restamos 1 y nos
queda 2.
El jp detecta que a es diferente de cero, entonces se regresa
hasta la instrucción que indica la etiqueta ciclo1.
Y así hasta que a tenga un valor de cero. Una vez que el jp
detecte que a es igual a cero, el programa continuara con la
siguiente instrucción.

Un ejemplo de loop para 6 segundos: Imagina que esto funciona como un cronometro

ld a,06h; a b c
loop3 ld b,0ffh; 6 : 255 : 255
loop2 ld c,0ffh;
loop1 dec c; Los valores de a b y c cambian a ritmos
jp nz,loop1; diferentes.
dec b; Análogamente con el cronometro, a serían
jp nz,loop2; minutos, b segundos y c fracciones de segundo
dec a;
jp nz,loop3; Para que se complete un ciclo de b necesitas que
pasen 255 de c, y para que pase un ciclo de a
>otra instrucción necesitas que pasen 255 de b (65,025 de c)
Y a es en realidad la cuenta de segundos enteros
Programar like a boss Parte 4
2.-Escribir el código, comandos y sintaxis. Cont.
Un ejemplo de loop indefinido o infinity loop.
Como a se decrementa en uno, entonces, 40h
loopi ld a,40h;
pasa a ser 3Fh, como el jp no detecta un cero,
dec a;
regresa a la etiqueta loopi, y el valor de a se
jp nz,loopi;
reestablece a 40h, y así hasta el final de los
tiempos, o de las materias que recursarás…

3.-Copu… Compilar el programa (En realidad se dice ensamblar, porque, ya


sabes, ensamblador…)
NOTA: NECESITAS UN SISTEMA OPERATIVO QUE NO PASE DE LOS 32 BITS…
O sea que solo funciona hasta Win XP…

Para ensamblar un programa, necesitas el MSDOS viejito…


Una vez que hayas acabado el programa en el archivo .ASM y guardado en la carpeta donde se
encuentran los archivos del compila… ejem ensamblador.

El directorio que usamos es el siguiente:

C:\progsz80\ Aunque claro, puede que tu C sea mi E o mi D o tu mamá.

En el cmd ingresa el siguiente comando:

> cd C:\progsz80

Una vez dentro del directorio, ponemos el siguiente comando:

> tasm -80 <nombre del código fuente>.asm

Si no hay errores, la consola te dirá que el ensamblado fue correcto y se te generaran dos nuevos
archivos, si hay errores, el programa te dirá que hiciste mal y donde metiste la pata.
Los dos nuevos archivos generados:

<nombre del código fuente>.OBJ Que es el programa ya compilado, listo para cargarlo a la
memoria.
Para cargarlo usando a Stefi el programador maravilla, solo le
das en “Open file” y buscas el archivo OBJ y lo cargas.

<nombre del código fuente>.LST Es un enlistado de direcciones, nos sirve como referencia
para corregir errores.

También podría gustarte