1. NÍVEL CONVENCIONAL DE MÁQUINA 1.1. VISÃO GERAL DO
Transcrição
1. NÍVEL CONVENCIONAL DE MÁQUINA 1.1. VISÃO GERAL DO
Curso de Ciências da Computação 1. NÍVEL CONVENCIONAL DE MÁQUINA Relembrando a nossa matéria de Arquitetura de Computadores, a arquitetura de Computadores se divide em vários níveis como já estudamos anteriormente. Ou seja: o Nível 0 (Nível de Lógica Digital) e o Nível 1 de Microprogramação (Linguagem de Baixo nível). Chegou a hora de tocarmos no nível Convencional de Máquina (ou seja, Nível de Arquitetura de Conjunto de Instruções). . 1.1. VISÃO GERAL DO NÍVEL A tecnologia de computadores fez um progresso incrível nos aproximadamente 65 anos desde que foi criado o primeiro computador eletrônico de uso geral. Hoje, menos de 1000 dólares compram um computador pessoal com maior desempenho, mais memória principal e mais espaço de armazenamento em disco que um computador comprado em 1980 por um milhão de dólares. Essa rápida taxa de aperfeiçoamento vem de avanços na tecnologia usada para construir computadores e da inovação no projeto de computadores. Disciplina: Projeto Lógico de Computadores (5º/6º Sem - 2014). Livro: Andrew S. Tanenbaum Página 1 de 5 Curso de Ciências da Computação Embora os aperfeiçoamentos tecnológicos tenham sido bastante regulares, o progresso que surge de melhores arquiteturas de computadores e muito menos consistente. O crescimento no desempenho de microprocessadores desde meados da década de 1980 tem sido substancialmente maior que nos anos anteriores, como mostra o gráfico de desempenho SPECint. Gráfico. 1.1 Esse gráfico representa o desempenho relativo medido pelos benchmarks SPECint, com a base unitária correspondendo a um VAX11/780 (de 1984). O desempenho de máquinas mais novas é estimado por um fator de escala que relaciona o desempenho para duas versões diferentes de SPEC (por exemplo, SPEC92 e SPEC95). Antes da metade da década de 1980, o crescimento no desempenho de microprocessadores era orientado em grande parte pela tecnologia e aumentava em media cerca de 35% ao ano. 1.1.5. A evolução da tarefa do projetista de computadores Na década de 1960, a forma dominante de computação se Iimitava a grandes mainframes máquinas que custavam milhões de dólares e eram armazenadas em salas de computação com vários operadores supervisionando seu suporte. As aplicações típicas incluíam o processamento de dados comerciais e a computação científica em grande escala. Os anos 70 presenciaram o nascimento do minicomputador, uma máquina de dimensões menores, dedicada inicialmente a aplicações em laboratórios científicos, mas que logo ampliou seus limites, à medida que a tecnologia do compartilhamento de tempo diversos usuários compartilhando um computador interativamente pela utilização de terminais independentes - se disseminou. Na década de 1980, surgiu o computador de mesa (desk Top) baseado em microprocessadores, na forma de computadores pessoais e de estações de trabalho. Disciplina: Projeto Lógico de Computadores (5º/6º Sem - 2014). Livro: Andrew S. Tanenbaum Página 2 de 5 Curso de Ciências da Computação O computador de mesa de um único usuário substituiu o compartilhamento de tempo e levou ao surgimento de servidores - computadores que forneciam serviços em maior escala, tais como armazenamento e acesso confiável a arquivos em longo prazo, maior quantidade de memória e maior capacidade de computação. Na década de 1990, surgiram: a Internet e a WWW (World Wide Web), os primeiros dispositivos bem-sucedidos como computadores de mão (assistentes digitais pessoais ou PDAs) e também os aparelhos eletrônicos digitais de alto desempenho, desde videogames até os telefones celulares. Os projetistas de Computadores fizeram história liderando esta evolução, mas a arquitetura dentro desta evolução continua basicamente a mesma. 1. O projetista utiliza uma solução combinada de hardware/software que inclui algum hardware personalizado e um núcleo de processador embutido que é integrado ao hardware personalizado, frequentemente no mesmo chip. 2. O projetista usa software personalizado funcionando em um processador embutido comercial. 3. O projetista utiliza um processador de sinais digitais e software personalizado para o processador. Os processadores de sinais digitais (DSPs - digital signal processors) são processadores especialmente adaptados para aplicação de processamento de sinais. Em suma: Um sistema de computação, nada mais é do que um conjunto de componentes integrados para funcionar com se fossem um único elemento e que têm por objetivo realizar manipulações com dados, isto é, realizar alguns tipos de operações com os dados de modo a obter uma informação útil. O NÍVEL CONVENCIONAL DE MÁQUINA que estudamos aqui age sobre a interpretação dos microprogramas e prepara o sistema de computação para receber o Sistema Operacional. Para tal é necessário que a manipulação de dados seja organizada em tipos de dados. 1.2. TIPOS DE DADOS Já sabemos que um computador funciona através da execução sistemática de instruções que o orientam a realizar algum tipo de operação sobre valores (numéricos, alfabéticos, ou lógicos). Estes valores são genericamente conhecidos como dados. Quer desejemos calcular uma expressão matemática complexa, quer o objetivo seja colocar uma relação de nomes em ordem alfabética, como também a tarefa de acessar a Internet e até a manipulação do mouse, tarefas que requerem ou não a execução de operações matemáticas, todas elas necessitam do emprego de instruções que ativem operações com os dados. Estes dados podem ser: Valores numéricos (no cálculo de expressões matemáticas), Valores alfabéticos (caracteres), ou ainda; Valores apenas binários (lógicos). Disciplina: Projeto Lógico de Computadores (5º/6º Sem - 2014). Livro: Andrew S. Tanenbaum Página 3 de 5 Curso de Ciências da Computação De qualquer modo, tanto as instruções quanto os dados estão sempre armazenados internamente sob a forma de uma sequência de 0s e 1s, os algarismos binários, que constituem a linguagem da máquina. Quando digitamos os valores dos dados, estes são convertidos internamente em um código de armazenamento como se fossem caracteres alfabéticos (nesse instante, eles são tratados como um texto), isto é, quando introduzimos, por exemplo, um dado cujo valor decimal e 143. Este número e digitado algarismo por algarismo, e claro, primeiro o algarismo 1, depois o algarismo 4 e, em seguida, o algarismo 3. Logo, o sistema de computação segue o mesmo processo, recebendo estes algarismos não como o numero 143, mas sim um texto com caracteres codificados segundo o código de armazenamento interno utilizado (na maioria dos casos e o código ASCII). Seriam, portanto, introduzidos (digitados) os seguintes valores binários: 00110001 (algarismo 1 em ASCII); 00110100 (algarismo 4 em ASCII); 00110011 (algarismo 3 em ASCII). Qualquer que tenha sido a linguagem de programação utilizada para escrever o programa, este devera ser convertido para um outro programa equivalente, porém em linguagem de máquina, denominado código-objeto e, em seguida, completado através do processo de ligação, tornando-se um código executável pelo processador (os processos de compilação, que geram código-objeto e código de ligação, que dão origem a códigos executáveis). A referida conversão (compilação) também inclui os dados, que deverão ser alterados de modo a estarem em uma forma apropriada para utilização pela unidade aritmética e lógica (UAL). Em outras palavras, se o programa que vamos executar contiver um comando do tipo: X:= A + B; antes da sua execução teremos que, de alguma forma, introduzir um valor numérico correspondente a "A" e um outro valor para "B", de modo que esses valores sejam lidos pela UCP e somados na UAL. Para efetivar a soma, a UAL executa, passo a passo, uma série de microoperações (um algoritmo), como, por exemplo, verificar o sinal dos números, efetuando uma ou outra ação diferente. No entanto, dependendo da forma com que o dado foi definido no programa pelo programador (ao escrever o programa em uma linguagem de alto nível), o referido algoritmo poderá ser diferente (em cada passo serão realizadas micro-operações diferentes, de acordo com o algoritmo realizado), embora o resultado final seja o mesmo. Ou seja, se o programador definiu o dado como um valor inteiro, ele será representado de uma forma diferente, por exemplo, da forma que ele seria internamente representado se o programador tivesse definido o mesmo dado como sendo um valor fracionário. A operação aritmética, embora sendo a mesma (uma soma, por exemplo), teria sua efetivação estabelecida por algoritmos diferentes, um para o caso de soma com números representados sob a forma de inteiros e outro para o caso de uma soma com números representados sob a forma de fracionários. Por exemplo: Se A = +5 e B = -3, então, após a execução do comando, teremos: X = +2. Disciplina: Projeto Lógico de Computadores (5º/6º Sem - 2014). Livro: Andrew S. Tanenbaum Página 4 de 5 Curso de Ciências da Computação Se, por exemplo, A e B forem representados internamente de uma forma binária simples e direta, com 16 bits, teríamos para cada um: A = +5 = 0000000000000101 B = -3 = 1000000000000011 Nesse caso, o algoritmo que a UAL deve executar certamente será diferente, embora, no final, os resultados sejam idênticos. Esta diferença de formas de representação e respectivos algoritmos de realização das operações matemáticas é bastante útil, pois cada uma tem uma aplicação onde é mais vantajosa que a outra. Cabe ao programador à escolha da forma a ser utilizada pelo sistema, podendo ser explicita, quando ele define as variáveis e constantes em seu programa, ou implícita, ao deixar que o compilador faça sua própria escolha. A seguir são apresentados alguns exemplos de definição de variáveis em determinadas linguagens, indicando-se, em cada caso, o tipo de dados correspondente, estabelecido internamente no sistema. Exemplo 1.1 Definição de variáveis em Pascal Exemplo 1.2 Definição de variáveis em C Exemplo 1.3 Definição de variáveis em Visual Basic Exemplo 1.4 Definição de variáveis em Delphi Disciplina: Projeto Lógico de Computadores (5º/6º Sem - 2014). Livro: Andrew S. Tanenbaum Página 5 de 5