Baixe o app para aproveitar ainda mais
Prévia do material em texto
Interface Hardware-Software Interrupções Interrupções Interrupção é um evento faz o processador parar o programa em execução – Não para necessariamente no mesmo momento que a interrupção é sinalizada – Pode parar quando for mais conveniente Uma rotina de tratamento da interrupção deve ser executada Fluxo de Execução na Ocorrência de Interrupções Programa do usuário Rotina de tratamento de interrupção (ISR – Interrupt Service Routine) Eventos Internos e Externos Eventos internos gerados pela execução do programa podem causar interrupções – Divisão por zero – Utilização de instruções que invocam interrupções Interrupções gerados por eventos internos são chamados de Interrupções de SW ou Exceções Eventos externos a execução do programa podem também causar interrupções – Comunicação E/S – Erros de dispositivos de HW Interrupções gerados por eventos externos são chamados de Interrupções de HW Taxonomia das Interrupções Interrupções de HW Interrupções de HW são causadas por algum dispositivo conectado ao processador Interrupções de HW são ativadas por duas entradas do processador NMI (NonMaskable Interrupt) e INTR (INTerrupt Request) O INTR pode ser habilitado ou desabilitado com algumas instruções específicas do processador x86 – Ex: STI (Set Interrupt flag), CLI (Clear Interrupt flag) NMI está associada a erros de HW NMI não pode ser desabilitada, deve ser tratada Interrupções de SW Processadores x86 oferecem instruções que dão suporte ao tratamento de interrupções – int – into – iret/iretd – Bound Estas instruções permitem invocar ou retornar das rotinas de tratamento de interrupções, além de realizar operações para a manutenção do estado do processador Instrução INT Causa uma interrupção de SW especificada por tipo – Tipo é um número de oito bits que espefica qual rotina de tratamento de interrupção será chamada Registrador de Flags é empilhado – Garante a manutenção do estado interno do processador Zera a interrupt-enable flag e a trace flag (TF) – Impede que interrupções via INTR, e interrupções de single- step sejam reconhecidas durante o processamento da interrupção CS e IP são empilhados int tipo Forma Geral Utilizando a Instrução INT org 0x100 jmp start string: times 10 db 0 start: mov ah,0 int 16h sub al,'0‘; Leu caractere, transforma para numero cbw mov cl,3 mul cl call printNumber; chama rotina de impressao jmp exit ; continua Interrupção da BIOS para ter acesso ao teclado Programa lê um número do teclado, multiplica por 3 e coloca a saída no monitor Utilizando a Instrução INT printNumber: ; rotina converte cada digito para caracter mov cx,0 lea si,[string] mov bl,10 while: div bl; al = ax/10, ah = ax%10 inc cx; guarda qtd dígitos mov bh,ah add bh,'0‘; converte digito mov [si],bh; salva na memória, add si,1; anda com indice cbw cmp al,0; verifica se quociente == 0 jnz while sub si,1 for: std; dec df, a str salva na ordem inversa lodsb mov ah, 0eh mov bh,0 int 10h loop for ret Interrupção para ter acesso a serviços de vídeo Instruções IRET/IRETD (Interrupt Return) Toda ISR deve conter iret no final para retornar ao programa que causou a interrupção CS e IP são desempilhados Registrador de flags é desempilhado iretd deve ser utilizado quando se está utilizando endereçamento de 32 bits iret Formas Gerais iretd Instrução INTO Esta instrução ativa a interrupção tipo 4 quando a flag de overflow estiver ativada – A rotina de tratamento para este tipo de interrupção é chamada Caso a flag não esteja ativada, a instrução não faz nada into Forma Geral Instrução BOUND Testa se indice está dentro de um intervalo numérico, caso não esteja a interrupção 05H é gerada – indice deve ser um registrador de 16 ou 32 bits – intervalo é dado por uma posição de memória para um número de 16 ou 32 bits – indice é testado com o número presente na posição de memória intervalo e o número presente na posição de memória de intervalo + um word ou double word A rotina de tratamento da Int 05H, no DOS é associada a impressão na tela. Portanto, deve-se mudar a rotina bound indice,intervalo Forma Geral Utilizando a Instrução BOUND org 0x100 jmp start limites:dw 0,3 vetor: db 10,23,12,80 start: mov ax,0 mov si,0 mov bx, vetor laco: add bx,si bound si,limites add ax,[bx] inc si ... Se índice não estiver dentro dos limites do vetor, interrupção 5 é gerada Programa soma elementos de vetor, testando índice do vetor Prioridades de Interrupções Se uma interrupção de HW acontecer simultaneamente a uma de SW, o processador atenderá a de maior prioridade Tipo Nível de prioridade Divisão por zero Mais alta INT e INTO NMI INTR Single step Mais baixa Exemplos de Geração de Interrupção mov bl, 0 div bl pushf pop ax or ax,100h push ax popf lodsb mov ah, 0EH mov bh,0 int 10h Divisão por zero (tipo 0) Single step ou trap (tipo 1), TF é colocada com o valor 1 Interrupção a cada instrução executada Serviço de vídeo (tipo 16 ou 10H) Imprime caracter Tabela de Vetor de Interrupções Em modo real, toda interrupção (HW ou SW) aponta para uma entrada única e específica da tabela de vetor de interrupções Cada interrupção é identificada por um número de 8 bits – 256 interrupções possíveis Cada entrada da tabela é composta por um vetor de 4 bytes (2 bytes para o IP e 2 bytes para o CS), que indica para onde o programa deve pular para iniciar o tratamento da interrupção – Tamanho da tabela 256 x 4 → 1024 bytes – Faixa de endereços (0 – 003FFH) Significado Recomendado pela Intel das Entradas da Tabela Pode-se programar para que rotinas de tratamento de interrupções diferentes sejam associados a estas entradas – Exemplo: Entrada 10h(16) em modo real é utilizado para serviços de vídeo Como Encontrar a Entrada da Tabela de Vetor de Interrupções? Deve-se multiplicar o número que identifica o tipo de interrupção por 4, e o resultado é igual ao endereço da entrada da tabela Exemplo: Configurando uma Chamada de ISR Como configurar a interrupção 40 para chamar um ISR localizado no endereço 28000H? Solução: – 1.Devemos achar um valor para CS e IP que juntos deem o endereço desejado Exemplo: CS = 2800H e IP = 0, CS << 4 + IP = 28000H – 2. Calcular o endereço para onde vamos salvar estes valores Endereço = 40 x 4 = 160 = 00A0H – 3. Salvar CS e IP na posição de memória calculada em 2 Código da Configuração da Chamada do ISR push ds; salvando DS na pilha mov ax, 0 mov ds, ax; novo end de DS é 0 mov di,00A0H; offset de INT 40 mov word[di],0; colocando IP mov word[di + 2], 2800H; colocando CS pop ds; carregando valor antigo de DS Sequencia de Passos Executados Pelo Processador Antes de Executar oISR 1. Obter o número da interrupção Pode ser feito de 3 formas: 1. Pode vir especificado na interrupção (ex: INT 21) 2. Processador mesmo gera a interrupção (ex: INTO, divisão por zero, NMI) 3. Processador obtém número do barramento depois de receber um INTR 2. Salvar o estado do processador 1. Empilha flags 2. Zera as flags interrupt-enable e trace 3. Empilha CS e IP 3. Buscar o novo CS:IP – Ir na tabela de vetores de interrupção Ciclo de Processamento de Interrupções Múltiplas Interrupções Caso ocorram interrupções simultâneas, a de mais alta prioridade será reconhecida primeira No caso de chegar uma interrupção de mais alta prioridade (ex: divisão por zero) e uma NMI, as duas devem ser tratadas embora a primeira seja reconhecida antes No caso de chegar uma interrupção de mais alta prioridade (ex: divisão por zero) e uma INTR, a primeira é tratada e só depois de finalizada a INTR é tratada Exemplo de Múltiplas Interrupções Esquema de um ISR push ax; salvam-se os registradores push bx push cx ; corpo do ISR pop cx; restauram-se os registradores pop bx pop ax iret ; retorna da interrupção Embora ISRs se distingam de como tratam as diferentes interrupções, algumas ações são comuns a todos DIVERR:push si push cx push bx mov cx, 0 lea si,[msgErr] loop: ;imprime mensagem de erro lodsb cmp cl,al je exit mov ah, 0EH mov bh,0 int 10H jmp loop ;;continua Exemplo do Corpo de uma ISR (1) ISR para tratar divisão por zero Salva contexto exit: mov ax,101H; colocar um valor padrao em ax mov dx, 0 ;zerar o dx pop bx pop cx pop si iret msgErr: db ‘Divisao por zero', 0 Exemplo do Corpo de uma ISR (2) ISR para tratar divisão por zero Retorna da interrupção e restaura contexto anterior
Compartilhar