Você está na página 1de 91

ORGANIZAÇÃO E

ARQUITETURA DE
COMPUTADORES
SUMÁRIO

Apresentação 4
Autor 5

UNIDADE 1

Evolução histórica do computador 6


Organização Estruturada de Computadores

Breve história do computador

Arquitetura de Computadores

UNIDADE 2

A informação e sua representação 29


Sistemas de Numeração

Conversão entre os Sistemas de Numeração

Aritmética Binária
SUMÁRIO

UNIDADE 3

Componentes do computador 54
Modelo de von Neumann

Modelo de barramento de sistema

Sistemas de computação

UNIDADE 4

Execução de programas 70
Geração de programas executáveis

Interpretação

Linguagem montadora
APRESENTAÇÃO

A disciplina Organização e Arquitetura de Computadores tem por objetivo permitir a você


conhecer os conceitos básicos de arquitetura de computadores digitais com seus devi-
dos componentes elementares, entendendo suas aplicabilidades no mercado de traba-
lho, bem como a evolução proporcionada ao longo do tempo.

A disciplina está dividida logicamente em quatro unidades distribuídas, e você estudará:

• Na Unidade 1, a evolução histórica dos computadores a partir de uma abordagem


clara e objetiva.
• Na Unidade 2, a informação e sua representação; dessa forma, você irá manipular
conversão de bases de sistemas de numeração, aritmética binária e o reconheci-
mento de símbolos disponíveis na tabela American Standard Code for Information
Interchange — ASCII;
• Na Unidade 3, os principais componentes do computador.
• Na Unidade 4, a execução de programas, buscando entender o funcionamento
de programas executáveis, diferenciando a linguagem interpretada e a linguagem
montadora.

4
AUTOR

ALFREDO NAZARENO PEREIRA BOENTE

Pós-doutorado em Neurociência e Sistemas Lógicos aplicados à Gestão Empresarial,


Educação e Pesquisa Experimental pelo HCTE/UFRJ (2014); doutorado em Ciências
da Engenharia de Produção pelo Instituto Alberto Luiz Coimbra de Pós-Graduação
e Pesquisa de Engenharia – COPPE/UFRJ (2013); doutorado em Processamento de
Dados pela AWU-IOWA-USA (2006); mestrado em Administração e Desenvolvimento
Empresarial pela Universidade Estácio de Sá – Unesa (2009); mestrado em Ciências
da Computação pela Universidad de Habana-CU (2003), mestrado em Engenharia de
Software pela AWU-IOWA-USA (2002); especialização em Análise de Sistemas pela
Unesa (2000); especialização em Docência Superior pela Universidade Cândido Mendes
— Ucam (2001); especialização em Tecnologia em Banco de Dados pela Unesa (2001);
especialização em Ciências da Computação pela Universidad de La Habana, em Cuba
(2002); especialização em Administração Escolar pela Unesa (2003); especialização
em Logística Empresarial pela Faculdade Internacional Signorelli (2016); graduação em
Processamento de Dados com ênfase em Projeto e Análise de Sistemas pelas Faculdades
Reunidas Professor Nuno Lisboa (1996); graduação em Processos Gerenciais – Gestão
Empresarial pela Universidade Veiga de Almeida – UVA (2018).

5
UNIDADE 1

Evolução histórica do computador


INTRODUÇÃO

Esta unidade é importante para que o estudante conheça a organização estruturada de


computador com os seus mais diferentes níveis, buscando uma compreensão acerca da
diferença entre computadores analógicos e digitais. O estudante também irá conhecer a
história dos computadores e o registro de suas gerações, o que lhe dará base para iniciar
o estudo das arquiteturas de computadores RISC e CISC.

OBJETIVO

Nesta unidade, você será capaz de:

• Conceituar a organização e arquiteturas de computadores a partir de uma breve


história dos computadores.

7
Organização Estruturada de Computadores

No que tange ao estudo da organização estruturada de computadores, é necessário dei-


xar bem claro que aquilo que ora é conveniente para o ser humano não é de mesma
forma conveniente para o computador. De certo, o computador não entende a linguagem
do ser humano, seja ela utilizada no nosso cotidiano, seja ela utilizada por meio de lingua-
gens de programação. O entendimento do computador acerca daquilo que desejamos
que seja realizado por ele está em uma esfera bem diferente daquela compreendida pelo
ser humano. Dessa forma, observe que se pode classificar como linguagem de alto nível
e linguagem de baixo nível o seguinte:

Linguagem de baixo nível


Linguagem de alto nível

É aquela que mais É aquela que mais


se aproxima do se aproxima do
entendimento das entendimento da
pessoas do que do máquina do que do
computador. homem.

Existe o conceito de máquinas de multiníveis contemporâneas que está ligado diretamente


à quantidade de níveis de uma máquina. A maioria dos computadores modernos
apresenta dois ou mais níveis. Nesse viés, pode-se afirmar que existem máquinas com
até seis níveis, conforme ilustra a Figura 1, apresentada a seguir.

8
Figura 1: Computador com seis níveis.

Nível 5 Nível de linguagem orientada a problema

Tradução (compilador)
Nível 4 Nível de linguagem assembly

Tradução (assembler)
Nível 3 Nível de máquina do sistema operacional

Interpretação parcial (sistema operacional)


Nível 2 Nível de arquitetura do conjunto de instrução

Interpretação (microprograma) ou execução direta


Nível 1 Nível de microarquitetura

Hardware
Nível 0 Nível lógico digital

Fonte: Tanenbaum (2013).

Vamos conhecer melhor cada um desses níveis?

O nível 0, descrito de baixo para cima, é conhecido como nível lógico digital e refere-se
ao hardware verdadeiro da máquina cujos circuitos executam programas em linguagem
de máquina, ou seja, linguagem de baixo nível. Hardware é a parte física do computador,
composta pelos dispositivos eletrônicos e eletromecânicos.

No estudo da engenharia elétrica, ainda é apresentado um nível mais abaixo do que o


nível 0, tecnicamente conhecido como nível de dispositivo (portanto, está fora do escopo
desta disciplina).

O nível 1, conhecido como nível de microarquitetura, apresenta uma coleção de 8 a 32


registradores que formam uma memória local e um circuito tecnicamente conhecido
como Unidade Lógica e Aritmética – ULA, que é capaz de realizar operações aritméticas
simples. Já os registradores estão conectados à ULA para formar os chamados caminhos
lógicos de dados, que controlados por um programa conhecido como microprograma,
em algumas máquinas, e pelo próprio hardware do computador, em outras.

9
O nível 2, conhecido como nível de arquitetura do conjunto de instrução, também
conhecido tecnicamente como Instruction Set Architecture – ISA. Em linhas gerais, os
fabricantes de computadores disponibilizam um manual de referência da linguagem
de máquina, que se refere ao ISA, ou seja, ao conjunto de instruções executadas pelo
hardware do computador.

O nível 3, conhecido como nível de máquina do sistema operacional, é o nível no qual suas
instruções também são executadas, ou por microprogramas, ou pelo próprio hardware
do computador. Nele, algumas instruções são interpretadas pelo sistema operacional
e outras diretamente pelo microprograma ou controle de hardware, e não pelo sistema
operacional propriamente dito.

O nível 4, conhecido como nível de linguagem assembly, refere-se à chamada linguagem


montadora que, na realidade, é uma forma simbólica para uma das linguagens
subjacentes. Nesse nível, é disponibilizado um método para que as pessoas possam
escrever programas para os níveis 1, 2 e 3, que serão em seguida interpretados pelo
computador. O programa de software que especificamente realiza tal tradução é
tecnicamente denominado assembler. Software é, portanto, a parte lógica do computador,
composta pelos programas de computador.

O nível 5, conhecido como nível de linguagem orientado a problema, consiste em


linguagens projetadas para serem usadas por programadores de aplicações que
geralmente têm problemas a resolver. Essas são as chamadas linguagens de alto
nível, geralmente traduzidas por compiladores específicos para cada uma delas. Os
compiladores são, na verdade, programas de computador que geram um código-objeto
a partir de um código-fonte escrito em certa linguagem de computador de alto nível, para
que esta seja compreensível pelo computador (baixo nível). Pode-se citar como exemplo
de linguagem de alto nível C, C++, Java, PHP, Python, dentre outras.

Então, a partir de seus diferentes níveis, o computador é uma máquina capaz de executar
uma sequência de instruções que são definidas pelo homem para gerar um determinado
resultado, a fim de solucionar dado problema. A essa sequência de instruções, dá-se o
nome de algoritmo, o qual pode ser definido por um conjunto de regras expressas por
uma sequência lógica finita de instruções que serão executadas pelo computador.

10
Saiba mais

Nos microcomputadores, a relação entre arquitetura e organização é muito


próxima. As mudanças na tecnologia não apenas influenciam na organização,
como também resultam na introdução de arquiteturas mais poderosas e flexíveis.

Classificação dos computadores

Os computadores podem ser tecnicamente classificados como analógicos


ou digitais. Vamos ver as características de cada um deles?

Os computadores analógicos não trabalham com números nem com símbolos que
representam os números, pois procuram fazer analogias entre quantidades. O ábaco é
um exemplo clássico desse tipo de computador (ver Figura 2), uma vez que se utilizava
de pequenos carretéis embutidos em um pequeno filete de metal para realizar cálculos.
É considerado a máquina de calcular primitiva, pois, segundo Tanenbaum (2013), teve
origem provavelmente na Mesopotâmia, há mais de 5.500 anos.

Figura 2: Computador Analógico - Ábaco.

A régua de cálculo (ver Figura 3) utiliza comprimentos de escalas especialmente calibradas


para facilitar a multiplicação, a divisão e outras funções.

Figura 3: Computador Analógico - Régua de Cálculo.

11
Portanto, os computadores analógicos representam uma categoria de computadores
que se utilizam de eventos elétricos, mecânicos ou hidráulicos para resolver problemas.

Charles Babbage foi o inventor da máquina diferencial que era capaz de realizar cálculos
polinomiais, baseada no conceito de um computador analógico.

Curiosidade

A máquina analítica criada por Babbage precisava de software, pois era


programável em uma linguagem de montagem simples. Para produzir esse
software, Babbage contratou a jovem Ada Augusta Lovelace, filha do famoso
poeta britânico Lord Byron. Assim, Ada Lovelace foi a primeira programadora
de computadores do mundo. A linguagem de programação ADA teve esse
nome em sua homenagem.

Figura 4: Computador Digital.

Conforme será estudado a seguir, todos os computadores que surgiram,


independentemente de sua caracterização por geração, foram baseados na chamada
Máquina Universal, que se refere a um dispositivo teórico também conhecido como
Máquina de Turing. A Máquina de Turing recebeu esse nome devido ao seu inventor, o
matemático, lógico, criptoanalista e cientista da computação britânico, Alan Mathison
Turing. O artigo de referência acerca da Máquina de Turing foi publicado em 1936.

12
Curiosidade

A história do projeto do desenvolvimento do computador Colossus, durante a


Segunda Guerra Mundial, é contada no filme O Jogo da Imitação (2014). Vale
a pena assistir ao filme para ter ideia do projeto, do contexto histórico e da
influência de Alan Turing.

MIDIATECA

Acesse a midiateca da Unidade 1 e veja o conteúdo complementar indicado pelo


professor sobre Alan Turing.

13
Breve história do computador

Caracterizado pela evolução tecnológica, o computador passa de analógico para digital.


De certo que essa evolução somente ocorreu graças ao desenvolvimento das tecnologias
utilizadas na construção dos computadores.

O surgimento dos primeiros computadores digitais, tendo como percursor o computador


