Computadores 2
2008
Arquitectura de
Computadores 2
Laboratorio 1
Documentacin de
La Solucin Implementada
Integrantes
C.I.
4.506.720-7
4.323.204-0
3.975.469-4
InformeObligatorio1.Pagina1de8
1 Introduccin
1.1 Introduccin
El propsito de este documento es brindar una descripcin general del Diseo
de la solucin implementada para resolver el problema planteado en el primer
laboratorio de Arquitectura de Computadores 2.
Pseudocdigo:
InformeObligatorio1.Pagina2de8
Repetir
Reset diskette;
Hasta que no haya error;
Repetir
seteo parmetros;
cargar sectores;
Deshabilitar interrupciones;
//cli
Cargar gdt;
//lgdt
Modo protegido;
DS=SS =10h;
ESP= 90000h;
//jmp 08h:1000h
// dw 0AA55h
El cursor:
La posicin del cursor se almacena en dos registros de 8 bit ya que las posibles posiciones son
80*25 = 2000 > 256 que sera lo que se puede especificar con uno solo. Luego tanto para saber
InformeObligatorio1.Pagina3de8
Funciones de video:
Tenemos las funciones de limpiar la pantalla (clrscr) que lo que hace nicamente es colocar el
caracter ASCII 0 con el fondo y color 0xF en toda la pantalla y luego posicionar el cursor en
(0,0). Por otra parte la funcin print() escribe en pantalla el string parmetro (que es un array de
chars) a partir de la posicin del cursor (tal como se explic anteriormente), y por ltimo le suma
a la posicin del cursor el largo del string.
Ports.c:
Tanto la funcin in como out son una lnea usando assembler embebido en lenguaje C de las
operaciones in y out de assembler.
2.1.3 Main.c
El main limpia la pantalla usando la funcin clrscr() detallada anteriormente, imprime el mensaje
Arquitectura de Computadores 2 usando la funcion print y por ultimo entra en loop infinito.
InformeObligatorio1.Pagina4de8
2.2 Parte B
En esta parte se utiliz el bootloader de la parte A con muchos agregados para soportar las
interrupcines, as como cumplir con el resto de los requerimientos. Tambin fueron utilizadas
las bibliotecas antes mencionadas. En esta seccin se comentar acerca de los agregados del
bootloader y la forma en que se solucion el problema de manejar el cronmetro con dos
interrupciones.
2.2.1 bootloader.asm
Estructura:
Tenemos tres TSSs (Task State Segment) uno para el main, uno para la rutina de atencin a la
interrupcin del timer y otro para la rutina del teclado. El TSS es el lugar donde la CPU salva el
contexto de la tarea que esta ejecutando para darle la CPU a otra; entre otras cosas guarda el
IP (instruccin pointer) el DS, CS, SS y el registro de flags. Cada TSS es accesible mediante un
TSS-descriptor en la GDT (General Descriptor Table).
Para el main se defini un segmento de cdigo que ocupa toda la memoria y uno de datos que
tambin comienza en la posicin 0 y se extiende hasta la 0xFFFF. Estos segmentos son
compartidos con el timer y se encuentran especificados en la GDT.
En cuanto a el teclado fueron definidos segmentos de cdigo y datos especficos para esa tarea
y por lo tanto fue necesaria una tabla LDT (Local Descriptor Table) la cual es referenciada desde
la GDT con un LDT-descriptor e indirectamente desde el TSS del teclado haciendo referencia
al ndice en la GDT donde se encuentra dicho LDT-descriptor. En el caso del timer como no
tiene LDT, la referencia se pone en 0.
Por otra parte se tiene la IDT (Interrupt Description Table). Esta tabla dice bsicamente donde
esta la rutina de atencin a las interrupcines. Los ndices 8 y 9 son los del timer y el teclado
respectivamente. En esta tabla pueden haber tres clases de Gate descriptors, Task gate,
Interrupt gate y Trap gate descriptors. Como en el obligatorio se pidi que las rutinas de
atencin a las interrupciones fuesen tareas distintas a las interrumpidas era necesario definir
Task gate descriptors, los cuales hacen referencia a el ndice en la GDT de los TSS-descriptors
de cada una de las rutinas.
InformeObligatorio1.Pagina5de8
Pseudocdigo:
Leer sectores desde diskette;
//Como en la parteA
Deshabilitar interrupciones;
//cli
Levantar gdt;
// lgdt
Levantar idt;
//lidt
//Parte A
//out 0x21,0fch
//jmp 08h:1000h
PIC 8259:
Este PIC es a travs del cual se indica qu interrupcines de hardware (de las que son
enmascarables) pueden interrumpir. La CPU puede comunicarse con este PIC mediante los
puertos 0x21 y 0x20. El puerto 0x21 es un registro de 8 bit en donde se indica con un cero si la
interrupcin correspondiente a determinado bit esta habilitada. En nuestro caso se manda a este
puerto el valor 0xFC que es 1111 1100. El primer bit indica que el timer puede interrumpir y el
segundo es para el teclado.
A este mismo PIC se le debe avisar cuando termina la rutina de interrupcin del dispositivo por
la cual se invoc. Para esto se manda un 0x20 al puerto 0x20. De no hacerse esto el PIC no
avisar de la prxima interrupcin del dispositivo, dado que el PIC enmascara las prximas
interrupcines del dispositivo que interrumpi hasta que no se le avise que y fue atendida y que
puede volver a interrumpir.
La rutina del main queda en la direccin 1000h porque este es el destino a partir del
cual se cargan los sectores subsiguientes en el bootloader.
InformeObligatorio1.Pagina6de8
El timer queda entre la direccin 1000h y 1500h porque esta rutina va despus del
main() en memoria y adems es lo suficiente mente corto el cdigo para no pasarse
mas all de la direccin 1500h.
La base del stack del teclado y el timer fueron considerados en sus respectivos TSS
y en el caso del main haciendo un mov esp, 070000h
InformeObligatorio1.Pagina7de8
Chartecla_oprimida=0;
Inttic=0;
Booleanpausa=false
voidtimer()
inicio:
Si(tecla_oprimida<>0)
Dependedelcaso
CasoP
pausa=true;
CasoS
pausa=false;
CasoFlecha_arriba
Incrementarcronometro;
CasoFlecha_abajo
Decrementarcronometro;
Fin_depende
Tecla_oprimida=0;
Fin_si
Si(notpausa)tic++;
Si(tic=18)
Incrementarcronometro;
tic:=0
Fin_si
Si(hubocambios)Borraeimprimenuevocronometro
out(0x20,0x20);
iret
gotoinicio;
fin_timer
InformeObligatorio1.Pagina8de8