Buscar

apostila org.computadores part3

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 43 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 43 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 43 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

Instituto Politécnico 
Curso: Tec. Redes de Computadores 
Disciplina: Organização de Computadores 
Prof.: Fábio Lucena Veloso 
 
Curso: Tec. Análise de Sistemas 
Disciplina: Organização de Computadores 
Prof.: Roberto Barros 
 
 
 
 
 
 
 
 
 
 
 
Profs. Fábio Lucena Veloso e Roberto Barros 1
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. 
Profs. Fábio Lucena Veloso e Roberto Barros 2
 
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 
Profs. Fábio Lucena Veloso e Roberto Barros 3
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 
Profs. Fábio Lucena Veloso e Roberto Barros 4
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 armazenadosem 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ços 
 
Uma 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). 
 
Profs. Fábio Lucena Veloso e Roberto Barros 5
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
Y
XD,E T<- D x E MPY E AC <—AC x E
AD
D
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
VE
XD T<- D 
MP
Y
XE T<- T x E 
AD
D 
XC T<- T 4- C 
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. 
 
Profs. Fábio Lucena Veloso e Roberto Barros 6
É 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 
Profs. Fábio Lucena Veloso e Roberto Barros 7
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: qualo 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 
 
 
Profs. Fábio Lucena Veloso e Roberto Barros 8
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. 
 
Profs. Fábio Lucena Veloso e Roberto Barros 9
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. 
 
 
Profs. Fábio Lucena Veloso e Roberto Barros 10
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 
 
 
Profs. Fábio Lucena Veloso e Roberto Barros 11
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 
 
 
 
 
ex. 1: O ACC receberá o valor 5A 
5A3B
1035C 15D
 
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) 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
Profs. Fábio Lucena Veloso e Roberto Barros 12
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 
 
 
 
 
Passo 1: O operador para o operando é buscado da posição 
10 0. 
 
Passo 2: O
 
 
 
 
 
15101000
41510
Passo 3: O
 
 
 
 
Obs: Existem diferentes modos de se- Cada código de operação estabel
modo de endereçamento. 
- A instrução possui um campo espec
 
 
4) Por registrador: semelhante ao dire
referenciada na instrução é substituíd
mencionado na instrução passa a ser 
MP. Tem como vantagem um menor
dado passa a ser armazenado em um 
memória. 
 
0
 operando é buscado da posição 1510. 
 R1
4
 operando é carregado em R1. 
 utilizar esse endereçamento: 
ece não só o tipo de instrução como também o 
ífico para indicar o modo de endereçamento 
to e indireto exceto que a célula de memória 
a por um registrador da CPU. O endereço 
o de um dos registradores e não mais uma célula da 
 numero de bits para endereçar os registradores. O 
meio com acesso mais rápido que o acesso à 
Profs. Fábio Lucena Veloso e Roberto Barros 13
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 
topo da 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 
Rapidez na execução 
da instrução 
Limitação do 
tamanho do dado. 
Inadequado para o 
uso com dados de 
valor variável 
Direto O campo operando 
contém o endereço do 
dado 
Flexibilidade no 
acesso a variáveis de 
valor diferente em 
cada execução do 
programa 
Perda de tempo, se 
o dado é uma 
constante 
Indireto O campo operando 
contém o endereço do 
dado 
Manuseio de vetores 
(quando o modo 
indexado não está 
disponível). Uso como 
“ponteiro” 
Muitos acessos à 
memória principal 
para execução 
 
 
 
 
 
 
 
 
 
Profs. Fábio Lucena Veloso e Roberto Barros 14
Representação de dados 
 
Os computadores executam instruções que realizam operações sobre valores 
(numéricos, alfanuméricos ou lógicos). Esses valores são conhecidos como dados. Os 
valores de dados normalmente são introduzidos no computador através de digitação, e 
são imediatamente transformados em algum código padrão, que depende do computador 
que está recebendo o dado e alguns caracteres podem ser armazenados nesse código 
padrão (dados alfanuméricos), enquanto outros podem ser armazenados em formato 
mais adequado para a realização de operações sobre eles (dados numéricos ou lógicos). 
 
 
Tipo de dado 
 
De um modo geral, as seguintes formas de dados são utilizadas nos programas atuais 
(formas primitivas) 
 
• Tipo caractere 
• Tipo lógico 
• Tipo numérico 
 
 
Tipos primitivos de dados: 
 
 
 
Existem ainda formas mais complexas permitidas em certas linguagens modernas, mas 
durante a compilação estes dados são convertidos para as formas primitivas. 
 
 
 
Profs. Fábio Lucena Veloso e Roberto Barros 15
Tipo caractere 
 
Os computadores só trabalham com dígitos binários, valendo 0 ou 1. Para representar os 
símbolos (ou caracteres) que reconhecemos a partir de 0s e 1s, deve ser utilizada uma 
técnica chamada de codificação, onde cada símbolo de nossa linguagem é associado 
biunivocamente a um grupo de bits. A codificação é a forma de representar os 
caracteres armazenados no computador. 
O tamanho desse grupo de bits é definido a partir do número de diferentes símbolos que 
queremos representar, uma vez que já sabemos que n bits podem representar até 2n 
símbolos diferentes. 
 