analógico, permitiu que a classificação dos computadores fosse caracterizada por
gerações, a partir das tecnologias que eram utilizadas para sua fabricação.

Vamos entender melhor cada uma dessas classificações?

Geração zero: computadores mecânicos (1642-1945)

A geração zero foi caracterizada pelo uso dos computadores essencialmente analógicos,
os quais eram construídos a partir de engrenagens mecânicas e eletromecânicas, cuja
operação era realizada de forma lenta, em baixa velocidade, limitando-se, portanto, à
resolução de problemas bem específicos (STALLINGS, 2017). Dois exemplos clássicos
de computadores dessa geração são a Máquina de Pascal (ver Figura 5) e a Máquina das
Diferenças de Babbage (ver Figura 6).

Figura 5: Máquina de Pascal.

14
Figura 6: Máquina das Diferenças de Babbage.

Primeira geração: válvulas (1945-1955)

De acordo com Stallings (2017), essa geração de computadores utilizou válvulas (ver Figura
7) para elementos lógicos digitais e memória. Uma série de pesquisas e computadores
comerciais foram construídos com válvulas. O estímulo para o computador eletrônico foi
a Segunda Guerra Mundial, segundo Tanenbaum (2013).

Figura 7: Válvula.

O primeiro computador digital eletrônico dessa geração foi o Eletronic Numeric Integrator
and Computer – ENIAC, construído por John Mauchley e John Presper Eckert, inicialmente
idealizado em 1943.

O ENIAC apresentava, em sua estrutura, 18.000 válvulas e 1.500 relés, pesando 30


toneladas, que consumia na época 140 kw de energia, conforme ilustra a Figura 8. Sua
construção somente foi concluída em 1946 com a ajuda de colaboradores, dentre eles,
John von Neumman.

15
Figura 8: ENIAC.

Em 1949 entrou em operação o Eletronic Delay Storage Automatic Calculator – EDSAC,


construído por Maurice Wilkes na Universidade de Cambridge. Nesste mesmo período,
John Mauchley e John Presper Eckert começaram a trabalhar no Eletronic Discrete Variable
Computer — EDVAC, enquanto John von Neumman foi para o Institute for Advanced
Studies, em Princeton, para construir sua própria versão do EDVAC, a chamada Máquina
IAS. O primeiro projeto básico descrito por John von Neumman, passou a ser conhecido
como Máquina de von Neumman (ver Figura 9), que foi utilizada como arquitetura básica
do EDSAC.

Figura 9: Máquina Original de Von Neumman.

Memória

Unidade de Unidade de lógica e


controle aritimética Entrada

Saída

Acumulador
Fonte: Tanenbaum (2013).

16
A Máquina de Von Neumman apresentava cinco partes básicas consideradas elementos
básicos do sistema computacional:

(1) Memória.
(2) Unidade de lógica e aritmética.
(3) Unidade de controle.
(4) Equipamento de entrada.
(5) Equipamento de saída.

Nos computadores modernos, o “cérebro”, a unidade de lógica e aritmética e a unidade


de controle são combinados em um único chip, denominado Central Processing Unit –
CPU – (Unidade Central de Processamento).

O último computador dessa geração foi o Universal Automatic Computer – UNIVAC,


considerado um computador de grande escala, cujo primeiro modelo foi apresentado
em 1951. O modelo final da série UNIVAC ocorreu em 1955.

Segunda geração: transistores (1955-1965)

Stallings (2017) afirma que essa geração de computadores utilizou transistores (ver
Figura 10). Foi inventada em 1948, nos Bell Labs, por John Bardeen, Walter Brattain e
William Shockley, em substituição às válvulas.

Figura 10: Transistor.

O primeiro computador transistorizado recebeu o nome de Transistorized Experimental


Computer 0 – TX-0 (Computador Transistorizado Experimental 0), tendo sua construção
iniciada em 1955 e concluída somente em 1956, um ano depois. Em substituição ao TX-0,

17
surge, em 1961, o Programmed Data Processor-1 – PDP-1 (Processador de Dado
Programável), desenvolvido pela empresa Digital Equipament Corporation (DEC). Com
isso, surge a indústria de minicomputadores (CORRÊA, 2016).

Para refletir

Antes do lançamento do PDP-1, os computadores eram tão grandes e caros


que poucos tinham acesso a esse tipo de tecnologia. No entanto, nos dias de
hoje, a tecnologia é disponível para todos.

O PDP-1 foi doado ao Massachusetts Institute of Technology – MIT, onde logo atraiu a atenção
de estudantes, professores e pesquisadores. Anos mais tarde, surgiu o PDP-8, uma inovação
tecnológica que apresentava um barramento único, o omnibus (ver Figura 11).

Figura 11: Barramento omnibus do PDP-8.

Terminal de E/S de fita


CPU Memória console de papel
Outra E/S

Omnibus
Fonte: Tanenbaum (2013).

O autor define barramento como um conjunto de fios paralelos utilizados para conectar
os componentes de um computador. Surge o multiprocessamento (capacidade do
processador de processar dois ou mais processos simultâneos).

Decerto, naquela época, enquanto os projetistas buscavam tornar os hardwares mais


baratos (DEC) ou mais rápidos (International Business Machine – IBM e Control Data
Corporation – CDC), um grupo de pesquisadores adotou uma linha de ação diferente,
pois buscavam construir uma máquina com a intenção de programá-la em linguagem
Algol 60, uma precursora da linguagem C e da linguagem Java. Nesse viés, nascia o
Burroughs B5000 e a ideia de que o software também era importante. A IBM desenvolve
o computador IBM 7094 que, na época, vendeu em larga escala.

18
Terceira geração: circuitos integrados (1965-1980)

Segundo Stallings (2017), um transistor isolado, autocontido, é chamado de componente


discreto. Os componentes discretos (transistores, resistores, capacitores e assim por
diante) eram fabricados separadamente. Imaginava-se, na época, como vários desses
componentes discretos poderiam ser unificados em um só componente. Surge então,
em 1958, o circuito integrado (ver Figura 12) de silício inventado por Jack Kilby e Robert
Noyce, permitindo que dezenas de transistores fossem colocados em um único chip.

Figura 12: Circuito integrado.

Esse tipo de empacotamento possibilitava a construção de computadores menores, mais


rápidos e mais baratos do que seus precursores transistorizados. O parâmetro utilizado
para visualização da velocidade do processador é tecnicamente denominado velocidade
de clock, que se refere à real velocidade do computador.

Naquela época, surgiu a multiprogramação (capacidade de executar dois ou mais


programas na memória ao mesmo tempo). Nesse período também foi adotada
efetivamente a chamada arquitetura Complex Instruction Set Computer – CISC, capaz de
executar centenas de instruções complexas diferentes.

A DEC continuava sendo líder de mercado sobre outros fabricantes com o lançamento do
PDP-11 que tinha registradores orientados a palavras (word) e uma memória orientada
para byte, e ambos ocupavam uma faixa que abrangia uma considerada relação preço/
desempenho (TANENBAUM, 2013). Mais uma vez, a IBM inovou com o lançamento do
IBM 360.

Quarta geração: microprocessadores (1980-atual)

Stallings (2017) afirma que, na década de 1980, surge a Very Large Scale Integration
– VLSI (Integração em Escala Muito Grande), que tinha possibilitado colocar, primeiro,
dezena de milhares, depois, centena de milhares e, por fim, milhões de transistores em
um único chip (ver Figura 13).

19
Figura 13: Chip VLSI.

Esse desenvolvimento logo levou a computadores menores e bem mais rápidos. Antes do
PDP-1, os computadores eram tão grandes e caros que as empresas e as universidades tinham
que ter departamentos especiais denominados centrais de computação para usá-los. Com
a chegada do minicomputador, cada departamento podia comprar sua própria máquina. Em
1980, os preços dos computadores caíram tanto que era possível que um indivíduo tivesse
seu próprio computador, denominado computador pessoal (Personal Computer – PC). Nessa
época, a Intel lança CPUs com microprocessadores modernos e potentes a preços bem
competitivos com os de seus concorrentes, entrando fortemente na briga do mercado dos
computadores pessoais. Depois disso, surgiram os microcomputadores.

Toda essa evolução histórica permite que os computadores sejam apresentados em


diferentes portes (grande porte, pequeno porte, minicomputador e microcomputador, por
exemplo). Vale ressaltar que:

O porte do computador não tem relação direta com o seu tamanho e


peso, mas sim com sua capacidade de processamento e armazenamento
de dados.

Nessa época, a Apple destacava-se com os computadores pessoais, denominados Apple,


que, mais tarde, se tornariam o Apple II, projetado por Steve Job e Steve Wozniak. Ao mesmo
tempo, hardwares bem sofisticados necessitavam de softwares também sofisticados.

20
Saiba mais

O nascimento do mercado de computadores pessoais também gerou o


computador portátil. O primeiro deles foi o Osborne-1, que pesava 11 quilos e,
na verdade, era mais um computador “arrastável” do que portátil. Ainda assim,
comprovava a ideia de que um computador portátil era possível. Fica lançada a
ideia para os futuros notebooks, laptops, palmtops, dentre outros.

Surge, então, o IBM-PC, com o sistema operacional MS-DOS, desenvolvido pela Microsoft
Corporation, representada por Bill Gates e Paul Allen. Não querendo ficar atrás, a Apple
lança o Macintosh, com o sistema operacional Mac OS, próprio para computadores Apple.

Importante

Essa emocionante disputa entre Steve Jobs e Bill Gates está bem detalhada no
filme Piratas do Vale do Silício.

Em meados de 1980, surge um novo desenvolvimento, denominado Reduced Instruction


Set Computer – RISC, em substituição do CISC.

Ainda nos anos 1980, a Microsoft desenvolveu o sistema operacional Windows, que
passou a ser utilizado em grande parte dos computadores pessoais do mundo inteiro.

Quinta geração: computador de baixa potência e invisíveis

Tanenbaum (2013) afirma que, em 1981, o governo japonês anunciou que estava planejando
gastar 500 milhões de dólares para ajudar empresas a desenvolver computadores de
quinta geração que seriam baseados em inteligência artificial e representariam um salto
quântico em relação aos computadores “burros” da quarta geração. No entanto, o que
caracterizou a quinta geração de computadores foi o encolhimento dos computadores.
O primeiro tablet foi lançado em 1989 pela Grid Systems, denominado GridPad. Consistia
em uma pequena tela em que os usuários podiam escrever com uma caneta especial
para controlar o sistema.

21
Hoje em dia, são projetados computadores “invisíveis”, embutidos em eletrodomésticos,
relógios, cartões bancários e diversos outros dispositivos. Esses processadores permitem
maior funcionalidade e custos mais baixos em uma ampla variedade de aplicações.
Um aspecto peculiar desses computadores embutidos é que o hardware e o software
costumam ser projetados em conjunto.

Dessa forma entende-se a primeira geração como máquinas de válvulas (por exemplo, o
ENIAC), a segunda geração como máquinas de transistores (por exemplo, o IBM 7094), a
terceira geração como as primeiras máquinas de circuitos integrados (por exemplo, IBM
360), a quarta geração como computadores pessoais (por exemplo, as CPUs Intel) e a
quinta geração reflete, na verdade, mais uma mudança de paradigma do que uma nova
arquitetura específica. Em um futuro, não tão distante, computadores estarão espalhados
por todas as partes do mundo, embutidos em tudo (computadores, de fato, invisíveis).

MIDIATECA

Acesse a midiateca da Unidade 1 e veja o conteúdo complementar indicado pelo


professor sobre o surgimento da microinformática.

22
Arquitetura de Computadores

