Sie sind auf Seite 1von 18

TEMA II: ORGANIZACIN DE LA MEMORIA EN EL ALTAIR 535.

El SAB 80C535 puede direccionar cuatro reas de memoria diferentes: * Hasta 64 kbytes de memoria externa de programa. * Hasta 64 k bytes de memoria externa de datos. * 256 bytes de memoria de datos. * 128 bytes que actan como rea de registros de funciones especiales (SFR). En la explicacin de cmo funcionaba el microprocesador, vimos cmo exista una zona ( las primeras posiciones de memoria ) donde estaban las instrucciones y otra zona en donde se lean y escriban datos. Normalmente en las aplicaciones, la memoria de programa es una EPROM, donde est cargado el sistema operativo Altair y el programa de la aplicacin. Despus existe una memoria RAM que se utiliza de memoria de datos ( para cargar datos que nos manden de algn equipo va serie, resultado de conversiones A/D, resultados de operaciones aritmticas y lgicas, etc. ). Estos dos mapas de memoria son independientes, es decir, existe una forma de distinguir por el programador, el acceder a la memoria de programa o a la de datos. En el Hardware, esto se puede realizar a una lnea que permite activar una memoria u otra.

SISTEMA OPERATIVO

FFFF

FFFF

PROGRAMA DE LA APLICACIN (Realizado previamente en ensamblador) 64 K

MEMORIA DE DATOS Mmm

0000 /PSEN

0000

Configuracin aprovechando la memoria al mximo ( 64K + 64K ).

Pero a nosotros esta configuracin no nos conviene, ya que tendramos que grabar mediante una grabadora de EPROMS el programa que hiciramos. Teniendo en cuenta de

