Curso de Ciências da Computação 1. NÍVEL CONVENCIONAL DE MÁQUINA (Cont.) 1.3. INSTRUÇÕES – Conceitos Básicos Já estudamos anteriormente que os processadores funcionam (ou melhor, o seu hardware funciona) através de ordens simples e básicas, tais como: Efetue a soma de dois números; Mova um dado de um local para outro; Adicione 1 ao valor de um número; Transfira 1 byte de dados da memória para uma porta de saída. Estas ordens são simples porque o hardware não é capaz de manipular diretamente ordens mais complexas. Ainda sabemos que essas ordens são transmitidas ao hardware (componentes do processador) para serem interpretadas e executadas por meio de sinais elétricos que representam ou o bit “1” ou o bit “0”, ou seja, por um conjunto de bits, que chamamos formalmente de instrução de máquina. Todo processador já é fabricado de modo a conter em seu interior um grupo dessas instruções, que são chamadas em bloco de: “conjunto de instruções” (“instruction set”). A escolha das operações que o processador poderá realizar diretamente (ou seja, quais “instruções” irão realizar) e como cada uma delas será realizada, passo a passo, são dois itens importantes no projeto e na fabricação de um processador. Nesse ponto, nos referimos à fronteira entre: O entendimento do programador – que deseja obter solução para seu problema e elabora um programa em uma linguagem que seja próxima de seu entendimento (de sua lógica) contendo operações complexas, em linguagens como: “Pascal”; “C” ou “Java”, e: O hardware do processador – que aceita apenas operações simples para ser executadas. O programador (em linguagem de baixo nível) pode ver e manipular alguns poucos elementos do hardware, como os registradores de dados, a parte de cima da tal fronteira, enquanto outro nível, chamado de microarquitetura (contendo micro-operações e microprogramação), se encarrega de interpretar essas instruções e efetivamente providenciar sua execução, passo a passo (micro-operação por micro-operação). Obs. Existem alguns processadores, no entanto, (p.ex., os de arquitetura RISC) que usam o controle por meio de programação direta no hardware, sem o uso de microprogramação. Fig. 1.3 Instruções passadas aos níveis inferiores ao nível de Máquina convencional. Disciplina: Projeto Lógico de Computadores (5º/6º Sem - 2014). Livro: Andrew S. Tanenbaum Página 1 de 7 Curso de Ciências da Computação Vamos acrescentar um exemplo que deve auxiliar o entendimento sobre o conceito e o papel das instruções de máquina e como, por isso, funcionam os processadores de emprego geral, assim comercialmente denominados. Exemplo 1: Considere uma máquina, um robô, construído de forma a possuir dois braços mecânicos, com terminações capazes de se mover para cima e para baixo (o braço da esquerda e o braço da direita) e cada uma das terminações sendo capaz de girar no sentido horário ou contrariamente ao sentido horário. Os outros movimentos deste Robô são irrelevantes para o exemplo, por isso só mencionaremos oito movimentos. Para que ele possa realizar cada um desses movimentos e tenha flexibilidade de realizar outros mais complexos, projetou-se um conjunto de instruções primitivas (simples) que acionam o hardware (efetivam os movimentos das articulações, braços): cada uma dessas instruções foi identificada por um código numérico de 0 a 7, conforme mostrado na Tabela 1.1. Tabela 1.1 Codificação e descrição de movimentos executados pelo robô no Exemplo 1. Essa máquina pode ser usada por uma empresa, por exemplo, para aparafusar algum objeto em uma parede ou desparafusar; a operação (de aparafusar) pode ser realizada em qualquer posição (como, p.ex., inclinada para baixo, cerca de 45° ou na perpendicular do chão, (90°), usando qualquer um dos dois braços articulados, e assim por diante). Se, em determinado momento, se quiser aparafusar um objeto na perpendicular do chão (90°), pode-se, a partir da posição de repouso do robô (braços estendidos para baixo), comandar a execução de um programa do tipo: Contador A = 1 Contador B = 100 Enquanto contador A < 90 Iniciar Instrução cod. 0 Contador A = contador + 1 Fim Enquanto contador B < 100 Iniciar Instrução cod. 2 Contador B = Contador B + 1 Fim Disciplina: Projeto Lógico de Computadores (5º/6º Sem - 2014). Livro: Andrew S. Tanenbaum Página 2 de 7 Curso de Ciências da Computação A essência do conceito aqui mostrado é apenas a capacidade de a máquina poder realizar operações complexas diferentes (e, pois, uma máquina de emprego geral) usando as mesmas instruções primitivas (da Tabela 1.1), as quais podem ser manipuladas de forma diferente para obterem-se resultados diferentes. O programa mostrado é bastante incompleto, porém sua única finalidade é mostrar a diferença entre uma instrução primitiva, que realiza uma operação básica simples, e uma outra operação, mais complexa, que requer várias instruções básicas (um programa) para ser realizada. Além disso, teremos grande flexibilidade de ações complexas a realizar, pois podemos variar a combinação das primitivas, obtendo-se, com isso, resultados diferentes. Essa é uma das características essenciais dos computadores de emprego geral. Ou seja, possuem um conjunto básico de instruções primitivas e o usuário (programador) pode combina-las de diferentes modos (criar diferentes programas), obtendo diferentes resultados. Assim é que um determinado computador (pode ser um dos sistemas baseados em um processador Pentium 4 ou AMD Athlon XP), com seu conjunto de instruções de máquina (primitivas) pode ser empregada para o desenvolvimento de textos (com o MS Office ou Open Office), mas também pode ser empregado para controlar o fluxo de carros em uma região (controlando a abertura e o fechamento dos sinais de trânsito) e, em determinadas circunstâncias, poderá, também, ser empregado como plataforma para um sistema de controle bancário e outras aplicações. O que se quer demonstrar e que a inteligência e a versatilidade do sistema estão na combinação dessas instruções primitivas (nos programas), no software, visto que o hardware e imutável (pelo menos para o usuário). 1.4. FORMATO DE UMA INSTRUÇÃO DE MÁQUINA Como já estudamos, o conjunto de instruções de um processador define o que ele é capaz de realizar em si, permitindo ao programador do programa compilador escrever seu código de acordo. Lembramos que esta é a razão de, por exemplo, um programa escrito em um programa compilador para “PC” ® não “rodar” em uma plataforma “Apple” ®. As instruções dos processadores são diferentes, por isso o programa deve ser ajustado à plataforma do processador. Uma instrução de máquina deve, então, especificar para o hardware (especificamente a unidade de controle do processador) que determinada operação deve ser realizada (soma de dois números, movimento de um dado, etc.). Em função da interpretação do que é a instrução, a UC, que já possui a sequência de execução (programação) de todas as instruções daquele especifico processador, "dispara" (emite os sinais elétricos de controle correspondentes a cada microação) a sinalização para efetivação das ações subsequentes para a completa execução da operação. A Fig. 1.4 mostra exemplos de diversas operações primitivas que podem redundar em instrução de máquina de um determinado processador. Disciplina: Projeto Lógico de Computadores (5º/6º Sem - 2014). Livro: Andrew S. Tanenbaum Página 3 de 7 Curso de Ciências da Computação Fig. 1.4 Exemplo de operações primitivas típicas. Quais são os elementos requeridos para execução de uma operação? Como eles são projetados para formatar, em binário, uma instrução de máquina? Qual ou quais tipos de dados ela manipulara? Por exemplo, uma operação de somar dois números requer a indicação da operação em si (como ela ocorrera) e a localização dos dados envolvidos: a 1ª parcela, a 2ª parcela e o resultado; é também necessário indicar se os valores são números inteiros ou números fracionários (ponto flutuante – conforme visto em Circuitos Digitais). A resposta a essas e outras questões pertinentes configura o projeto do conjunto de instruções de um determinado processador ou "família" de processadores. O projetista do conjunto de instruções define, então, que operações aquele processador irá realizar e especifica, para cada uma delas, todos os detalhes de identificação e execução da operação, estabelecendo, assim, o formato de cada instrução da máquina. Além disso, é necessário detalhar sua execução, ou seja, criar uma sequência de micro-operações para efetivamente realizar a tarefa. Fig. 1.5 Formato básico de uma instrução de máquina. Fig. 1.6 Três formatos típicos de instrução: (a) instrução sem endereço; (b) instrução de um endereço; (c) instrução de dois endereços. Disciplina: Projeto Lógico de Computadores (5º/6º Sem - 2014). Livro: Andrew S. Tanenbaum Página 4 de 7 Curso de Ciências da Computação A Fig. 1.6 mostra vários formatos típicos para as instruções de nível 2. Em algumas máquinas de nível 2 todas as instruções possuem o mesmo comprimento, já em outras podem existir dois ou três comprimentos. Alem disso, as instruções podem ser mais curtas, do mesmo tamanho ou mais longas do que o comprimento de uma palavra. 1.4.1. Campo Operando (Op.) O “campo operando”, ou “campos operando” (pois pode haver mais de um campo, indicando a localização de mais de um dado ou endereço), de uma instrução indica genericamente o dado que se deseja manipular em um endereço para buscar ou armazenar um dado ou resultado de uma determinada operação. O dado pode estar explicitamente colocado: No próprio campo operando da instrução, ou; Estar armazenado em uma posição de memória, ou ainda: Em um registrador de dados do processador, cujo endereço é o que se encontra no Campo Operando da instrução. Essa diversidade de apresentação do dado na instrução denomina-se genericamente modo de endereçamento. Na prática, o conjunto de instruções definido para um determinado processador ou família de processadores (como é o caso da arquitetura x86) é sempre constituído de uma mistura de formatos diferentes, justamente para permitir a melhor aplicação em cada caso, exceto em arquiteturas do tipo RISC. No que se refere ao Campo Operando, podem-se analisar dois aspectos: Quantidade de operandos (3, 2, 1 e 0 operandos); Modo de endereçamento do dado (modo de interpretação do valor armazenado no campo operando). 1.5. MODOS DE ENDEREÇAMENTO Ao analisarmos o formato básico de instruções de máquina e o ciclo de execução de cada instrução, concluindo que: a) O endereçamento de uma instrução é sempre realizado através do valor armazenado no Contador de Instrução (Cl). Todo ciclo de instrução é iniciado pela transferência da instrução para o Rl – Registrador de Instrução (usando-se o endereço contido no Cl). b) Toda instrução consiste em uma ordem codificada (código de operação), para o processador executar uma operação qualquer sobre dados. No contexto da interpretação de uma instrução, o dado pode ser um valor numérico, um caractere alfabético, um endereço (instrução de desvio). c) A localização do(s) dado(s) pode estar explicitamente indicada na própria instrução por um ou mais conjuntos de bits, denominados campo do operando, ou implicitamente (quando o dado estiver armazenado no único registrador existente no processador para este fim, como era o caso quando os processadores possuíam o ACC - acumulador). Disciplina: Projeto Lógico de Computadores (5º/6º Sem - 2014). Livro: Andrew S. Tanenbaum Página 5 de 7 Curso de Ciências da Computação Todos os exemplos apresentados até esse ponto definiram o campo operando como contendo o endereço onde esta localizado o dado referido na instrução; no entanto, essa não é a única maneira de indicar a localização de um dado, havendo outros modos de endereçamento. A existência de vários métodos para localizar um dado que está sendo referenciado em uma instrução se prende a necessidade de dotar os sistemas de computação da necessária flexibilidade no modo de atender aos diferentes requisitos dos programas, o que é uma característica típica de arquiteturas ClSC. Algumas relações possíveis entre comprimento de instrução e comprimento de palavra são mostradas na Fig. 1.7. Fig. 1.7 Algumas relações possíveis entre comprimento de uma instrução e comprimento de uma palavra. Para justificar a existência de muitos métodos de indicar a localização do dado referenciado na instrução pode-se citar o caso de instruções em que e ineficiente usar 0 dado armazenado na MP, como, por exemplo, o de um contador, o qual tem um valor fixo inicial e, durante a execução do programa, e sistematicamente atualizado. Nesse caso, melhor seria se 0 referido contador (dado) fosse inicialmente transferido para um registrador, dentre os que estivessem disponíveis no processador ela permanecesse (sendo diretamente atualizado no processador até o final da execução do programa, caso contrário poderia acarretar um considerável gasto de tempo para os repetidos ciclos de leitura e gravação). A manipulação de vetores acarreta a necessidade de se estabelecer um método eficaz de endereçamento para variáveis que ocupam posições contiguas de memória, ocasionando outro tipo de necessidade de indicar se o dado de forma diferente. E assim por diante. Disciplina: Projeto Lógico de Computadores (5º/6º Sem - 2014). Livro: Andrew S. Tanenbaum Página 6 de 7 Curso de Ciências da Computação Dentre os diversos modos de endereçamento desenvolvidos para processadores, os principais são: • imediato; • direto; • indireto; • por registrador; • indexado; • base mais deslocamento. A existência de muitos modos de endereçamento de dados em um mesmo conjunto de instruções e típico de arquiteturas ClSC, pois sem duvida aumenta a complexidade da decodificação de cada instrução e aumenta a quantidade delas, com isso acarretando todas as desvantagens já mencionadas quando analisamos a largura do campo código de operação. Nem todos esses modos estão incluídos nos conjuntos de instruções dos processadores contemporâneos, mas devem ser descritos não só por razões históricas, mas para percepção do processo evolutivo da tecnologia. Disciplina: Projeto Lógico de Computadores (5º/6º Sem - 2014). Livro: Andrew S. Tanenbaum Página 7 de 7