Desde o advento da computação foram criados vários sistemas de codificação, dentre os 
quais podemos destacar: 
 
a) BCD - Binary Coded Decimal (Decimal codificado em binário) - grupos de 6 bits, 
representando 64 caracteres (obsoleto). 
 
b) EBCDIC - Extended Binary Coded Decimal Interchange Code (Código para 
intercâmbio BCD estendido) - Usado em mainframes IBM. Grupos de 8 bits, 
permitindo 256 caracteres diferentes, mas na prática muitos códigos não são associados 
a nenhum caractere legível. 
 
c) ASCII - American Standard Code for Information Interchange (Código padrão 
americano para troca de informações) - Criado com grupos de 7 bits, e mais um para 
paridade, foi estendido para 8 bits, devido à necessidade de aumentar o conjunto de 128 
caracteres para 256, devido à introdução de símbolos gráficos, e letras acentuadas. 
 
d) Unicode - Grupos de 16 bits, criado para suportar todos os símbolos da humanidade, 
como caracteres japoneses, chineses, árabes, hebraicos, etc. Comporta até 64K símbolos 
diferentes (mais de 65.000). Para manter compatibilidade com a tabela ASCII atual, 
todos os símbolos ASCII permanecem como estão, sendo adicionados 8 bits zero após 
os atuais 8 bits. 
 
Tabelas ASCII e EBCDIC são encontradas em diversas publicações e programas de 
computador, e não são facilmente decoráveis em seu todo, mas é útil conhecer as 
representações de alguns símbolos nesses códigos. Os valores dos símbolos 
normalmente são mostrados nas tabelas em hexadecimal. 
 
Caractere ASCII EBCDIC 
Espaço 20 40 
Dígitos 0 a 9 30 a 39 F0 a F9 
Letras A - Z (a - z) 41 a 5A (61 a 7A) 
Letras A - I (a - i) C1 a C9 (81 a 89) 
Letras J - R (j - r) D1 a D9 (91 a 99) 
Letras S - Z (s - z) E2 a E9 (A2 a A9) 
 
 
 
Profs. Fábio Lucena Veloso e Roberto Barros 16
Notas: 
No código ASCII as letras minúsculas são obtidas adicionando-se 20 as maiúsculas, 
enquanto no EBCDIC as letras minúsculas são obtidas subtraindo-se 40 das maiúsculas. 
Em ASCII as letras são contíguas, permitindo que ao se programar, possa-se fazer letra2 
= letra1 + 1, para obter a letra seguinte a uma outra, enquanto que isso não é permitido 
em EBCDIC. 
 
 Exemplo: "J" = "I" + 1 em ASCII e "J" = "I" + 8 em EBCDIC. 
 
 Com esse conjunto de caracteres pode-se representar qualquer informação, e até 
processá-las. Entretanto, existem outras formas de se armazenar valores matemáticos 
no computador, que se por um lado não são fáceis de serem interpretados pelas pessoas, 
são muito mais eficientes de serem processados pelos computadores. Chamamos a essas 
representações de representações internas. Elas também dependem da arquitetura do 
computador. 
Quando o usuário, utilizando uma linguagem de programação, introduz um programa no 
computador, os componentes de sua estrutura física convertem os caracteres 
introduzidos como um texto livre, para o código de bits usados pela máquina, em 
seguida traduz para o código-objeto e passa os elementos do programa para uma 
representação passível de ser interpretada e manipulada pelo hardware (CPU) 
 
 
Tipo lógico 
 
Esse tipo de dados permite armazenar apenas 2 informações distintas: 
 
• Verdadeiro (True): bit um 
• Falso (False): bit zero 
 
Como já vimos anteriormente, estas variáveis são utilizadas de diversas formas em um 
programa, podendo ser realizado um tipo específico de operação, empregando 
operações lógicas. 
 
Apesar de ser necessário apenas 1 bit para armazenar 1 valor entre 2 possíveis, as 
implementações nas linguagens de programaçãoutilizam 1 ou mais bytes para 
armazenar um valor lógico (ou booleano). 
 
Assim, em Pascal pode-se declarar ByteBool (lógico com 1 byte) ou WordBool (lógico 
com 1 palavra Æ 2 ou 4 bytes, dependendo do tamanho da palavra). 
Em Visual Basic, a declaração Boolean cria variáveis lógicas com 2 bytes de tamanho. 
 
Em COBOL não existe este tipo de dado, apesar de existirem expressões lógicas, como 
A > B e os operadores lógicos NOT, AND e OR. 
 
 
 
 
 
Profs. Fábio Lucena Veloso e Roberto Barros 17
Os operadores lógicos mais comuns em linguagens de programação são: 
 
a) NOT. Operador unário. Inverte o valor lógico da variável ou expressão, devolvendo 
True se a variável for False, e False se a variável for True. Exemplos: NOT A; NOT 
(VALOR > 10) 
 
b) AND. Operador binário. A AND B devolve True se A e B forem True, e devolve 
False em caso contrário. 
 
c) OR. Operador Binário. A OR B devolve True se pelo menos 1 dos operandos for 
True, e devolve False se ambos forem False 
d) XOR (OU EXCLUSIVO). A XOR B devolve True se exatamente 1 dos operandos 
for TRUE, e False se ambos forem False ou True. 
 
 
Tipo numérico 
 