Nesta última parte da unidade, você irá estudar a arquitetura RISC e a arquitetura CISC,
assim como conhecer o pipeline, ou seja, paralelismos e seus tipos.

Arquitetura RISC

A arquitetura Reduced Instruction Set Computer — RISC (Computador com Conjunto


de Instruções Reduzidas), foi criada na década de 1980. Os processadores RISC
apresentavam diferenças significativas em relação a outros existentes na época. Uma
vez que essas CPUs eram incompatíveis com as outras do mesmo período, conforme
afirma Corrêa (2016), seus projetistas tinham liberdade para escolher novos conjuntos de
instruções que maximizassem o desempenho total do sistema.

Embora a fase inicial estivesse dirigida a instruções simples, que podiam ser executadas
rapidamente, logo se percebeu que projetar instruções capazes de ser iniciadas com
rapidez era a chave para o bom desempenho dos computadores modernos. Na verdade,
o tempo que uma instrução demorava para ser iniciada importava menos do que a
quantidade de instruções que podiam ser inicias por segundo.

Os processadores RISC caracterizam-se, portanto, por contar com um pequeno conjunto


de instruções, as quais fazem o mínimo possível de operações simples. Entretanto, um
subconjunto de instruções simples simula as instruções mais complexas, o que torna a
programação em RISC mais difícil e demorada que aquela realizada por outros projetos,
CISC, por exemplo.

Arquitetura CISC

A arquitetura Complex Instruction Set Computer — CISC (Computador com Conjunto de


Instruções Complexas) apresenta um grande conjunto de instruções simples e complexas.
Isso faz com que a programação de computadores, com base nessa arquitetura, seja
mais fácil que em computadores com base em outros projetos. Por outro lado, segundo
Corrêa (2016), a complexidade do conjunto de instruções torna os circuitos da CPU e da
unidade de controle bastante complicados.

23
Curiosidade

Houve uma tentativa de criar uma arquitetura mista ora denominada CRISC,
que apresentaria tanto as características da arquitetura RISCO como as
características da arquitetura CISC. Obviamente, esse foi um caso de
insucesso, porém serviu como ideia para que os computadores modernos
fossem projetados com as duas arquiteturas, RISC e CISC, mantendo suas
características primárias.

Um ponto importante a ser considerado no estudo da história dos computadores está na


busca contínua da melhoria de desempenho dos computadores, buscando torná-los mais
rápidos e eficientes. Nesse viés, o modo de alcançar esse objetivo é tornar os chips mais
rápidos, aumentando sua velocidade de clock, independentemente de sua arquitetura,
RISC ou CISC. Para tanto, o paralelismo, conhecido tecnicamente como pipeline, é um
meio viável de conseguir um desempenho ainda melhor para dada velocidade de clock.
Na verdade, paralelismo refere-se à execução de duas ou mais coisas ao mesmo tempo.

Veja agora as duas modalidades gerais de paralelismo:

1. Nível de instrução 2. Nível do processador

O paralelismo é explorado Várias CPUs trabalham juntas


dentro de instruções para a solução do mesmo
individuais para obter da problema, no entanto, cada
máquina mais instruções por abordagem tem seus próprios
segundo. méritos.

24
Saiba mais

Os primeiros sistemas de processamento paralelo foram construídos no final


dos anos 1960 e tinham somente dois processadores. Os anos de 1970 viram
a introdução de supercomputadores com até 32 processadores, e os anos
de 1980 trouxeram os primeiros sistemas com mais de 1000 processadores.
Finalmente, em 1999, a IBM anunciou a construção de um supercomputador,
chamado Blue Gene. Esse computador maciçamente paralelo continha mais
de um milhão de processadores, cada qual com sua própria memória.

A partir dos computadores com processadores 486, a Intel passou a utilizar


tanto a arquitetura RISC como a arquitetura CISC. Dessa forma, a máquina
contém um núcleo RISC, que executa as instruções mais simples e um
único ciclo do caminho de dados, enquanto interpreta as instruções mais
complicadas, mais complexas no modo CISC.

MIDIATECA

Acesse a midiateca da Unidade 1 e veja o conteúdo complementar indicado pelo


professor sobre a evolução da informática.

25
NA PRÁTICA

Uma empresa da área de Sistema de Informação foi contratada para dar apoio quanto
ao planejamento e gerenciamento da infraestrutura de recursos de informação aos
sócios que estavam abrindo um novo escritório. Uma das orientações da empresa
da área de Sistema de Informação é que os computadores fossem da Intel. Isso
porque a Intel apresenta computadores com processadores da sexta geração.
Portanto, são mais rápidos, têm recursos de segurança integrada e também mais
compatíveis com o Windows 10.

A empresa explicou aos sócios do novo escritório que esses computadores fazem
parte da Era Skylake. “Skylake é o nome da microarquitetura com manufatura de 14
nanômetros da Intel, a qual, por sua vez, é o ponto de partida da sexta geração de
processadores da empresa. Como é de se esperar de qualquer evolução, a sexta
geração dos processadores Intel Core oferece desempenho melhorado e novas
experiências com menor consumo de energia. Além disso, ela amplia o leque de
designs possíveis para os dispositivos em que estará embarcada: tablets, computer
stick, dispositivos 2 em 1, all-in-one com 4K e as novas workstations móveis.”

Um exemplo de computador de ponta no mercado está ligado à família do


processador Intel Xeon E3, que “passa a equipar também uma série de workstations
móveis, enquanto a sexta geração de processadores Intel vPro é voltada para
negócios e empresas. Mais de 48 processadores com a Intel Iris e Iris Pro Graphics
fazem parte dessa nova geração, que possui foco também na Internet das Coisas. As
indústrias de varejo, médica, industrial, vigilância e segurança digital se beneficiam
das melhorias dos novos processadores e contam com designs de Internet das
Coisas da borda para a nuvem.”

Fonte: INTEL. Processadores da sexta geração da Intel são mais rápidos, cheios de recursos
de segurança integrada e ainda mais compatíveis com o Windows 10. Inovação Tecnológica,
11 janeiro 2017.

26
Resumo da Unidade 1

Nesta unidade, você conheceu a organização estruturada de computador com os


seus mais diferentes níveis. Compreendeu a diferença dos computadores analógicos
e digitais, destacando a máquina de calcular primitiva. Aprendeu também a história
dos computadores, conhecendo as características de suas gerações, além de ter
compreendido as diferenças apontadas nas arquiteturas RISC e CISC.

CONCEITO

Nesta unidade, destacaram-se os conhecimentos:

• Da organização estruturada de computador com os seus mais diferentes níveis,


que nos leva à compreensão lógica dos computadores analógicos e digitais.
• Do que caracterizou as diversas gerações de computadores, o que nos reporta a
um importante marco histórico da própria evolução dos computadores.
• Das arquiteturas de computadores, RISC e CISC, que nos conduzem às mais
modernas arquiteturas de computadores dos dias atuais.

27
Referências

CORRÊA, A. G. D. Organização e Arquitetura de Computadores. São Paulo: Pearson


Education do Brasil, 2016. [Biblioteca Virtual]

STALLINGS, W. Arquitetura e Organização de Computadores. 10. ed. São Paulo: Pearson


Education, 2017. [Biblioteca Virtual]

TANENBAUM, A. S. Organização Estruturada de Computadores. 6. ed. São Paulo:


Pearson Prentice Hall, 2013. [Biblioteca Virtual]

28
UNIDADE 2

A informação e sua representação


INTRODUÇÃO

Esta unidade é importante para que você conheça os sistemas de numeração (decimal,
binário, octal e hexadecimal) para a realização das conversões entre os diferentes
sistemas de bases de numeração. Você também irá efetuar cálculos elementares com
números binários.

OBJETIVO

Nesta unidade, você será capaz de:

• Fomentar a conversão de bases e suas aplicações dentro do sistema numérico


utilizado na linguagem de máquina, tomando como base o sistema binário,
visando conhecer a tabela ASCII e suas funcionalidades.

30
Sistemas de Numeração

Para uma melhor compreensão dos sistemas de numeração é necessário entendermos


alguns conceitos elementares acerca deste estudo. O cerne dos sistemas de numeração
é o número ou numeral. Um numeral nada mais é que um símbolo ou grupo de símbolos
que representa um número em determinado momento da evolução do ser humano,
independentemente da era de referência, dos primórdios aos tempos modernos.

Tem-se, portanto, que, em determinada escrita ou época, os numerais diferenciaram-se


dos números do mesmo modo que as palavras se diferenciaram das coisas às quais elas
se referem. Os símbolos “10”, “dez” e “X” (decem em latim) são numerais distintos que
representam o mesmo número, embora escrito de formas diferentes e épocas diferentes.

Um sistema de numeração, também conhecido como sistema numeral, é um sistema em


que um conjunto de números são representados por numerais de uma forma consistente.
Pode ser visto como o contexto que permite ao numeral “10” ser interpretado como o
numeral binário para dois ou o numeral decimal para dez, por exemplo.

Vejamos algumas possíveis representações tomando como base a contagem de 0 a 15


em várias bases numéricas (decimal, binária, octal e hexadecimal):

Figura 1. Contagem de 0 a 15.

Base Representação

Decimal 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15

Binária 0 1 10 11 100 101 110 111 1000 1001 1010 1011 1100 1101 1110 1111

Octal 0 1 2 3 4 5 6 7 10 11 12 13 14 15 16 17

Hexadecimal 0 1 2 3 4 5 6 7 8 9 A B C D E F

Fonte: Elaborada pelo autor (2019).

Neste viés, é importante ressaltar que iremos estudar os sistemas de numeração decimal,
binário, octal e hexadecimal, sistemas estes que compõem a Tabela ASCII - American
Standard Code for Information Interchange (Tabela de Código Padrão Norte-Americano
para Intercâmbio de Informações).

31
Curiosidade

A tabela de código padrão Norte-Americano para intercâmbio de informações


não é nenhuma novidade para quem já trabalha com informática, processamento
de dados, principalmente com desenvolvimento de produtos de software. Ela
contém os quatro sistemas de numeração mais utilizados por profissionais de
Engenharia da Computação, Ciência da Computação, Sistemas de Informação,
Engenharia Elétrica, dentre outras.

Sistema Decimal

Conforme afirma Stallings (2017), no dia a dia utilizamos um sistema baseado em dígitos
decimais (0, 1, 2, 3, 4, 5, 6, 7, 8, 9) para a representação de números, e nos referimos a este
sistema como sistema decimal. Considere o que o número 83 significa. Ele quer dizer 8
dezenas e mais 3 unidades. Logo:

83 = (8 x 10) + 3

O número 4.728 significa 4 milhares, 7 sentenas, duas dezenas e mais 8 unidades.

4.728 = (4 x 1.000) + (7 x 100) + (2 x 10) + 8

Diz-se, portanto, que o sistema decimal tem uma base ou raiz de 10. Isso quer dizer que
cada dígito do número é multiplicado por 10, elevado a uma potência que corresponde à
posição do dígito. Assim:

83 = (8 x 10¹) + (3 x 100)

4.728 = (4 x 103) + (7 x 102) + 2 x 10¹) + (8 x 100)

Cabe informar que o mesmo princípio é mantido para as frações decimais, para tanto as
potências negativas de dez são usadas. Dessa forma a fração decimal 0,256 permanece
para 2 décimos mais 5 centésimos mais 6 milésimos. Logo:

0,256 = (2 x 10-1) + (5 x 10-2) + (6 x 10 -3)

32
Um número composto tanto pela parte inteira quanto pela parte fracionária tem números
elevados tanto para as potências de 10 positivas (parte inteira), quanto para as negativas
(parte fracionária). Veja:

