A apresentação está carregando. Por favor, espere

A apresentação está carregando. Por favor, espere

Aspectos de Interrupção

Apresentações semelhantes


Apresentação em tema: "Aspectos de Interrupção"— Transcrição da apresentação:

1 Aspectos de Interrupção
Processador Plasma Aspectos de Interrupção Wang Jiang Chau Grupo de Projeto de Sistemas Eletrônicos e Software Aplicado Laboratório de Microeletrônica – LME Depto. Sistemas Eletrônicos- EPUSP

2 Chamadas de Função em MIPS
Três passos para realizar a chamada de função: O fluxo de controle do programa deve ser mudado. Argumentos e valores de retorno são passados. Variáveis podem ser alocados e destruídos. Como isto é tratado no MIPS: Instruções específicas para chamada de função. Convenções para registradores para passagem de dados. Uso de pilha (stack). No fluxo normal de execução de um programa em Assembly (do MIPS especificamente, aqui), quando ocorre uma rotina (função ou procedimento), há um salto para o endereço onde a rotina deve iniciar. Para isto, em termos de hardware, o registrador PC receberá este valor do endereço de início da rotina. Um programa em C, por exemplo, que possua chamadas a rotinas, ao ser compilado, gerará uma versão em assembly com a instrução jal na chamada e com jr no retorno. Em C, os argumentos e valores de retorno ficam explícitos na declaração da rotina. Já ao ser convertido em assembly, não há como os argumentos ou variáveis de retorno estarem associados a jal ou jr. Ficará implícito que os argumentos estarão associados aos registradores $a e as variáveis de retorno aos registradores $v. Outro aspecto muito importante em assembly é o número limitado de registradores. É importante notar que em uma programação de alto nível, tipo C, a definição de variáveis é livre e o usuário pode definir o número de variáveis que desejar e usá-los livremente como operandos da operações. Já em assembly MIPS, as operações são apenas realizadas sobre os dados em registradores. Este número limitado de registradores faz com que seja necessário proteger (armazenar em memória) os dados temporários dos registradores em uso , dentro de uma parte qualquer do programa, quando uma rotina seja chamada. Devemos lembrar que dentro da rotina chamada, os mesmos registradores (em número limitado) serão usados para as suas operações. Ao retornar da rotina, os valores do registradores armazenados anteriormente são recuperados e retornam aos registradores, para que possam ser utilizados corretamente pelo programa chamador. A forma deste armazenamento é por pilha (Stack). 2 BD01: Digital IC Architecture, version 1.0 2

3 Fluxo de Controle em MIPS
MIPS usa instrução jump-and-link (jal) para chamada. jal é uma instrução de salto que implica no armazenamento do endereço de retorno (o endereço da instrução seguinte ao jal) no registrador $ra. jal é a única instrução do MIPS capaz de acesar o valor do program counter, armazenando o endereço de retorno PC+4 em $ra. jal Function1 Para retornar o controle de volta ao trecho de programa chamador, a função salta para o endereço em $ra. jr $ra Todas as instruções em assembly devem ser implementadas em hardware, ou seja, cada instrução deve ser decodificada e a execução em hardware correspondente deve ser garantida. A instrução jal Function1 indica que: Em software: há um salto e a próxima instrução a ser executada é o de endereço (rótulo, label) Function1 do programa assembly Em hardware: o registrador PC recebe o valor associado ao endereço (rótulo) Function1, enquanto o registrador $ra ($31) recebe o valor de PC atual + 4 A instrução jr $ra indica que: Em software: há um salto e a próxima instrução a ser executada é o endereço de valor dado no registrador $ra ($31). Em hardware: o registrador PC recebe o valor armazenado no $ra ($31). 3 BD01: Digital IC Architecture, version 1.0 3

4 Um Exemplo addi … add … jal A sub … jal B mul … A : div … lw … jr $ra B : add … sw … Cada vez que uma instrução jal é encontrada, o controle salta para a respectiva sub-rotina (A e B neste caso). Quando a execução da sub-rotina encerra, ela returna para o local apontado pelo registrador $ra. O registrador $ra contém o endereço da próxima instrução após a instrução jal. O slide mostra um programa com duas chamadas a rotinas em sequência. A primeira chamada é para a rotina que reside no endereço (rótulo) A enquanto, logo depois, a rotina de rótulo B é chamada. As setas em azul referem-se à primeira chamada e as setas em verde, à segunda. A sequência de execução é a seguinte: addi (programa principal) add jal A div (no endereço, rótulo A) lw jr (última instrução da primeira rotina) sub (programa principal) jal B add (no endereço, rótulo B) sw jr (última instrução da segunda rotina) mul 4 BD01: Digital IC Architecture, version 1.0 4

5 Outro Exemplo Em sub-rotinas aninhadas, a primeira instrução jal leva o controle à sub-rotina externa (A neste caso). Nela, uma segunda instrução jal é encontrada durante a execução, levando o controle para a sub-rotina interna (B neste caso). O fim da execução e os retornos das sub-rotinas ocorrem na ordem inversa. addi … add … jal A sub … A : div … lw … jal B mul … jr $ra B : add … sw … O slide mostra um programa com duas chamadas a rotinas aninhadas. A primeira chamada é para a rotina que reside no endereço (rótulo) A. Dentro da execução da primeira rotina, a rotina de rótulo B é chamada. As setas em azul referem-se à primeira chamada e as setas em verde, à segunda. A sequência de execução é a seguinte: addi (programa principal) add jal A div (no endereço, rótulo A) lw jal B add (no endereço, rótulo B) sw jr (última instrução da segunda rotina) mul jr (última instrução da primeira rotina) sub (programa principal) 5 BD01: Digital IC Architecture, version 1.0 5