A ULA foi projetada para, rapidamente, executar operações com valores recebidos em 
forma binária. Um dos primeiros problemas ocorridos quando da representação de 
números nos computadores foi na indicação do sinal do número (+ ou -) Isso foi 
resolvido com o acréscimo de mais um bit na representação do número, esse bit 
adicional representa o sinal do número e é denominado sinal e magnitude. 
 
A convenção adotada de forma universal é: 
 
• Valor positivo - bit de sinal igual a 0 
• Valor negativo - bit de sinal igual a 1 
 
Outro problema é a forma de representação dos números fracionários, devido à 
dificuldade de se representar à vírgula internamente entre a posição dos dois bits. 
Existem dois modos de representação: 
 
• Ponto fixo (vírgula fixa) – consiste em adotar uma posição fixa para a vírgula 
• Ponto flutuante (vírgula flutuante) – utiliza a representação conhecida como 
notação científica 
 
 
Representação em ponto fixo 
 
Os valores fracionários também representam um problema a ser resolvido. A solução 
mais simples é guardar o número como se fosse inteiro, e lembrar que certo número de 
dígitos são fracionários para posterior apresentação ou operação. 
 
Posições mais adotadas: 
• Na extremidade esquerda – nesse caso o número seria totalmente fracionário; 
• Na extremidade direita – nesse caso o número seria inteiro 
 
Profs. Fábio Lucena Veloso e Roberto Barros 18
Em nenhum dos casos a vírgula estará representada fisicamente na memória, isto é feito 
via programa por ocasião da definição da variável, realizada pelo programador. O 
sistema memoriza essa posição, mas não a representa fisicamente. 
 
Esse modo é chamado de representação em ponto fixo. 
 
Na linguagem C, os tipos definidos são: CHAR (1 byte), INT (2 bytes) e LONG INT (4 
bytes). 
 
Em Visual Basic, temos os tipos BYTE, INTEGER (2 bytes) e LONG (4 bytes). Nesta 
linguagem existe ainda um tipo chamado DECIMAL com 14 bytes, contendo um valor 
inteiro e um fator de escala, indicando o número de casas decimais e podendo valer, se 
não tiver parte fracionária, +/-79.228.162.514.264.337.593.543.950.335, e com partes 
decimais, esse mesmo valor, mas com a vírgula decimal em qualquer posição a partir do 
dígito 7 inicial. O menor número em valor absoluto é 10-28. Temos também em VB o 
tipo CURRENCY (monetário) com 8 bytes de comprimento, com 4 casas decimais, 
permitindo uma precisão de -922.337.203.685.477,5808 até 922.337.203.685.477,5807. 
 
Na representação de números em ponto fixo, os valores positivos são representados pelo 
bit 0 de sinal. Sendo posicionado como algarismo mais representativo (à esquerda) este 
grupo de bits representará o valor absoluto do número (magnitude) 
 
Quanto aos números negativos o sinal é representado pelo bit 1 e a magnitude pode ser 
representada por um dos três modos: 
 
a)Sinal e magnitude 
 
b) Complemento 
 
c) Complemento a base menos 1 
 
 
Sinal e Magnitude 
 
A representação de números com n algarismos binários (n bits) em sinal e magnitude é 
obtida atribuindo-se 1 bit (em geral, na posição mais à esquerda) para indicar o valor do 
sinal, e os n-1 bits restantes para indicarem a magnitude do número. Neste tipo de 
representação, o valor dos bits usados para representar a magnitude (valor absoluto do 
número) é o mesmo, seja para números positivos ou números negativos, o que varia é o 
valor do bit de sinal. Esta é uma forma idêntica de representar a que usamos na vida 
real, com a diferença de que usamos símbolos gráficos no lugar do bit de sinal do 
computador. 
 
 
 
 
 
 
 
Profs. Fábio Lucena Veloso e Roberto Barros 19
Exemplos de uma representação de dados em sinal e magnitude. 
 
 
 
Representação de valores em sinal e magnitude 
 
 
Características da representação em Sinal e magnitude 
• Possui duas representações para o ZERO (matematicamente incorreto) o que é 
uma desvantagem em relação a outros métodos de representação 
• Representação dos números é simétrica entre os números positivos e negativos, 
limitada à quantidade permitida de bits dos registradores internos 
• Se os números forem fracionários, a faixa de representação é mais reduzida. 
Restringe-se a quantidade de algarismos da parte inteira. 
 
 
Limites de Representação 
 
Se os registradores que irão armazenar os valores têm capacidade para receber n 
algarismos, então a faixa limite de números inteiros, que pode ser armazenada nos 
referidos registradores é obtida pela expressão: 
 
- ( 2n-1 - 1) a + ( 2n-1 - 1) 
 
• Se n é a quantidade limite de algarismos, então a magnitude é calculada a partir 
de n-1 algarismos, visto que 1 algarismo é reservado para indicar o sinal do 
número 
• Do valor obtido (2n-1) subtrai-se 1 (para os valores negativos e positivos) 
porque o primeiro valor a ser representado é zero 
 