que nunca salen a la primera, se perdera mucho tiempo en desarrollar un programa al tener que grabar y borrar EPROMS constantemente. Adems, ello supondra un coste econmico elevado, ya que haran falta los grabadores de EPROMS, borradores y muchas EPROMS, ya que stas no se pueden grabar y borrar indefinidamente. Para que podamos probar nuestros programas cuantas veces queramos rpida y eficazmente, el sistema Altair nos ofrece un mtodo muy til. En el sistema Altair existen dos memorias: * Una memoria de programa de 32 Kbytes, en donde se encuentra el sistema operativo. *Una memoria RAM que es compartida como memoria de programa y de datos.
64 k (Memoria de programa (EPROM).

32 K de memora de datos.

32 K de memora de Programa y datos. Se comparte, se hacen solapar los mapas de memora.

64 K (Memora de datos) (RAM).

32 K de memora de datos.

Esto ya veremos como se hace desde el punto de vista Hardware. Desde el punto de vista Software slo debemos tener en cuenta que el direccionamiento de memoria queda como se indica a continuacin:

$0000 $00FF

vectores de inte ESPACIO RESERVADO PARA APLICACIONES USUARIO. SISTEMA OPERATIVO ALTAIR.

$0000

EPROM

Slo memora de programa.

$7000 4 Kbytes $7FFF

$8000 Ejemplo. $9000 Programa prueba de aplicacin. RAM Zona de Datos del programa de prueba. $FFFF $FFFF Memora compartida de Programa y datos.

Con esta configuracin podemos tener en la EPROM el sistema operativo, el cual nos permite, unido a los programas en PC de IBERCOM, realizar programas en ensamblador y pasarlos a travs del puerto serie al ALTAIR y cargarlos en la memoria RAM compartida. El sistema operativo har correr el programa y podremos comprobar si funciona sin tener que grabar una EPROM. El programa si no ocupa todos los 32K de RAM, puede utilizar la zona que le quede libre para almacenar datos. Pero hay que tener en cuenta que estando el programa en la RAM, ste se borra si se le corta la alimentacin, aunque se le puede mantener con una batera, pero sta tiene su tiempo. Normalmente el usuario no se fa de esto, aparte de que si hay que almacenar el equipo durante demasiado tiempo, habra que volver a grabar otra vez el programa en la RAM. Por ello, lo normal en todas las aplicaciones es que, una vez depurado y comprobado el programa, ste se graba en la zona de usuario de la EPROM. Memoria de datos interna.El SAB 80C535 posee una memoria RAM interna, pequea, pero que es muy til a la hora de programar. Est dividida fsicamente en tres bloques:

$FF Bloque superior

Como comparten direcciones de memoria iguales, existe un modo diferente para acceder a cada una de ellas.

128 bytes $80

$FF

$80 $7F Bloque 128 bytes. $00 inferior Registros de funcin especial (SFR)

En el rea SFR estn los registros de funcin especial. Estos son registros de muy diversas utilidades que ya iremos viendo. Por poner un ejemplo estn: PSW: Registro de estado de programa. ACC : Acumulador. P1, P2, P3, P4, P5: Puertos. Etc.

Para acceder a ellas se podran utilizar sus direcciones de memoria ( pg. 2. 12 ) pero el lenguaje ensamblador nos permite nombrarlos por su smbolo y tener con ello un acceso directo. Ejemplo P6V P4, # 20. Hay instrucciones que permiten mover y trabajar con datos de las memorias de datos interna y externa. Hay direcciones que coinciden, incluso triplemente, ya que estn los registros de funcin especial. Esto quiere decir que el P se podra volver loco al existir direcciones de las memorias de datos interna y externa que coinciden. Por ello, debe existir algn mtodo que permita diferenciar a qu memoria se accede. Memoria de datos interna de Registros de Funcin Especial.-

En esta memoria RAM interna estn, como su propio nombre indica, los registros de funcin especial. Estos son: - ACC: Acumulador. $FF - B: Registro temporal. - SP: Stack Pointer. Acceso directo. 128 bytes - DPTR: DPL DPH. - P6,,P0: Puertos. $80 No hay problema porque ni nos enteramos a qu memoria accedemos, ya que ponemos smbolos de registros. A estos registros el acceso es directo, es decir, para realizar algo con ellos slo hay que indicar su smbolo. Ejemplo: en la instruccin MOV ( mover )
4

MOV P1, # 30 -> Mueve a P1 el dato 30. MOV P5, P4 -> Mueve P4 a P5. Aunque estos registros tengan una direccin de memoria en la memoria interna, sta no se menciona. Memoria de datos interna que no es SFR.$FF Parte alta. (126 bytes) $80 $7F 32 primeras posiciones. $1F $00 Parte baja. (126 bytes) Acceso directo. Acceso indirecto.

$1F

R7 R0 R7 R0 R7 R0 R7 R3 R2 R1 R0

Banco 3

Banco 2

Banco 1

$07

Banco 0

$00

Las 32 primeras posiciones contienen los registros de propsito general.(Los registros R, R0, ..,R7.). Las 32 posiciones estn divididas en grupos de 8 registros llamados bancos. Existen cuatro bancos: 0, 1, 2 y 3 pero slo uno de ellos puede estar activo al mismo tiempo, es decir, si accedemos al R5 tenemos que saber a qu banco estamos accediendo porque existen 4 registros R5. El establecimiento del banco activo se realiza mediante el registro PSW ( Registro de Estado ). Ya se ha comentado de este registro que es un registro en el que sus bits son independientes y cada uno sirve para algo diferente ( comparar, bit de paridad, ). Existen dos bits en este registro que indican el banco activo:
PSN.4 0 0 1 1 PSN.3 0 1 0 1 Banco 0 5

Banco 1 Banco 2 Banco 3

Ejemplo: Si

PSW = 0 y PSW = 1

est seleccionado el banco 1.

Bancos. Si realizamos la instruccin : MOV R3, #28 Cargamos el dato 28 en el registro 3 del banco 1: R3 3 2 28 1 0

Si realizamos la instruccin: MOV R3,#28, cargamos el dato 28 en el Registro 3 del banco 1. Para poder cambiar la seleccin del banco sabemos que el registro de estado ( PSW) es un registro de la memoria de registros de funcin especial y, por lo tanto se trabaja con l de un modo directo. Por ejemplo, para establecer el banco 3 podramos realizar la operacin: MOV PSW, # 24 0 0 0 1 1 0 0 0

Pero esto pondra a 0 el resto de bits que pueden estar dando una informacin en ese momento o en todo caso hay algunos que no sabemos para qu sirven y no debemos modificarlos. Podemos seleccionar bancos modificando el PSW bit a bit , ya que esto con este registro es posible. Setb Setb PSW. 3 PSW. 4

1- Realizar un programa que vaya cargando en todos los registros " R " los datos de 0 al 32, y luego los muestre en P4. Como hemos visto en muchos programas hasta ahora, la forma de utilizar los registros " R " es directa, es decir, es como los registros especiales SFR, no hay que especificar la posicin de memoria donde estn para trabajar con ellos, sino que tienen su nombre. Ej.: MOV R0, # 22

Pero si nos fijamos en el mapa de memoria de la memoria interna, queda por ver una parte de la memoria baja que es direccionable directamente e indirectamente y la memoria alta que es indirecta. De lo que queda de la memoria baja que se puede direccionar directamente nos vamos a olvidar, pero se realizara de la siguiente forma: MOV P4, $ 08 -> Con esto moveramos al acumulador lo que hay en la posicin 08 de la memoria interna.

2.- Modificar el programa anterior para realizar lo mismo pero con direccionamiento directo sin nomenclatura R0, R1, R2,etc., sino con direcciones de memoria. De este modo se podran utilizar los 128 bytes bajos de la memoria RAM interna. Otro modo de acceder a estos 128 bytes bajos y los 128 bytes altos, es lo que se llama direccionamiento o acceso indirecto. MOV R0, #$08 -> Se carga el dato 08 hexadecimal en R0. MOV P4, @R0 -> En P4 se carga lo que hay en la direccin apuntada por R0 ( $ 08 ). El registro R0 es un puntero que apunta a la direccin que se le cargue, aunque se le carga como un dato, no como una direccin.

00001000

R0

00000001

$08 $00

Cuando se quiere ver lo que hay en esa direccin se utiliza el smbolo @ seguido de R0 trasvasando a un registro SFR.
* Slo se pueden utilizar R0 y R1.

3.- Modificar el programa anterior para que las 32 primeras posiciones sean cargadas y leidas en el P4 con direccionamiento indirecto. Tener en cuenta que segn el esquema de memoria, con este sistema ( direccionamiento indirecto ) podramos acceder tambin a los 128 bytes altos. Estableciendo estas formas de direccionamiento directo o indirecto, ya el P sabe distinguir entre la memoria alta interna y la memoria SFR. La memoria baja es posible direccionarla de un modo u otro ya que slo hay una. ( Ver esquema de memoria ). Todo esto est muy bien saberlo, pero en principio, el modo de utilizar estas memorias va a ser un poco diferente. Cuando el P arranca, coloca el puntero de pila en la

direccin correspondiente a R0 del banco 1, es decir, en la posicin $08, ya que la pila utiliza la memoria RAM interna. Quiere decir esto que ya no podemos utilizar los dems bancos y no se puede hacer lo que hemos visto ?. Al arrancar, el P selecciona el banco 0 y pone el SP en la direccin $08. Si nosotros necesitamos utilizar otro banco lo especificamos en el PSW y el sistema operativo normalmente nos traslada el SP por detrs del banco.
FF

SP

R1

$08 Banco 0.

R0

4.- Comprobarlo y despus decirles que lo comprueben. Todo esto, y que adems el sistema operativo del Altair utiliza algunas zonas de memoria superiores a las de los 4 bancos y que la pila es superimportante.

Se podra desbordar la pila.

SP

Cuando se adquiere un cierto nivel se trabaja mucho con subrutinas y con la pila, por lo que el tamao de sta puede llegar incluso a ser pequeo. Por todo ello NORMAS: -> En principio utilizar el banco 0 y todo el resto de la memoria interna dejarlo para la pila. El SFR utilizarlo normalmente pero slo para los registros que conocemos y con los nombres conocidos ( P0, ACC, etc. ). -> Si nos es imprescindible, utilizar ms bancos. Acceso a la memoria externa de datos.-> Fijndose en el esquema de memoria podemos ver que es accesible indirectamente. $0000 $FFFF -> Slo puede tener como origen y destino de datos el Registro acumulador. -> En vez de los registros R0 y R1 se utiliza el registro DPTR que es de 16 bits ( $8000 a $FFFF ). -> En vez de la instruccin MOV se utiliza MOVX. Ejemplo: 905A MOV DPTR, #$905 A; Carga en DPTR la direccin 905 A. $8000
ACC

DATOS

DPTR $FFFF Ejemplo: Ahora vamos a ver cmo se haca lo contrario. 905A MOV DPTR, #$905 A MOVX @DPTR, ACC
ACC (DATOS)

905A

5.- Realizar un programa que cargue 20 datos ( del 0 al 19 ) a partir de la direccin $B000 y los lea mostrndolos en P4. Otra forma de acceder a la memoria de datos externa es la de direccionamiento base ms registro ndice. Este modo permite acceder a una posicin de memoria a travs de un puntero que se calcula a travs de la suma del registro base ( DPTR ) ms el ndice.
* Comprobar lo que se va a poner a continuacin, tambin que esto se pueda hacer con la instruccin MOVX para lectura y escritura.

El ejemplo lo vamos a ver con la instruccin MOVC que es igual que MOVX pero que trabaja slo con la memoria de programa. Como la zona $8000 - $FFFF es memoria de
9

programa y datos, en esta zona tambin puede acceder pero slo para leer, ya que se supone en principio que de la memoria de programa o del programa, slo se va a querer leer algo. Esta instruccin y el modo de direccionamiento base ms ndice se ha establecido en este P porque muchas veces en el mismo programa se incluye una tabla de datos que es necesaria para la aplicacin. Ejemplo: Supongamos que ya sabemos manejar el Display, y queremos que al principio, nada ms arrancar el P, saque un mensaje por pantalla diciendo " Hola ". Este mensaje no lo crea el programa espontneamente. La palabra " hola " debe estar almacenada en algn sitio. Lo normal es que est en la misma memoria de programa codificada en cdigo ASCII. Podra estar en la RAM estuvirera en la RAM.
PROGRAMA

$1090 $1091 $1092 $1093

H- 58 O- 32 L- 48 A- 81

EPROM

DATOS

RAM

El proceso sera el que el programa ira mandando dato a dato al display para que este lo vaya sacando en pantalla.( Se mandara al display a travs del puerto 4 ). Se podra hacer de la siguiente forma: MOV DPTR, #$1090 MOVC ACC, @DPTR MOV P4, ACC MOV ACC, @DPTR MOV P4, ACC y as dos veces ms y tantas veces como caracteres tuviera el mensaje. MOV R0, #100 MOV DPTR, #$1090 Bucle: MOV ACC, R0 MOVC ACC, @ACC + DPTR MOV P4, ACC Djnz R0, bucle De esta forma hay que realizar tres instrucciones para cada letra, y hay que ir poniendo posicin a posicin de memoria. Lo ideal sera realizar un bucle que nos mandara todos los caracteres sin tener que escribir tanto ( imaginarse que hay que mandar 100 caracteres ).

Slo se puede realizar el incremento y la carga con el acumulador ( comprobarlo ). Comprobar si tambin se puede hacer con MOVX para cargar y leer datos.

10

6.- Realizar un programa que lea 32 bits del mismo programa ( salida en P4 ). 7.- Realizar un programa que cargue con este modo de direccionamiento 20 datos en la parte libre de la RAM y luego los lea. SALTOS Y LLAMADAS A SUBRUTINAS.- ( pg. 6.11 ). SUBRUTINAS.Ya se ha visto el manejo de subrutinas con la instruccin lcall direccin. Esta instruccin es una forma de llamar a una especie de subprograma para que se ejecute.
PROGRAMA PRINCIPAL lcall espera ret SUBRRUTINA espera:

Lo normal cuando se realicen programas de ms envergadura es utilizar bastante las subrutinas. Es mucho ms fcil y ahorra tiempo tener las cosas ordenadas en subrutinas, por ejemplo podramos tener: -> Una subrutina que nos sume nmeros de 16 bits. -> Una subrutina de delay, que espere 1 segundo. -> Una subrutina que nos mande un dato por el cable serie. etc. El utilizar subrutinas, adems de permitirnos tener una organizacin de programa mejor, nos ahorra tiempo en el programa que estemos realizando, ya que no hay que repetir rutinas ( ejemplo " lcall espera " ), y nos ahorra tiempo en sucesivos programas ya que podemos copiar subrutinas de programas anteriores, slo hay que tener claro lo que hacen. Pero las subrutinas pueden dar un problema:
Programa principal MOV A,#34 lcall suma ADD A,R0 Suma: ;Subrutinas que suman datos de 16 bits. Se utiliza el Acumulador R0 el valor

Si no estuviera la llamada a " suma ", se sumara a 34, pero esto no ocurre, ya que la subrutina suma como vimos en su momento, modifica el contenido de R0 y del Acumulador, adems de otros. ret Por ello debe de existir un mtodo para guardar el contenido de los registros ms importantes antes de saltar a una rutina y despus dejarlas como estaban.

11

Esto se realiza gracias a una memoria interna del P llamada PILA. Esta tiene una estructura tipo LIFO ( Last Input First Output , ltimo que entra primero en salir ). 03 02 01 00
Dato 4 Dato 3 Dato 2 Dato 1

SP (Stack pointer) En el ejemplo primero habra que sacar el dato 4 que es el ltimo que se ha metido. (puerto de pila)

Esta rea de memoria interna de P es apuntada por un registro interno del P parecido al PC ( contador de programa ) pero en este caso se llama SP ( Stack Pointer ), y se incrementa cada vez que se mete un dato en la pila. Es decir, si se mete un dato se pone a 01, si se meten 10 se pone a 10. Cuando se saca un dato se decrementa en 1. Existen dos instrucciones para manejar la pila: Push: mete un dato en la pila e incrementa SP. Pop: saca el ltimo dato de la pila y decrementa SP. Para que no hubiera problemas con subrutinas como en el caso anterior, deberamos hacer lo siguiente:
Suma; Subrutina que suma datos de 16 bits. Programa principal push ACC push B push R0 push R1 Guarda en la pila registros que utilice la subrutina.

mov A, #34 lcall suma ADD A, R0 pop R1 pop R0 pop B pop ACC ret

Restaura el contenido de los registros.

Pueden darse dos fallos ( ver cmo queda la pila ): 1) Si se recuperan en distinto orden a como se han introducido los registros, recuperamos datos diferentes. 2) Si ponemos distinto nmero de " pop " que de " push " la instruccin " ret ", no recoge el contenido de PC antes de saltar a la subrutina. Esto implica que cuando

