Thiago Gondim Ribeiro Leite 02 0. CAPA 1. Esta parte do projeto tem como objetivo explicar o tratamento de interrupção do processador Pentium da Intel(R). Utilizamos uma interrupção de hardware utilizando o mouse como exemplo. Lembrando que o Numero Identificador do IDTR do mouse na IDT é 74h. Obs.: Esta tela ainda não tem referencia como o contexto da explicação. 2. Introdução Ao mexer o mouse, o mesmo irá enviar um pedido de interrupção ao processador. A CPU responde com um "ACKnowledge" para saber qual dispositivo está interrompendo. O PIC envia o ID do mouse no barramento de dados, então a CPU lê o ID e calcula o endereço da ISR(Interrupt Service Routine). A CPU empilha o endereço da próxima instrução a ser executada quando do retorno da ISR. Obs.: Chamar atenção para a tela e fazer um comentário. 3. Comentário sobre o IDT e IDTR A IDT é uma tabela que contém os vetores das diversas interrupções que podem ocorrer. O IDTR é um registrador que armazena o índice da tabela onde se encontra o vetor da interrupção que foi solicitada. O vetor de interrupção contém todas as informações necessárias para o tratamento da rotina de interrupção. Tais como: endereço na memória onde se encontra a rotina de tratamento da interrupção, o tipo de interrupção que está sendo executada, privilégio, etc. 4. De posse do vetor de interrupção, o processador empilha o endereço da instrução que será executada quando ele retornar da subrotina de atendimento a interrupção (ISR), e desvia o EIP para o endereço correspondente ao OFFSET do vetor de interrupção. => telas: DISASSEMBLER = 'PUSHA' MEMÓRIA = base_idt + 3A0 IDT = 74h ************************************************************************ Mecanismo de Interrupção Tipos de Interrupção : Hardware: ocorrência de evento externo Software: execução de uma instrução específica (traps) Exceção: erros de execução (overflow, underflow, ...) Identificadas por um número Vetor de interrupção Não-mascaráveis Mascaráveis Dispositivo de E/S gera interrupção. Vetor de interrupção - determina endereço da rotina de serviço dessa interrupção. Registrador global aponta para o início da tabela. Interrupções c/ prioridade – controlador de interrupções. Neste Caso, Trabalharemos com: Vector No.-->116 Dispositivo --> mouse PS/2 IDT - INTERRUPT DESCRIPTOR TABLE A IDT suporta 256 descritores cada um com 8 bytes de tamanho (tamanho máximo: 2Kb) Número máximo de vetores de interrupção: 256(interrupção 0 até FFh). 2. Falar do descritor (IDTR) (ver slide 8 e 9 do material de joseana) sidt [inter] mov eax,[inter+2] add eax,74h*8 mov [eax],word pisca mov [eax+2],word 920h mov ebx,pisca shr ebx,16 mov [eax+6],bx interrupcao mov edx,0 pisca: .ler: in al,64h and al,1 jz .nada ; recuperar a base da IDT ; pular o tamanho e pegar a base ; end. da interrup. do mouse *8 bytes+base ; eax contem o end. do offset ; 920 no end. do segment selector ; coloca o pisca em ebx ; trocar a posicao do mais significativo com o menos do pisca ; colocar apenas os 16 bits menos significativos de ebx na palavra de ; iret ; le status do mouse (end. da porta de entrada, status bit 0) ; verifique se tem um byte para ser lido in al,60h ; le byte transmitido pelo dispositivo (60 endereco do dado) mov dx,0A0h mov al,20h out dx,al ; envie "End of Interrupt" ao PIC2 (A0 endereco do PIC2) ; 20 - codigo de "END of Interrupt" nada: mov dx,20h mov al,20h out dx,al ; envie "End of Interrupt" ao PIC1 (20 - endereco do PIC1) ; codigo do "End of Interrupt" not byte [0e0000005h] iret ; inverter a cor de um pixel na tela no endereco especificado ; iret para interrupcao 3. entrando na interrupção... * Ao mexer o mouse, o mesmo irá enviar um pedido de interrupção ao processador. * Ao reconhecer qual dispositivo pediu interrupção, o processador gera o número do vetor de interrupção correspondente ao mouse (74h) para acessar o IDTR na IDT 4. De posse do IDTR, o processador empilha o endereço da instrução que será executada quando ele retornar da subrotina de atendimento a interrupção (ISR), e desvia o EIP para o endereço correspondente ao OFFSET do IDTR. => telas: DISASSEMBLER = 'PUSHA' MEMÓRIA = base_idt + 3A0 IDT = 74h ******** chamar atencao para a pilha , incrmento do esp ************ TOPO = endereco de retorno da subrotina => telas: DISASSEMBLER = 'PUSHA' MEMORIA = 44D4AA (endereco do PUSHA) IDT = 74h 5. iniciando a subrotina .... * explicar 'PUSHA' - chamar atencao para a pilha - empilha todos os registradores * segue desenhando quadrado até parar de mexer o mouse 6. Ao pararmos de mecher o mouse, esvaziamos o buffer do mesmo (não há mais bytes para serem lidos) * Envio de EOI(End of Interrupt) ao PIC (Programmable Interrupt Controller) 7. Retornando da subrotina... *****chamar atenção para a pilha, incremento do esp, q ficara apenas o valor de end de retorno da subrotina ****** - retorno do contexto - retorno da subrotina (IRET) de atendimento a interrupção * Recupera o valor(antes da chamada da subrotina) do PSW * E o EIP vai apontar para o endereço de retorno armazenado na pilha, na hora da call 8. Continua a execução normal (desenhando fractal..)