Buscar

Apostila Geral Arq Comp03

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes
Você viu 3, do total de 25 páginas

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes
Você viu 6, do total de 25 páginas

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes
Você viu 9, do total de 25 páginas

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Prévia do material em texto

Prof. Fábio Lucena Veloso		� PAGE �1�
Instituto Politécnico
Curso: Tec. Redes de Computadores Disciplina: Organização de Computadores Prof.: Fábio Lucena Veloso
�
Conjunto de Instruções:
Características de instruções de máquina:
A operação de uma CPU é determinada pelas instruções que ela executa, conhecidas como instruções de máquina ou instruções do computador. A coleção de diferentes instruções que a CPU é capaz de executar é conhecida como conjunto de instruções da CPU.
Elementos de instruções de máquina
Cada instrução deve conter toda a informação necessária para que a CPU possa executá- la. A Figura 22, mostra os passos envolvidos na execução de instruções, definindo os elementos de instruções de máquina:
Código de operação: especifica a operação a ser efetuada (por exemplo, ADD, E/S). A operação é especificada por um código binário, conhecido como código de operação. Referência a operando fonte: a operação pode envolver um ou mais operandos fonte, ou seja, operandos que constituem dados de entrada para a operação.
Referência a operando de destino: a operação pode produzir um resultado.
Endereço da próxima instrução: indica onde a CPU deve buscar a próxima instrução, depois que a execução da instrução corrente for completada.
A próxima instrução a ser buscada pode estar localizada na memória principal ou, no caso de um sistema com memória virtual, tanto na memória principal quanto na memória secundaria (disco). Na maioria dos casos, a próxima instrução é a que segue imediatamente a instrução corrente. Nesses casos, a instrução não inclui uma referência explícita para a próxima instrução. Quando isso é necessário, a instrução deve fornecer um endereço de memória principal ou de memória virtual.
Figura 22 - Diagrama de estados do ciclo de instruções.
�
Os operandos fonte e de destino podem estar localizados em uma das seguintes áreas: Memória principal ou virtual: assim como na referência para a próxima instrução, deve ser fornecido um endereço, que pode ser na memória principal ou na memória virtual. Registrador da CPU: com raras exceções, a CPU contém um ou mais registradores, que podem ser referenciados pelas instruções de máquina. Se existir apenas um único registrador, a referência a ele poderá ser implícita. Se existirem vários registradores, então, cada registrador será designado por um número distinto, e a instrução deverá conter o número do registrador desejado.
Dispositivo de E/S: a instrução deve especificar um módulo de E/S e um dispositivo para a operação. Se for usada a E/S mapeada na memória, essa informação consistirá apenas em um endereço na memória principal ou na memória virtual.
Representação de instruções
Internamente, cada instrução de um computador é representada como uma seqüência de bits. Uma instrução é dividida em campos, correspondentes aos elementos da instrução. Um exemplo simples de formato de instrução é mostrado na Figura 23. Na maioria dos conjuntos de instruções, é usado mais de um formato de instrução. Durante a execução, uma instrução é lida em um registrador de instruções (IR) da CPU. A CPU deve ser capaz de extrair os dados dos vários campos da instrução e efetuar a operação requerida.
Fig. 23
É difícil para o programador lidar com representações binárias de instruções de máquina. Por isso, tornou-se prática comum usar uma representação simbólica para instruções de máquina.
Os códigos de operação são representados por abreviações, chamadas mnemônicos, que indicam a operação a ser efetuada. Alguns exemplos comuns são:
ADD Adição
SUB Subtração MPY Multiplicação DIV Divisão
LOAD Carregar dados da memória
STOR Armazenar dados na memória
Os operandos são também representados de maneira simbólica. Por exemplo, a instrução:
ADD R,Y
pode significar adicionar o valor contido na posição Y com o conteúdo do registrador R. Nesse exemplo, Y é um endereço de uma posição de memória e R indica um registrador
�
particular. Note que a operação é feita sobre o conteúdo da posição de memória, e não sobre seu endereço.
Portanto, é possível escrever um programa em linguagem de máquina de maneira simbólica. Cada código de operação simbólico tem uma representação binária correspondente, e o programador especifica o endereço de cada operando simbólico. Por exemplo, o programador pode começar com a seguinte lista de definições:
X = 513
Y = 514
e assim por diante. Essa entrada simbólica pode ser convertida, por meio de um programa bastante simples, em códigos de operação e referências a operandos na forma binária, resultando em instruções de máquina binárias.
Hoje, é muito raro programar em linguagem de máquina. A maioria dos programas é escrita em linguagem de alto nível ou, em alguns casos, em linguagem de montagem. No entanto, a linguagem de máquina simbólica permanece como uma ferramenta útil para descrever instruções de máquina, sendo usada a seguir para esse propósito.
Tipos de instrução
Considere uma instrução em uma linguagem de alto nível, tal como BASIC ou
FORTRAN. Por exemplo:
X = X + Y
Esse comando instrui o computador a adicionar o valor armazenado em Y ao valor armazenado em X e colocar o resultado em X. Como isso pode ser feito usando instruções de máquina? Suponha que as variáveis X e Y correspondam às posições de memória de endereços 513 e 514.
Se considerarmos um conjunto simples de instruções de máquina, esse comando pode ser implementado com três instruções:
1) Carregar um registrador com o conteúdo da posição de memória 513.
2) Adicionar o conteúdo da posição de memória 514 ao registrador.
3) Armazenar o conteúdo do registrador na posição de memória 513.
Como se pode observar, uma única instrução em linguagem de alto nível pode requerer várias instruções de máquina. Isso é típico do relacionamento entre uma linguagem de alto nível e uma linguagem de máquina. Em uma linguagem de alto nível, as operações são expressas de uma maneira algébrica concisa, usando variáveis. Em uma linguagem de máquina, as operações são expressas de maneira mais básica, envolvendo a movimentação de dados de e para registradores.
Tendo como base esse exemplo simples, consideramos os tipos de instruções que devem ser incluídos em um computador. Um computador deve ter um conjunto de instruções que permita ao usuário formular qualquer tarefa de processamento de dados. Outra
�
maneira de determinar esse conjunto de instruções é considerar os comandos disponíveis em uma linguagem de programação de alto nível. Qualquer programa em uma linguagem de alto nível deve ser traduzido para uma linguagem de máquina, para que possa ser executado. Portanto, o conjunto de instruções de máquina deve ser suficiente para expressar qualquer comando de uma linguagem de alto nível. Com isso em mente, podemos, então, catalogar os tipos de instruções de máquina como a seguir:
a) Processamento de dados: instruções aritméticas e lógicas
b) Armazenamento de dados: instruções de memória
c) Movimentação de dados: instruções de E/S
d) Controle: instruções de teste e de desvio
Instruções aritméticas fornecem a capacidade computacional para processamento de dados numéricos. Instruções lógicas (booleanas) operam sobre bits de uma palavra, como bits e não como números; oferecem, portanto, a capacidade para processar qualquer outro tipo de dado que o usuário possa desejar empregar. Essas operações são efetuadas, primariamente, em dados armazenados em registradores da CPU. Por isso, devem existir instruções de memória para mover dados entre a memória e os registradores. Instruções de E/S são necessárias para transferir programas e dados para a memória e para transferir resultados da computação de volta para o usuário. Instruções de teste são usadas para testar o valor de uma palavra de dados ou o estado de uma computação. Instruções de desvio são utilizadas para desviar a execução do programa para uma nova instrução, possivelmente dependendo do resultado de um teste.
Número de endereçosUma das maneiras tradicionais de descrever uma arquitetura é em termos do número de endereços contidos em cada instrução. Esse aspecto tornou-se menos significativo com a crescente complexidade de projeto de CPU. Entretanto, é útil considerar e analisar essa distinção entre instruções com diferentes números de endereços.
Qual é o número máximo de endereços necessários em uma instrução? Evidentemente, instruções aritméticas e lógicas requerem maior número de operandos. Quase todas as operações aritméticas e lógicas são unárias (um operando) ou binárias (dois operandos). Portanto, precisamos, no máximo, de dois endereços para referenciar operandos. Como o resultado da operação deve ser armazenado, isso sugere que é necessário um terceiro endereço. Finalmente, depois de concluída a execução de uma instrução, a próxima instrução deve ser buscada, sendo necessário conhecer seu endereço.
Essa linha de raciocínio sugere que poderia ser necessário ter instruções com quatro endereços: dois para operandos, um para o resultado e o endereço da próxima instrução. Na prática, instruções com quatro endereços são extremamente raras. A maioria das instruções tem um, dois ou três endereços de operando, sendo implícito o endereço da próxima instrução (contido no contador de programa).
�
A Figura 24 compara instruções típicas de um, dois e três endereços, que podem ser usadas para computar o comando Y = (A - B) / (C + D x E). Com instruções de três endereços, cada instrução especifica dois endereços de operandos e um endereço para o resultado. Como podemos querer não alterar o valor de qualquer posição de memória, uma área de memória temporária, T, é usada para armazenar resultados intermediários. Note que a implementação do comando requer quatro instruções e que a expressão original tem cinco operandos.
Instrução	Comentário	Instrução		Comentário 	 SUB XA, B	Y<- A – B	LOAD	D	AC<-D
MP	XD,E	T<- D x E	MPY	E	AC <—AC x E
AD	XX C	T<- T + C	ADD	C	AC<-AC+C
DIV XXT	Y<- Y -5- T	STOR	Y	Y <-AC
�
(a) Instruções com três endereços LOAD SUB
�A B	AC ^~A AC*- AC- B
�
DIV	Y	AC<-AC-Y Instrução	Comentário	STOR	Y	Y *-AC
MO	XA	Y<- A	(c) Instruções com um endereço
SUB XB	Y<r- Y – B MO	XD	T<- D
MP	XE	T<- T x E
AD	XC	T<- T 4- C
D
DIV XT	Y<- Y + T
(b) Instruções com dois endereços
Figura 24 - Programas para executar o comando Y = (A - B) / (C + DxE).
Formatos de instrução com três endereços não são muito comuns, porque resultam em instruções de tamanho relativamente grande, devido ao espaço necessário para manter os três endereços. No caso de instruções com dois endereços e das operações binárias, um dos endereços referencia tanto um operando quanto o resultado. Por exemplo, a instrução SUB Y, B calcula o valor Y - B e armazena o resultado em Y. O uso do
formato de instrução com dois endereços reduz o tamanho das instruções, mas apresenta algumas desvantagens. Para evitar que se altere o valor de um operando, é usada uma instrução MOVE, para mover um dos operandos para a posição de resultado ou para uma posição temporária, antes de a operação ser efetuada. O número de instruções requeridas para implementar o exemplo anterior aumentaria, nesse caso, para seis instruções.
Instruções de apenas um endereço são ainda mais simples. Nesse caso, um segundo endereço deve ser implícito. Esse tipo de instrução era comum nas primeiras máquinas, onde o endereço subentendido é um registrador da CPU, conhecido como acumulador
(ACC). O acumulador contém um dos operandos e é usado para armazenar o resultado.
�
É possível, ainda, usar um formato de instrução com zero endereço, para alguns tipos de instrução. Esse formato se aplica a uma organização de memória especial, denominada pilha.
�
Número de endereços	Representação simbólica
�
Interpretação
�
3	OP A,B,C	A B OP C
2	OP A,B	A A OP B
1	OP A	Acc Acc OP A
0	OP	T (T – 1) OP T
Acc = acumulador
T = topo da pilha
A, B, C = registradores ou posições de memória
A Tabela acima apresenta um resumo da interpretação de instruções com zero, um, dois ou três endereços. Em cada caso, supomos que o endereço da próxima instrução a ser executada seja implícito e que a operação requeira dois operandos como entrada e um operando como resultado.
O número de endereços por instrução constitui uma decisão de projeto importante. Poucos endereços por instrução resultam em instruções de menor extensão e mais primitivas, que requerem uma CPU menos complexa. Por outro lado, o número de instruções por programa é maior, o que, em geral, resulta em maior tempo de execução e em programas mais complexos. Além disso, existe outro aspecto importante em relação ao quais instruções de um ou múltiplos endereços se contrapõem. Com instruções de um endereço, o programador geralmente tem disponível apenas um registrador de propósito geral, o acumulador. Com instruções de múltiplos endereços, é comum haver múltiplos registradores de propósito geral. Isso possibilita que algumas operações sejam efetuadas apenas sobre registradores. Como referências a registradores são mais rápidas do que referências à memória, a execução dessas instruções é mais rápida. Em razão da flexibilidade e da capacidade para usar múltiplos registradores, a maioria das máquinas modernas emprega instruções de dois ou de três endereços.
As questões de projeto envolvidas na escolha do número de endereços por instrução são complicadas ainda por outros fatores. Um deles consiste em decidir se um endereço se refere a uma posição de memória ou a um registrador. Como o número de registradores é menor que o número de posições de memória, um número menor de bits é requerido para endereçar um registrador. Além disso, uma máquina pode oferecer uma variedade de modos de endereçamento, requerendo um ou mais bits para especificar o modo de endereçamento. Como resultado, a maioria dos projetos de CPUs envolve uma variedade de formatos de instrução.
Projeto do conjunto de instruções.
Um dos aspectos mais interessantes e mais analisados do projeto de computadores é o projeto do conjunto de instruções. O projeto do conjunto de instruções é muito complexo, pois afeta diversos aspectos do sistema. Ele define muitas das funções
�
desempenhadas pela CPU e, portanto, tem efeito significativo sobre a implementação da CPU. Como o conjunto de instruções constitui o meio pelo qual o programador pode controlar a CPU, ao projetar um conjunto de instruções é preciso considerar as necessidades do programador.
Você poderá se surpreender ao saber que algumas das questões mais fundamentais relativas ao projeto de conjuntos de instruções permanecem ainda em discussão. De fato, nos últimos anos, tem crescido a discordância a respeito dessas questões. Algumas das questões mais importantes são as seguintes:
a) Repertório de operações: quantas e quais são as operações que devem ser fornecidas e quão complexas elas podem ser.
b) Tipos de dados: quais os tipos de dados sobre os quais as operações são efetuadas. c) Formatos de instrução: qual o tamanho das instruções (em bits), o número de endereços por instrução, o tamanho dos vários campos etc.
d) Registradores: qual o número de registradores da CPU que podem ser usados pelas instruções e qual o propósito de cada um.
e) Endereçamento: de que modo (ou modos) o endereço de um operando pode ser especificado.
Essas questões são altamente inter-relacionadas e devem ser consideradas em conjunto ao se projetar um conjunto de instruções.
Tipos de operandos
Instruções de máquina operam sobre dados. As classes de dados mais importantes são:
1) Endereços
2) Números
3) Caracteres
4) Dados lógicos
Ao discutir os modos de endereçamento, veremos que os endereços são, de fato, uma forma de dado. Em muitos casos, é necessário efetuar cálculos sobre o valor do campo de endereço de um operando de uma instrução para determinar o endereço de memória principal ou virtual correspondente. Nesse contexto, os endereços podem ser considerados números inteiros sem sinal.Outros tipos de dados comuns são números, caracteres e dados lógicos; cada um será discutido detalhadamente adiante nesta apostila
�
Representação das Instruções
Podemos representar o formato padrão da instrução com um operador conforme o diagrama abaixo.
Este formato não é o único utilizado nos sistemas de computação. Na realidade o conjunto de instruções é sempre constituído por uma mistura de formatos diferentes.
A tendência é fazer com que os computadores operem quase sempre com uma pequena quantidade de instruções.
Pode-se efetuar a análise segundo dois aspectos:
1) Quantidade de operandos.
2) Modo de interpretação (endereçamento) do valor armazenado no campo operado.
Quantidade de Operandos:
Instruções de máquinas são constituídas de um conjunto de beta, o qual contém um subconjunto chamado código de operação, que identifica a operação a ser realizada pelo hardware. Este código é decodificado na UC na fase de instrução, gerando os pulsos de controle para acionar as portas lógicas necessárias a execução da operação.
Possui ainda um ou mais grupos de bits denominados campo(s) do(s) operando(s) que tem por função identificar e localizar o dado a ser processado.
•	4 operandos (não mais usada) = Possui a indicação explícita da localização de todos os operandos como também traz armazenado o endereço da próxima instrução;
•	3 operandos = Os campos 1 e 2 representam o endereço de cada dado utilizado em uma operação, já o campo 3 contém o endereço para armazenamento do resultado dessa operação;
•	2 operandos = O campo 1 recebe o resultado da operação;
•	1 operando = O registrador ACC (acumulador) é empregado como operando implícito guardando o valor de um operando e posteriormente o valor do resultado da operação.
�
Detalhes:
4 Operandos:
Cód. Op.	Operando 1	Operando 2	Operando 3	End. próx. instr.
Ex.:	Soma -> C = A + B
ADD A, B, C, P (C) <- (A) + (B), P
Onde P é o endereço da próxima instrução.
Vantagens: Ser uma instrução completa, pois possui todos os operandos necessários a realização de uma operação aritmética, dispensando até a instrução de desvio incondicional, pois essa já se encontra no campo P.
Desvantagens: Ocupa demasiado espaço de memória, principalmente porque um grande n° de instruções não necessita de três operandos.
3 Operandos:
Cód. Op.	Operando 1	Operando 2	Operando 3
Ex.:	C = A + B
ADD A, B, C (C) <- (A) + (B)
Desvantagem: Ainda é muito grande, consumindo demasiado espaço de memória.
2 Operandos:
Cód. Op.	Operando 1	Operando 2
Ex.:	ADD A, B (A) <- (A) + (B)
MOV A, B (A) <- (B)
Obs: Observe que o valor do 1° operando se perde após o armazenamento naquele endereço do resultado da operação.
1 Operando:
Cód. Op.	Operando
Ex.:	ADD Op	 ACC <- ACC + (Op)
Onde “Op” é o operando.
�
Obs: Observem que o valor do 1° operando se perde após a realização da operação, pois o resultado da operação será armazenado nesse local.
Obs: Para esse tipo, foram criadas duas novas instruções com o propósito de permitir a transferência de dados entre o ACC e a MP (Memória Principal)
LDA Op => ACC	 (Op)
STA Op => (Op)	 ACC
Modos de Endereçamento
Pelo formato básico da instrução e o ciclo de execução de cada instrução podemos concluir:
a) O endereçamento de uma instrução é sempre realizado através do valor do armazenamento no contador de instrução (CI). Todo o ciclo de instrução é iniciado pela transferência da instrução para o RI.
b) Toda a instrução consiste em uma ordem codificada (código da operação) para a CPU
executar uma operação qualquer sobre os dados.
c) A localização dos dados pode estar explicitamente indicada na própria instrução
(campos operando) ou implicitamente quando armazenado no acumulador (ACC).
Principais modos de endereçamento
Dentre os diversos modos de endereçamento atualmente empregados podemos destacar os principais:
1) Imediato: indica o valor do dado no campo operando da instituição em vez de buscá- lo na memória, tem como vantagem o curto tempo de execução da instrução por não gastar ciclo de memória para sua execução. O dado transferido da memória junto com a instrução por esta estar contida no campo operando da instrução.
Ex.:	MOV Reg. Op Reg <- valor de Op
Cód. Op.	Reg	Operando
 4 4 8 bits
