Baixe o app para aproveitar ainda mais
Prévia do material em texto
Todo nó computacional, como os microcontroladores e os microprocessadores, tem, por objetivo, realizar o processamento de instruções por meio de sua decodificação e de sua execução. Para tanto, o processador exporta instruções que poderão ser mapeadas diretamente na linguagem de programação Assembly. Sabemos que um computador pode ser dividido em módulos, que, por sua vez, poderão ser decompostos em submódulos. Para esta questão, adote os submódulos internos à CPU: unidade de controle; registradores de controle e de estado; registradores de propósito geral; e ULA. Quais módulos e submódulos serão ativados quando as seguintes instruções forem processadas? Arquitetura de uma Unidade Central de Processamento (UCP) A função? fundamental da Unidade Central de Processamento (UCP), não obstante o formato físico e a arquitetura, é executar uma sequência de instruções armazenadas chamada programa. O programa é representado por uma série de números que são mantidos em algum tipo de memória no computador. Há quatro etapas que quase todos os processadores centrais executam em sua operação: a busca de instruções, a decodificação, a execução e escrita de dados. A abaixo mostra o diagrama em blocos de uma Unidade Central de Processamento (UCP). Unidade Lógica e Aritmética A Unidade Lógica e Aritmética (ULA), ou Arithmetic Logic Unit (ALU), é a unidade da Unidade Central de Processamento (UCP, ou também CPU), responsável pela execução das operações aritméticas e lógicas. John von Neumann já propôs o conceito de ULA em 1945, quando construiu o computador EDVAC. A ULA executa as principais operações lógicas e aritméticas que um computador precisa realizar. Ela faz as operações de soma, subtração, multiplicação e determina se um número é zero, positivo ou negativo. Além das funções aritméticas, uma ULA deve ser capaz de determinar se uma quantidade é igual, menor ou maior que outra. A ULA também realiza as funções lógicas Arquitetura de Computadores 2014 CIANO.indd 58 14/04/15 15:59 Arquitetura de Computadores 59 básicas como E, OU, OU-Exclusivo, assim como a negação, tanto com números quanto com caracteres. Unidade de Controle A Unidade de Controle (UC) é responsável por gerar todos os sinais que controlam as operações no interior da UCP. Além disso, também tem o objetivo de controlar as interfaces de entrada e de saída do processador com o mundo externo. A UC realiza a decodificação de instruções e executa as ações dessas instruções. Registradores O registrador de uma Unidade Central de Processamento é um tipo de memória rápida e com pequena capacidade construída dentro da UCP e utilizada para o armazenamento temporário de dados no processamento. Pelo fato de estarem próximos da Unidade Lógica e Aritmética e de ser construída com circuitos de memória muito rápidos, possibilita o maior desempenho no processamento. Os registradores ficam no topo da hierarquia de memória, por isso é a forma mais rápida mas também, mais cara de se armazenar um dado. Barramentos Os diversos componentes de um computador precisam se comunicar. O barramento é um subsistema que transfere dados entre componentes dentro de um computador ou entre computadores. Os barramentos do computador são basicamente linhas de comunicação elétricas em forma paralela ou serial com conexões múltiplas, isto é, permite ligar vários dispositivos. Com o aumento do desempenho, os sistemas de interconexão têm papel importante. O barramento interno tem como função conectar a CPU, memória e interfaces. O barramento externo tem como função conectar computadores aos seus periféricos, impressoras, vídeo e outros computadores. Entrada e saída Na computação, a entrada/saída, ou E/S, ou ainda o termo em inglês I/O (Input/Output), referem-se à comunicação entre um sistema de processamento de dados (tal como um computador) e o mundo exterior - possivelmente um ser humano ou outro sistema de processamento de dados. As entradas são os sinais ou os dados recebidos pelo sistema, e as saídas são os sinais ou os dados emitidos a partir dele. Linguagem Assembly mov Reg1, [Reg2] ; Reg1 = conteúdo da posição de mem. apontada por Reg2 mov Reg3, 10 ; Reg3 = 10 sub Reg1, Reg3 ; Reg1 = Reg1 – Reg3 js p_else ; desvio para p_else se flag sinal esteja sinalizada ; <sequência_if>;codificação relativa ao if jump p_final ; desvio não condicional para p_final p_else: ; rótulo denominado p_else ; <sequência_else>;codificação relativa ao else p_final: ; rótulo denominado p_final <restante_do_código> ; sequência após o desvio condicional instrução operando_destino, operando_fonte No caso do “sub”, o operando à esquerda corresponde tanto à fonte quanto ao destino do resultado da operação. Caso o Assembly manipulasse três operandos, teríamos esta instrução: instrução operando_destino, operando_fonte1, operando_fonte2 Os comentários, no código, estão precedidos por ponto-e-vírgula. Voltando, então, ao código, percebemos que, na primeira linha, ocorre a instanciação, por meio do comando “mov ” (movimentação de dados), do registrador “Reg1” com o conteúdo da posição de memória referenciado pelo registrador “Reg2”. Na segunda linha, é realizada a instanciação do registrador “Reg3” com o valor 10. Quando é realizada a operação “sub” na terceira linha, é instanciado o registrador flags. Caso a subtração resulte em 0, o bit zero é instanciado em 1; caso a subtração resulte em um valor negativo, o bit sinal é instanciado em 1. O flags é utilizado como parâmetro da quarta linha: instrução “js” (jump sinal). A instrução js faz com que o fluxo de processamento seja desviado para o rótulo “p_else” (um rótulo marca uma posição de memória) caso o bit flag sinal valha 1 – ou seja, caso a subtração anterior tenha gerado um valor negativo. Sendo assim, o trecho identificado como “<sequência_if>” somente será executado se o resultado da operação de subtração for maior ou igual a zero. Consequentemente, o trecho “<sequência_else>” será executado se o resultado da operação de subtração gerar um valor negativo. A instrução “jump” corresponde a um desvio não condicional (como o comando “goto” da linguagem C/C++). No caso do código, o desvio não condicional direciona o fluxo de processamento ao rótulo “p_final” – saindo da estrutura if/else.
Compartilhar