442,256 = (4 x 102) + (4 x 101) + (2 x 100) + (2 x 10 -1) + (5 x 10 -2) + (6 x 10 -3)

Sabe-se que, em qualquer número, o dígito mais à esquerda é conhecido como dígito
mais significativo, pois ele contém o valor mais alto. Em contrapartida, o dígito mais
à direita é chamado de dígito menos significativo, pois ele contém o valor mais baixo.
No número decimal do exemplo anterior, o número 4 à esquerda é o número mais
significativo, e o número 6 à direita é o número menos significativo.

Em geral, para a representação decimal de X = { … d2d1d0, d-1d-2d-3 … }, o valor de X é

X = ∑𝒊(𝒅𝒊 𝒙𝟏𝟎𝒊 )

Sistema Binário

De acordo com Corrêa (2016), no sistema binário há apenas dois símbolos ou valores
possíveis para os dígitos: 0 e 1. Embora apresente apenas dois números, esse sistema
de numeração pode representar qualquer quantidade que possa ser representada em
decimal ou em qualquer outro sistema de numeração, como é o caso dos sistemas octal
e hexadecimal.

Para que isso ocorra com apenas dois algarismos, o sistema binário utiliza um número
maior de dígitos que o sistema decimal para expressar determinado valor.

Da mesma forma que o sistema decimal, os números são representados dígito a dígito,
considerando os dígitos mais significativos e os menos significativos, principalmente
quando se trata de números binários fracionários. Vejamos o exemplo a seguir:

1011,1012 = (1 x 2³) + (0 x 2²) + (1 x 2¹) + (1 x 20) + (1 x 2-1) + (0 x 2-2) + (1 x 2-3)

33
Curiosidade

No sistema binário, o termo em inglês Binary Digit (dígito binário) é quase


sempre abreviado, sendo, portanto, utilizado usualmente o termo bit para
designá-lo. Um bit pode assumir dois valores possíveis, 0 e 1. Um conjunto de
8 bits forma tecnicamente o que se chama de byte. Um conjunto de 4 bits é
denominado Nibble. Uma Word é composta por um conjunto de 16 bits. Quando
o número de bits de uma Word é aumentado, por exemplo, 32 ou 64 bits, temos,
portanto, uma Dword (Double Word ou palavra dupla) e uma Qword (Quad Word
ou palavra quádrupla), respectivamente.

Em geral, para a representação binária do valor de Y = { … b2b1b0,b-1b-2b-3 … }, valor de Y é

Y = ∑𝒊(𝒅𝒊 𝒙𝟐𝒊 )

Sistema Octal

Tanenbaum (2013) afirma que, no sistema octal, existem 8 símbolos ou algarismos


possíveis que formam os números desse sistema de numeração. Os números do sistema
octal são

0, 1, 2, 3, 4, 5, 6 e 7.

Em geral, para a representação octal do valor de W = { … o2o1o0,o -1o -2o -3 … }, valor de W é

W = ∑𝒊(𝒅𝒊 𝒙𝟖𝒊 )

Sistema Hexadecimal

No sistema hexadecimal, segundo Tanenbaum (2013), para os números hexadecimais


são necessários 16 dígitos. Dessa forma, precisamos de 6 novos símbolos além dos 10
símbolos já conhecidos do sistema decimal. Por convenção, além dos algarismos de 0 a
9, usa-se letras maiúsculas de A a F para representar os 6 dígitos que aparecem depois
do algarismo 9.

34
Os números hexadecimais são, portanto, formados pelos algarismos

0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A, B, C, D, E e F.

Em geral, para a representação hexadecimal do valor de Z = { … h2h1h0,h-1h-2h-3 … }, valor


de Z é

Z = ∑𝒊(𝒅𝒊 𝒙𝟏𝟔𝒊 )

Decerto, em todas as fórmulas utilizadas, “B” representa a base do sistema de numeração,


“n” representa a quantidade de dígitos disponíveis para a representação dos números, e
“a” representa qualquer número. Essa fórmula geral representa um número inteiro.

n −1
a = ∑ ( xi .B i )
i −0

Notação Posicional

As representações numéricas permitem visualizar o mesmo número em diferentes bases


de numeração. Isso é possível devido à conversão de notação das bases numéricas.
Observe:

Números Decimais: normalmente – somente o numeral


-5, 30, 44

Números Binários: numeral com a letra b no final


-101b, 11110b, 101100b

Número Octal: numeral com um zero à esquerda


-05, 036, 054

Número Hexadecimal: numeral com h no final ou 0x na frente do número


-5h, 1Eh, 2Ch OU -0x5, 0x1E, 0x2C

35
No estudo dos sistemas de numeração existe a notação posicional que permite calcular
a quantidade que um número representa. Por exemplo, que quantidade representa o
símbolo 1?

Na verdade, dependerá da posição em que ele aparece no número completo. Vamos


então considerar o número 1968. Em termos de contagem, o número significa:

Milhar Centena Dezena Unidade

1 9 6 8

1 x 1000 + 9 x 100 + 6 x 10 + 8 x 1

Observe que o valor de contagem de cada símbolo depende da posição em que o


algarismo se encontre no numeral.

MIDIATECA

Acesse a midiateca da Unidade 2 e veja o conteúdo complementar indicado pelo


professor sobre a Tabela ASCII.

36
Conversão entre os Sistemas de Numeração

Conversão de base numérica é o nome dado à passagem da representação de um


número de uma base numérica para outra, alterando sua simbologia para se adequar
à nova base, sem perder o real valor do número. A base que normalmente usamos é a
decimal ou base dez, pois contém dez algarismos, conforme já foi estudado.

Iremos, portanto, realizar a operação de conversão de bases entre os sistemas de


numeração decimal, binário e hexadecimal.

Base Decimal para Base Binária

A conversão da base decimal para a binária é bem simples de operacionalizar. Basta


pegar o número na base dez e dividi-lo sucessivamente por dois, base dois, até que o
quociente seja menor que o divisor.

Vamos tomar como exemplo o número 25(10). Qual será o seu correspondente na base 2?

Em seguida, para formarmos o número na base binária, basta tomar o número quociente
concatenado, sem intervalos, com os demais números encontrados como resto das
divisões, de baixo para cima.
Então, 25(10) = 11001(2)

Vejamos outro exemplo: converter o número 65(10) para X(2).

37
Então, 65(10) = 1000001(2)

Base Binária para Base Decimal

A conversão de um número da base binária para a base decimal é feita pelo método
denominado Método Polinomial. Esse método considera que cada algarismo do número
é multiplicado pelo número dois, que corresponde ao número da base binária, elevado
a sua respectiva potência, iniciada por 0, até a quantidade de algarismos do número,
sempre da direita para a esquerda.

Vamos tomar como exemplo o número 101011(2). Qual será o seu correspondente na
base dez?

Em seguida, soma-se todas as parcelas referentes aos resultados das multiplicações


decorridas. Então, teremos: 1 + 2 + 0 + 8 + 0 + 32 = 43
Portanto, 101011(2) = 43(10)

Vejamos outro exemplo: Converter o número 1001101(2) para X(10).

38
Somando as parcelas teremos: 1 + 0 + 4 + 8 + 0 + 0 + 64 = 77
Portanto, 1001101(2) = 77(10)
Observe que para todos os processos de conversão de base binária para decimal tomou-
se apenas números inteiros. O mesmo pode ocorrer utilizando-se números binários
fracionários. Veja o exemplo a seguir:

Converter o número 1011010,1010(2) para X(10).

Somando as parcelas, tanto a parte inteira, quanto a parte fracionária, teremos: 0 + 2 + 0


+ 8 +16 + 0 + 64 “,” 0 + 0,125 + 0 + 0,5 = 90,625
Portanto, 1011010,1010(2) = 90,625(10)

Vejamos outro exemplo: converter o número 11001,110(2) para X(10).

39
Somando as parcelas, tanto a parte inteira, quanto a parte fracionária, teremos: 1 + 0 + 0
+ 8 +16 “,” 0,5 + 0,25 + 0 = 25,75
Portanto, 11001,110(2) = 25,75(10)

Base Decimal para Base Hexadecimal

A conversão de um número da base decimal para a base hexadecimal acontece quando


se toma o número da base dez e divide-se sucessivamente por 16 (base hexadecimal)
até que o quociente seja menor que o divisor. Para a formação do número na base
hexadecimal, basta tomar o número quociente concatenado, sem intervalos, com os
demais números encontrados como resto das divisões, de baixo para cima, respeitando
o sistema de numeração da base dezesseis, ou seja, a utilização das letras de A a F, para
a complementação do próprio sistema de numeração.

Então, 1237(10) corresponde a quanto na base 16?

Logo, 1237(10) é igual a 4D5(16), pois 13, na base 16, corresponde à letra D.

Vejamos outro exemplo: Conversão do número 894(10) para a base 16.

40
Logo, 894(10) é igual a 37E(16), pois 14, na base 16, corresponde à letra E.

Base Hexadecimal para Base Decimal

A conversão de um número da base hexadecimal para a base decimal é feita pelo


método polinomial, conforme já estudado anteriormente. Então considera-se que cada
algarismo do número é multiplicado pelo número 16, que corresponde ao número da
base 16, elevado a sua respectiva potência, iniciada por 0 até a quantidade de algarismos
do número, sempre da direita para a esquerda.

Vamos tomar como exemplo o número A3(16). Qual será o seu correspondente na base 10?

Em seguida, soma-se todas as parcelas referentes aos resultados das multiplicações


decorridas. Então, teremos: 3 + 160 = 163
Portanto, A3(16) = 163(10)

Vejamos outro exemplo: converter o número F15(16) para X(10).

Então, teremos: 5 + 16 + 3840 = 3861


Portanto, F15(16) = 3861(10)

Base Decimal para Base Octal

A conversão de um número da base decimal para a base octal ocorre quando toma-se o
número da base dez e divide-se sucessivamente por 8 (base octal) até que o quociente
seja menor que o divisor. Também, para a formação do número na base octal, basta tomar

41
o número quociente concatenado, sem intervalos, com os demais números encontrados
como resto das divisões, de baixo para cima.

Então, 35(10) corresponde a quanto na base octal?

Logo, 35(10) é igual a 43(8).

Vejamos outro exemplo: Conversão do número 115(10) para a base octal.

Logo, 115(10) é igual a 163(8).

Base Octal para Base Decimal

A conversão de um número da base octal para a base decimal é feita pelo método
polinomial, ou seja, considera-se que cada algarismo do número é multiplicado pelo
número oito que corresponde ao número da base octal, elevado a sua respectiva
potência, iniciada por 0 até a quantidade de algarismos do número, sempre da direita
para a esquerda.

Vamos tomar como exemplo o número 71263(8). Qual será o seu correspondente na
base dez?

42
Em seguida, soma-se todas as parcelas referentes aos resultados das multiplicações
decorridas. Então, teremos: 3 + 48 + 128 + 512 + 28672 = 29363(10).
Portanto, 71263(8) = 29363(10)

Vamos tomar como exemplo o número 171(8). Qual será o seu correspondente na base 10?

Então, teremos: 1 + 56 + 64 = 121


Portanto, 171(8) = 121(10)

Base Binária para Base Hexadecimal

Para a conversão de base binária para a base hexadecimal, basta tomar-se o número da base
binária, sempre da direita para a esquerda, separando todos os números em grupo de quatro
dígitos (16 <> 24), completando com zeros o grupo da esquerda, quando for necessário.

Por exemplo: vamos admitir o número 10010110110(2). Qual o seu equivalente na base 16?

Em seguida, concatena-se todos os algarismos correspondentes na base 16, não


esquecendo da representação das letras de A até F nesse sistema de numeração.