Ex:	JMP Op Armazena o valor de Op no Acc => Acc <- Op
Cód. Op.	Operando
 4 8 bits
�
2) Direto: o valor binário contido no campo operando da instrução indica o endereço de memória onde se localiza o dado. O endereço pode ser uma célula onde o dado está inteiramente contido ou pode indicar o endereço da célula inicial. Requer apenas uma referência a MP para buscar o dado sendo, porém mais sendo mais lento que o imediato.
Ex 1.:	LDA Op Acc <- (Op) ex.1 -> LDA 3B
Cód. Op.	Operando
 4 8 bits
Ex 2.:	ADD Op1, Op2 (Op1) <- (Op1) + (Op2) ex. 2 -> ADD 5C, 3B
Cód. Op.	Operando 1	Operando 2
 4 4 8 bits
�
3B	5A
�
ex. 1: O ACC receberá o valor 5A
ex. 2: Somar o conteúdo da posição de memória Op1 (5C) de dado (103) com o conteúdo da posição de memória Op2 (3B) de dado (5A) e armazenar o resultado na posição de memória Op1 (5C) com valor = 15D (dado)
�
5C	103
�
15D
�
3) Indireto: o valor binário do campo operando representa o endereço de uma célula, mas o conteúdo da referida célula não é o valor de um dado e sim um outro endereço de memória, cujo conteúdo é o valor do dado. Há um duplo endereçamento para o acesso do dado, em conseqüência mais ciclos de memória. O endereço intermediário é conhecido como ponteira, pois indica a localização do dado (aponta para o dado)
Cód. Op.	Operando
 4 8 bits