12

se llegue a " ret " se volver a una direccin de memoria aleatoria, lo que supone un error fatal.

PILA
SP

R1 R0 B ACC Contenido de PC (cont. de pg.)

1001 1002 1003 lcall

push push push push pop pop pop ret

SP B R1 R0 seses se recupera en vez de ACC 1002

push R0 push R1

lcall

pop R1 pop R0 ret

8.- Realizar un programa que muestre en P4 dos nmeros de 4 bits procedentes de dos registros diferentes. Con una entrada P5.0, deben de intercambiarse los nmeros utilizando las instrucciones push y pop. * Es importante en las subrutinas que creemos, por lo menos en las importantes, en las que sabemos que vamos a utilizar en otros programas, utilizar las instrucciones push y pop para

13

salvar los registros que utilicemos en esa subrutina. ( Pero tampoco es bueno pasarse porque la pila es limitada ). Otro repaso a saltos y llamadas a subrutinas.- Subrutinas: Ya sabemos lo que son subrutinas, pero la nica instruccin que hemos utilizado hasta ahora ha sido LCALL. Tambin existe otra que se llama ACALL. La diferencia entre ambas es que ACALL ocupa slo dos bytes, pero slo puede saltar en la pgina de 2 Kbytes donde se est ejecutando y LCALL ocupa tres bytes pero puede saltar en todo el programa. Menos mal que si hay un fallo de eleccin nos da un mensaje el compilador. - Saltos incondicionales: Existen AJMP, LJMP, SJMP. SJMP -> Salto en + 127 bytes alrededor ( salto corto ) ( 2 bytes ). AJMP-> Salto en pgina de 2 Kbytes en donde est ( salto medio ) ( 2 bytes ). LJMP-> Salto a cualquier posicin ( salto largo ) ( 3 bytes ). Hay una instruccin que tambin puede saltar a cualquier posicin. Ej: JMP @A + DPTR La direccin a la que salta es la suma de lo que hay en el acumulador y el registro DPTR. Ejemplo: ( pg. 6.12) ( comprobar ). inicio: mov DPTR, # tabla_de_saltos. ( carga la direccin de memoria de la etiqueta ) jmp @A + DPTR ( salto indirecto con ndice). tabla_de _saltos: ajmp programa0 ; ACC=0 ajmp programa1 ; ACC=2 ( Va de dos en dos porque la instruccin ajmp programa2 ; ACC=4 ajmp ocupa 2 bytes ).

