Hardware memória principal

  • 373 views
Uploaded on

 

More in: Internet
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Be the first to comment
    Be the first to like this
No Downloads

Views

Total Views
373
On Slideshare
0
From Embeds
0
Number of Embeds
0

Actions

Shares
Downloads
8
Comments
0
Likes
0

Embeds 0

No embeds

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
    No notes for slide

Transcript

  • 1. MEMÓRIA TECNOLOGIAS As primeiras tecnologias utilizadas em memórias foram as memórias de núcleos magnéticos, hoje apenas uma curiosidade. As memórias modernas são compostas por circuitos semicondutores, com novas tecnologias sendo criadas a cada ano permitindo que grandes quantidades de células de memória sejam encapsuladas em pequenas pastilhas. HIERARQUIA DE MEMÓRIA A MP não é o único dispositivo de armazenamento de um computador. Em função de características como tempo de acesso, capacidade de armazenamento, custo, etc., podemos estabelecer uma hierarquia de dispositivos de armazenamento em computadores. Tipo Capacidade Velocidade Custo Localização Volatilidade Registrador Bytes muito alta muito alto UCP Volátil Memória Cache Kbytes alta alto UCP/placa Volátil Memória Principal Mbytes média médio Placa Volátil Memória Auxiliar Gbytes baixa baixo Externa Não Volátil A UCP vê nesta ordem e acessa primeiro a que está mais próxima. Subindo na hierarquia, quanto mais próximo da UCP, maior velocidade, maior custo, porém menor capacidade de armazenamento. REGISTRADORES Registradores são dispositivos de armazenamento temporário, localizados na UCP, extremamente rápidos, com capacidade para apenas um dado (uma palavra). Devido a sua tecnologia de construção e por estar localizado como parte da própria pastilha ("chip") da UCP, é muito caro. O conceito de registrador surgiu da necessidade da UCP de armazenar temporariamente dados intermediários durante um processamento. Por exemplo, quando um dado resultado de operação precisa ser armazenado até que o resultado de uma busca da memória esteja disponível para com ele realizar uma nova operação. Máquinas RISC são geralmente construídas com um grande conjunto de registradores, de forma a trazer os dados para o mais próximo possível da UCP, de forma a que o programa opere sempre sobre dados que estão em registradores. Registradores são VOLÁTEIS, isto é, dependem de estar energizados para manter armazenado seu conteúdo. MEMÓRIA CACHE Com o desenvolvimento da tecnologia de construção da UCP, as velocidades foram ficando muito mais altas que as das memórias, que não tiveram a mesma evolução de velocidade (o aperfeiçoamento das memórias se deu mais no fator capacidade). Desta forma, os tempos de acesso às memórias foram ficando insatisfatórios e a UCP ao buscar um dado na memória precisa ficar esperando muitos ciclos até que a memória retorne o dado buscado ("wait states"), configurando um gargalo ("bottleneck") ao desempenho do sistema. Por esse motivo, desenvolveram-se outras arquiteturas de memória privilegiando a velocidade de acesso. A arquitetura da memória cache é muito diferente da arquitetura da memória principal e o acesso a ela é muitas vezes mais rápido (p.ex: 5 ns contra 70 ns).
  • 2. No entanto, o custo de fabricação da memória cache é muito maior que o da MP. Desta forma, não é econômico construir um computador somente com tecnologia de memória cache. Criou-se então um artifício, incorporando-se ao computador uma pequena porção de memória cache, localizada entre a UCP e a MP, e que funciona como um espelho de parte da MP. Desenvolveram-se ainda algoritmos que fazem com que, a cada momento, a memória cache armazene a porção de código ou dados (por exemplo, uma sub-rotina) que estão sendo usados pelas UCP. Esta transferência (MP <--> Cache) é feita pelo hardware: ela independe do software, que ignora se existe ou não memória cache, portanto ignora essa transferência; nem o programador nem o sistema operacional têm que se preocupar com ela. A memória cache opera em função de um princípio estatístico comprovado: em geral, os programas tendem a referenciar várias vezes pequenos trechos de programas, como loops, sub-rotinas, funções e só tem sentido porque programas executados linearmente, seqüencialmente, são raros. Desta forma, algoritmos (chamados algoritmos de cache) podem controlar qual parte do código ficará copiado na cache, a cada momento. Quando a MP busca um determinado trecho de código e o encontra na cache, dá-se um "cache hit" , enquanto se o dado não estiver presente na cache será necessário requisitar o mesmo à MP, acarretando atraso no processamento e dá-se um "cache miss" ou "cache fault". O índice de cache hit ou taxa de acerto da cache é geralmente acima de 90%. Memórias cache também são VOLÁTEIS, isto é, dependem de estar energizadas para manter gravado seu conteúdo. MEMÓRIAS AUXILIARES Memórias auxiliares resolvem problemas de armazenamento de grandes quantidades de informações. A capacidade da MP é limitada pelo seu relativamente alto custo, enquanto as memórias auxiliares tem maior capacidade e menor custo; portanto, o custo por bit armazenado é muito menor. Outra vantagem importante é que as memórias auxiliares não são VOLÁTEIS, isto é, não dependem de estar energizadas para manter gravado seu conteúdo. Os principais dispositivos de memória auxiliar são: discos rígidos (ou HD), drives de disquete, unidades de fita, CD-ROM, DVD, unidades ótico-magnéticas, etc. OBS.: Cache de disco não é a mesma tecnologia da memória cache. Trata-se do emprego do mesmo conceito da memória cache, para acelerar a transferência de dados entre disco, MP e UCP, usando um programa (um software, por ex.: SmartDrive) para manter um espelho do conteúdo de parte do disco (a mais provável de ser requisitada a seguir pela UCP) gravado em uma parte da Memória Principal. Recentemente, as unidades de disco passaram a incorpor em sua interface chips de memória - tipicamente 32 a 64 Kbytes - para acelerar a transferência de dados, utilizando um algoritmo de cache. Memória Principal Conforme definimos anteriormente, Memória Principal é a parte do computador onde programas e dados são armazenados para processamento. A informação permanece na memória principal apenas
  • 3. enquanto for necessário para seu emprego pela UCP, sendo então a área de MP ocupada pela informação pode ser liberada para ser posteriormente sobregravada por outra informação. Quem controla a utilização da memória principal é o Sistema Operacional. ESTRUTURA DA MEMÓRIA PRINCIPAL - CÉLULAS E ENDEREÇOS A memória precisa ter uma organização que permita ao computador guardar e recuperar informações quando necessário. Não teria nenhum sentido armazenar informações que não fosse possível recuperar depois. Portanto, não basta transferir informações para a memória. É preciso ter como encontrar essa informação mais tarde, quando ela for necessária, e para isso é preciso haver um mecanismo que registre exatamente onde a informação foi armazenada (lembrando nossa analogia com o computador hipotético, imagine encontrar uma informação guardada ao acaso, se nosso escaninho tivesse 1 milhão de compartimentos ...). Célula é a unidade de armazenamento do computador. A memória principal é organizada em células. Célula é a menor unidade da memória que pode ser endereçada (não é possível buscar uma "parte" da célula) e tem um tamanho fixo (para cada máquina). As memórias são compostas de um determinado número de células ou posições. Cada célula é composta de um determinado número de bits. Todas as células de um dado computador tem o mesmo tamanho, isto é, todas as células daquele computador terão o mesmo número de bits. Cada célula é identificada por um endereço único, pela qual é referenciada pelo sistema e pelos programas. As células são numeradas seqüencialmente, uma a uma, de 0 a (N-1), chamado o endereço da célula. Endereço é o localizador da célula, que permite identificar univocamente uma célula. Assim, cada célula pode ser identificada pelo seu endereço. Unidade de transferência é a quantidade de bits que é transferida da memória em uma única operação de leitura ou transferida para a memória em uma única operação de escrita. O tamanho da célula poderia ser igual ao da palavra, e também à unidade de transferência, porém por razões técnicas e de custo, são freqüentemente diferentes. OBS.: Uma célula não significa o mesmo que uma palavra; uma célula não necessariamente contém uma palavra. Palavra é a unidade de processamento da UCP. Uma palavra deve representar um dado ou uma instrução, que poderia ser processada, armazenada ou transferida em uma única operação. No entanto, em geral não é assim que acontece e os computadores comerciais não seguem um padrão único para a organização da UCP e MP. Computadores comerciais (tais como por exemplo os baseados nos processadores Intel 486) podem ter o tamanho da palavra definido como de 32 bits, porém sua estrutura de memória tem células de 16 bits. A estrutura da memória principal é um problema do projeto de hardware: - mais endereços com células menores ou menos endereços com células maiores? O tamanho mais comum de célula era 8 bits (1 byte); hoje já são comuns células contendo vários bytes.
  • 4. Número de bits para representar um endereço Expressão geral: MP com endereços de 0 a (N-1) N = 2x logo: x = log2 N sendo x = nº de bits para representar um endereço e N o número de endereços. CAPACIDADE DA MEMÓRIA PRINCIPAL A capacidade da MP em bits é igual ao produto do nº de células pelo total de bits por célula. T = N x M T = capacidade da memória em bits N = nº de endereços ( como vimos anteriormente, N=2x sendo x = nº de bits do endereço) M = nº de bits de cada célula Para encontrar a capacidade em bytes, bastaria encontrar a capacidade em bits e depois multiplicar por 8 (cada byte contém 8 bits) ou então converter o tamanho da célula para bytes e depois multiplicar pelo número de células. O último endereço na memória é o endereço N-1 ( os endereços começam em zero e vão até N-1). MEMÓRIA - EXERCÍCIOS Numa MP com 1kbyte de capacidade, onde cada célula tem 8 bits: a) quantas células tem a MP? b) quantos bits são necessários para representar um endereço de memória? 2) Um computador endereça 1k células de 16 bits cada uma. Pede-se: a) sua capacidade de memória; b) o maior endereço que o computador pode endereçar; 3) A memória de um computador tem capacidade de armazenar 216 bits e possui um barramento de dados de 16 bits. Pede-se: a) o tamanho da célula de memória;
  • 5. 4) Calcular e completar os campos: M - Tamanho da célula x - nº de bits do endereço N - nº de endereços T - Capac. da memória 0 a (N-1) - Faixa de endereços 8 bits - - 1 K byte - 16 bits - 1 K endereços - - - 4 bits - 256 bits - 4 bytes - - 4 Gbytes - - - - 1 Mbyte 0 a 65.535 64 bits - - - 0 a 262.143 UNIDADE CENTRAL DE PROCESSAMENTO A Unidade Central de Processamento - UCP (em inglês, Central Processing Unity - CPU) é a responsável pelo processamento e execução dos programas armazenados na MP. As funções da UCP são: executar as instruções e controlar as operações no computador. A UCP é composta de duas partes: UAL - Unidade Aritmética e Lógica - tem por função a efetiva execução das instruções UC - Unidade de Controle - tem por funções a busca, interpretação e controle de execução das instruções, e o controle dos demais componentes do computador Obs.: Neste curso, por simplicidade, será considerado apenas o funcionamento serial em uma UCP. Outras abordagens serão discutidas no capítulo Tópicos Avançados de Arquitetura (UCP's não pipelined). A seguir é apresentado o diagrama esquemático de uma UCP.
  • 6. Registradores Importantes na UCP Na UC - CI Contador de Instruções (em inglês: PC - Program Counter) - armazena o endereço da próxima instrução a ser executada - tem sempre o mesmo tamanho do REM. Na UC - RI Registrador de Instrução (em inglês: IR - Instruction Register) - armazena a instrução a ser executada. Na UAL - ACC Acumulador (em inglês:ACC - Accumulator) - armazena os dados (de entrada e resultados) para as operações na UAL; o acumulador é um dos principais elementos que definem o tamanho da palavra do computador - o tamanho da palavra é igual ao tamanho do acumulador. Instruções Para que um programa possa ser executado por um computador, ele precisa ser constituído de uma série de instruções de máquina e estar armazenado em células sucessivas na memória principal. A UCP é responsável pela execução das instruções que estão na memória. Quem executa um programa é o hardware e o que ele espera encontrar é um programa em linguagem de máquina (uma sequência de instruções de máquina em código binário). A linguagem de máquina é composta de códigos binários, representando instruções, endereços e dados e está totalmente vinculada ao conjunto ("set") de instruções da máquina. Um ser humano usa seu conhecimento e inteligência para traduzir uma tarefa complexa (tal como, por exemplo, a tarefa de buscar uma pasta num arquivo) numa série de passos elementares (identificar o móvel e gaveta onde está a pasta, andar até o móvel, abrir a gaveta, encontrar a pasta, retirar a pasta e fechar a gaveta). Para o computador, uma instrução precisa ser detalhada, dividida em pequenas etapas de operações, que são dependentes do conjunto de instruções do computador e individualmente executáveis. Fazendo um paralelo com linguagens de alto nível, o programa elaborado pelo programador (o código-fonte, composto de instruções complexas) precisa ser "traduzido" em pequenas operações
  • 7. elementares (primitivas) executáveis pelo hardware (ver Conceito de Processo). Cada uma das instruções tem um código binário associado, que é o código da operação. Formato geral de uma Instrução Código de operação (OPCODE) Operando (s) (OP) Código de Operação ou OPCODE - identifica a operação a ser realizada pelo processador. É o campo da instrução cuja valor binário identifica (é o código binário) da operação a ser realizada. Este código é a entrada no decodificador de instruções na unidade de controle. Cada instrução deverá ter um código único que a identifique. Operando(s) - é ou são o(s) campo(s) da instrução cujo valor binário sinaliza a localização do dado (ou é o próprio dado) que será manipulado (processado) pela instrução durante a operação. Em geral, um operando identifica o endereço de memória onde está contido o dado que será manipulado, ou pode conter o endereço onde o resultado da operação será armazenado. Finalmente, um operando pode também indicar um Registrador (que conterá o dado propriamente dito ou um endereço de memória onde está armazenado o dado). Os operandos fornecem os dados da instrução. Obs: Existem instruções que não tem operando. Ex.: Instrução HALT (PARE). O Capítulo Representação de Instruções detalha esse assunto. Conjunto de Instruções Quando se projeta um hardware, define-se o seu conjunto ("set") de instruções - o conjunto de instruções elementares que o hardware é capaz de executar. O projeto de um processador é centrado no seu conjunto ("set") de instruções. Essa é uma das mais básicas decisões a ser tomada pelo Engenheiro de projeto. Quanto menor e mais simples for este conjunto de instruções, mais rápido pode ser o ciclo de tempo do processador. Funcionalmente, um processador precisa possuir instruções para: operações matemáticas aritméticas: +, - , × , ÷ ... lógicas: and, or, xor, ... de complemento de deslocamento operações de movimentação de dados (memória <--> UCP, reg <--> reg) operações de entrada e saida (leitura e escrita em dispositivos de E/S) operações de controle (desvio de seqüência de execução, parada) As estratégias de implementação de processadores são: CISC - Complex Instruction Set Computer - exemplo: PC, Macintosh; um conjunto de instruções maior e mais complexo, implicando num processador mais complexo, com ciclo de processamento mais lento; ou RISC - Reduced Instruction Set Computer - exemplo: Power PC, Alpha, Sparc; um conjunto de instruções menor e mais simples, implicando num processador mais simples, com ciclo de processamento rápido. Obs.: adotaremos o termo instrução para as instruções de máquina ou em linguagem Assembly e comando para linguagens de alto nível. Há hoje uma crescente tendência a se utilizar um conjunto de instruções reduzido, de vez que os compiladores tendem a usar em geral apenas uma pequena quantidade de instruções. Há também vantagens na implementação do hardware - maior simplicidade, menor tempo de ciclo de instrução). O projeto de um processador poderia ser resumido em:
  • 8. a) Definir o conjunto de instruções (todas as possíveis instruções que o processador poderá executar) · definir formato e tamanho das instruções · definir as operações elementares b) Projetar os componentes do processador (UAL, UC, registradores, barramentos, ...) Duas estratégias são possíveis na construção do decodificador de instruções da UC: . wired logic (as instruções são todas implementadas em circuito) . microcódigo (apenas um grupo básico de instruções são implementadas em circuitos; as demais são "montadas" através de microprogramas que usam as instruções básicas. Ciclo de Instrução As instruções são executadas sequencialmente (a não ser pela ocorrência de um desvio), uma a uma. O CI indica a seqüência de execução, isto é, o CI controla o fluxo de execução das instruções. A seguir é ilustrado o ciclo de processamento de uma instrução. Descrição do processamento de uma instrução na UCP: - a UC lê o endereço da próxima instrução no CI; - a UC transfere o endereço da próxima instrução, através do barramento interno, para o REM; COMUNICAÇÃO ENTRE MEMÓRIA PRINCIPAL E UCP BARRAMENTOS Os diversos componentes dos computadores se comunicam através de barramentos. Barramento é um conjunto de condutores elétricos que interligam os diversos componentes do computador e de circuitos eletrônicos que controlam o fluxo dos bits. Para um dado ser transportado de um componente a outro, é preciso emitir os sinais de controle necessários para o componente-origem colocar o dado no barramento e para o componente-destino ler o dado do barramento. Como um dado é composto por bits (geralmente um ou mais bytes) o barramento deverá ter tantas linhas condutoras quanto forem os bits a serem transportados de cada vez. Obs.: Em alguns computadores (usando uma abordagem que visa a redução de custos), os dados podem ser transportados usando mais de um ciclo do barramento.
  • 9. Assim, se quisermos transferir um byte - por exemplo, 01001010 - da UCP para a Memória Principal, os circuitos de controle se encarregarão de colocar o byte 01001010 no barramento, ou seja, colocariam sinais de tensão "high" nas 2ª, 4ª e 7ª linhas do barramento (por convenção, os bits são sempre ordenados da direita para a esquerda) e de informar à memória para ler o dado no barramento. Os dados são representados no barramento na forma de sinais de tensão, sendo que um sinal de tensão de uns poucos volts ("high") representa o bit "1" e um sinal próximo de zero volts ("low") representa o bit "0". REGISTRADORES UTILIZADOS A comunicação entre MP e UCP usa dois registradores da UCP chamados de Registrador de Endereços de Memória - REM ou, em inglês, Memory Address Register (MAR), bem o como Registrador de Dados da Memória - RDM ou, em inglês, Memory Buffer Register (MBR). x = no de bits do barramento de endereços; em geral (mas não obrigatoriamente) é igual ao nº de bits do Registrador de Endereços de Memória - REM. M = nº de bits contidos em uma célula; M em geral (mas não obrigatoriamente) é igual ao nº de bits do Registrador de Dados da Memória - RDM. ESQUEMÁTICO DE FUNCIONAMENTO DA COMUNICAÇÃO MP / UCP UCP / MP Barramento de endereços - unidirecional (só a UCP envia dados - write - ou lê dados - read - da MP) Barramento de dados - bidirecional Barramento de controle - bidirecional UCP ---> MP (controles ... - r/w) MP -----> UCP (wait ... ) ELEMENTOS ENVOLVIDOS:
  • 10. Barramentos: de dados - bidirecional de endereços -unidirecional de controle - bidirecional Registradores: REM - Registrador de Endereços de Memória (MAR - Memory Address Register) RDM - Registrador de Dados de Memória (MBR - Memory Buffer Register) Exercícios: 1) Quais das seguintes memórias são passíveis de implementação? MEMÓRIA Nº BITS NO REM Nº DE CÉLULAS TAMANHO DA CÉLULA EM BITS a 10 1024 8 b 10 1024 12 c 9 1024 10 d 11 1024 10 e 10 10 1024 f 1024 10 10 2) Um computador tem 512 endereços e cada célula tem 10 bits. Qual a capacidade: a) do REM; b) do RDM; c) da MP em bits. 3) Um computador tem um RDM de 16 bits e um REM de 20 bits. Sabe-se que a célula desse computador é de 8 bits e que ele tem um número de células igual à sua possibilidade de endereçamento. Pede-se: a) qual o tamanho da barra de endereços? b) quantas células são lidas da memória em uma única operação? c) quantos bits tem a memória desse computador? PALAVRA (UNIDADE DE INFORMAÇÃO) Palavra é a unidade de informação do sistema UCP / MP. A conceituação mais usada (IBM, Digital) define palavra como sendo a capacidade de manipulação de bits do núcleo do computador (UCP e MP). Pressupõe-se aqui que todos os elementos do núcleo do computador (o que inclue o tamanho da UAL, do acumulador e registradores gerais da UCP e o barramento de dados) tenham a mesma largura (processem simultaneamente o mesmo número de bits), o que nem sempre acontece. Muitas vezes encontram-se computadores em que o tamanho da UAL e do acumulador (e registradores gerais) não é o mesmo tamanho dos barramentos. Desta forma, encontram-se especificações de "computadores de 64 bits" mesmo quando seu barramento de dados é de 32 bits, nesse caso referindo-se exclusivamente à capacidade de manipulação da UCP de 64 bits (isto é, sua UAL e acumulador tem 64 bits). Esta conceituação é imprecisa (às vezes, enganosa) e pode levar a erros de avaliação da capacidade de processamento de um computador. Como exemplos, citamos os microprocessadores Intel 8086 (16 bits, sendo todos seus elementos de
  • 11. 16 bits) e seu "irmão" mais novo 8088, usado nos primeiros IBM/PC e XT (idêntico sob quase todos os aspectos ao 8086 e também dito de 16 bits, sendo que UAL e registradores são de 16 bits mas o barramento de dados é de apenas 8 bits, por economia e razões de compatibilidade com toda uma geração de placas de 8 bits). Destaque-se que nesse caso as transferências de dados através do barramento de dados se fazem em duas etapas, um byte de cada vez, e em conseqüência no 8088 elas consomem o dobro dos ciclos de barramento que o 8086), o que torna suas operações de transferência de dados mais lentas que as de seu "irmão" 8086. Concluindo, deve-se analisar caso a caso, porque a simples menção ao tamanho da palavra não é uma terminologia que permita definir de forma conclusiva sobre a arquitetura do computador. Em geral, o termo "célula" é usada para definir a unidade de armazenamento (o tamanho de células de memória) e o termo "palavra" para definir a unidade de transferência e processamento, significando na prática quantos bits o computador movimenta e processa em cada operação. Não confundir: célula não é sinônimo de palavra, embora em algumas máquinas a palavra seja igual à célula. A palavra de um computador pode ter 1 byte (p.ex, 8080), 2 bytes (p.ex. 80286), 4 bytes (p.ex. 486, o Pentium, e muitos mainframes IBM) e mesmo 8 bytes (p.ex. o Alpha da DEC). Células de memória muitas vezes tem o tamanho de 1 ou 2 bytes - de 8 a 16 bits. TEMPO DE ACESSO Tempo de acesso (ou tempo de acesso para leitura) é o tempo decorrido entre uma requisição de leitura de uma posição de memória e o instante em que a informação requerida está disponível para utilização pela UCP. Ou seja, o tempo que a memória consome para colocar o conteúdo de uma célula no barramento de dados. O tempo de acesso de uma memória depende da tecnologia da memória. As memórias DRAM (Dynamic RAM - as mais comuns hoje) tem tempo de acesso na faixa de 60 ns. Tempo de ciclo (ou ciclo de memória é conceituado como o tempo decorrido entre dois ciclos sucessivos de acesso à memória. As memórias dinâmicas perdem seu conteúdo em alguns instantes e dependem de ser periodicamente atualizadas (ciclo de "refresh"). No caso das SRAM (Static RAM ou memórias estáticas), que não dependem de "refresh", o tempo de ciclo é igual ao tempo de acesso. As memórias dinâmicas, no entanto, requerem ciclos periódicos de "refresh", o que faz com que a memória fique indisponível para novas transferências, a intervalos regulares necessários para os ciclos de "refresh". Assim, as memórias DRAM tem ciclo de memória maior que o tempo de acesso. O tempo de acesso de qualquer memória tipo RAM (Random Access Memory ou memória de acesso aleatório) é independente do endereço a ser acessado (a posição de memória a ser escrita ou lida), isso é, o tempo de acesso é o mesmo qualquer que seja o endereço acessado. ACESSO À MEMÓRIA PRINCIPAL O acesso à MP é ALEATÓRIO, portanto qualquer que seja o endereço (a posição) de memória que se queira acessar, o tempo de acesso é o mesmo (constante). Obs.: Embora a MP seja endereçada por célula, a UCP em geral acessa a MP por palavra. O endereçamento por célula dá maior flexibilidade de armazenamento, em compensação o número de acessos é em geral maior. FUNCIONAMENTO A MP pode ser acessada através de duas operações:
  • 12. ACESSO Tipo LER ou ESCREVER a) LEITURA: LER DA MEMÓRIA Significa requisitar à MP o conteúdo de uma determinada célula (recuperar uma informação). Esta operação de recuperação da informação armazenada na MP consiste na transferência de um conjunto de bits (cópia) da MP para a UCP e é não destrutiva, isto é, o conteúdo da célula não é alterado. SENTIDO: da MP para a UCP PASSOS EXECUTADOS PELO HARDWARE: a.1) a UCP armazena no REM o endereço onde a informação requerida está armazenada; a.2) a UCP comanda uma leitura; a.3) o conteúdo da posição identificada pelo endereço contido no REM é transferido para o RDM e fica disponível para a UCP. b) ESCRITA: ESCREVER NA MEMÓRIA Significa escrever uma informação em uma célula da MP (armazenar uma informação). Esta operação de armazenamento da informação na MP consiste na transferência de um conjunto de bits da UCP para a MP e é destrutiva (isto significa que qualquer informação que estiver gravada naquela célula será sobregravada). SENTIDO: da UCP para a MP PASSOS EXECUTADOS PELO HARDWARE: b.1) a UCP armazena no REM o endereço de memória da informação a ser gravada e no RDM a própria informação; b.2) a UCP comanda uma operação de escrita; b.3) a informação armazenada no RDM é transferida para a posição de memória cujo endereço está contido no REM. CLASSIFICAÇÃO DAS MEMÓRIAS Quanto à leitura e escrita, as memórias podem ser classificadas como: R/W - Read and Write (memória de leitura e escrita), comumente (e impropriamente) chamada de RAM (Random Access Memory ou memória de acesso aleatório), embora não seja a única RAM. Esta memória permite operações de escrita e leitura pelo usuário e pelos programas. Seu tempo de acesso é da ordem de 70ns e independe do endereço acessado. É construída com tecnologia de semicondutores (bipolar, CCD), pode ser estática (SRAM) ou dinâmica (DRAM) e é volátil. A MP é construída com memória R/W. ROM - Read Only Memory ou memória apenas de leitura Esta memória permite apenas a leitura e uma vez gravada não pode mais ser alterada. Também é de acesso aleatório (isto é, é também uma RAM), mas não é volátil. É utilizada geralmente por fabricantes para gravar programas que não se deseja permitir que o usuário possa alterar ou apagar acidentalmente (tal como por ex..a BIOS - Basic Input Output System e microprogramas de memórias de controle). Quando se liga uma máquina, é da ROM que vem os programas que são carregados e processados no "boot" (na inicialização o hardware aponta automaticamente para o primeiro endereço da ROM). Desta forma, parte do espaço de endereçamento da MP é ocupado por ROM. A ROM é mais lenta que a R/W e é barata, porém o processo produtivo depende de ser programada por máscara ("mask programmed") em fábrica e devido ao alto custo da máscara somente se torna econômica em grandes quantidades.
  • 13. Obs.: Boot (ou bootstrap loader) é o processo de inicialização e carga dos programas básicos de um computador, automática, sem intervenção externa. Este termo vem de uma analogia com um processo (impossível) que seria uma pessoa se levantar puxando-se pelos cordões de suas próprias botas. PROM - Programmable Read Only Memory ou memória apenas de leitura, programável. Esta memória é uma ROM programável (em condições e com máquinas adequadas, chamadas queimadores de PROM) e geralmente é comprada "virgem" (sem nada gravado), sendo muito utilizada no processo de testar programas no lugar da ROM, ou sempre que se queira produzir ROM em quantidades pequenas. Uma vez programada (em fábrica ou não), não pode mais ser alterada. EPROM - Erasable Programmable Read Only Memory ou memória apenas de leitura, programável (com queimadores de PROM) e apagável (com máquinas adequadas, à base de raios ultra-violeta). Esta memória é uma PROM apagável. Tem utilização semelhante à da PROM, para testar programas no lugar da ROM, ou sempre que se queira produzir ROM em quantidades pequenas, com a vantagem de poder ser apagada e reutilizada. EEPROM (ou E2 PROM) - Electrically Erasable Programmable Read Only Memory ou memória apenas de leitura, programável e eletronicamente alterável. Também chamada EAROM (Electrically Alterable ROM). Esta memória é uma EPROM apagável por processo eletrônico, sob controle da UCP, com equipamento e programas adequados. É mais cara e é geralmente utilizada em dispositivos aos quais se deseja permitir a alteração, via modem, possibilitando a carga de novas versões de programas à distância ou então para possibilitar a reprogramação dinâmica de funções específicas de um determinado programa, geralmente relativas ao hardware (p.ex., a reconfiguração de teclado ou de modem, programação de um terminal, etc). Lógica Temporizada Conforme vimos ao analisar a comunicação entre UCP e memória, as instruções, os dados e os endereços "trafegam" no computador através dos barramentos (de dados, de endereços e de controle), sob a forma de bits representados por sinais elétricos: uma tensão positiva alta ("high" - geralmente no entorno de 3 volts) significando "1" e uma tensão baixa ("low" - próxima de zero) significando "0". Mas os dados no computador não ficam estáticos; pelo contrário, a cada ciclo (cada "estado") dos circuitos, os sinais variam, de forma a representar novas instruções, dados e endereços. Ou seja, os sinais ficam estáticos apenas por um curto espaço de tempo, necessário e suficiente para os circuitos poderem detetar os sinais presentes no barramento naquele instante e reagir de forma apropriada. Assim, periodicamente, uma nova configuração de bits é colocada nos circuitos, e tudo isso só faz sentido se pudermos de alguma forma organizar e sincronizar essas variações, de forma a que, num dado instante, os diversos circuitos do computador possam "congelar" uma configuração de bits e processá-las. Para isso, é preciso que exista um outro elemento, que fornece uma base de tempo para que os circuitos e os sinais se sincronizem. Este circuito é chamado clock - o relógio interno do computador. Cada um dos estados diferentes que os circuitos assumem, limitados pelo sinal do clock, é chamado um ciclo de operação. Clock A Unidade de Controle da UCP envia a todos os componentes do computador um sinal elétrico regular - o pulso de "clock" - que fornece uma referência de tempo para todas as atividades e permite o sincronismo das operações internas. O clock é um pulso alternado de sinais de tensão, gerado pelos circuitos de relógio (composto de um cristal oscilador e circuitos auxiliares). Ciclo de Operação
  • 14. Cada um destes intervalos regulares de tempo é delimitado pelo início da descida do sinal, equivalendo um ciclo à excursão do sinal por um "low"e um "high" do pulso. O tempo do ciclo equivale ao período da oscilação. A física diz que período é o inverso da freqüência. Ou seja, P = 1 / f. A freqüência f do clock é medida em hertz. Inversamente, a duração de cada ciclo é chamada de período, definido por P=1/f (o período é o inverso da freqüência). Por exemplo, se f = 10 hz logo P = 1/10 = 0,1 s. 1 Mhz (1 megahertz) equivale a um milhão de ciclos por segundo. Sendo a freqüência de um processador medida em megahertz, o período será então medido em nanosegundos, como vemos no exemplo abaixo: f = 10 Mhz = 10 x 106 hz P = 10 / 106 = 100 ns (1 nanosegundo). Sempre que se fala sobre máquinas velozes, citamos números em megahertz. Para um melhor entendimento sobre o que ocorre na máquina, em vez de falar sobre a freqüência do clock seria mais ilustrativo discutirmos uma outra grandeza: o período (isto é, o tempo de duração de cada ciclo ou simplesmente tempo de ciclo). Quando se diz que um processador é de 200 Mhz, está-se definindo a freqüência de operação de seu processador (seu clock), significando que o processador pode alternar seus estados internos 166 milhões de vezes por segundo. Isto acarreta que cada ciclo (equivalente a um estado lógico) de operação dura 1 / 200.000.000 s = 5 x 10-9 s ou seja, 5 nanosegundos. Como podemos ver pelo exemplo a seguir, o processador com o clock ilustrado em (B) teria um tempo de ciclo cinco vezes menor que o (A) e portanto teria (teoricamente) condições de fazer cinco vezes mais operações no mesmo tempo. Quando analisamos os números de clock de um processador ou barramento, pode ficar uma impressão que esses números não fazem sentido: 133 MHz, 166 MHz ... Vejamos como ficam seus períodos, e como esses números apresentam um padrão regular: Freqüência (MHz) Período (ns) 25 40 33 30
  • 15. 40 25 50 20 66 15 100 10 133 7.5 166 6 200 5 266 3.75 Os primeiros computadores tinham um único sinal de clock geral, válido para UCP, memória, barramentos de E/S (entrada / saída), etc. À medida que a tecnologia foi se aperfeiçoando, a freqüência de clock de operação dos processadores (e, em menor escala, também a das memórias) aumentou em uma escala muito maior que a dos demais componentes. Desta forma, foi necessário criar diferentes pulsos de clock para acomodar as freqüências de operação dos diferentes componentes. A placa-mãe de um PC utiliza uma freqüência-mestra (hoje em geral de 66 Mhz, equivalente a um período de 15 ns, estando em prancheta placas para 100 MHz) para seu barramento (ciclo de barramento), a qual é multiplicada ou dividida para ser utilizada pelos demais componentes: · o processador tem essa freqüência multiplicada por 2 (133 Mhz) a 4 (266 MHz), · o barramento PCI usa freqüências reduzidas pela metade (33 Mhz), · as memórias (ciclos da ordem de 60 ns) usam freqüências reduzidas a um quarto e · as cache secundárias (ciclos entre 10 e 20 ns) usam a própria freqüência da placa-mãe. As memórias cache primárias são hoje construídas como parte do processador e usam o mesmo clock do processador. O efeito prático (econômico$$$$) do aumento da freqüência de operação é que a precisão de fabricação dos circuitos tem que ser também maior. O tamanho de cada junção de transistor fica menor (hoje são construídos chips com 0,35 microns e uma nova geração com 0,25 microns está em gestação). Uma junção menor requer menor potência para sua operação, menos elétrons para operar uma transição de estados, menor tempo de propagação do sinal, menor potência dissipada. Em conseqüência da grande precisão exigida, apenas uma pequena parcela dos processadores fabricados (cerca de 5%) consegue operar na máxima freqüência para a qual foram projetados, e a maioria é certificada para operar a freqüências mais baixas. Isto acarreta que, embora todos os processadores de um tipo sejam fabricados pelos mesmos processos e nas mesmas máquinas, apenas alguns serão certificados para a máxima freqüência prevista, o que obriga que o preço dos processadores de clock máximo seja muito mais caro que o dos muitos outros que não obtiveram certificação para aquele elevado clock e serão vendidos com "tags" de 166 ou 133 Mhz, a preços reduzidos. Instruções por ciclo Qual a real importância e significado da freqüência do processador? Quando se faz uma soma em uma calculadora, basta teclar cada um dos algarismos do 1º número, teclar o sinal de mais, depois teclamos os algarismos do segundo número e teclamos o sinal de igual. É comum pensar que nos computadores as coisas se passam mais ou menos do mesmo jeito. No
  • 16. entanto, a soma propriamente dita é a menor das tarefas que um computador executa quando soma dois números. Neste exemplo, o computador precisaria localizar a instrução de soma na memória e movê-la para a UCP. Esta instrução estaria codificada na forma de dígitos binários e teria que ser decodificada para determinar a operação a ser realizada (no caso, ADD), o tamanho dos dados (quantas células eles ocupam), determinar a localização e buscar cada um dos números na memória, e só então, finalmente, fazer a soma. Para o computador, a soma é realmente a parte mais simples e mais rápida de toda a operação, já que decodificar a instrução e principalmente obter os dados tomam a maior parte do tempo (este assunto será discutido no Capítulo sobre Representação de Instruções). Cada nova geração de processadores tem sido capaz de executar as operações relativas ao processamento de uma instrução em menor número de ciclos do clock (ver seção sobre Pipeline em Tópicos Avançados de Arquitetura). Por exemplo, na família Intel x86: - 386 - mínimo de 6 ciclos por instrução de soma de 2 números; - 486 - em geral, 2 ciclos por instrução de soma de 2 números; - Pentium - 1 ciclo por instrução de soma de 2 números; - Pentium Pro - 1 ciclo por instrução de soma de 3 números; na soma de mais números, quando um dos números está em memória de baixa velocidade, o Pentium Pro é capaz de "pular" este número e, enquanto busca o número que falta, seguir adiante, buscando e somando os demais números para finalmente incluir o número que faltava na soma. Usando uma analogia com um automóvel, para andar mais rápido geralmente é mais eficaz trocar de marcha do que acelerar. Comparativamente, um processador de 66 Mhz hoje equivaleria a uma pequena pressão no acelerador e um de 300 Mhz ao acelerador pressionado até o fundo (pé na tábua!). Mas, se um 8088 fosse a 1ª marcha, um Pentium II seria equivalente à 5ª marcha e seria certamente muito mais rápido, mesmo que fosse possível "acelerar" o 8088 ao mesmo clock do Pentium. Se compararmos um 486 DX4-100 (100 Mhz) com um Pentium também de 100 Mhz, veremos que o Pentium 100 será substancialmente mais rápido, o que se deve à sua arquitetura e não ao clock. É portanto um engano comparar apenas a freqüência do clock: o desempenho do processador deve ser avaliado por um conjunto de características da arquitetura, do qual a freqüência do clock é apenas um deles - e não o mais importante (mais detalhes serão apresentados no capítulo Tópicos Avançados de Arquitetura). REPRESENTAÇÃO DE INSTRUÇÕES INSTRUÇÃO DE MÁQUINA Quem executa um programa é o hardware e o que ele espera encontrar é um programa em linguagem de máquina (uma sequência de instruções de máquina em código binário). Um programa em linguagem de alto nível não pode ser executado diretamente pelo hardware. Ele tem que ser transformado (traduzido) para linguagem de máquina por um compilador, antes de ser carregada em memória, para que o hardware possa executá-lo. A linguagem de máquina é composta de códigos binários, representando instruções, endereços e dados e está totalmente vinculada ao conjunto ("set") de instruções da máquina. Funcionalmente as operações do computador são: · matemáticas (aritméticas, lógicas, de complemento, de deslocamento...) · movimentação de dados (memória <--> registrador) · entrada-saída (leitura e escrita em dispositivos externos - dispositivos de Entrada / Saída) · controle (desvio da sequência de execução, parar, etc...)
  • 17. Obs.: O conjunto de instruções de alguns processadores, como por exemplo o Intel 8080, não possui instruções para multiplicação ou divisão; portanto, um programa em linguagem de máquina, nestes processadores, não pode fazer multiplicação ou divisão diretamente (somente através de combinação de outras instruções). Já um programa em linguagem de nível mais alto pode implementar comandos de multiplicação (ou divisão) que combinem uma série de instruções binárias do conjunto de instruções para fazer uma multiplicação (ou divisão) através de repetidas somas (subtrações) ou por deslocamento de bits. Ex. de um conjunto de instruções de uma máquina hipotética: Instrução Significado Operação Código Load Carregar no acumulador ACC <-- op 0000 Store Salvar na memória op <-- ACC 0001 Add Somar ACC <-- ACC + op 0010 Sub Subtrair ACC <-- ACC - op 0011 Mult Multiplicar ACC <-- ACC * op 0100 Div Dividir ACC <-- ACC / op 0101 Jmp Desviar CI <-- op 0110 Jz Desviar, se ACC igual zero CI <-- op, se ACC = 0 0111 Jnz Desviar, se ACC não zero CI <-- op, se ACC != 0 1000 Read Ler entrada op <-- entrada 1001 Print Imprimir saida <-- op 1010 Stop Terminar 1100 Cada uma das instruções tem um código binário associado, que é o código da operação. Serão usadas as seguintes convenções: Operador Significado Operador Significado + adição ~ not (negação) - subtração = igual * multiplicação != diferente / divisão | or (AND) <-- atribuição ^ exclusive or (XOR) << deslocamento à esquerda & and (E) >> deslocamento à direita
  • 18. FORMATO DAS INSTRUÇÕES Código de operação (OPCODE) Operando 1 (OP1) OP 2 OP 3... Código de Operação ou OPCODE - identifica a operação a ser realizada pelo processador. É o campo da instrução cuja valor binário identifica (é o código binário) da operação a ser realizada. Este código é a entrada no decodificador de instruções na unidade de controle. Cada instrução deverá ter um código único que a identifique. Operando(s) - é o campo da instrução cujo valor binário sinaliza a localização do dado (ou é o próprio dado) que será manipulado (processado) pela instrução durante a operação. Em geral, um operando identifica o endereço de memória onde está contido o dado que será manipulado, ou pode conter o endereço onde o resultado da operação será armazenado. Finalmente, um operando pode também indicar um Registrador (que conterá o dado propriamente dito ou um endereço de memória onde está armazenado o dado). Os operandos fornecem os dados da instrução. Obs: Existem instruções que não tem operando. Ex.: Instrução HALT (PARE). Há diversos formatos de instruções, com características particulares, vantagens e desvantagens. O conjunto de instruções de uma máquina pode ser constituído por instruções de diversos formatos. Esta flexibilidade permite a escolha da instrução adequada para aplicação em cada caso. Conjunto de instruções pode ser analisado sob alguns aspectos, por exemplo: - quantidade de instruções - quantidade de operandos - modo de endereçamento (é a forma de sinalizar a localização de um dado - endereçamento imediato, direto, indireto, indexado... será abordado na próxima seção - Modos de Endereçamento). Exemplos: ADD OP1 OP2 => (OP1) <-- (OP1) + (OP2) Soma conteúdo de OP1 e OP2 e armazena o resultado em OP1 ADD OP1 OP2 OP3 => (OP3) <-- (OP1) + (OP2) Soma conteúdo de OP1 e OP2 e armazena o resultado em OP3 ADD OP1 => (ACC)<--(ACC) + (OP1) Soma conteúdo de OP1 e ACC e armazena o resultado em ACC LTR - Linguagem de Transferência entre Registradores (register transfer language) A LTR é utilizada para sinalizar o processamento de uma operação, mostrando o que acontece com os registradores e posições de memória como resultado do processamento de uma instrução. · caracteres alfanuméricos significam abreviaturas de nomes de registradores ou posições de memória (ex: REM. MP) · parênteses indicam conteúdo, no caso de registradores, ou o valor é um endereço na MP. · seta indica atribuição (transferência de conteúdo entre registradores ou entre registrador e memória principal) · Ex.: REM <--- (CI) - o conteúdo do CI é copiado para o REM · Ex.: RDM <--- (MP(REM)) - o conteúdo da célula da MP cujo endereço está no REM é copiado para o RDM TAMANHO (EM BITS) DE UMA INSTRUÇÃO PROBLEMA DE PROJETO: Escolha do tamanho das instruções Da escolha do tamanho das instruções depende :
  • 19. · tamanho da memória · tamanho das células da MP · velocidade de acesso · organização do barramento de dados. A solução desta equação é complexa. Basicamente, o projetista decide entre fatores como economia de espaço em memória, processamento mais rápido das instruções ou um conjunto de instruções mais completo e poderoso: Maior Conjunto Instruções --> requer muitas instruções (para atendimento a diferentes aplicações) --->muitos bits por opcode --> requer instruções completas ---> muitos bits para operandos --> requer hardware mais complexo ---> processamento de instruções mais lento CÓDIGO DE OPERAÇÃO (OPCODE) O número de bits do código de operação depende de quantas instruções tem o set de instruções da máquina. Ex: um processador com 256 instruções (ou 28 instruções) teria necessidade de 8 bits para representar o código de operação. Lembre-se que cada instrução precisa ter o seu código binário! Um processador pode ter suas instruções com código de operações com tamanho fixo ou variável. Códigos de operação com tamanho fixo são mais fáceis de implementar e manipular durante a execução de programas. Se uma máquina com código de operação de tamanho fixo tem N instruções, serão necessários n bits para representar suas instruções, sendo: 2n = N Desta forma, o número de bits necessários ao opcode será: n = log2 N No caso do microprocessador Intel 8080, o código de operação tem 8 bits e são implementadas 78 instruções. Com 8 bits no código de operação, teria sido possível implementar 28 = 256 instruções. Assim, o projetista poderia ter utilizado apenas 7 bits, no entanto preferiu utilizar 8 bits, mantendo uma "folga" e os códigos não utilizados ficaram como reserva para futuras implementações em outros processadores da mesma "família", o que permitiu manter a compatibilidade entre os processadores da “família”. No Intel 8080, o código de operações varia apenas os 6 bits mais significativos; os 2 bits menos significativos são utilizados para indicações da especificidade da instrução, conforme veremos na seção sobre o Conjunto de Instruções do Intel 8080. Outros sistemas possuem código de operação de tamanho variável. Por exemplo, o IBM/370 tem: ---> 166 instruções com código de operação de 8 bits. ---> 11 instruções com código de operação de 16 bits. Opcodes com tamanho variável permitem codificar maior quantidade de instruções com menos bits e permitem projetar um compromisso mais flexível entre a quantidade de bits do opcode e do(s) campo(s) de operando(s). Esta organização é bastante comum.
  • 20. OPERANDO A função do operando é identificar / localizar o dado que será processado. Quanto ao número de operandos, podemos considerar: Um maior número de operandos permite maior completeza, por possibilitar ter todos os operandos necessários à indicação dos dados para a realização de operação. Em conseqüência, embora mais operandos ocupem mais memória, será necessário uma menor quantidade de instruções em um programa, ocupando menor espaço em memória. Com um menor número de operandos, as referências ficam menos completas, e serão necessárias mais instruções no programa. No entanto, tendo menos operandos, o espaço ocupado na memória pelos operandos será menor. A decisão sobre o número de operandos é tomada pelo projetista, levando em conta esse balanço. Como geralmente o operando contém um endereço da MP, o número de bits ocupado por um operando depende do número de células endereçáveis de memória, ou seja, é preciso saber quantas células podem ser endereçadas na memória principal para saber quantos bits serão necessários para o operando. Obs.: desta forma, pode-se concluir que o número de bits de cada operando será igual ao número de bits do REM e do CI. Por simplicidade, neste curso vamos considerar que todas as instruções de uma máquina tem o mesmo tamanho. Esta simplificação muitas vezes não corresponde à realidade de uma máquina comercial, mas atende aos objetivos deste curso. Exercício 1: (Adaptado do livro Organização Estruturada de Computadores, A. Tanembaum, pág. 250) Uma certa máquina tem endereços de 6 bits e instruções de 16 bits. Algumas das instruções deste computador tem um operando e outras tem dois operandos. Se há n instruções de dois operandos, qual é o número máximo de instruções de um operando? Exercício 2: As instruções de um certo computador ocupam sempre 1 (uma) palavra de 36 bits. O conjunto de instruções deste computador deve incluir todas as seguintes instruções: a) 7 instruções com 3 operandos (duas referências à memória e uma a registrador); b) 500 instruções com 2 operandos (uma referência à memória e uma a registrador); c) 50 instruções com 1 operando (uma referência à memória). Considerando que esta máquina tem endereços de 15 bits e 8 registradores gerais, elabore um esquema de codificação para os códigos de instrução. Exercício 3: Comente quais as conseqüências se, no problema anterior, fosse alterado o item a) para ... 8 instruções ... CICLO DE INSTRUÇÃO Primeiramente, o programa a ser executado precisa ser carregado (armazenado) na MP, o que é feito pelo Sistema Operacional, que também se encarrega de informar à UCP onde o programa começa. O Sistema Operacional faz isto "setando" o Contador de Instruções (isto é, colocando no CI o endereço da MP onde está localizada a primeira instrução daquele programa). A partir daí se realiza o processamento automático, executando-se as instruções seqüencialmente
  • 21. uma a uma, o que é obtido através do incremento automático do CI. Obs: Se o programa inclui uma instrução de desvio, o fluxo seqüencial pode ser alterado. A UCP não diferencia um dado de uma instrução. A UCP não "executa" dados devido ao conteúdo do CI, que é incrementado pelo tamanho da instrução e fica sempre apontando para a próxima instrução. Mas se em um programa houver uma instrução de desvio para um endereço em que esteja contido um dado, a UCP interpretaria o valor binário do dado como se fosse o código de uma instrução, tentaria executar e o resultado seria imprevisível. Ciclo de Instrução 1 - A UCP busca o código de operação na MP e armazena no Registrador de Instrução da UC Fase: Busca da instrução - (Instruction Fetch) - ciclo de busca RI <--- (CI) Micro-operações: - a UC lê o conteúdo do CI (endereço da próxima instrução ) e coloca o endereço no REM; - a UC envia um sinal à memória de operação de leitura (memory read), via barramento de controle; - a memória lê o endereço que está no REM, via barramento de endereços, e busca o conteúdo da célula referenciada; - a memória coloca no RDM, via barramento de dados, o conteúdo da célula lida; - a memória envia à UC, via barramento de controle, um sinal de "leitura concluída"; - a UC transfere o código de operação (o conteúdo do RDM) ao RI. 2 - A UC (decodificador de instruções) decodifica o Código de Operação. Fase: Busca da instrução - (Instruction Fetch) - ciclo de busca Micro-operações: - o Decodificador de Instruções decodifica o opcode; - o Decodificador de Instruções determina quantas células a instrução ocupa; - a UC incrementa o CI para apontar para a próxima instrução: CI <--- (CI + n), onde n = nº de células que a instrução ocupa. - a UC incrementa o REM para apontar para o operando: REM <--- (REM + 1); 3 - A UC busca (se houver) o(s) operando(s) Fase: Busca de operandos (Operand Fetch) - ciclo de execução RI <--- (Op) Micro-operações: - a UC envia um sinal à memória de operação de leitura (memory read), via barramento de controle; - a memória lê o endereço que está no REM, via barramento de endereços, e busca o conteúdo da célula referenciada; - a memória coloca no RDM, via barramento de dados, o conteúdo da célula lida; - a memória envia à UC, via barramento de controle, um sinal de "leitura concluída"; - a UC transfere o operando (o conteúdo do RDM) ao RI. * Se o operando é o próprio dado: -- a UC transfere o dado (o conteúdo do RDM) ao ACC. -- vai para operação 4; caso contrário: * Se o operando é um ponteiro para onde o dado está armazenado: -- a UC coloca no REM o endereço de onde o dado está armazenado; -- a UC envia um sinal à memória de operação de leitura (memory read), via barramento de controle; -- a memória lê o endereço que está no REM, via barramento de endereços, e busca o conteúdo da célula referenciada; -- a memória coloca no RDM, via barramento de dados, o conteúdo da célula lida; -- a memória envia à UC, via barramento de controle, um sinal de "leitura concluída";
  • 22. -- a UC transfere o dado (o conteúdo do RDM) ao ACC; -- vai para operação 4. 4 - A UC comanda a execução da instrução (a operação é executada sobre o dado). Fase: Execução da instrução - ciclo de execução - UAL executa a instrução. 5 - Se o programa tiver terminado, Para; senão, volta ao passo 1. Exemplo 1: Formato da Instrução de Máquina: Código Operação Operando 8 bits 8 bits tamanho da instrução = 16 bits Conteúdo da Memória Principal: MP ENDEREÇO CONTEÚDO da CÉLULA 00 2A 01 0C 02 2B 03 04 04 56 ..... ..... 0C 01 0D 00
  • 23. Nesta máquina, considere que o código de operação 2A significa LDA Op ==> ACC <--- (Op) Obs.: A instrução do exercício LDA Op (LDA é um mnemônico para "load accumulator") significa "carrega no acumulador o conteúdo da posição de memória indicada no operando". Solução: Neste exemplo: O CI tem 8 bits porque o operando tem 8 bits; o mapa de memória também mostra isso, com os endereços ocupando 2 dígitos hexadecimais (cada dígito hexadecimal requer 4 bits). A célula de memória tem 8 bits, conforme vemos pelo mapa de memória, em que os conteúdos das células ocupam 2 dígitos hexadecimais. O RI tem 16 bits porque a instrução tem 16 bits. ACC - não daria para assegurar porque depende do tamanho da palavra; vamos assumir 8 bits, de vez que como o operando, o opcode e a célula têm 8 bits, o RDM e o Acumulador provavelmente também terão 8 bits A instrução LDA Op ocupará 2 células, logo o incremento do CI = n = 2 Vamos acompanhar o processamento da instrução LOAD (2A neste exemplo) => colocar o conteúdo do endereço indicado pelo operando no ACC (carrega dado no acumulador); T0, T1 e T2 representam os diversos estados dos registradores (nos respectivos tempos do ciclo de busca da instrução). n=2 (2 acessos à MP para buscar instrução) CICLO de TEMPO CI ACC REM RDM RI (16 bits) OPERAÇÃO T0 00 x 00 2A 2Axx Lê opcode T1 02 x 01 0C 2A0C Lê operando T2 02 0C 01 0C 2A0C Carrega Acumulador Obs.: usamos um x para indicar que o conteúdo de uma célula ou de parte da célula não importa ("don't care") e não é considerado (é desprezado) para a presente operação, podendo ser nulo ou então conter o resultado de uma operação anterior. Exemplo 2: Considerando a mesma máquina do exemplo anterior, qual seria o processamento da instrução LDIA Op ==> ACC <--- ((Op)) Obs.: A instrução do exercício LDIA Op (LDIA é um mnemônico para "load accumulator indirect") significa "carrega no acumulador o conteúdo da posição de memória apontada pela posição indicada no operando". Portanto, a posição de memória indicada pelo Operando é um ponteiro para a posição onde está o dado e existe uma indireção. Esse assunto será tratado em detalhe na próxima seção - Modo de Endereçamento. CICLO de TEMPO CI ACC REM RDM RI (16 bits) OPERAÇÃO T0 00 x 00 2A 2Axx Lê opcode T1 02 x 01 0C 2A0C Lê operando T2 02 x 0C 01 2A0C Lê dado T3 02 01 0C 01 2A0C Carrega dado no acumulador
  • 24. Exemplo 3: Numa máquina de 2 operandos, a MP tem 256 células com 20 bits, o RDM tem 20 bits e cada instrução ocupa 1 célula. Em seu conjunto de instruções, o código binário 6 tem o seguinte significado: 6 => ADD Op1, Op2 ==> (Op1) <---- (Op1) + (Op2) - soma o conteúdo da posição de memória indicada em Op1 com o conteúdo da posição de memória indicada em Op2 e coloca o resultado na posição de memória indicada em Op1. Mostre o conteúdo dos registradores da UCP e das posições de memória que se alterarem após a execução da instrução dada. Mapa da memória: ENDEREÇO MP (T1) 10 6B2B3 .... ..... B2 03210 B3 04591 .... ..... Solução: A MP tem 256 células = 28 células ----> REM = 8 bits ----> CI = 8 bits Célula = 20 bits e 1 instrução = 20 bits RDM = 20 bits e RI = 20 bits Operando = 8 bits ---> 8 bits x 2 operandos = 16 bits (cada instrução tem 2 operandos); logo, o opcode tem 4 bits. Cada instrução ocupa uma célula, logo n=1 (o incremento do CI será sempre 1). Formato da instrução: opcode operando 1 operando 2 (20 bits) 4 bits 8 bits 8 bits - CI REM RDM ACC OPERAÇÃO T0 10 10 6B2B3 0 Lê instrução (opcode + 2 operandos) T1 11 B2 03210 03210 Lê 1º dado T2 11 B3 04591 077A1 Lê 2º dado T3 11 B2 077A1 077A1 Executa instrução CÁLCULO DO VALOR DO ACUMULADOR 03210 04594+ -------- 077A1 Resp.: A posição de memória B2 será alterada para o valor 077A1. Nenhuma outra posição de memória é alterada. Exemplo 4: Máquina com Instruções de 3 operandos Resolver a expressão: X = A * (B + C * D - E/F)
  • 25. Conjunto de Instruções: ADD X,A,B ===> (X) <--- (A) + (B) => soma conteúdo das posições de memória A e B e coloca o resultado em X SUB A,B,X ===> (X) <--- (A) - (B) => subtrai conteúdo da posição de memória B da A e coloca o resultado em X MULT A,B,X ===> (X) <--- (A) * (B) => multiplica conteúdo das posições de memória A e B e coloca o resultado em X DIV A,B,X ===> (X) <--- (A) / (B) => divide conteúdo da posição de memória A pela B e coloca o resultado em X Solução: MULT C, D, X ----> (X) <--- (C) * (D) DIV E, F, T ------> (T) <--- (E) / (F) (sendo T uma variável temporária - nenhuma variável deve ser sobrescrita) ADD B, X, X ----> (X) <--- (B) + [(C) * (D)] SUB X, T, X -----> (X) <--- (B) + [(C) * (D)] - [(E) / (F)] MULT A, X, X ----> (X) <--- (A) * {(B) + [(C) * (D)] - [(E) / (F)]} Obs: o número de instruções é igual ao número de operações da expressão. Exemplo 4: Máquina com Instruções de 2 operandos Resolver a expressão: X = A * (B + C * D - E/F) Conjunto de Instruções: ADD X,A ===> (X) <--- (X) + (A) ===> Soma o conteúdo de X e A e coloca o resultado em X SUB X,A ===> (X) <--- (X) - (A) MULT X,A ===> (X) <--- (X) * (A) DIV X,A ===> (X) <--- (X) / (A) MOV X,A ===> (X) <--- (A) ==> copia o conteúdo de A para X. Obs.: observar que, ao não dispor do 3º operando (o qual indica uma terceira posição de memória, onde será colocado o resultado), o conteúdo do 1º operando é sobrescrito (portanto, é destruído) pela instrução, pois o resultado vai para ele; desta forma, é necessário uma outra instrução, para mover o conteúdo de uma posição de memória para outra posição, de forma a permitir salvar o conteúdo de uma variável e também mover o resultado, se necessário: Solução: MOV X, C ==> (X) <--- (C) (copiou o conteúdo de C para X) MULT X, D ==> (X) <--- (C) * (D) (desta forma não se perde o conteúdo de C) MOV T, E ==> (T) <--- (E) (copiou o conteúdo de E para uma variável temporária T) DIV T, F ==> (T) <--- (E) / (F) ADD X, B ==> (X) <--- (B) + [(C) * (D)] SUB X, T ==> (X) <--- (B) + [(C) * (D)] - [(E) / (F)] MULT X, A ==> (X) <--- (A) * {(B) + [(C) * (D)] - [(E) / (F)]} OBS: o número de instruções é maior que o número de operações da expressão Exemplo 5:
  • 26. Máquina com Instruções de 1 operando Resolver a expressão: X = A * (B + C * D - E/F) Conjunto de Instruções: ADD X ==> ACC <--- ACC + (X) ==> soma os conteúdos do acumulador e de X e coloca o resultado no acumulador. SUB X ==> ACC <--- ACC - (X) MPY X ==> ACC <--- ACC * (X) DIV X ==> ACC <--- ACC / (X) LOAD X ==> ACC <---- (X) ==> carrega o conteúdo de X no acumulador STORE X ==> (X) <--- ACC ==> salva o conteúdo do acumulador na posição de memória X. Obs.: Observe que, ao dispor de apenas 1 operando (portanto, teria a indicação de apenas 1 dado da operação), o 2º dado e o local onde será colocado o resultado são substituídos pelo ACUMULADOR que funciona como um OPERANDO IMPLÍCITO. O conteúdo do acumulador é sobrescrito (destruído) pela instrução, pois o resultado vai para ele; desta forma, são necessárias duas outras instruções, para carregar o conteúdo de uma posição de memória para o acumulador e para salvar o conteúdo do acumulador para outra posição de memória, de forma a permitir mover dados e o resultado da instrução, entre o acumulador e a a memória: Solução: LOAD E ==> ACC <--- (E) (carregou o conteúdo de E no acumulador) DIV F ==> ACC <--- (E) / (F) (não se perde o conteúdo de E ou F) STORE X ==> (X) <--- (E) / (F) (salvou o conteúdo do acumulador em X) LOAD C ==> ACC <--- (C) (carregou o conteúdo de C no acumulador) MULT D ==> ACC <--- (C) * (D) (não se perde o conteúdo de C ou D) ADD B ==> ACC <--- (B) + [(C) * (D)] SUB X ==> ACC <--- (B) + [(C) * (D)] - [(E) / (F)] MULT A ==> ACC <--- (A) * {(B) + [(C) * (D)] - [(E) / (F)]} STORE X ==> (X) <--- (A) * {(B) + [(C) * (D)] - [(E) / (F)]} (salva o conteúdo do acumulador na posição de memória X) OBS: o número de instruções é maior que o número de operações da expressão. Não foi necessário utilizar qualquer variável temporária. Exercício 6 Compare os exemplos anteriores em relação ao tempo de execução, número de instruções e memória. Experimente resolver as expressões executando as instruções em ordem diferente, e seus efeitos em relação ao número de instruções e de variáveis temporárias usadas. MODOS DE ENDEREÇAMENTO MODO IMPLÍCITO (Implied Addressing) A função da instrução traz implícito o endereçamento. Exemplo No microprocessador Intel 8080 essas instruções ocupam apenas 1 byte; são as seguintes as instruções com endereçamento implícito: STC (set carry flag) - "seta" o bit de carry e CMC (complement carry) - complementa o valor do bit de carry; - o operando implícito é o carry flag. RAL (rotate accumulator left), RAR (rotate accumulator right) - instruções de deslocamento de bits, à esquerda e à direita - o operando implícito é o acumulador; RLC (rotate accumulator left through carry) e RRC (rotate accumulator right through carry) -
  • 27. instruções de deslocamento de bits, à esquerda e à direita, através do carry flag - os operandos implícitos são o acumulador e o carry flag; DAA (decimal adjust accumulator) - instrução para aritmética em BCD - o operando implícito é o acumulador. MODO IMEDIATO O valor do campo operando é o próprio dado. É usado para trabalhar com valores constantes. O operando é dito operando imediato (o operando é o próprio valor a ser operado, ou seja, é o próprio dado a ser processado). Vantagem O operando é obtido durante o ciclo de busca, em apenas 1 acesso. Não é necessário fazer nenhum acesso à MP no ciclo de execução, acarretando maior rapidez na execução. Desvantagens a) O tamanho do dado fica limitado ao número de bits do operando (campo operando da instrução). A limitação de tamanho do campo operando reduz o valor máximo do dado que pode ser armazenado. No Intel 8080, o campo Operando tem 8 bits, portanto o maior valor deste campo será limitado a 28 = 256. Existem instruções que permitem carregar doublewords, isto é, palavras duplas que ocupam 2 células de memória, em que o maior valor será limitado a 216 = 65.536 (64 k). b) Este modo de endereçamento não permite flexibilidade para alterar dados que variam a cada execução do programa, portanto não é adequado para variáveis repetidamente operadas com diferentes valores a cada execução do programa. Utilização - Inicialização de contadores - Constantes - Armazenamento de ponteiros em registradores - Indicação de quantidade de posições em operações de deslocamento de bits (multiplicação e divisão) Exemplos Obs.: Instruções do Intel 8080. LDI Op ==> ACC <--- Op = carrega o valor (hexadecimal) do operando no acumulador. LDI 50 (load immediate) ==> ACC <---- 50 (carrega o valor hexadecimal 50 no acumulador) LDI 'Op' ==> ACC <--- 'Op' = carrega o caractere representado no operando no acumulador. LDI 'C' (load immediate) ==> ACC <---- C (carrega o caractere C (ASCII 43) no acumulador) JMI Op (jump immediate) ==> CI <--- Op = carrega o CI com o valor (hexadecimal) do operando JMI 1000H ==> CI<--- 1000 = causa um desvio para o endereço 1000 (hexadecimal) Obs.: O Intel 8080 armazena o byte menos significativo do operando na posição de memória que segue o opcode e o byte mais significativo do operando na segunda posição de memória que segue o opcode. MVI R, Op (move immediate) ==> R <--- Op = move o valor do operando para o registrador R MVI B, 7AC1 ==> B <--- 7AC1 (como o operando é de 16 bits, B estará representando o par B, C) CPI ’C’ (compare immediate) ==> compara os valores do ACC com o caractere ‘C’ (ASCII 43) LXI Op (load register pair immediate) ==> RP <--- Op = carrega o valor do operando em um par
  • 28. de registradores. LXI SP, 31FFH ==> SP <--- 31FF (carrega o valor hexadecimal 31FF no Ponteiro de Pilha - SP) Nota: No Intel 8080, as instruções com endereçamento imediato são sempre codificadas com mnemônicos de 3 letras terminados pela letra I. Exemplos instrução de soma ==> mnemônico para endereçamento direto = ADD instrução de soma ==> mnemônico para endereçamento imediato = ADI; instrução “move” ==> mnemônico para endereçamento direto = MOV instrução “move” ==> mnemônico para endereçamento imediato = MVI; instrução “load” (carrega) ==> mnemônico para endereçamento direto): LDA instrução “load” ==> mnemônico para endereçamento direto = LDI Obs.: No Intel 8080, quase todas as instruções imediatas usam o acumulador como operador implícito. As exceções são: MVI (move immediate) - pode mover o dado para qualquer registrador de trabalho ou posição de memória; LXI (load register pair immediate) - move um dado de 16 bits (geralmente um endereço) para qualquer par de registradores. MODO DIRETO O valor do campo operando indica o endereço do dado na MP. No Intel 8080, como um endereço requer 16 bits, o operando (no modo direto) terá 16 bits, ocupando 2 células e as instruções no modo de endereçamento direto terão 3 bytes. Vantagens a) É aplicado em mais situações que o modo imediato; b) Requer apenas uma referência à memória para busca do dado (além de uma para a busca da instrução), sendo mais rápido que o modo indireto. Desvantagens a) Limitação do endereço da MP que pode ser indicado pelo tamanho do campo operando. b) É mais lento que o modo imediato. Utillização Quando o dado varia de valor a cada execução. Exemplos de Instruções do Intel 8080: LDA Op (”load accumulator”), sendo Op um endereço na memória ==> ACC <--- (Op) (carrega o conteúdo da posição de memória indicada pelo operando no acumulador). LDA 978A ===> ACC <--- (978A) = carrega no acumulador o conteúdo da posição de memória 978A. JMP Op ("jump") ==> CI <--- (Op) JMP 1000H ==> CI<--- (1000H) = causa um desvio para o endereço contido nas posições 1000 e 1001 (hexadecimal) da memória, carregando o conteúdo das posições 1000 e 1001H no CI Obs: como o CI contém 16 bits (um endereço), serão necessárias DUAS células de memória (uma célula contém 8 bits), o que requer dois ciclos de busca à memória.
  • 29. MOV R, Op ==> R <--- (Op) MOV B, 7AC1 ==> B <--- (7AC1), move o conteúdo da posição de memória (8 bits) indicada pelo operando - 7AC1 - para o registrador B (8 bits). Exercício: Comparar o efeito das instruções acima no modo direto com as instruções equivalentes no modo imediato, em termos de acessos à memória. Resp: No modo de endereçamento direto, são necessários mais de 1 acessos à MP para a busca do dado, sendo 1 no ciclo de busca para busca do operando e pelo menos 1 no ciclo de execução para a busca do dado propriamente dito. No modo imediato, é necessário apenas um acesso à memória no ciclo de busca para a busca do dado (o operando é o próprio dado). Não é necessário nenhum acesso de busca à memória no ciclo de execução. MODO INDIRETO O campo operando contém um endereço de memória cujo conteúdo é o endereço do dado a ser operado. Portanto, há um duplo endereçamento. O endereço intermediário é chamado ponteiro (“pointer”) DESENHO (a incluir) Exemplo: LDID Op ==> ACC <--- ((Op)) São necessários 3 ou mais acessos à memória: 1 para buscar o opcode, 1 (ou 2, quando for uma referência à memória) para buscar o operando (Op) e mais 1 para buscar o dado ((Op)) propriamente dito (ou 2, quando o dado for um endereço de memória; por exemplo, quando for uma instrução de desvio). Vantagem a) Permite implementar estruturas de organização de dados mais complexas, mais sofisticadas. b) Elimina a limitação de células endereçáveis. Desvantagem Requer maior quantidade de acessos à MP para completar o ciclo de execução da instrução, acarretando que o tempo requerido para a execução da instrução é maior. Obs.1: É possível haver várias indireções. Em algumas máquinas, existe 1 bit que sinaliza no caso de existirem várias Indireções. Enquanto este bit for 0, continua com as indireções, até encontrá-lo ligado. Obs.2: O Intel 8080 somente dispõe de instruções com modo de endereçamento indireto usando registradores como ponteiro. Os exemplos dessa aplicação são apresentados no item sobre ENDEREÇAMENTO POR REGISTRADOR. Utilização Manutenção de ponteiro de dados Exemplo: Relação de dados a serem movimentados para novas posições de memória (por exemplo, elementos de vetores), basta modificar o valor da célula endereçada pela instrução (não é necessário mudar o
  • 30. valor do operando). ENDEREÇAMENTO POR REGISTRADOR Existem outros modos de endereçamento, que usam registradores para indicar a posição onde estão os dados. Os modos de endereçamento direto e indireto por registrador funcionam de forma semelhante aos modos de endereçamento direto e indireto vistos anteriormente (em que o operando aponta para uma posição de memória), porém o operando aponta para um registrador (onde está o dado - endereçamento direto - ou então faz referência à memória - endereçamento indireto). Modo por registrador direto O operando aponta para um registrador, o qual contém o dado. Modo por registrador indireto O operando aponta para um registrador, o qual contém um endereço de memória (ponteiro) para o dado. Vantagens Maior velocidade / rapidez de execução - o acesso ao registrador é muito mais rápido que o acesso à memória. Economia de espaço de armazenamento de instrução (o tamanho da instrução é menor porque como são poucos registradores, são menos bits para seus endereços). Desvantagem Não são adequados para transferência de variáveis da MP para ULA. Pequeno número de registradores - se forem muitos os dados endereçados por registrador, os registradores disponíveis podem não ser suficientes. Utilização Implementação de contadores. Exemplo de uso: vetor E(1) ... E (100) Ri contém E ( i ) para incrementar e percorrer o vetor Obs.: No Intel 8080, a identificação do registrador envolvido na operação faz parte do próprio opcode. Exemplos Os exemplos usam instruções do Intel 8080: ADD r (add register) ==> (ACC) <--- (ACC) + (r) - soma o conteúdo do registrador r ao conteúdo do acumulador (endereçamento por registrador, direto) ADD M (add memory) ==> (ACC) <--- (ACC) + ((M)) - soma o conteúdo da posição de memória indicada pelo registrador M ao conteúdo do acumulador (endereçamento por registrador, indireto) INR M (increment memory) ==> ((M)) <--- ((M)) + 1 - incrementa o conteúdo da posição de memória indicada pelo registrador M (endereçamento por registrador, indireto) DCR r (decrement register) ==> (r) <--- (r) - 1 - decrementa o conteúdo do registrador r (endereçamento por registrador, direto) MOV r1, r2 (move register) ==> (r1) <--- (r2) - o conteúdo do registrador r2 é copiado para o
  • 31. registrador r1 (endereçamento por registrador, direto). MOV M, r (move to memory) ==> ((M)) <--- (r) - o conteúdo do registrador r é copiado para a posição de memória cujo endereço está no registrador M (endereçamento por registrador, indireto). MODO INDEXADO O endereço de cada elemento é obtido através da soma do campo Operando com o conteúdo de um registrador (Registrador de Índice). O endereço de cada elemento (por exemplo, de um vetor) é a soma (antes da colocação do endereço no REM) do valor do campo operando com o conteúdo de um registrador (escolhido como registrador índice). Vantagem Rapidez na execução das instruções de acesso aos dados (a alteração dos endereços é realizada na UCP. Utilização Manipulação de estruturas de dados mais sofisticadas (vetores). Obs.: O Intel 8080 não possui nenhuma instrução com modo de endereçamento indexado, o qual somente foi introduzido na família Intel a partir do 8086. Exemplos LDX Ri, Op ==> ACC <--- ((Op) + (Ri)) ADX Ri, Op ==> ACC <--- ACC + ((Op) + (Ri)) MODO BASE + DESLOCAMENTO Utiliza um registrador chamado Registrador de Base, que contém o endereço base na MP e um operando, que contém o deslocamento do dado em relação à base. Utilização É usado para relocação de programas: define endereço inicial da área do programa e o endereço inicial da área de dados (pode ser utilizado um registrador para endereços e um para dados) Nota: Os microprocessadores Intel (após 8086/8) usam registradores específicos como registradores-base. Estes Registradores de Base são utilizados para implementar o endereçamento de memória e a segmentação da memória em páginas de 64 kbytes. Diferenças conceituais entre os modos Indexado e Base + Deslocamento Modo lndexado Acesso a diferentes dados pela alteração do endereço através do registrador-índice, com um único valor no operando. É utilizado para manipulação de estruturas de dados. Modo Base + Deslocamento Um único valor no registrador-base e valores diferentes no campo deslocamento da instrução. É utilizado para relocação de programas.
  • 32. IDENTIFICAÇÃO DO MODO DE ENDEREÇAMENTO DA INSTRUÇÃO O Código de Operação identifica o modo de endereçamento, através de seu mnemônico e do correspondente código binário. Determinados bits no opcode podem indicar o modo de endereçamento ou a instrução pode possuir um campo específico para indicar o modo de endereçamento, através de códigos em bits. O registrador utilizado no endereçamento também pode ser indicado por bits determinados no opcode. Comparação dos Efeitos dos Modos de endereçamento - Exemplo (máquina hipotética) Qual será o valor carregado no acumulador quando forem executadas as seguintes instruções: LDI Op ==> (ACC) <--- Op (modo de endereçamento Imediato) LDA Op ==> (ACC) <--- (Op) (modo de endereçamento direto) LDID Op ==> (ACC) <--- ((Op)) (modo de endereçamento Indireto) LDR Op ==> (ACC) <--- (R) (modo de endereçamento Direto por Registrador) LDIR Op ==> (ACC) <--- ((R)) (modo de endereçamento Indireto por Registrador) LDX Op ==> (ACC) <--- ((Ri) + (Op)) (modo de endereçamento Indexado) LDB Op ==> (ACC) <--- ((Rb) + (Op)) (modo de endereçamento Base + Deslocamento) Conteúdo da memória no início da instrução: ENDEREÇO Conteúdo 0000 opcode 0001 05 0002 00 0003 00 0004 00 0005 30 0006 00 0007 21 xxx 0015 FF xxx 0020 3A xxx 0030 10 Conteúdo dos registradores no início da instrução CI ACC Ri Rb Reg. B Reg. M (HL) 0000 xx 02 10 AC 0015 Resposta: INSTRUÇÃO SIGNIFICADO Cont.do ACC (após exec. da instrução LDI Op (2 (ACC) <--- Op 05
  • 33. bytes) LDA Op (3 bytes) (ACC) <--- (Op) 30 LDID Op (3 bytes) (ACC) <--- ((Op)) 10 LDR Op (1 byte) (ACC) <--- (B) AC LDIR Op (1 byte) (ACC) <--- ((M)) FF LDX Op (3 bytes) (ACC) <--- ((Ri) + (Op)) 21 LDB Op (2 bytes) (ACC) <--- ((Rb) + (Op)) FF Nota: Algumas instruções usam uma combinação de modos de endereçamento. Instrução CALL - endereçamento direto (ou imediato) + por registrador indireto endereçamento direto - especifica o endereço da sub-rotina desejada endereçamento por registrador indireto - é o Ponteiro da Pilha CALL copia (“push”) o conteúdo corrente do CI para uma posição da MP especificada pelo ponteiro da pilha (Stack Pointer). Ver páginas sobre [Pilha] e [Processamento de Sub-rotinas] Efeitos de Temporização dos Modos de Endereçamento O modo de endereçamento afeta o tempo requerido para executar uma instrução e a memória requerida para seu armazenamento Instruções que usam endereçamento implícito ou por registrador são executadas muito rápido, pois trabalham direto com o hardware do processador e seus registradores. A instrução toda pode ser buscada (“fetched”) em um único ciclo de busca (um único acesso à memória). O número de acessos à memória é o mais importante fator no consumo de tempo de execução da instrução. Cada ciclo de acesso à memória busca uma célula e implica em um número variável de estados, cujo tempo de duração depende da frequência do clock. Cada instrução consome um determinado número de ciclos de UCP. Exemplo: A instrução CALL requer 5 acessos à memória, sendo 3 para buscar a instrução (opcode mais operando de 2 bytes) e mais 2 para salvar ("push") o conteúdo (2 bytes) do CI (Program Counter) para o ponteiro da pilha (Stack Pointer).