Thiago Gondim Ribeiro

Propaganda
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..)
Download