Ex. a) Para um registrador de 6 bits, n = 6, e os limites de representação serão: 
 
De - ( 26-1 - 1) a + ( 26-1 - 1) ou - ( 25 – 1 ) a + ( 25 – 1 ) = - 31 a + 31 
 
 
b) Para um registrador de 16 bits, n = 16, teremos: 
 
De - ( 216-1 - 1) a + ( 216-1 - 1) ou - ( 215 – 1 ) a + ( 215 – 1 ) = - 32767 a + 32767 
 
Profs. Fábio Lucena Veloso e Roberto Barros 20
c) Para um registrador de 16 bits, porém representando um número fracionário tendo, 
por exemplo, 10 bits para a parte inteira, 5 bits para a parte fracionária e 1 bit para o 
sinal: 
Neste caso, n = 10 (somente a parte inteira, é claro) e os limites serão: 
 
De - ( 210-1 - 1) a + ( 210-1 - 1) ou - ( 29 – 1 ) a + ( 29 – 1 ) = - 511 a + 511 
 
 
 
Considerações sobre representação em Sinal e Magnitude 
 
As operações com números negativos realizadas com sinal e magnitude são demoradas 
e difíceis porque é necessário efetuar várias comparações e decisões em vista da 
manipulação dos sinais das parcelas para determinar o sinal do resultado. As mesmas 
operações se tornam mais simples e rápidas quando realizadas através da aritmética de 
complemento 
 
O problema encontrado pelos fabricantes de computadores na implementação da ULA 
para que efetuasse operações aritméticas com valores representados em sinal e 
magnitude residiu, principalmente, em dois fatores: 
 
a) Custo – devido à necessidade de construção de dois elementos diferentes, um para 
efetuar somas e outro para efetuar subtrações 
 
b) Velocidade – ocasionada pela perda de tempo gasto na manipulação dos sinais, de 
modo a determinar o tipo de operação e o sinal do resultado 
 
Outro fator é a inconveniência da dupla representação do ZERO, o que resulta em um 
circuito lógico específico para evitar erros de interpretação. 
 
No sinal e magnitude, a única diferença entreum valor positivo o mesmo valor negativo 
é o bit de sinal, enquanto que na forma de complemento a 2, os dois valores são tais que 
se os somarmos obteremos 0 com um overflow de 1 bit (vai um). 
 
 
Overflow: Diz-se que há overflow quando a soma de dois números de n algarismos der 
como resultado um número com n+1 algarismos. Este fato é válido, sejam números 
binários ou decimais, com ou sem sinal. 
 
 
Nenhum sistema moderno emprega aritmética em sinal e magnitude, a qual foi 
substituída por aritmética em complemento a 2 (complemento a base) 
 
 
Algoritmo para a soma em Sinal e Magnitude 
 
1) Se ambos os números tem o mesmo sinal, somam-se as magnitudes, o sinal de 
resultado é o mesmo das parcelas; 
Profs. Fábio Lucena Veloso e Roberto Barros 21
2) Se o número tem sinais diferentes: 
a) Identifica-se a maior das magnitudes e registra-se o seu sinal; 
b) Subtrai-se a magnitude menor da maior (apenas as magnitudes); 
c) Sinal do resultado é igual ao sinal da maior magnitude 
 
 
Exemplo: 
 
Somar os números: (+13) e (+12) 
 
+13 0 0 1 1 0 1 
+12 0 0 1 1 0 0 
+25 0 1 1 0 0 1 
Mesmo sinal (bit 0). Somam-se as 
magnitudes e coloca-se o bit 0 no 
resultado 
 
 
 
Somar os números: (-17) e (-9) 
 
- 17 1 1 0 0 0 1 
- 9 1 0 1 0 0 1 
-26 1 1 1 0 1 0 
Mesmo sinal (bit 1). Operação idêntica à 
do exemplo anterior 
 
 
 
Somar os números: (+18) e (-11) 
 
+18 0 1 0 0 1 0 
- 11 1 0 1 0 1 1 
+ 7 0 0 0 1 1 1 
Sinais diferentes. Maior número (+18), 
bit de sinal 0. Subtração das magnitudes; 
bit de sinal 0 no resultado 
 
 
 
Somar os números: (-21) e (+10) 
 
- 21 1 1 0 1 0 1 
+10 0 0 1 0 1 0 
- 11 1 0 1 0 1 1 
Sinais diferentes; maior magnitude (21), 
sinal (–) (bit 1). Subtrai-se o menor do 
maior; bit 1 (sinal (-) para o resultado 
 
 
 
Algoritmo para a subtração em Sinal e Magnitude 
 
1) Troca-se o sinal do subtraendo 
 
2) Procede-se como no algoritmo da soma 
 
 
 
 
Profs. Fábio Lucena Veloso e Roberto Barros 22
Exemplo: 
 
Efetuar a subtração: (-18) - (+12) 
 
(-18) - (+12) = (-18) + (-12) = - 30 
 
- 18 1 1 0 0 1 0 
- 12 1 0 1 1 0 0 
- 30 1 1 1 1 1 0 
Foi trocado o sinal de (+12) para (-12) e a 
operação passou a ser de soma; como 
números tem mesmo sinal (-) resultado = (-)
 
 
Efetuar a subtração: (-27) - (-14) 
 