Otra instruccin de salto absoluto o incondicional ( igual que sjmp pero tiene ms alcance ).

14

9.- Realizar un programa que con tres entradas del P5 elija uno de 4 programas diferentes y que cada uno muestre algo en P4 ( uno de los programas diferentes que ya hemos realizado ). - Saltos condicionales: jz -> Salta si A=0 jnz-> Salta si A0 jc -> Salta si C=1 jnc -> Salta si C=0 jb -> Salta si bit=1 jnb -> Salta si bit=0 jbc -> Salta si bit=1 y pone bit a 0. djnz -> Salta si Registro=0, si no lo decrementa. Volvamos a ver el programa de la pg. 6.20. Se utiliza la instruccin cjne para ver si el n ACC es igual o distinto que el n de B. Para ver si el n es mayor o menor se utiliza la instruccin de salto condicional jc, ya que la instruccin cjne activa el bit de comp si el operando 1 es menor que el 2 y no lo activa si ocurre lo contrario. El bit de comp o bit CY o bit de acarreo, ya hemos visto en muchas instrucciones como utilizarlo ( ej. en instrucciones de rotacin ), pero en este caso activa lo que se llama una bandera de estado, es decir, es un indicador de lo que ocurre al realizarse una operacin, en este caso la comparacin de dos datos. El bit C est en un registro llamado PSW, Status Register o Registro de banderas de estado, donde existen otros bits que al igual que el C realizan indicaciones diferentes. REGISTRO PSW PSW.7 PSW.6 CY AC PSW.5 F0 PSW.4 RS1 PSW.3 RS0 PSW.2 OV PSW.1 F1 PSW.0 P

