Aula 9

Data de publicação: Nov 10, 2013 10:55:11 PM

Arquitetura de um microprocessador

Operações com a ALU

Seguindo o raciocínio da operação anterior (operações com a memória) vamos aproveitar o valor do registo Ra, isto é, o valor 23 do exemplo do ponto anterior.

Imaginemos que a instrução seguinte movia outro valor para o registo Rb através dos mesmos passos enunciados anteriormente. Para este exemplo usaremos Rb=7.

Suponhamos que a próxima instrução era a soma de Ra=Ra+Rb.

Para começar vamos assumir que o registo IR já contém a instrução a executar e os registos Ra e Rb já estão carregados com os valores 23 e 7 respetivamente (1)

O primeiro passo será colocar o valor do registo Ra no acumulador à entrada da ALU (2). Este registo é necessário para realizar a função de buffer, isto é para aguentar o valor 23 até que o valor do registo Rb seja colocado na outra entrada da ALU.

Assim que as duas entradas da ALU tenham os operandos carregados (3), esta efetua a soma (uma vez que a instrução indica uma soma) e coloca-os num registo temporário (4). O resultado desta operação origina um tipo de variável de estado (FLAGS) que será diferente consoante o tipo de valor que for devolvido pela ALU.

O registo temporário também é necessário para servir o buffer. Acontece que o barramento de dados ainda está ocupado com o valor de Rb e se não houvesse este buffer o resultado da operação seria novamente introduzido na ALU, alterando o resultado final. Assim, quando o barramento ficar livre o resultados é finalmente escrito no registo Ra (5).

Desta forma se conclui o funcionamento da ALU.

Interrupções

Por vezes o CPU interrompe o seu trabalho para atender outros pedidos. Para esse efeito, o CPU possui linhas de interrupção próprias que disponibiliza para atender interrupções provenientes de dispositivos exteriores (por exemplo, uma tecla premida).

Para atender a interrupção, tem de saber onde interrompeu o trabalho anterior, para posteriormente poder retomar a execução do programa principal. Assim, só é possível o CPU conseguir este feito, se armazenar temporariamente a informação de que estava a tratar nesse momento em memória.

É precisamente aqui que entra um registo especial de nome Stack Pointer (SP). Será esse registo o responsável por guardar a informação relativa às interrupções numa zona especial da memória denominada por Stack (pilha). A sua função passa por guardar a informação de retorno à rotina que estava a ser executada antes da interrupção ter lugar, ou seja, o valor do PC (e por vezes também valores dos registos internos). Desta forma, o PC fica livre para poder ser carregado com o endereço da rotina que gerou a interrupção. Por exemplo, como analogia podemos pensar na seguinte situação:

Imaginemos que necessita de colocar um quadro em sua casa na parte superior da parede, mas como não é suficiente alto para chegar à zona onde se pretende realizar o furo irá necessitar de uma escada.

A analogia começa aqui. Tem de fazer o furo com uma máquina própria mas aos mesmo tempo necessita de subir a escada em segurança, não o podendo fazer a carregar com as ferramentas. A rotina principal é realizar o furo e a interrupção é ter-se lembrado de que é necessário subir as escadas e que para isso não o pode fazer a carregar com as ferramentas ao mesmo tempo. Assim, pedimos a alguém que nos segure nas ferramentas (Stack) enquanto subimos a escada (interrupção). Uma vez em cima das escadas pedimos a alguém que nos chegue as ferramentas (acede-se novamente à Stack onde está guardada a informação da rotina anterior) e precedemos com a realização do furo (Program Counter volta à rotina anterior).

Resumindo podemos enumerar os passos que ocorrem durante uma interrupção:

  1. O conteúdo do registo PC (endereço de memória) é guardado na Stack (1)

  2. Guardam-se os valores dos registos internos a ser utilizados aquando da interrupção, igualmente na Stack (1) O apontador SP é incrementado para apontar para a próxima posição da pilha, isto é, para a posição imediatamente acima (2)

  1. Atender à interrupção passando o PC a apontar para a zona da memória onde está o programa a executar durante a interrupção (3)

  2. Terminada a execução da interrupção (4), são recuperados da Stack os valores que os registos internos tinham antes da interrupção, o valor do PC e o apontador SP é decrementado (5)

  3. Finalmente retoma a execução do programa interrompido (6)

No entanto, pode ocorrer outra interrupção quando já está a ser atendida uma interrupção. Esta situação não tem limites e pode ocorrer tantas vezes quantas forem necessárias. A ordem pela qual a informação das interrupções é armazenada na Stack e posteriormente extraída segue normalmente uma lógica LIFO (Last In First Out) ou melhor do tipo pilha (Stack). A última interrupção será a primeira a ser atendida.

Resumindo, o CPU necessita de armazenar em memória:

  • Instruções;

  • Dados;

  • Informações que permita retomar a execução de um programa previamente interrompido.

PERGUNTA

Qual é o nome da zona especial da memória que tem como finalidade guardar informação relativa a interrupções?