(-27) - (-14) = (-27) + (+14) = -13 
 
- 27 1 1 1 0 1 1 
+14 0 0 1 1 1 0 
- 13 1 0 1 1 0 1 
Foi trocado o sinal de (-14) para (+14) e a 
operação passou a ser de soma; como 
números tem sinais deferentes subtrai-se o 
menor do maior; resultado é igual ao do 
maior = (-) 
 
 
 
Representação de números negativos em complemento 
 
O conceito de complemento é válido para qualquer base de numeração. Há dois tipos de 
complemento: 
 
• Complemento a base 
• Complemento a base menos 1 
 
 
Complemento a base: 
 
O termo complemento, em matemática, significa a quantidade que falta para completar 
um valor, torná-lo completo 
 
Em operações aritméticas, o complemento a base de um número N é o valor necessário 
para se obter Bn, ou seja: 
 
Complemento a base de N = Bn – N, 
 
Onde: n = quantidade de algarismos utilizados na operação 
N = valor do número 
 
Na base 10: N = 76310 C10 de N = 105 – N = 10000010 – 76310 = 9923710
Na base 8: N = 2548 C8 de N = 85 – N = 1000008 – 2548 = 775248
Na base 2: N = 1102 C2 de N = 25 – N = 1000002 – 1102 = 110102
Profs. Fábio Lucena Veloso e Roberto Barros 23
(Considerando-se números com cinco algarismos) 
 
 
Na prática: 
 
• 1ª etapa: Subtrair cada algarismo do maior algarismo da base considerada 
• 2ª etapa: Ao resultado encontrado somar 1 ao algarismo menos significativo 
(mais à direita) 
 
Refazendo os exemplos acima: 
 
N = 76310 C10 de N = 99999 – 763 = 9923610 + 1 = 9923710
N = 2548 C8 de N = 77777 – 254 = 775238 + 1 = 772548
N = 1102 C2 de N = 11111 –110 = 110012 + 1 = 110102
 
 
Complemento a base menos 1 
 
A definição matemática do complemento a base menos um (Cb-1) de um número N é: 
 
Cb-1(N) = 2n – N – 1 
 
Onde: n = quantidade de algarismos do número 
2n – N = Cb – 1 
Cb = complemento a base 
 
Pode-se afirmar que se trata da representação em complemento a base subtraída de 1, 
daí o nome complemento a base menos 1. 
 
 
Na prática: 
 
Obtém-se o complemento a base menos 1 de um número (CB-1), subtraindo-se do valor 
(B-1) cada algarismo do número, B-1 é o maior algarismo de uma base. 
 
Se a base for 2, pode-se obter a representação em complemento a base menos 1 através 
da troca do valor dos bits do número, ou seja, alterar o valor de cada bit 1 para 0 e vice-
versa. 
 
Complemento a base 2 
 
A primeira etapa desse método consiste na operação de obtenção do complemento a 
base -1. 
 
Quando se tratar de valores na base 2 pode-se executar a primeira etapa de obtenção do 
complemento a 2 de um número, ao invés de substituir cada algarismo do número do 
maior algarismo da base (no caso 1), simplesmente deve se inverter o valor do 
algarismo, isto é, se for 0 passar para 1 e vice-versa. 
Profs. Fábio Lucena Veloso e Roberto Barros 24
A segunda etapa permanece a mesma (somar 1 ao resultado) 
 
Exemplos: 
 
Quase a totalidade dos computadores modernos utiliza a aritmética de complemento a 2 
(quando se trata de ponto fixo) devido a duas grandes vantagens em relação a sinal e 
magnitude: 
 
1) Possui uma única representação para o ZERO; 
 
2) Necessita de apenas um circuito para realizar as operações de soma e subtração (mais 
barato) 
 
Uma única representação para o ZERO acarreta uma assimetria. Há um número 
negativo a mais do que números positivos. 
 
Exemplo: 
 
Um computador com um registrador com capacidade para armazenar 6 bits para o 
registrador representará o zero da seguinte forma: 
 
000000 Æ o 1º zero indica o sinal do número 
 
Para calcular o complemento a 2 desse numero usando o método rápido: 
 
000000 Æ 111111 + 1 = 00000 
 
O vai um para a 7ª ordem é desprezado, porque consideramos o limite de 6 bits para o 
registrador. O valor final é igual ao inicial, portanto uma única representação para o 
ZERO! 
 
 
Limites de representação em complemento a 2 
 
Pode-se generalizar para qualquer quantidade de bits nos registradores com a seguinte 
expressão: 
 
- ( 2n-1) a + ( 2n-1 - 1) 
Profs. Fábio Lucena Veloso e Roberto Barros 25
Exemplo: 
 
No caso de um registrador de 6 bits. Teremos: 
 
26 valores representáveis = 64 números binários 
 
Utilizando a expressão teremos: 
 
de –32 a +31 (+32 não possui representação com esta quantidade de bits) 
Aritmética com complemento a 2 
 
 
Aritmética em complemento a 2 
 