Então, teremos: 4B6, considerando que o grupo de bits que apresentou o resultado 11
será representado pela letra B.

Portanto, 10010110110(2) = 4B6(16)

Vejamos outro exemplo: converta o número 110010100011(2) para X(16).

43
Logo, 110010100011(2) é igual a CA2(16).

Base Binária para Base Octal

Para a conversão de base binária para a base octal, basta tomar-se o número da base
binária, sempre da direita para a esquerda, separando todos os números em grupo de três
dígitos (8 <> 2³), completando com zeros o grupo da esquerda, quando for necessário.

Por exemplo: vamos admitir o número 10010110110(2). Qual o seu equivalente na base octal?

Em seguida, concatena-se todos os algarismos correspondentes na base octal.


Então, teremos: 2266.

Portanto, 10010110110(2) = 2266(8)

Vejamos outro exemplo: converta o número 101111100(2) para X(16).

Logo, 101111100(2) é igual a 574(8).

Curiosidade

A tabela ASCII - American Standard Code for Information Interchange é um


código binário (cadeias de bits [0 e 1]) que codifica um conjunto de 128 sinais:
95 sinais gráficos (letras do alfabeto latino, sinais de pontuação e sinais
matemáticos) e 33 sinais de controle, utilizando portanto apenas 7 bits para
representar todos os seus símbolos.

44
MIDIATECA

Acesse a midiateca da Unidade 2 e veja o conteúdo complementar indicado pelo


professor sobre a conversão de base numérica com calculadora.

45
Aritmética Binária

Os computadores e as calculadoras digitais realizam várias operações aritméticas com


números representados no formato binário (CORRÊA, 2016). Nosso objetivo é realizar
as operações aritméticas elementares com números binários: adição, subtração,
multiplicação e divisão.

Adição

A soma de dois números binários é realizada da mesma forma que a adição de números
decimais. Em geral, os mesmos passos são seguidos em uma adição binária. Entretanto,
apenas quatro casos podem ocorrer na soma de dois dígitos binários em qualquer
posição.

Estes são os casos:

0+0=0
1+0=1
1 + 1 = 10 > 0 + carry de 1 para a próxima posição
1 + 1 + 1 = 11 > 1 + carry de 1 para a próxima posição

Esse último caso ocorre quando dois bits de determinada posição estão em nível 1 e há
um carry de posição anterior.

Vejamos alguns exemplos de adição com binários:

a) 011 + 110 = 1001

b) 1001 + 1111 = 11000

46
c) 11,011 + 10,110 = 110,001

Curiosidade

Na adição de binários, utiliza-se o que chamamos de tabela-verdade de um


meio-somador.

Subtração

A subtração de dois números binários é realizada da mesma forma que a subtração


de números decimais. Em geral, os mesmos passos são seguidos em uma subtração
binária. Quando ocorre a subtração de um número com outro de menor parcela, este
deverá ter seu valor complementado a partir do número imediatamente à esquerda
daquele que estiver sendo operado. Vamos analisar os possíveis casos com binários:

1–1=0
1–0=1
0–0=0
0 – 1 = ? > necessita de um valor de complemento da parcela anterior.

47
Curiosidade

Na subtração de binários utiliza-se o que chamamos de tabela-verdade de um


meio-diminuidor.

Vejamos alguns exemplos:

a) 1 – 1 = 0

b) 11 – 10 = 01

c) 110 – 100 = 010

d) 1100 – 1001 = 0011

48
Multiplicação

Em comparação à adição e à subtração, a multiplicação é considerada uma operação


complexa, seja ela realizada no hardware ou no software. No entanto, sua operação é
bem simples, pois todo número multiplicado por 0 é 0 e, todo o número multiplicado por
1 é ele mesmo. Em seguida, somam-se as parcelas intermediárias, também conhecidas
como produtos parciais, conforme podemos observar nos exemplos a seguir:

a) 1 x 1 = 1

b) 11 x 10 = 110

c) 110 x 100 = 11000

d) 1100 x 1001 = 1101100

49
Divisão

A divisão de binário é um pouco mais complexa que a multiplicação, mas é baseada nos
mesmos princípios gerais. Então, realiza-se a divisão de forma aritmética crisp, efetuando
as adições conforme necessidades da operação, até que se complete toda a operação.
Vejamos alguns exemplos:

a) 1 ÷ 1 = 1

b) 110 ÷ 10 = 11

c) 11110 ÷ 100 = 111,1

d) 110110 ÷ 110 = 1001

MIDIATECA

Acesse a midiateca da Unidade 2 e veja o conteúdo complementar indicado pelo


professor sobre binários com vírgula.

50
NA PRÁTICA

No dia a dia, cientistas da computação precisam realizar operações elementares


por meio da aritmética binária em busca de solução ou confirmação de certo status
acerca da arquitetura de computadores, principalmente no que tange ao uso da
memória do computador. Neste viés, são apresentadas as seguintes situações de
cálculos:

a) 101010 + 101101
b) 11001 – 1011
c) 1101 x 1011
d) 110110 ÷ 110

Veja os resultados obtidos nas operações realizadas:

101010 + 101101 = 1010111


11001 – 1011 = 1110
1101 x 1011 = 10001111
110110 ÷ 110 = 1001

51
Resumo da Unidade 2

Nesta unidade, você conheceu os sistemas de numeração decimal, binário, octal e


hexadecimal. Transformações ou conversões de números foram realizadas por meio das
mudanças de bases a partir dos quatro sistemas de numeração estudados. Além disso,
você realizou as operações aritméticas elementares, soma, subtração, multiplicação e
divisão, com números binários (aritmética binária).

CONCEITO

Nesta unidade, destacaram-se as operações elementares: soma, subtração,


multiplicação e divisão com números binários (aritmética binária).

52
Referências

CORRÊA, A. G. D. Organização e Arquitetura de Computadores. São Paulo: Pearson


Education do Brasil, 2016. Disponível na Biblioteca Virtual.

STALLINGS, W. Arquitetura e Organização de Computadores. 10. ed. São Paulo: Pearson


Education, 2017. Disponível na Biblioteca Virtual.

TANENBAUM, A. S. Organização Estruturada de Computadores. 6. ed. São Paulo:


Pearson Prentice Hall, 2013. Disponível na Biblioteca Virtual.

53
UNIDADE 3

Componentes do computador
INTRODUÇÃO

Nesta unidade, você conhecerá os conceitos de arquitetura de computador, seus


periféricos e a relação de entrada e saída por meio da apresentação dos modelos de
von Neumann e de barramento de sistema. Além disso, você será capaz de identificar as
partes integrantes do sistema de computação.

OBJETIVO

Nesta unidade, você será capaz de:


• Conhecer os conceitos de arquitetura de computador, seus periféricos e a
relação de entrada e saída.

55
Modelo de von Neumann

O modelo de von Neumann recebeu esse nome em homenagem ao matemático John von
Neumann, que você pode observar na Figura 1, considerado o criador dos computadores
da forma como são projetados até os dias atuais.

John von Neumann.


Como surgiu esse modelo?

A ideia do modelo surgiu da necessidade de armazenar


programas em um computador, pois, até então, ainda não havia
formas de realizar isso. Von Neumann e outros pesquisadores
descobriram que, utilizando dispositivos de memória em formas
de linha de retardo de mercúrio, poderiam armazenar instruções
de programas.
Fonte: wikipedia.org

Figura 1 - Modelo de von Neumann.

Memória

Unidade de Unidade de lógica e


controle aritimética

Acumulador

Entrada Saída

Fonte: Tanenbaum (2013).

A proposta inicial de um computador de programa armazenado, denominado IAS


(Princeton Institute for Advanced Studies), foi relatada pelo próprio von Neumann. Ele era
composto da seguinte forma:

56
• Central Arithmetic (CA): o dispositivo deve realizar as operações elementares da
aritmética mais frequentemente e, por esse motivo, precisa ter unidades especializadas
apenas para essas operações.

• Control Center (CC): a sequenciação apropriada das operações pode ser executada,
de forma mais eficiente, por um controle central.

• Memória (M): qualquer dispositivo que tiver de executar longas e complicadas


sequências de operações precisa ter uma memória considerável.

• Recording (R): deve ser capaz de manter contato de entrada e saída, que são os
neurônios correspondentes sensoriais e motores do cérebro humano.

• Input (I): é necessário ter unidades para transferência de informações de R para M.

• Output (O): é necessário ter unidades para transferência de informações de M para R.

O modelo de von Neumann, de acordo com Stallings (2017), é uma arquitetura de


computador que se caracteriza pela possibilidade de uma máquina digital armazenar
seus programas no mesmo espaço de memória em que os dados, podendo assim
manipular tais programas. Essa arquitetura é um projeto-modelo de um computador
digital de programa armazenado que utiliza uma unidade de processamento (CPU) e uma
de armazenamento (“memória”) para comportar, respectivamente, instruções e dados.

Veja, a seguir, os componentes reunidos na máquina proposta por von Neumann:

• Memória.
• Unidade aritmética e lógica.
• Unidade central de processamento.
• Unidade de controle.

Qual é a função dessa máquina?

A função é a mesma da tabela de controle da máquina de Turing universal, ou seja,


buscar um programa na memória, instrução por instrução, e executá-lo sobre os dados
de entrada.

Todos os elementos dessa arquitetura são alinhados da estrutura


hardware do CPU, assim o sistema pode realizar todas as suas atividades
sem apresentar erros no desempenho.

57
MIDIATECA

Acesse a midiateca da Unidade 3 e veja o conteúdo complementar indicado pelo


professor sobre arquitetura de von Neumann.

58
Modelo de barramento de sistema

O modelo de barramento de sistema representa um caminho de comunicação que


conecta dois ou mais equipamentos tecnicamente denominado barramento de sistema
(bus), conforme ilustra a Figura 2, apresentando também um barramento de dados, um
de endereços e um de controle.

Algumas arquiteturas em particular apresentam um barramento de entrada e saída


separado dos demais barramentos.

Figura 2 - Modelo de barramento de sistema.

CPU
Memória principal Entrada e
(ALU, registradores
saída E/S
e controle)

Fonte: Corrêa (2013).

Nesse modelo, cada barramento é composto por um conjunto de fios interligando os


componentes do sistema. Por exemplo, ao nos referirmos a um sistema de 32 bits no
barramento de dados, isso quer dizer que existem 32 fios para transmitir dados, e eles
estão interligando todas as unidades do computador.

Conforme afirma Tanenbaum (2013), um computador moderno tem, normalmente, três


barramentos:

59
1. Barramento de dados: para transmitir dados.
2. Barramento de endereços: para identificar onde o dado deve ser lido/escrito
(endereço de memória).
3. Barramento de controle: para coordenar o acesso aos barramentos de dados e
endereços para que não ocorram conflitos.

No modelo de barramento, o acesso a dispositivos pode ser realizado de duas maneiras


(TANENBAUM, 2013):

• Existem arquiteturas que exigem que os dispositivos sejam


mapeados em memória. Dessa forma, ocorre que:
• Para enviar uma informação a um dispositivo desse tipo, a
CPU deve escrever em um (ou mais) endereço de memória

1
específico.
• Para receber informações do dispositivo, a CPU deve ler um
(ou mais) endereço de memória específico.

• Há também arquiteturas que são mais flexíveis e possuem


dois tipos de endereçamento:
• Endereçamento de memória.
• Endereçamento de entrada e saída (E/S).
• Nesse caso, os dispositivos podem tanto ser mapeados em
memória como em portas de E/S. O uso de mapeamento

2
de dispositivos em portas de E/S permite que todo o
endereçamento de memória esteja disponível, efetivamente,
para o acesso a ela.

MIDIATECA