En la pgina 6.16 se tiene la utilidad de cada bit del registro PSW. Los registros de banderas son: - CY - AC - OV -P CY ya lo hemos visto. AC y OV lo veremos ms adelante.

15

P es activado si la suma de los 8 bits del acumulador es impar y es desactivado cuando el resultado es par.

10.- Realizar una rutina a la que le lleguen datos de 7 bits ( 0 - 128 ) y calcule el bit de paridad y se lo aada en el bit 7. Debe mostrar los datos en P4. Diagramas de flujo.Es una forma de representar el programa. Se suele realizar antes de empezar ste para tener un esquema de lo que tenemos que hacer. Consta de:

OO lflllflfll Operacin Operacin NO

S Trama de decisin o pregunta

Terminal

Lnea de flujo

Ejemplo sencillo: Cargar un registro con el valor 38 y decrementarlo hasta que el el valor sea 0.

Inicio Cargar un registro con el valor 38

16

Decrementa el contenido del registro

Es 0 el contenido del registro ? Si

No

Fin En este caso es sencillo y el diagrama de flujo se puede adaptar muy bien al enunciado del problema, pero en caso de problemas ms complejos el diagrama se complica.

17

11.- Problema. S0
.

S7

P5

PPP

Validacin de dato Eleccin de banco de registro R0 Dato de 3 bits. Eleccin de registro

11.- Ordenar una tabla de 10 datos de mayor a menor.

18

Das könnte Ihnen auch gefallen