A aritmética em complemento a 2 requer apenas um circuito para somar dois números e 
um circuito que realize a operação de complementação. O algoritmo básico refere-se, 
então, à soma dos números, considerando-se que os negativos estejam representados em 
complemento a 2; ele acusa também, se o resultado ultrapassar a quantidade de bits 
representáveis pela ULA (e registradores), que denominamos overflow. 
 
 
Algoritmo para soma em complemento a 2: 
 
1) somar os dois números, bit a bit, inclusive o bit de sinal 
 
2) desprezar o último “vai 1” (para fora do número), se houver 
 
3) se, simultaneamente, ocorrer “vai 1” para o bit de sinal e para fora do número, ou se 
ambos não existirem, o resultado está correto. 
 
4) Se ocorrer apenas um dos dois “vai 1” (ou para o bit de sinal ou para fora do 
número), o resultado está incorreto. Ocorreu overflow. 
 
 
Exemplos: (com registradores de 5 bits) 
 
1) Dois números positivos: N1 + N2 
 
+ 9 + (+ 4) = + 13 
 
 + 9 0 1 0 0 1 (1ª parcela) 
+ (+ 4) 0 0 1 0 0 (2ª parcela) 
 
 + 13 0 1 1 0 1 
 bit de sinal (+) 
 
noteque os bits de sinal da 1ª parcela e da 2ª parcela são ambos 0 e que o bit de sinal da 
soma é 0, indicando que a soma é positiva. 
 
Profs. Fábio Lucena Veloso e Roberto Barros 26
2) Número positivo e número negativo menor: N1 + C2 de N2 
 
+ 9 + (-4) (lembre-se que -4 estará em sua forma de complemento 2 = 11100) 
 
 + 9 0 1 0 0 1 
+ (-4) 1 1 1 0 0 
 
 + 5 1 0 0 1 0 1 
 bit de sinal (+) 
 
 este “vai 1” é desprezado 
 
neste caso, o bit de sinal da 2ª parcela é 1. Note que os bits de sinal também participam 
do processo de adição. De fato, um “vai 1” é gerado na última posição da adição. Este 
“vai 1” é desprezado, de modo que o resultado final da soma é 00101 que é equivalente 
a + 5. 
 
3) Número positivo e número negativo maior: C2 de N1 + N2 
 
-9 + (+ 4) (lembre-se que -9 estará em sua forma de complemento 2 = 10111) 
 
 -9 1 0 1 1 1 
+ (+ 4) 0 0 1 0 0 
 
 -5 1 1 0 1 1 complemento 2 de 1011 = 0101 = 5 
 
 bit de sinal (-) 
 
A soma aqui tem um bit de sinal igual a 1, indicando um número negativo. Como a 
soma é negativa, ela está na forma de complemento a 2, de modo que os quatro últimos 
bits (1011) representam o complemento a 2 de 0101 (equivalente ao decimal 5). Desta 
forma, 11011 é o equivalente a -5, o resultado correto. 
 
 
4) Dois números negativos: C2 de N1 + C2 de N2 
 
-9 + (-4) (lembre-se que -9 estará em sua forma de complemento a 2 = 10111 e 
que -4 estará em sua forma de complemento a 2 = 11100) 
 
-9 1 0 1 1 1 
-4 1 1 1 0 0 
 
-13 1 1 0 0 1 1 complemento 2 de 0011 = 1101 = 13 
 
 bit de sinal (-) 
 este “vai 1” é desprezado 
 
 
 
Profs. Fábio Lucena Veloso e Roberto Barros 27
Exemplos: (com registradores de 6 bits) 
 
5) N1 + N2: 
 
+ 12 + 7 
 
+ 12 0 0 1 1 0 0 
+ 7 0 0 0 1 1 1 
 
+ 19 0 1 0 0 1 1 
 bit de sinal (+) 
 
 
 
 
6) N1 + C2 de N2 
 
+ 12 + (-7) 
 
+ 12 0 0 1 1 0 0 
- 7 1 1 1 0 0 1 
 
+ 5 1 0 0 0 1 0 1 
 bit de sinal (+) 
 este “vai 1” é desprezado 
 
7) C2 de N1 + N2 
 
-12 + 7 
 
-12 1 1 0 1 0 0 
+ 7 0 0 0 1 1 1 
 
- 5 1 1 1 0 1 1 complemento 2 de 11011 = 00101 = 5 
 bit de sinal (-) 
 
 
8) C2 de N1 + C2 de N2 
 
-12 + (-7) 
 
 -12 1 1 0 1 0 0 
+ (-7) 1 1 1 0 0 1 
 
 -19 1 1 0 1 1 0 1 complemento 2 de 01101 = 010011 = 19 
 
 bit de sinal (-) 
 
 este “vai 1” é desprezado 
Profs. Fábio Lucena Veloso e Roberto Barros 28
Subtração no sistema de complemento de 2: 
 
A operação de subtração usando o sistema de complemento de 2, na verdade, envolve a 
operação de adição e não é, realmente, diferente dos casos vistos anteriormente. Ao se 
subtrair um número binário (o subtraendo) de outro número binário (o minuendo), o 
procedimento é o seguinte: 
 
1) Tome o complemento 2 do subtraendo, incluindo o bit de sinal. Se o subtraendo for 
um número positivo, isto irá torná-lo um número negativo na forma de complemento 2. 
Se o subtraendo for um número negativo, isto irá torná-lo um número positivo na forma 
binária verdadeira. Em outras palavras, nós estamos mudando o sinal. 
 