Acesse a midiateca da Unidade 3 e veja o conteúdo complementar indicado pelo


professor sobre periféricos — dispositivos de entrada e saída.

60
Sistemas de computação

Um computador digital consiste em um sistema interconectado de processadores,


memória e dispositivos de entrada/saída (TANENBAUM, 2013). Nesta última parte desta
unidade, você verá uma introdução sobre esses três componentes e sua interconexão, e
sua importância para sistemas de computação.

Processadores

A organização de um computador simples com barramento é ilustrada na Figura 3. A CPU


(Central Processing Unit – Unidade de Processamento Central) é o “cérebro” do computador.

E qual é sua função?

Sua função é executar programas armazenados na memória principal, buscando suas


instruções, examinando-as e, então, executando-as uma após a outra.

Os componentes do computador são conectados por um barramento, conjunto de fios


paralelos que transmitem endereços, dados e sinais de controle.

Barramentos podem ser externos à CPU, conectando-a à memória e aos dispositivos de


entrada/saída, mas também podem ser internos. Os computadores modernos possuem
diversos barramentos.

Figura 3 - Organização de um computador simples.


Unidade central de processamento (CPU)

Unidade de
controle

Unidade de lógica Dispositivos de E/S


e aritimética (ULA)

Registradores

Memória
Disco Impressora
Principal

Barramento
Fonte: Tanenbaum (2013).

61
Vamos entender melhor a CPU?

A CPU é composta de diversas partes distintas. A unidade de controle é responsável por


buscar instruções na memória principal e determinar seu tipo. Já a unidade de aritmética
e lógica efetua operações de cálculos e processamentos lógicos.

A CPU também contém uma pequena memória de alta velocidade usada para armazenar
resultados temporários e realizar alguns controles de informações. Essa memória é
composta de uma quantidade de registradores, cada um deles com determinados
tamanho e função — em geral, eles apresentam o mesmo tamanho. Registradores podem
ser lidos e escritos em alta velocidade porque são internos à CPU.

O registrador mais importante é o contador de programas (PC – Program Counter),


que indica a próxima instrução a ser executada. Com tamanha importância, também
é o registrador de instrução (IR – Instruction Register) que retém a instrução que está
sendo executada naquele exato momento. A maioria dos computadores também possui
diversos outros registradores, alguns de uso geral e outros de uso específico.

A organização interna de parte de uma típica CPU baseada no modelo de von Neumann
está ilustrada na Figura 4.

Figura 4 - Caminho de dados de uma típica máquina de von Neumann.

A+B

A
Registradores

A B Registradores de entrada do ULA

Barramento de entrada do ULA

ULA

A+B Registrador de saída do ULA

Fonte: Tanenbaum (2013).

62
Essa parte é tecnicamente denominada “caminho de dados” e é composta por
registradores, unidade de aritmética e lógica e por diversos barramentos que conectam as
partes. Os registradores alimentam dois registradores de entrada da ULA, representados
por A e B na Figura 4.

O caminho de dados é extremamente importante para todas as máquinas. A ULA efetua


adição, subtração e outras operações simples sobre suas entradas, produzindo dessa
forma um resultado no registrado de saída, o qual pode ser armazenado em um registrador.

Conforme afirma Tanenbaum (2013, p. 44-45), a CPU registra cada instrução em uma
série de pequenas etapas:

1. Trazer a próxima instrução da memória até o registrador de instrução.


2. Alterar o contador de programa para que aponte para a próxima instrução.
3. Determinar o tipo de instrução trazida.
4. Se a instrução usar uma palavra de memória (Word), determinar onde esta
palavra está.
5. Trazer a palavra para dentro de um registrador da CPU se necessário for.
6. Executar a instrução.
7. Voltar à etapa 1 para iniciar a execução da instrução seguinte.
Tal sequência de etapas costuma ser determinada pelo ciclo buscar–decodificar–
executar, que é fundamental para a operação de todos os computadores.

Memória principal

A memória é a parte do computador na qual são armazenados os programas e os dados.


De acordo com Tanenbaum (2013), alguns cientistas da computação usam o termo
“armazém”, ou “armazenagem”, em vez de “memória”, se bem que “armazenagem” está
sendo cada vez mais usado para armazenagem em disco. Sem uma memória a partir
da qual os processadores possam ler e na qual possam gravar ou escrever informações,
não haveria computadores digitais com programas armazenados. A memória principal
também pode ser chamada de memória real ou primária.

Vamos, agora, compreender como funcionam as memórias?

Historicamente, as CPUs sempre foram mais rápidas que as memórias (TANENBAUM,


2013). À medida que fica possível colocar cada vez mais circuitos em um chip, os projetistas
estão usando essas novas facilidades no paralelismo (pipelining) e em operações

63
superescalares, fazendo com que as CPUs fiquem mais velozes. Nesse contexto, segundo
Stallings (2017), surgiu uma memória pequena e rápida denominada tecnicamente como
“cache”.

A ideia básica de um cache é bem simples: as palavras (word) de memória usadas com
mais frequência são mantidas no cache; quando a CPU precisa de uma palavra, ela
examina em primeiro lugar a cache; então, somente se a palavra não estiver ali é que ela
recorrerá à memória principal.

Memória secundária

Seja qual for o tamanho da memória principal, ela sempre será considerada muito
pequena. As pessoas sempre querem armazenar mais informações do que a memória
pode conter, ainda mais porque, à medida que a tecnologia melhora, elas começam a
pensar em armazenar coisas que antes estavam inteiramente no reino da ficção científica
(CORRÊA, 2016).

Para tanto surgem as memórias secundárias, também conhecidas como memória de


massa ou auxiliar, cujo objetivo é auxiliar no armazenamento de dados. Veja, a seguir,
alguns exemplos de memórias secundárias:

• Disco magnético.
• Unidades de fita magnética.
• Hard disk (HD).
• Compact-disc (CD).
• Digital versatile disc (DVD).
• Pen drive.

Entrada/Saída

De acordo com Tanenbaum (2013), um sistema de computador é formado por três


componentes principais. Vamos conhecê-los?

64
1 CPU

2 Memórias (primária e secundária)

3
Equipamentos de entrada/saída (E/S), ou input/output
(I/O), como impressoras, escâneres e modens.

Vale ressaltar que a maioria dos computadores pessoais e estações de trabalho apresenta
placa-mãe que contém um chip da CPU e diversos outros chips de suporte. Ela contém,
também, um barramento ao longo do comprimento e soquetes nos quais os conectores
de borda das placas de E/S podem ser inseridos. A estrutura lógica de um computador
pessoal simples é ilustrada na Figura 5. Esse computador tem um único barramento para
conectar a CPU, a memória e os equipamentos de entrada/saída, enquanto a maioria dos
sistemas tem dois ou mais barramentos.

Cada dispositivo de entrada/saída consiste em duas seções: uma que contém grande
parte da eletrônica, denominada “controlador”, e outra que contém o dispositivo de
entrada/saída em si, tal como um drive de disco.

Figura 5 - Estrutura lógica de um computador pessoal simples.

Controlador Controlador Controlador Controlador


CPU Memória
de vídeo de teclado de cd-rom de disco rígido

Barramento

Fonte: Tanenbaum (2013).

65
O controlador está, em geral, contido em uma placa que é ligada em um encaixe livre.
Mesmo o monitor não sendo um dispositivo opcional, o controlador de vídeo às vezes
está localizado em uma placa de encaixe do tipo plug-in para permitir que o usuário
escolha entre placas, como uma sem acelerador gráfico, por exemplo.

Exemplo

Vamos conferir alguns exemplos?

São dispositivos de:

• Entrada: teclado, mouse, escâner, webcam etc.


• Saída: monitor de vídeo, impressora, plotador, caixa de som etc.
• Entrada/saída: leitor/gravador de CD/DVD, pen drive etc.

MIDIATECA

Acesse a midiateca da Unidade 3 e veja o conteúdo complementar indicado pelo


professor sobre os principais componentes de um computador pessoal (PC –
Personal Computer).

66
NA PRÁTICA

Os processadores Intel® Core™ da 9ª Geração levam o desempenho dos PCs


tradicionais a um patamar inteiramente novo, e, no topo, a gigante Intel apresenta
seu principal produto tradicional, o novo i9-9900K.

Qual foi o primeiro processador Intel caracterizado de 9ª geração?

Como resposta, a Intel apresenta o processador Intel® Core™ i9 desktop para


usuários tradicionais. O melhor de sua categoria, o i9-9900K, com 16 MB de cache
e tecnologia Intel® Turbo Boost 2.0, aciona o máximo em frequência turbo de
até incríveis 5,0 GHz. Acrescente a isso suporte à multitarefa em 16 vias de alto
desempenho acionado por 8 núcleos com Tecnologia Intel® Hyper-Threading
(Tecnologia Intel® HT) para vencer as cargas de trabalho mais exigentes.

67
Resumo da Unidade 3

Nesta unidade, você conheceu compreendeu os modelos de von Neumann e de


barramento de sistema, necessários para as arquiteturas de computadores digitais. Você
estudou, também, o sistema de computação, enfatizando suas partes principais, como
processadores, memórias e dispositivos de entrada/saída.

CONCEITO

Os computadores digitais apresentam uma arquitetura baseada no modelo de von


Neumann, que nada mais é que uma arquitetura de computador que se caracteriza pela
possibilidade de uma máquina digital armazenar seus programas no mesmo espaço
de memória em que os dados, podendo dessa forma manipular tais programas. Os
computadores de hoje em dia apresentam processadores superpotentes.

68
Referências

CORRÊA, A. G. D. Organização e arquitetura de computadores. São Paulo: Pearson


Education do Brasil, 2016. Disponível na Biblioteca Virtual.

STALLINGS, W. Arquitetura e organização de computadores. 10. ed. São Paulo: Pearson


Education, 2017. Disponível na Biblioteca Virtual.

TANENBAUM, A. S. Organização estruturada de computadores. 6. ed. São Paulo:


Pearson Prentice Hall, 2013. Disponível na Biblioteca Virtual.

69
UNIDADE 4

Execução de programas
INTRODUÇÃO

Nesta unidade, você irá conhecer como a arquitetura de computadores reconhece os


programas que são executados na memória do computador. Também irá aprender a
diferença inerente aos processos de compilação e interpretação de programas, além de
compreender a linguagem montadora e seus princípios.

OBJETIVO

Nesta unidade, você será capaz de:

• Entender o funcionamento de programas executáveis a partir da visão da


arquitetura de computadores, assim como a diferença entre linguagem interpretada
e linguagem montadora.

71
Geração de programas executáveis

Antes mesmo de falarmos na geração de programas executáveis, precisamos saber que


a unidade de processamento central – CPU executa cada instrução em uma série de pe-
quenas etapas. Tal sequência de etapas costuma ser denominada ciclo buscar-decodi-
ficar-executar, independentemente da arquitetura do computador (TANENBAUM, 2013).

Os computadores e suas arquiteturas utilizam programas para realizar o processamento


de dados. Um programa nada mais é que um conjunto de instruções cuja função é gerar
dados de saída a partir de dados de entrada (CORRÊA, 2016).

Como já sabemos, para executar as instruções do programa, a CPU utiliza ciclos de


máquina, ora denominado ciclo buscar-decodificar-executar. Veja, abaixo, as fases que
compõem esse ciclo de máquina:

1. Busca 2. Decodificação 3. Execução

O sistema copia a A unidade de A ordem da tarefa é


próxima instrução controle decodifica a enviada pela unidade
no registrador de instrução quando ela de controle para um
instrução da CPU. está no registrador componente da CPU.
O endereço da de instrução Esse componente
instrução a ser (instruction register). recebe e executa a
copiada permanece Dessa etapa, resulta instrução ou tarefa
no registrador o código binário para
denominado uma operação que o
contador de sistema vai realizar.
programa (program
counter).