6 Funcões em MIPS MIPS usa as seguintes convenções para argumentos e resultados. Até quatro argumentos podem ser “passados” colocando-os nos registradores $a0-$a3 antes da chamada da função com jal. A função pode “retornar” até dois valores, colocando-os nos registradores $v0-$v1, antes do retorno via jr. Estas convenções não são responsabilidade do hardware ou montador Os programadores (compiladores) seguem-nas, de forma que códigos sejam compreensíveis por terceiros. Repetindo o mencionado no slide 2, um programa em C com uma rotina, ao ser compilado, gerará uma versão em assembly com a instrução jal na chamada e com jr $ra no retorno. Em C, os argumentos e valores de retorno ficam explícitos na declaração da rotina. Já ao ser convertido em assembly, não há como os argumentos ou variáveis de retorno estarem associados a jal ou jr $ra ( a primeira instrução tem um rótulo como operando e o segundo, o registrado $31). Para facilitar a leitura e entendimento do código, fica como convenção (não há obrigatoriedade) que os argumentos estarão associados aos registradores $a0 a $a3, enquanto as variáveis de retorno aos registradores $v0 e $v1. O compilador (inteligente) cuidará para que no programa chamador em assembly os argumentos a serem passados residam em $a0-$a3 no momento anterior à chamada jal. Já para as variáveis de retorno, o compilador cuidará para que, na rotina em assembly, os registradores $v0-$v1 recebam os valores de retorno imediatamente antes da instrução jr $ra. 6 BD01: Digital IC Architecture, version 1.0 6

7 Pilha em MIPS MIPS não utiliza uma pilha explícita. É responsabilidade dos programadores implementarem uma. Pilhas são de importância fundamental quando sub-rotinas (regulares ou de interrupção) são implementadas. Valores temporários no banco de registradores precisam ser guardados antes da execução da sub-rotina e os mesmos valores devem ser retornados ao banco de registradores assim que a sub-rotina finaliza sua execução. Como parte das convenções adotados por programadores $29 é usado como stack pointer, denominado $sp. $sp contém o endereço do topo da pilha construída na memória. Como mencionado no slide 2, a pilha é necessária para armazenar na memória os valores temporários dos registradores no momento em que se salta para uma rotina, os quais serão recuperados retirados da memória de volta para os mesmos registradores quando ocorre o retorno da rotina. Como no MIPS a pilha é implícita (na memória), deve-se ter um registrador apontador de pilha (stack pointer) que contém o endereço de memória onde está o topo da pilha. No MIPS, tal registrador é o $29, também declarado como $sp. Só como lembrete, o registrador $29 ou $sp está convencionado para armazenar o endereço de topo da pilha e o compilador deve cuidar para que tal ocorra. Entretanto, esta convenção é de bom senso. Se o $sp for usado para outra finalidade que não o de stack pointer ou um outro registrador for usado para tal fim, isto não causará erros. Enfim o $29 ou $sp é apenas um registrador como qualquer um dos outros 30 registradores de uso geral (exceto $0 ou $zero que contém o valor 0). 7 7

8 Pilha em MIPS addi … add … jal A sub … A : div … lw … jal B mul …
$sp ($29) addi … add … jal A sub … A : div … lw … jal B mul … jr $ra B : add … sw … addr_z 0: addr_x temp. data from sub- rouutine A 1: addr_y 4 2: addr_z addr_y 3: addr_y temp. data from main program 1 4: addr_x addr_x 3 Seta indica aumento/diminuição da pilha (instruções para armazenamento/remoção de dados temporários de registradores na memória) 2 Exemplo de pilha e do apontador que precisaria ser introduzido no código exemplo anterior: Antes da instrução de salto para A (0) (jal A), $sp= addr_x. Neste momento, os registradores com valores de execução serão escritos na memória para os endereços de addr_x, addr_x-4, addr_x-8, etc., até alcançar-se addr_y (quando todos os registradores temporários estarão escritos); $sp=addr_y. Dento da rotina de endereço A (1), Antes da instrução de salto para B (2) (jal B), $sp= addr_y. Neste momento, os registradores com valores de execução serão escritos na memória para os endereços de addr_y, addr_y-4, addr_y-8, etc., até alcançar-se addr_z (quando todos os registradores temporários estarão escritos); $sp=addr_z. Ao retornar da rotina de rótulo B, antes de mul (3) (mul seria a primeira instrução a ser executada após o retorno), os registradores recebem de volta os valores armazenado na memória nos endereços de addr_z-4, addr_z-8, addr_z-16, etc., até alcançar-se addr_y (quando todos os registradores temporários terão recuperados os seus valores dentro da rotina A; $sp=addr_y. Ao retornar da rotina de rótulo A, antes de sub (4), os registradores recebem de volta os valores armazenado na memória nos endereços de addr_y-4, addr_y-8, addr_y-16, etc., até alcançar-se addr_x (quando todos os registradores temporários terão recuperados os seus valores do programa principal; $sp=addr_x. Memória Principal valores de registradores armazenados valores carregados nos registradores 8 8


Carregar ppt "Aspectos de Interrupção"

Apresentações semelhantes


Anúncios Google