2) Depois de tomar o complemento 2 do subtraendo, ele é somado ao minuendo. O 
minuendo é mantido em sua forma original. O resultado dessa adição representa a 
diferença perdida. O bit de sinal dessa diferença determina se é + ou – e se está na 
forma binária verdadeira ou na forma de complemento 2. 
 
Exemplos: (com registradores de 5 bits) 
 
1) Vamos considerar o caso: + 4 deve ser subtraído de + 9 
 
Minuendo = + 9 
Subtraendo = + 4 complemento 2 = 11100 
 
 + 9 0 1 0 0 1 
- (+ 4) 1 1 1 0 0 complemento 2 = 11100 
 
+ 5 1 0 0 1 0 1 
 
 “vai 1” desprezado 
 
 
2) + 9 – (- 4) 
 
 + 9 0 1 0 0 1 
- (- 4) 0 0 1 0 0 complemento 2 de - 4 = 11100 ; 
complemento 2 de 11100 = 00100 
+ 13 0 1 1 0 1 
 
 
3) - 9 - (+ 4) 
 
 - 9 1 0 1 1 1 
- (+ 4) 1 1 1 0 0 complemento 2 = 11100 
 
- 13 1 1 0 0 1 1 complemento 2 de 0011 = 1101 = 13 
 
 bit de sinal (-) 
 “vai 1” desprezado 
Profs. Fábio Lucena Veloso e Roberto Barros 29
4) - 9 - (- 4) 
 
 - 9 1 0 1 1 1 
- (- 4) 0 0 1 0 0 complemento 2 de - 4 = 11100 ; 
complemento 2 de 11100 = 00100 
 - 5 1 1 0 1 1 complemento 2 de 1011 = 0101 = 5 
 bit de sinal (-) 
 
 
 
Obs. Lembrar sempre: 
 
a) As operações de soma são normalmente realizadas como soma 
 
b) As operações de subtração são realizadas como soma de complemento 
 
c) Se o resultado encontrado é um valor positivo, então o valor decimal correspondente 
da magnitude é obtido por pura conversão de base 2 para 10 
 
d) Se o resultado encontrado é um valor negativo, deve-se primeiro converter esse 
valor para representação de sinal e magnitude e, em seguida, converter a magnitude 
para complemento a 2 e depois converter o resultado da base 2 para 10. Finalizando 
põem-se o sinal negativo no resultado. 
 
 
Representação em ponto flutuante. 
 
Em aplicações científicas ocorrem números muito grandes (como na astronomia) ou 
muito pequenos (como na física atômica). Nesses casos, sempre se estará interessado na 
ordem de grandeza do valor, e um certo número de dígitos de precisão. Nas máquinas 
de calcular científicas vemos a representação de números em notação científica, onde 
10234 é mostrado como 1.0234E05, significando 1.0234 * 105. Em computação, 
chamamos a notação científica de representação em ponto flutuante. 
 
Um número em notação científica é representado por um produto de dois fatores: 
 
EFxBN ±±= 
 
Onde: 
• N = número que se deseja representar 
• = sinal do número ±
• F = dígitos significativos do número (também chamada parte fracionária ou 
mantissa) 
• B = base de exponenciação 
• E± = valor do expoente, com seu sinal (expoente pode ser positivo ou 
negativo) 
 
 
Profs. Fábio Lucena Veloso e Roberto Barros 30
Exemplo: -2,3456 x 10-23
 
A representação interna dos números de ponto flutuante varia de fabricante para 
fabricante, pois além de se poder representar a mantissa de números negativos na forma 
sinal e magnitude ou complemento a dois, o expoente também pode ter essa 
representação, ou, como é o caso dos mainframes IBM, ter a representação de excesso a 
N. No caso do IBM, um expoente 64 significa 0, enquanto o 63 significa -1 e o 67 
significa 3 (excesso a 64). Também a base da exponenciação pode ser 2, 10 ou 16 (No 
IBM a base é 16). 
 
O importante é saber de alguns problemas que influenciam na programação com 
números de ponto flutuante. 
 
O resultado de operações aritméticas deve ser sempre considerado como aproximado. 
Com isso, nunca se deve perguntar se uma variável é igual a outra, ou igual a uma 
constante. Em vez disso, deve ser perguntado se a diferença entre os valores é muito 
pequena. Por exemplo, para saber se um número é zero, usa-se: IF ABS(NUMERO) < 
0.0000001. Para saber se um número é igual a outro pergunta-se: IF ABS (NUMERO-
OUTRO)<0.0001. 
 
Apesar de um número poder ser muito grande ou muito pequeno, não se deve somar 
números de grandeza muito diferentes, pois o menor número não causará diferença na 
soma, devido à pequena precisão dos dados. Exemplo: 1000000000000 + 0,000000001 
= 1000000000000, uma vez que o número de dígitos significativos é maior que a 
precisão da variável que contém o número. 
 