72
Figura 1 – Etapas de um ciclo de máquina.

Início
Decodificar

Executar
Buscar
Execução Decodificação Busca Ciclo da
máquina
(sem mais instruções)
Fim

Fonte: Corrêa (2016).

O ciclo de execução de programas executáveis apresenta uma equivalência entre


processadores. Tal equivalência, que envolve hardware e interpretadores, tem importante
implicações para a organização de computadores e para o projeto de sistemas de
computadores.

Um programa executável é aquele cujo código-fonte produzido por uma linguagem de


programação já tenha sido convertido em código executável.

Segundo Stallings (2017), o compilador é um programa que converte outro programa de


uma linguagem-fonte, tecnicamente conhecida como linguagem de programação, para
linguagem de máquina, ora classificada como código-objeto.

Alguns compiladores geram saídas em linguagem de montagem, que é convertida para


linguagem de máquina, por um montador diferente.

Um compilador se distingue de um montador pelo fato de que cada instrução de entrada,


não obrigatoriamente, corresponde a apenas uma instrução de máquina.

Um compilador pode suportar recursos diversos, como alocação automática de variáveis,


expressões aritméticas arbitrárias, estruturas de controle em geral, escopo de variável,
operações de entrada/saída, funções de alto nível e portabilidade de código-fonte.

Portanto, o programa conversor que recebe o código-fonte de certa linguagem


de programação e realiza a conferência da escrita gramatical e sintática correta,
convertendo-o para a linguagem de máquina, gerando um programa executável, é
tecnicamente denominado compilador. Observe a ilustração a seguir:

73
Figura 2 – Processo completo de compilação.

Ligador

Escrita do programa Criação de código


na linguagem fonte executável e
(p.e.C) Compilação alocação de memória

Código
Código-fonte Código-objeto Execução
executável

Editor de texto

Compilador Carregador
Fonte: Tanenbaum (2013).

A figura anterior ilustra o processo completo de conversão de um código-fonte em código


executável. Inicialmente, o código-fonte é gerado a partir de um editor de texto, na maioria
das vezes, próprio de certa linguagem de programação, que em seguida é convertido em
código-objeto por meio do processo de compilação. Esse código-objeto é carregado e
ligado a eventuais funções de bibliotecas próprias da linguagem de programação utilizada,
a fim de gerar o código executável. Esse código executável é alocado na memória real do
computador para poder ser efetivamente executado.

MIDIATECA

Acesse a midiateca da Unidade 4 e veja o conteúdo complementar indicado pelo


professor sobre Albor.

74
Interpretação

Interpretadores são programas de computador que leem o código-fonte de uma


linguagem de programação interpretada e o convertem em código executável.

Como podemos caracterizá-los?

O interpretador caracteriza-se por realizar a leitura do código-fonte, linha a linha,


convertendo cada leitura em código-objeto, tecnicamente denominado bytecode.
Dependendo do interpretador, a leitura pode ser feita de forma global para somente
depois converter o código-fonte inteiro, deixando-o pronto para ser executado (lembra
os compiladores).

Então, a interpretação é realizada da seguinte forma:

1. A primeira
instrução do
programa-fonte
2. Após a checagem, 3. Esse processo é
é recebida pelo
o interpretador ordena repetido até que a
conversor, que
ao computador que última linha de código
verifica se a escrita
execute a instrução seja efetivamente
está correta,
em código de convertida e
convertendo a
máquina. executada.
instrução, portanto,
em linguagem de
máquina.

Na verdade, o processo de interpretação apresenta um único passo: a execução do


programa a partir do código-fonte em certa linguagem de programação.

75
Figura 3 – Processo completo de interpretação.

Procedimento-
Módulo-
fonte 1
objeto 1

Procedimento- Módulo-
Interpretador Ligador
fonte 2 objeto 2

Módulo-
Procedimento-
objeto 3
fonte 3

0 0 0 0 10 0 1110 10 1
0 10 10 0 0 0 10 0 10 0
10 0 10 0 0 10 0 10 0 1
Memória 0 0 10 0 10 0 10 10 0 1
Carregador 0 1 0 0 1 0 1 0 0 1 0 111
principal 0 0 0 010 010 010 0

Programa executável
(código binário)

Fonte: Adaptada de Tanenbaum (2013).

Um método semelhante denominado tradução também pode ser utilizado para realizar
tal conversão. Nesse método, em vez de armazenar instruções do programa-fonte
na sequência que são fornecidas, o tradutor gera códigos intermediários visando não
sobrecarregar a memória do computador. Nesse processo, se um erro for detectado,
o processo é retornado para a primeira instrução do código-fonte, para que seja
providenciada a correção necessária do código.

Importante

Existem três processos de conversão de código-fonte em código executável:

1. Compilador.
2. Interpretador.
3. Tradutor.

Existe semelhança nos processos de interpretação e tradução. No entanto, este


é bem diferente do processo de compilação.

76
MIDIATECA

Acesse a midiateca da Unidade 4 e veja o conteúdo complementar indicado pelo


professor sobre compilador.

77
Linguagem montadora

Uma linguagem de montagem pura, segundo Tanenbaum (2013), é uma linguagem na


qual cada declaração produz exatamente uma instrução de máquina.

Na verdade, existe uma correspondência um para um entre instruções de máquina e


declarações no programa de montagem. Se cada linha em linguagem de montagem
conter exatamente uma declaração e cada palavra de máquina conter exatamente uma
instrução de máquina, então um programa de montagem de n linhas produzirá um
programa em linguagem de máquina de n instruções.

O motivo pelo qual as pessoas usam linguagem de montagem em vez de programação


em linguagem de máquina é porque é muito mais fácil de programar, pois se aproxima
mais do entendimento do homem que da máquina, diferentemente da linguagem de
máquina, que fica mais próxima do entendimento da máquina.

Nesse contexto, podemos afirmar que o uso de nomes simbólicos e endereços


simbólicos, em vez de binários e hexadecimais, faz uma enorme diferença. Por essa
razão, a linguagem de montagem utiliza mnemônicos para representar suas instruções.

Corrêa (2016) afirma que existem dois tipos de montadores: montador de dois passos
e montador de um passo. O montador de dois passos tem esse nome por fazer duas
passagens pelo código-fonte, da seguinte maneira:

1 O montador lê
o código-fonte
2 O código-fonte é
lido novamente, e
e determina os os mnemônicos
endereços para das instruções
as referências (abreviação de
simbólicas, comandos da
construindo uma instrução) e
tabela de símbolos. as referências
simbólicas são
substituídos por
códigos de máquina.

78
O montador de um passo faz apenas uma passagem pelo código-fonte, porém esse fato
implica restrições no programa-fonte. A principal dificuldade disso envolve referências
futuras a rótulos. Os operandos das instruções podem ser símbolos que ainda não
foram definidos pelo programa-fonte. Portanto, o montador não sabe qual endereço
relativo inserir na instrução traduzida. No entanto, essa dificuldade pode ser sanada
pelo montador. Ao encontrar um operando da instrução que seja um símbolo ainda não
definido, o montador:

• Deixa o campo do operando da instrução vazio, na instrução binária montada.


• Insere o símbolo usado como um operando na tabela de símbolos. A entrada da
tabela é marcada para indicar que o símbolo não está definido.
• Adiciona o endereço do campo do operando da instrução, que se refere ao símbolo
indefinido, a uma lista de referências futuras associadas à entrada na tabela de
símbolos.

Quando a definição de símbolo é encontrada, ela é associada à tabela de símbolos


(CORRÊA, 2016).

A linguagem de montagem (assembly), de acordo com Stallings (2017), é uma linguagem


de programação que está bem próxima à linguagem de máquina. Em geral, cada instrução
da linguagem de montagem é traduzida em uma instrução de máquina pelo montador. A
linguagem de montagem é dependente do hardware, com uma linguagem de montagem
diferente para cada tipo de processador.

Importante

As instruções da linguagem de montagem devem fazer referência aos registra-


dores específicos do processador, incluir todos os opcodes destes e refletir o
tamanho em bits de vários registradores do processador e dos operandos da
linguagem de máquina. Dessa forma, um programador de linguagem de mon-
tagem deve compreender bem a arquitetura do computador.

Salvo informar que programadores raramente usam linguagem de montagem para


aplicações ou até programas de sistemas. Isso é feito por meio das inúmeras linguagens
de programação de alto nível existentes no mercado.

79
O uso da linguagem de montagem reporta desvantagens significativas; de acordo com
Stallings (2017), são elas:

1. Tempo de desenvolvimento: escrever códigos em linguagem de montagem leva


muito mais tempo do que escrever em linguagem de alto nível.
2. Confiabilidade e segurança: é muito fácil cometer erros no código em linguagem
de montagem, pois o montador não verifica se as convenções de chamada e
convenções para salvar registradores são obedecidas.
3. Depuração e verificação: o código em linguagem de montagem é mais difícil de
depurar e verificar, porque há mais possibilidade de erros do que um código de alto
nível.
4. Manutenção: o código em linguagem de montagem é mais difícil de modificar e
manter, porque a linguagem permite o chamado código “espaguete” não estruturado
e o tipo de truques que são difíceis de serem entendidos por outras pessoas. Nesse
caso, uma documentação minuciosa e um estilo de programação consistente são
necessários.
5. Portabilidade: o código em linguagem de montagem é específico para uma
plataforma. Assim, ir para uma plataforma diferente é muito difícil.
6. Códigos de sistemas podem usar funções intrínsecas em vez de uma
linguagem de montagem: os melhores compiladores modernos para C++, por
exemplo, possuem funções intrínsecas para acessar registradores de controle do
sistema e outras instruções do sistema.
7. Código para aplicação pode usar funções intrínsecas ou classes vetoriais
em vez de linguagem de montagem: os melhores compiladores modernos
para C++, por exemplo, possuem funções intrínsecas para operações vetoriais e
outras instruções especiais que antes requeriam programação em linguagem de
montagem.
8. Compiladores melhoraram muito nos últimos anos: com a melhora significativa
dos compiladores modernos, a linguagem de montagem foi aos poucos deixando
de ser muito utilizada, sendo necessária, portanto, apenas para as operações de
montagens em registradores dos processadores.

Vamos ver agora algumas vantagens do uso da linguagem de montagem:

1. Depuração e verificação: trata-se de analisar um código em linguagem de


montagem gerado pelo compilador, ou ver a janela de montagem em um depurador.
São úteis para localizar erros e verificar a qualidade da otimização feita pelo
compilador para determinada parte do código.

80
2. Desenvolvimento de compiladores: para criar compiladores, depuradores e outras
ferramentas de desenvolvimento, é necessário entender técnicas de codificação em
linguagem de montagem.
3. Sistemas embarcados: sistemas embarcados pequenos têm menos recursos que os
PCs e mainframes. A programação em linguagem de montagem pode otimizar o código
tanto em velocidade quanto em tamanho em sistema embarcado pequeno.
4. Drivers para hardware e códigos de sistemas: acessar hardware, registradores de
controle de sistema etc. às vezes pode ser difícil ou impossível com código de alto nível.
5. Acesso às instruções que não são acessíveis a partir das linguagens de alto nível:
algumas instruções em linguagem de montagem não têm equivalentes na linguagem de
alto nível.
6. Código que se modifica: normalmente não é lucrativo porque interfere em um código
eficiente para uso de cache. Contudo ele pode ser vantajoso, por exemplo, para incluir
um pequeno compilador em programas matemáticos, em que uma função definida pelo
usuário precisa ser calculada várias vezes.
7. Otimização do tamanho do código: o espaço de armazenamento e a memória são tão
baratos que não vale a pena usar linguagem de montagem para reduzir o tamanho do
código. Porém, o tamanho da cache ainda é um recurso crítico, que pode se tornar útil
em alguns caso se otimizar o tamanho de um pedaço de código para que caiba dentro
da cache de código.
8. Otimização da velocidade do código: para situações em que os compiladores não são
eficientes, aumentos de velocidades podem ser alcançados por meio de um programa
em linguagem de montagem.
9. Bibliotecas e funções: o benefício total de otimizar o código é maior utilizando
bibliotecas de funções, usadas por muitos programadores.
10. Compatibilização de bibliotecas de funções com compiladores e sistemas
operacionais: é possível criar funções de biblioteca com várias entradas que sejam
compatíveis com diferentes compiladores e sistemas operacionais.