ou
Cód. Op.	Reg	Operando
Campo que especifica	Ex. Reg 1	Ex. End. 1000
o endereçamento indireto
�
1000
1510
�
1510
4
�
Passo 1: O operador para o operando é buscado da posição
1000.
Passo 2: O operando é buscado da posição 1510.
 R1
�
4
Passo 3: O operando é carregado em R1.
Obs: Existem diferentes modos de se utilizar esse endereçamento:
- Cada código de operação estabelece não só o tipo de instrução como também o
modo de endereçamento.
- A instrução possui um campo específico para indicar o modo de endereçamento
4) Por registrador: semelhante ao direto e indireto exceto que a célula de memória referenciada na instrução é substituída por um registrador da CPU. O endereço mencionado na instrução passa a ser o de um dos registradores e não mais uma célula da MP. Tem como vantagem um menor numero de bits para endereçar os registradores. O dado passa a ser armazenado em um meio com acesso mais rápido que o acesso à memória.
�
5) Indexado: o endereço do dado é a soma do valor do campo operando (fixo para um dado vetor) e de um valor armazenado neste registrador varia para o acesso a cada elemento. O índice aponta para o elemento desejado.
6) Base mais deslocamento: consiste na utilização de dois campos na instrução, um com o endereço de um registrador (chave base) e outro com um valor denominado deslocamento, porque contem um valor relativo ‘a primeira construção.
7) Endereçamento de pilha: aqui temos instruções sem endereços, apenas códigos de operação. Isto é possível através de uma estrutura denominada pilha.
Uma pilha consiste em um conjunto de posições de memória, que são manipuladas de maneira que cada leitura efetuada sobre a pilha recupere o último dado nela armazenado
(topo da pilha), retirando-o da pilha. A área de memória reservada para a pilha inicia a partir de um endereço fixo na memória e, usualmente, pelo menos os dois elementos no topoda pilha são armazenados em registradores da CPU. Instruções de zero endereços referenciam os dois elementos no topo da pilha.
Quadro comparativo entre os três primeiros modos de endereçamento.
�
Modos de
Endereçamento
�
Definição	Vantagens	Desvantagens
�
Imediato	O campo operando contém o dado
Direto	O campo operando contém o endereço do dado
Indireto	O campo operando contém o endereço do dado
�Rapidez na execução da instrução
Flexibilidade no acesso a variáveis de valor diferente em cada execução do programa
Manuseio de vetores
(quando o modo indexado não está disponível). Uso como
“ponteiro”
�Limitação do tamanho do dado. Inadequado para o uso com dados de valor variável
Perda de tempo, se o dado é uma constante
Muitos acessos à memória principal para execução
�
Execução de Programas
Para que um computador execute alguma tarefa, é necessário que os passos correspondentes estejam especificados um a um na sua memória RAM, em códigos que a sua CPU possa interpretar. Chamamos a esses códigos instruções de máquina, e ao conjunto de instruções, programa em linguagem de máquina. Como esta linguagem é apropriada para o entendimento pela CPU, mas não o é para o entendimento pelas pessoas, é necessário que existam programas que convertam instruções inteligíveis pelo homem para a linguagem de máquina. Vamos nesse capítulo abordar algumas linguagens de programação existentes, e os processos de executar os programas escritos em uma linguagem de alto nível em uma CPU.
Linguagem de Programação
É uma linguagem criada, para instruir um computador a realizar suas tarefas. Um programa escrito em uma linguagem de programação é freqüentemente denominado código. Codificar um algoritmo significa converter suas declarações em comandos em instruções específicas usando a sintaxe específica de cada linguagem de programação.
Existem muitas linguagens de programação disponíveis para uso em computadores. Algumas, como o COBOL, são para uso comercial, e estão disponíveis na maioria dos computadores. Outras são para uso específico em certo tipo de equipamentos, e não estão disponíveis para uso em outras plataformas, como o Visual Basic, que não tem versões disponíveis para Main Frames, sendo seu uso restrito a computadores pessoais ou estações de trabalho.
Classificação das Linguagens de Programação
1) Quanto ao nível, as linguagens podem ser
a) de máquina: O tipo mais primitivo de linguagem de programação é a linguagem de máquina que foi utilizada pela primeira geração de computadores. Um programa em linguagem de máquina é uma seqüência de números que representam instruções e os dados a serem manipulados.
b) de baixo nível (Assembly) O Assembly é conhecido também como linguagem de montagem, e os programas que traduzem o código para linguagem de máquina são chamados de montadores. Os que traduzem as linguagens de alto nível são chamados de compiladores. As linguagens Assembly são muito semelhantes à linguagem de máquina, tendo o programador que codificar as instruções que a CPU conhece uma a uma, apenas utilizando-se de mnemônicos para os códigos de instrução (por exemplo ADD em vez de 45, para instruir a CPU a fazer uma soma), e endereços simbólicos para os dados (por exemplo NOME-CLI em vez de 124503 para representar o endereço onde está armazenado o nome do cliente na memória).
c) alto nível (COBOL, BASIC, C, ETC). As linguagens de alto nível se utilizam instruções que necessitam às vezes de muitas instruções de máquina para a sua realização. Por exemplo, X = SQRT(A) executa um algoritmo complexo para guardar em X a raiz quadrada de A.
�
2) Quanto à geração, as linguagens podem ser classificadas como de:
a) primeira geração (programação no painel dos primeiros computadores),
b) segunda geração (Assembly),
c) terceira geração (linguagens procedimentais, como COBOL, C, FORTRAN) e
d) quarta geração (linguagens para utilização até por usuários finais, como SQL, QBE, e outras).
3) Quanto ao uso, as linguagens podem ser classificadas como:
•	científicas (FORTRAN),
•	comerciais (COBOL), e
•	de uso geral ( PL/I; BASIC)
Principais linguagens de terceira geração:
a) FORTRAN - FORmula TRANslation - Utilizada para cálculos científicos
b) ALGOL - ALGOrithm Language
c) COBOL - COmmon Business Oriented Language
d) LISP - Linguagem para manipulação de listas
e) PL/I - Programing Language I - Linguagem da IBM, com características comerciais, Científicas e Algoritmica. Desenvolvida para substituir todas as demais.
f)	PASCAL - Linguagem de uso geral, desenvolvida em meios acadêmicos. A última versão desta linguagem é o DELPHI, versão visual do PASCAL orientado a objetos.
g) C - Linguagem de alto nível, com funções de baixo nível. Usada como substituto dos Assembly, com a vantagem de ser multiplataforma. A última versão desta linguagem é o Visual C++, versão visual do C++, que é o C orientado a objetos.
h) BASIC - Beginners All purpose Symbolic Instruction Code. Linguagem poderosa, desenvolvida para ser usada por principiantes, por isso mesmo muito simples. A versão mais moderna desta linguagem é o Visual Basic, para Windows. O VB5 é apenas para Windows 95, enquanto o VB4 pode gerar executáveis para Windows de 16 ou 32 bits (Windows 3.1 ou Windows 95).
�
Montagem
Apesar do usuário escrever os programas (instruções) por intermédio de forma simbólica com as linguagens de programação, o computador continua entendendo somente o código binário havendo, portanto, necessidade de conversão ou tradução da linguagem simbólica para a linguagem binária executável.
A tradução mais rápida que existe denomina-se montagem e é realizada por um programa denominado montador (assembler). A montagem é realizada para traduzir um programa em linguagem de montagem para seu equivalente em linguagem de máquina
(executável).
Fluxo básico de uma montagem
O programa escrito em linguagem de montagem é chamado de código fonte e tem suas instruções examinadas uma a uma e em seguida convertidas para outro programa em linguagem binária denominado código objeto.
Funções do Montador
a) Substituir códigos de operação simbólicos por valores numéricos;
b) Substituir nomes simbólicos de endereços pelos valores numéricos dos endereços;
c) Reservar espaço em memória para armazenar as instruções e dados;
d) Converter valores de constantes para código binário e e) Examinar a correção de cada instrução.
�
Compilação
O método chamado compilação é usado quando se pretende converter para linguagem de máquina um programa escrito em linguagem de mais alto nível do que linguagem de montagem. É o processo de análise de um programa escrito em linguagem de alto nível
(código fonte) e sua conversão (ou tradução) em um programa equivalente descrito em linguagem binária executável.(código objeto)
O programa que executa esta tarefa é chamado de compilador.
Fluxo básico do processo de compilação
Análise do processo
O processo é semelhante ao da montagem (fonte-objeto), porém mais complexo e demorado. Durante a compilação o código fonte é analisado, comando a comando e dividido em três partes funcionais distintas:
1) Análise léxica: que consiste em decompor o programa fonte em seus elementos individuais distintos para serem verificados de acordo com as regras da linguagem;
�
2) Análise sintática: consiste na criação das estruturas de cada comando, na verificação da correção dessas estruturas e na alimentação da tabela de símbolos, tudo de acordo com as regras gramaticais de cada linguagem;
3) Análise semântica: consiste na verificação das regras de semântica da linguagem produzindo mensagens de erro para as incorreções e inconsistências.
Ligação ou Linkedição
O programador não necessita codificar certas operações porque o código binário para muitas tarefas já está armazenado nosistema. É preciso apenas que este código seja buscado onde estiver e incorporado ao código fonte.
As rotinas externas ao programa são organizadas em arquivos e diretórios específicos e são usualmente chamados de bibliotecas (library). Quando o programa deseja usar estas bibliotecas, insere uma chamada em seu código (CALL).
Para que um programa seja executado é necessário incorporar ao código objeto as rotinas existentes em bibliotecas. Cria-se uma conexão lógica entre o código objeto principal e o código objeto da rotina. Esse processo é denominado de ligação ou linkedição e é realizado por um programa conhecido por ligador ou linkeditor.
Fluxo básico do processo de ligação
O fluxo básico do processo de execução de um programa inclui duas etapas:
1) Compilação
2) Ligação ou linkedição
�
Como o resultado, obtém-se um conjunto de códigos de máquina interligados e prontos para a execução.
Análise do processo de ligação
O funcionamento do linkeditor consiste em examinar todo o código objeto gerado após a compilação e procurar referências externas não resolvidas (encontradas nas bibliotecas). Ao encontrar, substitui a linha do chamado pelo código objeto da rotina.
Na prática, os processos de compilação e linkedição são fases distintas e independentes do procedimento de execução de um programa, geram códigos distintos:
•	Código objeto, ao final da compilação e
•	Código executável após a linkedição
Em ambos os casos, os códigos são armazenados em memória secundária. Ao testarmos o código fonte estaremos testando os erros de codificação na linguagem específica e ao testarmos o código executável verificamos a correção lógica do sistema utilizando-se de uma massa de dados de teste.
Há um tipo de linkeditor, chamado de loader (carregador), que não armazena código executável, sendo um pouco mais rápido.Realiza em seqüência imediata as duas tarefas: ligação e execução do código de máquina, sem gerar código executável, cria o código, mas não armazena.
�
Podemos identificar, finalmente, três fases no processo:
1) Compilação
2) Ligação
3) Execução
Interpretação
O método de interpretação se caracteriza pela realização das três etapas (compilação, ligação e execução), comando a comando, do programa fonte. Não há processo explícito de compilação e ligação. O programa fonte é diretamente executado (interpretado) por outro programa chamado interpretador produzindo o resultado. Não há código objeto ou código executável.
Em resumo, cada comando do código fonte é lido pelo interpretador e convertido em código executável e imediatamente executado antes que o comando seguinte seja lido.
Compilação x Interpretação
Ao analisarmos as vantagens e desvantagens entre os métodos de compilação e interpretação podemos resumir nas seguintes:
a) A principal vantagem da interpretação sobre a compilação é a capacidade de identificar e indicar um erro na lógica do algoritmo ou na consistência entre o valor e o tipo de dado;
b) A desvantagem da interpretação é o consumo de memória. O compilador só permanece na memória durante a fase de compilação enquanto que o interpretador tem de estar presente durante toda a execução;
c) Outra desvantagem da interpretação consiste na possibilidade de certas partes do código fonte terem de ser interpretadas tantas vezes quantas forem definidas(uma instrução de looping por exemplo)
Veja o quadro comparativo que resume as considerações relativas ao consumo de recursos de computador com os dois processos.
Recursos	Compilação	Interpretação
Uso da memória (durante a execução)
•	Interpretador ou Compilador	Não	Sim
•	Código Fonte	Não	Parcial
•	Código Executável	Sim	Parcial
•	Rotinas de Bibliotecas	Só as necessárias	Todas
Instruções de Máquina (durante a execução)
•	Operações de Tradução	Não	Sim
•	Ligação de Bibliotecas	Não	Sim
•	Programa de Aplicação	Sim	Sim
�
Arquitetura RISC
RISC é uma abreviatura de Reduced Instruction Set Computer, computador com conjunto reduzido de instruções. O desenvolvimento de sistemas com arquitetura RISC começou no fim da década de 70 na Universidade de Stanford e no início dos anos 80 na IBM. Os cientistas entendiam que os programas não estavam fazendo o uso mais eficiente possível do hardware.
Diversos estudos foram realizados a fim de verificar o comportamento das instruções de máquina em relação ao desempenho dos sistemas na execução de programas escritos em linguagens de alto nível. Cada linguagem possuía alguns comandos poderosos criados com a finalidade de facilitar a vida dos programadores mais do que facilitar o desempenho da computação, isto é, facilitar o processamento do hardware. Permitia aos programadores desenvolver programas mais complexos com menor esforço, pois os comandos disponíveis realizavam muitas tarefas. Como as instruções de máquina continuaram primitivas, um único comando de alto nível tinha que ser convertido em várias instruções de máquina.
Como havia acentuada separação entre as linguagens de alto nível e a de máquina (gap semântico), os compiladores tornaram-se complexos para permitir a perfeita conversão das linguagens resultando um número excessivo de instruções e ineficiência na execução dos programas.
A arquitetura CISC aumentou a quantidade de instruções de máquina, aperfeiçoando alguma delas para atender os requisitos do processamento de um comando complexo, incluiu mais modos de endereçamento no conjunto de instruções e utilizou-se de microprogramação para certas operações por firmeware.
Em conclusão aos estudos realizados, no sentido de otimizar o desempenho do hardware, chegou-se a uma estrutura de máquina que permitia minimizar a necessidade de um grande número de instrução sendo que percentualmente algumas delas ocorriam com pequena freqüência.
Sistemas	Tipo	Ano	Qtde. Instr.	Qtde. Reg.	Tamanho Instr
IBM /370-168	CISC	1973	208	16	16 - 48 bits
Intel 80846	CISC	1989	147	8	1 - l7 bits
Intel Pentium	RISC	1993	150	8	1 - l7 bits
Power PC 601	RISC	1993	184	32-1 32-PF	32 bits
Sparc 10	RISC	1987	52	até 528	32 bits
Alpha 21064	RISC	1992	125	32-1 32-PF	32bits
�
A existência de muitas instruções significa muitos códigos de operação e muitos bits em cada código e ainda a dupla desvantagem de se ter instruções com maior comprimento, devido ao número de bits do Código da Operação e mais o tempo de sua interpretação. Baseado nestas conclusões surgiram os primeiros protótipos de máquinas RISC.
Veja a seguir, o quadro comparativo da freqüência de ocorrência de certos comandos de linguagem de alto nível na execução de programas.
�
Comando
�
Ocorrência	Peso nas Instr. De Máquina	Peso em Ref. à MP
Pascal	C	Pascal	C	Pascal	C
�
Assingn	45%	38%	23%	13%	14%	15%
Loop	5%	3%	42%	32%	33%	26%
Call	15%	12%	31%	33%	44%	45%
If	29%	43%	11%	21%	7%	13%
Goto	-	3%	-	-	-	-
Outros	6%	1%	3%	1%	2%	1%
Características da Arquitetura RISC
Menor quantidade de instruções
A característica mais marcante da arquitetura RISC é a de possuir um conjunto de instruções menor que o das máquinas CISC de mesma capacidade. Com menor número de instruções e com cada uma delas tendo sua execução otimizada, o sistema de vê produzir os resultados com melhor desempenho apesar de determinar a confecção de programas mais longos.
Execução otimizada da chamada de funções
As chamadas de funções que consomem razoável tempo do processador requerem poucos dados, mas consomem, na transferência, demorados acessos a memória em leituras e escritas. A arquitetura RISC possui mais registradores permitindo que os parâmetros e variáveis sejam manuseados na própria CPU e não na MP como nas máquinas CISC. Esta característica permite melhor desempenho do processamento já que executa mais otimizadas as chamadas de funções.
Menor quantidade de modos de endereçamento
Nas máquinas CISC as instruções podem ser realizadas com operandos localizados por diversos modos de endereçamento, como já vimos. Nas máquinas RISC criou-se um modo geral de apenas dois tipos de instrução para localização de operandos:LOAD/STORE, utilizando o acesso à memória somente pelo modo direto e as demais operações, no processador (matemáticas e lógicas). Houve simplificação do projeto e da implantação das instruções, reduzindo os ciclos de relógio necessários a sua realização.
�
Modo de execução Pipelining
Chama-se de pipelining o método no qual os processadores executam várias instruções quase que totalmente em paralelo acelerando o desempenho dos processadores e reduzindo o tempo de execução para poucos ciclos. A partir dos processadores Intel
8086/8088 as máquinas CISC empregam este método.
O objetivo do projeto de uma máquina RISC é o da execução de uma instrução a cada ciclo de relógio utilizando o pipelining em mais larga escala.
A seguir, quadro resumo das características da arquitetura RISC
Característica	Considerações
�
Menor quantidade de instruções que as máquinas CISC
Execução otimizada de chamada de funções
Menor quantidade de modos de endereçamento
Utilização em larga escala do pipelining
�Simplifica o processamento de cada instrução e torna este item mais eficaz
Embora o processador RS/6000 possua 184 instruções, ainda assim é bem menos que as 303 instruções dos sistemas VAX-11. Além disso, a maioria das instruções é realizada em 1 ciclo de relógio, o que é considerado o objetivo maior dessa arquitetura
As máquinas RISO utilizam os registradores da UCP
(em maior quantidade que os processadores OISO) para armazenar parâmetros e variáveis em chamadas de rotinas e funções. Os processadores OISO usam mais a memória para a tarefa
As instruções de processadores RISO são basicamente do tipo Load/Store, de desvio e de operações aritméticas e lógicas, reduzindo com isso seu tamanho
A grande quantidade de modos de endereçamento das instruções de processadores CISC aumenta o tempo de execução das mesmas
Um dos fatores principais que permite aos processadores RISO atingir seu objetivo de completar a execução de uma instrução pelo menos a cada ciclo de relógio é o emprego de “pipelining” em larga escala
�
CISC x RISC
Na avaliação das duas arquiteturas encontramos adeptos que poderão apontar vantagens e desvantagens de uma ou outra.
Muitos são os temas que podem ser abordados na discussão sobre RISC x CISC, um dos quais se refere ao desempenho do processador. Verifica-se que os programas de teste
(benchmarks) possuem uma série de complicações na interpretação de seus resultados em função do tipo de ambiente e da natureza dos testes.
Os adeptos da arquitetura CISC afirmam que instruções mais complexas redundam em código objeto menor reduzindo o consumo de memória com reflexos no custo do sistema. Isto não é necessariamente correto se considerarmos que uma menor quantidade de instruções nem sempre acarreta menor quantidade de bits, e na realidade o que consome menos memória e menor custo é a quantidade de efetiva de bits que o código apresenta.
Uma grande quantidade de operandos para definir instruções em programas em máquinas CISC poderá determinar um número maior de bits do que em programas em máquinas RISC, apesar destes possuírem maior quantidade de instruções.
Outro ponto a ser analisado se refere à rapidez de execução de um programa.
Os adeptos da CISC afirmam que as máquinas executam mais rapidamente os programas em linguagem de alto nível devido a um menor código binário o que não pode ser de todo correto, pois o tempo de execução de cada instrução pode determinar uma velocidade de execução maior, independente do tamanho do código.
Fatores que permitem uma tendência às máquinas RISC de executarem as instruções mais rápido:
•	Instruções com C.Op. com menos quantidade de bits e com tempo de codificação menor do que as máquinas CISC;
•	Instruções executadas diretamente pelo hardware e não por microprogramação. Mesmo que a microprogramação acarrete em flexibilidade, adiciona a carga de interpretação de cada instrução
Processadores RISC são otimizados para realizar operações de uma tarefa por ciclo de relógio proporcionado por uma grande quantidade de registradores e a grande quantidade de estágios de pipelining.

Outros materiais