Em COBOL, os números de ponto flutuante são declarados como COMP-1 (precisão 
simples- 4 bytes) e COMP2 (precisão dupla- 8 bytes). Na linguagem C e no Visual 
Basic os tipos podem ser: SINGLE (4 bytes -3.402823E38 até -1.401298E-45 para 
números negativos; 1.401298E-45 até 3.402823E38 para positivos) e DOUBLE (8 bytes 
-1.79769313486232E308 até -4.94065645841247E-324 para negativos; 
4.94065645841247E-324 até 1.79769313486232E308 para positivos).Em ponto 
flutuante, várias configurações podem representar o mesmo valor. Por exemplo, 102E1 
= 1,02E3 = 0,102E4. A representação aonde o dígito antes da vírgula é zero, e o após a 
vírgula é não zero é chamada de representação normalizada. 
 
 
Representação decimal 
 
As representações em ponto fixo e ponto flutuante são ótimas para cálculos 
matemáticos, em aplicações científicas. Para aplicações comerciais, como contabilidade 
e sistemas financeiros, precisa-se de um sistema que não tenha problemas de precisão, 
nem de conversão, que aparecem nas conversões de números decimais fracionários para 
binário (por exemplo, 0,1 na base 10 é uma dízima nas bases 2 e 16). 
 
A solução encontrada para equilibrar a necessidade de realizar eventuais operações 
aritméticas com valores decimais, mas representá-los internamente, sempre de forma 
binária, constituiu-se um método híbrido de representação de dados, denominado código 
binário decimal (Binary Coded Decimal – BCD) 
Profs. Fábio Lucena Veloso e Roberto Barros 31
 
O sistema BCD (código binário decimal) é um misto de decimal com binário, na forma 
BCD os dados decimais usados em um programa, em vez de serem diretamente 
convertidos da base 10 para a base 2, são representados internamente por códigos 
binários correspondentes a cada algarismo decimal, conforme mostrado na figura. 
 
 
Decimal Binário BCD 
0 0000 
1 0001 
2 0010 
3 0011 
4 0100 
5 0101 
6 0110 
7 0111 
8 1000 
9 1001 
 
Assim, por exemplo, o número decimal 7458 seria representado no código BCD da 
seguinte forma: 
 
0111 0100 0101 1000 
( 7 ) ( 4 ) ( 5 ) ( 8 ) 
 
Entre os algarismos sem código válido em decimal (códigos representativos dos valores 
decimais de 10 a 15) é comum utilizar alguns deles para indicar o sinal do número. Por 
exemplo, alguns sistemas utilizam 1100 para representar o sinal de (+) e 1101 para 
representar o sinal de (-). 
 
Atualmente só é usado o sistema conhecido como decimal compactado. Nesse sistema, 
a cada 4 bits têm-se um dígito decimal, valendo de 0 a 9. As configurações de A a F só 
são usadas no dígito mais à direita, para representar o sinal (B e D representam o -, 
enquanto A, C, E e F representam o +). 
 
Nos mainframes IBM, os números em decimal compactado podem ter até 16 
bytes de comprimento, permitindo números com até 31 dígitos de precisão, já que o 
sinal gasta meio byte. Nos computadores aonde a CPU não tem instruções para operar 
com números nessa representação, é necessária a implementação de rotinas para efetuar 
as 4 operações com esses números. Também se pode implementar a aritmética decimal 
compactada nos co-processadores aritméticos, para economizar tempo de execução de 
programas. 
 
 
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 
Profs. Fábio Lucena Veloso e Roberto Barros 32
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. 
 
Profs. Fábio Lucena Veloso e Roberto Barros 33
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). 
 
 
 
 
Profs. Fábio Lucena Veloso e Roberto Barros 34
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çã
b) Substituir nomes simbólicos d
c) Reservar espaço em memória
d) Converter valores de constant
e) Examinar a correção de cada 
 
 
 
o simbólicos por valores numéricos; 
e endereços pelos valores numéricos dos endereços; 
 para armazenar as instruções e dados; 
es para código binário e 
instrução. 
Profs. Fábio Lucena Veloso e Roberto Barros 35
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; 
 
Profs. Fábio Lucena Veloso e Roberto Barros 36
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 no sistema. É 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 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
Profs. Fábio Lucena Veloso e Roberto Barros 37
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. 
 
Profs. Fábio Lucena Veloso e Roberto Barros 38
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 
Profs. Fábio Lucena Veloso e Roberto Barros 39
 
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ênciana 
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 
 
 
 
Profs. Fábio Lucena Veloso e Roberto Barros 40
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. 
 
Ocorrência Peso nas Instr. De Máquina Peso em Ref. à MP Comando 
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. 
 
 
Profs. Fábio Lucena Veloso e Roberto Barros 41
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 
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 
Execução otimizada de 
chamada de funções 
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 
Menor quantidade de modos 
de endereçamento 
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 
Utilização em larga escala do 
pipelining 
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 
 
 
 
 
 
 
 
 
 
 
 
Profs. Fábio Lucena Veloso e Roberto Barros 42
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. 
	Instituto Politécnico
	Curso: Tec. Redes de Computadores
	Disciplina: Organização de Computadores
	Prof.: Fábio Lucena Veloso
	Curso: Tec. Análise de Sistemas
	Disciplina: Organização de Computadores
	Prof.: Roberto Barros

Outros materiais