Observação

Por que você precisa estudar linguagem de montagem? Basicamente por dois
motivos:

1. Um compilador deve produzir a saída usada por um assembler ou realizar o


processo de montagem. Assim, entender a linguagem de montagem é essen-
cial para compreender como funcionam os compiladores.
2. A máquina fica exposta, e escrever código de montagem é a única maneira de
se ter uma ideia de como realmente são as máquinas no nível de sua arquitetura.

81
Linguagem de montagem – Assembler

O nível de linguagem de montagem apresenta uma característica diferente em relação


aos níveis de microarquitetura e máquina do sistema operacional (TANENBAUM, 2013).

Programas que convertem um programa de usuário escrito em alguma linguagem para


outra são chamados de tradutores. A linguagem na qual o programa original é escrito é
denominada linguagem-fonte, e a linguagem para qual ela é convertida é denominada
linguagem-alvo. Ambas as linguagens definem níveis. Assim, se tiver um processador
disponível para executar diretamente o programa escrito em linguagem-fonte, não há
nenhuma necessidade de traduzir o programa-fonte para a linguagem-alvo.

De acordo com Corrêa (2016), a estrutura de sequência da linguagem de montagem é


composta de quatro elementos:

1. Rótulo.
2. Mnemônico.
3. Operando(s).
4. Comentário(s).

Figura 4 – Estrutura da sentença da linguagem de montagem.

Rótulo Mnemônico Operando(s) Comentários

Opcional Nome do opcode, zero opcional


Nome da diretiva ou ou
nome da macro mais

Fonte: Stallings (2017).

Vamos entender melhor cada um deles?

1. Rótulo:

O rótulo, como o próprio nome já diz, serve para rotular uma instrução, um identificador ou
até uma constante. Ele permite que o montador o defina como equivalente ao endereço
para o qual será carregado o primeiro byte do código-objeto gerado pela instrução.

82
Rótulos são utilizados mais frequentemente em instruções de desvio. Um rótulo possibilita
que uma posição do programa seja mais fácil de ser localizada e lembrada. Ele pode ser
movido com facilidade para corrigir um programa em linguagem de montagem. Nesse
caso, o montador irá mudar automaticamente o endereço em todas as instruções que
usam o rótulo quando o programa for remontado.

Corrêa (2016) afirma que o programador de linguagem de montagem não precisa calcular
endereços de memória, utilizando apenas rótulos conforme sua necessidade.

2. Mnemônico:

O mnemônico é uma operação ou função de sentença da linguagem de montagem.


Na verdade, refere-se a uma instrução de máquina, uma diretiva do montador ou uma
macro. Acerca de instruções de máquina, o mnemônico representa um nome simbólico
associado a um comando do assembler ou opcode.

3. Operando:

O operando é utilizado para especificar dados que são necessários para dada operação.
Uma sentença da linguagem de montagem inclui zero ou mais operandos.

4. Comentário:

O comentário é inserido dentro de um programa em linguagem de montagem. Ele pode


estar do lado direito de um comando em linguagem ou ocupar até uma linha inteira de
texto.

Como já foi dito, um programa em linguagem de montagem utiliza mnemônicos para


representar suas instruções ou comandos. Stallings (2017) afirma que a linguagem
montadora utiliza pseudoinstruções para representar ações que precisam ser executadas
a partir de um programa pelo assembler.

Pseudoinstruções

Um programa em linguagem de montagem precisa conter comandos ou instruções


próprias do assembler, além das especificações de quais instruções de máquina precisam
ser executadas pelo montador.

83
Veja, abaixo, algumas das pseudoinstruções disponíveis no assembler:

Pseudoinstruções Significado

SEGMENT Inicia um novo segmento com certos atributos.

ENDS Encerra o segmento corrente.

ALIGN Controla o alinhamento da próxima instrução ou dados.

EQU Define um novo símbolo igual a uma expressão dada.

DB Alocação de espaço para um ou mais bytes.

DW Alocação de espaço para um ou mais itens de dados (palavras) 16 bits.

DD Alocação de espaço para um ou mais itens de dados (duplos) 32 bits.

DQ Alocação de espaço para um ou mais itens de dados (quádruplos) 64 bits.

PROC Inicia um procedimento.

ENDP Encerra um procedimento.

MACRO Inicia a definição de macro.

ENDM Encerra uma macro.

PUBLIC Exporta nome definido neste módulo.

EXTERN Importa um nome definido em outro módulo.

INCLUDE Localiza e inclui outro arquivo.

IF Inicia a estrutura condicional.

ELSE Estrutura falsificada do continental IF.

ENIF Encerra a estrutura condicional.

COMMENT Define novo caractere de início do comentário.

PAGE Quebra de página na listagem.

END Encerra um programa de montagem.

Fonte: Adaptada de Tanenbaum (2013).

84
As instruções ou comandos de código assembler são adotados no formato de
mnemônicos, ou seja, abreviação de comandos para facilitar a memorização e seu uso.
A seguir, você pode conferir alguns mnemônicos utilizados na linguagem montadora:

Mnemônicos Significado

MOVE Movimentação de dados.

DTP Armazenamento de dados e variável (memória real).

ADD Operação aritmética de soma.

SUB Operação aritmética de subtração.

MULT Operação aritmética de multiplicação.

DIV Operação aritmética de divisão.

AND E lógico.

OR OU lógico.

NOT Operador lógico de negação.

JUMP Realiza um desvio incondicional.

LD Realiza o carreamento (LOAD).

READ Leitura de valor.

WRITE Escrita de valor.

STOP Encerra a execução do bloco de instrução.

Fonte: Adaptada de Tanenbaum (2013).

Tanenbaum (2013) afirma que, embora assemblers diferentes tenham notações


ligeiramente diferentes para definir suas macros, todos requerem as mesmas partes
básicas em uma definição de macro:

1. Um cabeçalho de macro para nomear a macro.


2. O texto que reporta o corpo da macro.
3. Uma pseudoinstrução que marca o final da delimitação da macro (ENDM).

85
Introdução ao MIPS

Você conhece o SPIM?

SPIM é um simulador de software que executa programas em assembly escritos para


processadores que implementam a arquitetura MIPS32.

Curiosidade

O termo SPIM é a escrita de MIPS ao contrário. Interessante, não?

De acordo com Corrêa (2016), o SPIM é um sistema autocontido para executar programas
do MIPS. Ele contém um depurador que oferece alguns serviços de forma bem similar
aos serviços oferecidos pelo sistema operacional.

O SPIM é muito mais lento do que um computador real. Não obstante, seu baixo custo e a
grande disponibilidade não têm comparação com o hardware real. O SPIM é um programa
simples e fácil de usar que simula o computador MIPS (STALLINGS, 2017). Obviamente
que, por se tratar de um simulador, nem tudo no SPIM é igual a um computador real.

Saiba mais

Os simuladores são implementados em forma de software. Por esse motivo, é


possível examiná-los e modifica-los com facilidade, o que permite aos progra-
madores e conhecedores de arquitetura de computadores acrescentar novas
instruções, criar novos sistemas, como é o caso dos multiprocessadores, ou
simplesmente coletar dados.

As instruções representam fisicamente um conjunto de sinais eletrônicos altos e baixos,


os quais são representados por números.

Corrêa (2016) afirma que, no MIPS, as instruções aparecem compostas em seis campos,
com tamanho total de 32 bits. Vamos conhecê-los?

86
• op: também chamado de opcode, refere-se à operação básica da instrução.
• rs: registrador do primeiro número de uma operação de soma.
• rt: registrador do segundo número de uma operação de soma.
• rd: registrador que recebe o resultado da operação.
• shamt: indica a quantidade de deslocamento necessário. Trata-se de uma abreviação
do termo em inglês shift amount (“quantidade de deslocamento”).
• funct: também conhecido como código de função ou simplesmente função. Trata-
se de uma abreviação do termo em inglês function (“função”).

Figura 5 – Campos do MIPS.

op rs rt rd shamt funct

6 bits 5 bits 5bits 5 bits 5 bits 6 bits

Fonte: Corrêa (2016).

Note que, na ordem que os campos são dispostos pelo simulador, primeiro aparece o
opcode. Em seguida, o registro do primeiro número, o registro do segundo número, o
registro do resultado e a quantidade de deslocamento, respectivamente. Finalmente, para
finalizar os campos do MIPS, aparece a função ou código de função.

MIDIATECA

Acesse a midiateca da Unidade 4 e veja o conteúdo complementar indicado pelo


professor sobre interpretador de Portugol.

87
NA PRÁTICA

Tradicionalmente, o conceito de segurança de computador está diretamente ligado


ao cenário em que um computador está sendo atacado por intrusos ou por códigos
maliciosos, como vírus, worms etc. Na prática, o ponto-chave da segurança de
computador é ativar proteção em nível de hardware e software — por exemplo: firewall,
honeypot, antivírus e outros.

No entanto, programadores de baixo nível estão utilizando diversas técnicas em


assembly para retardar os ataques de intrusos ou códigos maliciosos, enquanto
outro programa de computador, também escrito em assembly, busca a identificação
e localização do transgressor via rede de computador, principalmente na busca do
endereço IP da máquina que está sendo utilizada para esse ataque. Uma das técnica
mais utilizada em assembly é denominada ofuscação de código, cujo objetivo é causar
confusão em um programa com a finalidade de dificultar o discernimento, extração ou
modificação de alguma propriedade desse programa, preservando, dessa forma, sua
real funcionalidade.

88
Resumo da Unidade 4

Nesta unidade, você pôde compreender como decorre o funcionamento de programas


executáveis a partir da visão da arquitetura de computadores, assim como a diferença entre
linguagem interpretada e linguagem montadora. Nesse contexto, foi lhe apresentado como
a arquitetura de computadores consegue reconhecer os programas que são executados
na memória do computador. Você aprendeu também a diferença inerente aos processos
de compilação e interpretação de programas. Além disso, você conheceu os princípios da
linguagem montadora, além da análise de códigos em linguagem assembler.

CONCEITO

Nesta unidade, destacaram-se:



• Os programas que são executados na memória do computador.
• A diferença inerente aos processos de compilação e interpretação de programas.
• Os princípios da linguagem montadora.
• A análise de códigos em linguagem assembler.

89
Referências

CORRÊA, A. G. D. Organização e arquitetura de computadores. São Paulo: Pearson


Education do Brasil, 2016. Disponível na Biblioteca Virtual.

STALLINGS, W. Arquitetura e organização de computadores. 10. ed. São Paulo: Pearson


Education, 2017. Disponível na Biblioteca Virtual.

TANENBAUM, A. S. Organização estruturada de computadores. 6. ed. São Paulo:


Pearson Prentice Hall, 2013. Disponível na Biblioteca Virtual.

90

Você também pode gostar