Você está na página 1de 22

0

Sumário
Semana 1 .................................................................................................................................2
Visão Geral............................................................................................................................. 2
Breve História ........................................................................................................................ 4
Modelos de computador ....................................................................................................... 7
Semana 2 -Componentes do Computador ...............................................................................9
Unidade Central de Processamento - CPU ............................................................................. 9
Memória .............................................................................................................................. 10
Sistema de Armazenamento ................................................................................................ 11
Semana 3 - Sistema Operacional e Arquitetura e Organização de Computadores..................12
Gerenciamento de memória: Memória Virtual ................................................................... 13
Técnica de memória virtual: paginação e segmentação ...................................................... 13
Semana 4 - Arquiteturas Paralelas e Arquiteturas Avançadas................................................14
Paralelismo e Memória ........................................................................................................ 15
Pipeline ................................................................................................................................ 16
Semana 7 - Linguagem Assembly ...........................................................................................17
Linguagem Assembly (ASM)................................................................................................. 17
Linguagem C e Linguagem Assembly (ASM)......................................................................... 18
Linguagem Assembly (ASM) em Prática ............................................................................... 19

1
Semana 1

Visão Geral

O COMPUTADOR: Um computador é uma máquina eletrônica capaz de processar dados,


executar instruções e realizar tarefas diversas. Ele é amplamente utilizado em quase todos os
aspectos da vida moderna, desde atividades pessoais até aplicações industriais e científicas.

SISTEMA COMPLEXO: O computador é um sistema complexo, composto por diversos elementos


interligados que trabalham em conjunto para executar suas funções. É uma máquina que
permite realizar uma grande variedade de tarefas, e sua complexidade advém da combinação
de diferentes componentes e processos envolvidos em seu funcionamento.

ESTRUTURA HIERÁRQUICA: O computador possui uma estrutura hierárquica que organiza seus
componentes em diferentes níveis. Essa hierarquia permite que tarefas sejam distribuídas e
realizadas de forma eficiente. Os níveis básicos são geralmente o hardware e o software, mas
dentro de cada um desses níveis, há subníveis que desempenham funções específicas.

COMPONENTES BÁSICOS: Os componentes básicos de um computador incluem:

1. Hardware: É a parte física e tangível do computador. Inclui dispositivos como a CPU


(Unidade Central de Processamento), memória RAM (Memória de Acesso Aleatório),
disco rígido (HD ou SSD), placa-mãe, placa de vídeo, teclado, mouse, monitor, entre
outros. O hardware é responsável por executar as instruções e manipular os dados do
computador.

2. Software: É a parte lógica e não tangível do computador. São os programas, sistemas


operacionais, aplicativos e todas as instruções que permitem ao hardware executar
tarefas específicas. O software é essencial para que o computador funcione e para que
os usuários possam interagir com ele.

A estrutura de um computador consiste em quatro elementos principais:

1. Unidade Central de Processamento (CPU): É responsável por controlar a operação do


computador e realizar o processamento de dados.
2. Memória Principal: Armazena os dados temporariamente enquanto o computador está
em funcionamento.
3. E/S (Entrada/Saída): Permite a transferência de dados entre o computador e o ambiente
externo, possibilitando a interação com dispositivos e periféricos.
4. Interconexão do sistema: Estabelece a comunicação entre a CPU, a memória principal e
os dispositivos de E/S. Essa interconexão permite que o computador funcione de forma
coordenada e execute as tarefas necessárias.

Os componentes da CPU (Unidade Central de Processamento) são:

1. Unidade de Controle: Responsável por coordenar as operações do processador e


controlar a execução de instruções, garantindo que as tarefas sejam realizadas
corretamente.

2
2. Unidade Lógica e Aritmética: Realiza as operações matemáticas e lógicas, como adições,
subtrações, comparações e deslocamentos, necessárias para processar os dados.
3. Registradores: São pequenas áreas de armazenamento de alta velocidade localizadas na
CPU. Eles armazenam temporariamente dados, endereços de memória e instruções
durante a execução dos programas, tornando o acesso mais rápido do que a memória
principal. Os registradores desempenham um papel fundamental na eficiência do
processador.
4. A Interconexão da CPU é um elemento crucial que realiza a comunicação e a conexão
entre os componentes principais da Unidade Central de Processamento (CPU): a
Unidade de Controle, a Unidade Lógica e Aritmética (ULA) e os Registradores. Essa
interconexão é fundamental para que a CPU funcione de forma coordenada e execute
as tarefas necessárias para processar os dados e executar as instruções do programa em
execução.

As funções básicas de um computador são:

1. Processamento de Dados: O computador é capaz de manipular dados de várias formas,


realizando operações matemáticas e lógicas, executando algoritmos e processando
informações para produzir resultados desejados. A Unidade Central de Processamento
(CPU) é responsável por conduzir essas operações.
2. Armazenamento de Dados: O computador possui capacidade de armazenar dados tanto
a curto prazo quanto a longo prazo. A memória RAM (Memória de Acesso Aleatório) é
utilizada para armazenar dados temporariamente durante a execução de programas. Já
os dados que precisam ser preservados mesmo após o desligamento do computador
são armazenados em dispositivos como o disco rígido (HD) ou a unidade de estado
sólido (SSD).
3. Entrada e Saída (E/S): O computador interage com o mundo exterior através dos
dispositivos de entrada e saída. Os dados são recebidos do mundo exterior, por
exemplo, quando um usuário digita no teclado ou quando o computador recebe
informações de sensores externos. Da mesma forma, os dados também são enviados
para o mundo exterior, como quando informações são exibidas na tela do monitor ou
quando o computador envia sinais para controlar dispositivos externos.
4. Controle: O controle é uma função essencial que coordena todas as atividades
anteriores. É realizada pela Unidade de Controle da CPU, que gerencia os recursos do
computador e coordena o desempenho funcional do sistema em resposta às instruções
dos programas. A Unidade de Controle garante que as operações aconteçam na ordem
correta e que os recursos sejam utilizados eficientemente.

As funções básicas de um computador podem ser categorizadas de acordo com as características


de operação, utilização e construção:

Quanto às características de Operação:

1. Computadores Analógicos: Manipulam dados de forma contínua, representando


informações por meio de sinais físicos. São usados em aplicações específicas, como
simulações e cálculos científicos.

3
2. Computadores Digitais: Manipulam dados de forma discreta, representando
informações usando códigos binários (0s e 1s). São amplamente utilizados em diversas
áreas, desde dispositivos pessoais até sistemas complexos.

Quanto às características de Utilização:

1. Computadores Científicos: Projetados para realizar cálculos complexos, simulações e


análises científicas. São utilizados em pesquisas, estudos de engenharia e outras
aplicações acadêmicas.

2. Computadores Comerciais: Destinados a atividades empresariais, processamento de


dados comerciais, gestão de informações, transações financeiras e outras tarefas
relacionadas aos negócios.

Quanto às características de Construção:

1. Computadores Mecânicos: Modelos antigos de computadores que utilizavam


dispositivos mecânicos para realizar cálculos e processamento de informações.
Exemplos incluem a Máquina Analítica de Babbage.

2. 1ª Geração: Primeira geração de computadores eletrônicos, caracterizados pelo uso de


válvulas eletrônicas para processamento de dados. Exemplos incluem o ENIAC.

3. 2ª Geração: Segunda geração de computadores que empregava transistores para


substituir as válvulas. Eles eram menores, mais rápidos e mais confiáveis.

4. 3ª Geração: Terceira geração de computadores que utilizava circuitos integrados (chips)


para melhorar ainda mais o desempenho e a eficiência.

5. 4ª Geração: Quarta geração de computadores caracterizada pelo uso de


microprocessadores, o que tornou os computadores mais poderosos, compactos e
acessíveis.

Breve História

A história dos computadores é uma evolução desde as antigas máquinas mecânicas até os
modernos dispositivos digitais, revolucionando nossa maneira de viver, trabalhar e se conectar
com o mundo. Serão destacados a seguir alguns dos principais marcos dessa trajetória,
entendendo como a busca humana por calcular e processar informações transformou-se em
uma revolução tecnológica ao longo do tempo.

Os Computadores Mecânicos (1642-1945) representam uma fase inicial e notável na história da


computação, marcada por dispositivos inteiramente mecânicos. Alguns marcos importantes
nesse período foram:

● 1623-1662: Blaise Pascal criou um dispositivo mecânico acionado por uma manivela,
capaz de realizar operações de adição e subtração. Esse dispositivo foi chamado de
"Máquina Aritmética" ou "Pascalina".

4
● 1646-1716: Gottfried Wilhelm von Leibniz desenvolveu uma máquina mecânica capaz
de realizar operações de multiplicação e divisão, além das operações de adição e
subtração.

● 1792-1871: Charles Babbage concebeu a "Máquina Analítica", um projeto ambicioso


que consistia em quatro componentes: memória, unidade de cálculo e uma seção de
entrada e saída com leitora de cartões perfurados e dispositivos de impressão.

A Primeira Geração de computadores (1945-1955) marcou o surgimento dos primeiros


computadores eletrônicos, que utilizavam válvulas como componentes principais. Alguns
destaques desse período foram:

● 1912-1954: Alan Turing, o renomado matemático britânico, desempenhou um papel


importante no projeto do Colossus, uma máquina utilizada para decifrar códigos
alemães durante a Segunda Guerra Mundial. O Colossus é considerado um dos
primeiros computadores eletrônicos.
● 1943-1946: O ENIAC (Electronic Numerical Integrator and Computer) foi construído nos
Estados Unidos e foi o primeiro computador eletrônico de grande escala. Utilizava mais
de 17.000 válvulas e foi projetado para fins militares, realizando cálculos balísticos para
a artilharia durante a Segunda Guerra Mundial.
● 1954: A IBM lançou o seu primeiro computador eletrônico, o IBM 701, que foi projetado
para fins científicos e empresariais. Foi um dos primeiros computadores comerciais
disponíveis no mercado.

O Colossus foi um dos primeiros computadores eletrônicos da história, projetado por Alan
Turing e outros cientistas britânicos durante a Segunda Guerra Mundial. Ele foi desenvolvido
com o objetivo de decifrar códigos criptografados pelos nazistas, em particular, os códigos
utilizados pela máquina de criptografia alemã Lorenz SZ40/42.

A Segunda Geração de computadores (1954-1965) foi marcada pela substituição das válvulas
eletrônicas por transistores como principais componentes. Eis alguns destaques desse período:

● 1948: Os pesquisadores John Bardeen, Walter Brattain e William Shockley criaram o


transistor, uma inovação fundamental que recebeu o Prêmio Nobel de Física em 1956.
Os transistores tornaram as válvulas eletrônicas obsoletas devido ao seu tamanho
reduzido, menor consumo de energia e maior confiabilidade.

● Primeiro Computador Transistorizado: O TX-0 foi o primeiro computador a utilizar


transistores em vez de válvulas. Foi desenvolvido no Instituto de Tecnologia de
Massachusetts (MIT) em 1954.

● Digital Equipment Corporation (DEC): Na década de 1960, a DEC lançou a máquina


comercial PDP-1, que era semelhante ao TX-0. Esse período marcou o surgimento da
indústria de minicomputadores, com a PDP-1 sendo uma das primeiras máquinas
populares.

● PDP-8: A DEC lançou o PDP-8, que se destacou pela inovação de ter um barramento
único. Essa arquitetura de computador de pequeno porte tornou o PDP-8 muito popular
e influenciou o desenvolvimento de sistemas computacionais posteriores. Uma de suas
principais características inovadoras era a utilização de uma arquitetura de "barramento
único". Essa arquitetura consistia em ter apenas um barramento que conectava todos

5
os componentes do computador, incluindo CPU, memória e dispositivos de
entrada/saída.

● Década de 1960: A IBM produziu versões transistorizadas de seus computadores, como


o IBM 7090 e o IBM 7094, substituindo as máquinas baseadas em válvulas.

● Nascimento da Computação Científica: Com a disponibilidade de computadores


transistorizados mais rápidos e eficientes, a computação científica teve um grande
impulso, permitindo realizar cálculos complexos e avançados em áreas como pesquisa,
ciência e engenharia.

● Fim das Máquinas do Tipo ENIAC: Com a introdução de computadores transistorizados,


as máquinas do tipo ENIAC, baseadas em válvulas, se tornaram obsoletas, abrindo
caminho para uma nova era de computadores mais avançados.

● 1964: A Control Data Corporation (CDC) lançou o CDC 6600, que era mais rápido que
outros computadores da época. Esse computador apresentava uma CPU com alto grau
de paralelismo, o que o tornava especialmente eficiente em determinados tipos de
cálculos.

● Hardware mais barato (DEC) ou mais rápido (IBM e CDC): A concorrência entre
empresas como a Digital Equipment Corporation (DEC), IBM e Control Data Corporation
(CDC) levou ao desenvolvimento de computadores com foco em diferentes
características, como hardware mais barato (DEC) ou maior desempenho e velocidade
(IBM e CDC).

● Criação de uma Máquina para Programação em Algol 60: Pesquisadores


desenvolveram uma máquina projetada para programação na linguagem de
programação Algol 60, que foi um precursor de linguagens modernas como C e Java.

● Importância do Software: Durante essa geração, a ideia de que o software também era
um componente crucial para o funcionamento eficiente dos computadores começou a
ganhar reconhecimento.

A Terceira Geração de computadores (1965-1980) foi marcada pela invenção dos circuitos
integrados de silício, que possibilitaram a criação de computadores menores, mais rápidos e
mais baratos. Nesse período, ocorreram importantes avanços no campo da computação, com
destaque para os seguintes acontecimentos:

● 1958: Os circuitos integrados de silício foram inventados por dois físicos norte-
americanos. Esses circuitos continham dezenas de transistores em um único chip, o que
representou um grande avanço em relação aos transistores individuais utilizados
anteriormente.
● Computadores Menores e Mais Rápidos: Com os circuitos integrados, os computadores
puderam ser reduzidos em tamanho e alcançaram maior velocidade de processamento,
tornando-os mais eficientes e acessíveis.
● 1964: A IBM lançou a System/360, uma linha de produtos de computação baseados em
circuitos integrados. Essa linha de computadores introduziu conceitos importantes,
como a multiprogramação, permitindo a execução de vários programas na memória ao
mesmo tempo, melhorando o desempenho da CPU e possibilitando o uso de grande
espaço de memória para executar programas.

6
● DEC e a Série PDP-11: A Digital Equipment Corporation (DEC) lançou a série de
computadores PDP-11, que foi o sucessor de 16 bits do popular PDP-8. A PDP-11 foi
especialmente bem-sucedida, encontrando um grande mercado em universidades e
instituições acadêmicas.

A Quarta Geração de computadores (1980-atual) é caracterizada pelo avanço da tecnologia VLSI


(Very Large Scale Integration), que permitiu a colocação de milhões de transistores em um único
chip. Essa evolução trouxe importantes mudanças e marcos na história da computação:

● Tecnologia VLSI: Com a tecnologia VLSI, os computadores puderam ser projetados com
circuitos cada vez menores e mais eficientes, resultando em computadores mais
rápidos, poderosos e confiáveis.
● Computadores Menores e Mais Rápidos: A miniaturização dos componentes
possibilitou o desenvolvimento de computadores menores e mais leves, além de
alcançarem maior velocidade de processamento.
● Computador Pessoal (PC): Com a redução de custos da tecnologia VLSI, os preços dos
computadores caíram significativamente, tornando-os acessíveis para cada indivíduo.
Isso marcou o início da era do computador pessoal.
● Apple e IBM: Empresas como a Apple e a IBM desenvolveram computadores pessoais,
como o Apple Macintosh e o IBM Personal Computer (PC), respectivamente, tornando-
se populares e acessíveis ao público em geral.
● Sistema Operacional Windows: A Microsoft desenvolveu o sistema operacional
Windows, que teve um impacto significativo na popularização dos computadores
pessoais e se tornou o sistema operacional mais amplamente utilizado.
● Arquitetura RISC: A arquitetura RISC (Reduced Instruction Set Computer) começou a
substituir a arquitetura CISC (Complex Instruction Set Computer). A arquitetura RISC é
mais simples e otimizada para desempenho, o que contribuiu para a melhoria da
velocidade de processamento dos computadores.

Modelos de computador

O Modelo de Turing, desenvolvido pelo matemático inglês Alan Turing em 1937, é uma
abstração teórica que descreve um dispositivo lógico capaz de executar computações seguindo
uma série de regras predefinidas. A Máquina Universal de Turing, proposta por Turing, é uma
máquina hipotética capaz de simular qualquer outra Máquina de Turing, desde que seja
fornecido o programa apropriado.

Uma das inovações mais importantes do Modelo de Turing foi a ideia de um programa
armazenado, ou seja, um conjunto de instruções que a máquina pode seguir para realizar
diferentes tarefas. Esse conceito de programa armazenado foi uma das bases teóricas para o
desenvolvimento dos computadores modernos.

O Modelo de Turing é uma contribuição crucial para a teoria da computabilidade e é considerado


o embrião da ciência da computação. Ele estabeleceu os fundamentos para entender quais
problemas podem ser resolvidos de maneira algorítmica e quais são intratáveis, abrindo
caminho para a definição de limites teóricos da computação. A ideia de programas armazenados
deu origem à arquitetura de computadores que utilizamos hoje em dia, onde os programas são
armazenados na memória e executados por processadores. Em suma, o Modelo de Turing é uma

7
das pedras fundamentais da ciência da computação e influenciou profundamente o
desenvolvimento de tecnologias computacionais modernas.

O Modelo de Von Neumann, desenvolvido pelo matemático e cientista da computação húngaro-


americano John von Neumann, é a base para quase todos os computadores modernos. Esse
modelo é composto por quatro partes básicas, formando uma arquitetura fundamental para a
organização e funcionamento dos computadores:

1. Memória: A memória é responsável por armazenar tanto os dados quanto os programas


que serão processados pelo computador. É um local onde informações são
temporariamente retidas para serem acessadas e utilizadas pelo processador.

2. Unidade de Lógica e Aritmética (ULA): A ULA é o componente que realiza as operações


lógicas (como AND, OR, NOT) e aritméticas (como adição e subtração) nos dados
presentes na memória. É o coração do processamento dos computadores, onde os
cálculos e manipulações dos dados acontecem.

3. Entrada e Saída: A parte de entrada e saída é responsável por receber os dados de


entrada do usuário ou de dispositivos externos, bem como enviar os resultados do
processamento para o usuário ou para outros dispositivos.

4. Unidade de Controle: A unidade de controle é responsável por coordenar e controlar as


operações das outras partes do computador. Ela interpreta e executa as instruções dos
programas armazenados na memória, coordenando o fluxo de dados e controle do
computador.

É verdade que o modelo de Von Neumann, embora tenha sido fundamental para o
desenvolvimento dos computadores modernos, apresenta algumas limitações, especialmente
no que diz respeito à velocidade de processamento em certos tipos de tarefas. Por isso, ao longo
do tempo, surgiram novos modelos e paradigmas de computação que buscavam superar essas
limitações e explorar diferentes abordagens para realizar tarefas computacionais mais eficientes
e complexas. Alguns desses modelos incluem:

● Computação Distribuída: Nesse modelo, várias unidades de processamento trabalham


em conjunto em uma rede, compartilhando tarefas e recursos para realizar operações
de forma distribuída. A computação distribuída é amplamente utilizada em sistemas
como servidores em nuvem e redes de sensores.
● Redes Neurais: Inspiradas pelo funcionamento do cérebro humano, as redes neurais
são modelos computacionais que utilizam camadas de unidades de processamento
(neurônios artificiais) interconectadas para resolver problemas de aprendizado de
máquina, reconhecimento de padrões e outras tarefas.
● Algoritmos Genéticos: Modelados a partir do conceito de seleção natural e evolução,
os algoritmos genéticos são técnicas de otimização que buscam soluções para
problemas complexos imitando o processo evolutivo.
● Computação Quântica: Baseada nos princípios da mecânica quântica, a computação
quântica utiliza qubits em vez de bits para realizar cálculos que podem resolver
problemas que seriam intratáveis para computadores clássicos.
● Computação de Fluxo de Dados: Nesse paradigma, o foco é no fluxo contínuo de dados,
com o processamento ocorrendo conforme os dados vão chegando, tornando a
computação mais dinâmica e adaptável.

8
● Computadores Paralelos: Esses computadores utilizam múltiplos processadores
trabalhando em paralelo para realizar cálculos mais rapidamente, permitindo a
resolução de problemas complexos em tempo reduzido.

Esses modelos de computação têm sido utilizados em diversas áreas da ciência e da tecnologia,
impulsionando avanços significativos na resolução de problemas complexos e no
desenvolvimento de novas aplicações.

Semana 2 -Componentes do Computador


Unidade Central de Processamento - CPU
A Unidade Central de Processamento (CPU) é o cérebro do computador, responsável por
executar as operações e instruções que permitem que um sistema processe informações. A CPU
interage com diversos elementos do computador para realizar suas tarefas, usando um processo
cíclico conhecido como o ciclo da máquina, composto por três etapas principais: busca,
decodificação e execução.

Na etapa de busca, a CPU obtém a próxima instrução a ser executada a partir da memória
principal. Uma vez recuperada, a instrução é decodificada na etapa seguinte, onde a CPU
entende qual operação deve ser realizada. Finalmente, na etapa de execução, a CPU executa a
instrução, realizando operações lógicas, aritméticas ou de controle conforme necessário.

A Unidade de Controle desempenha um papel fundamental nesse processo. Ela coordena e


controla as atividades da CPU, comandando os subsistemas, determinando o fluxo de instruções
e gerenciando o acesso à memória. Além disso, a CPU utiliza registradores como pequenas áreas
de armazenamento temporário para dados que estão sendo processados ativamente.

As operações realizadas pela CPU podem ser divididas em três categorias principais: operações
lógicas (como AND, OR), operações aritméticas (como adição, subtração) e operações de
controle (que determinam o fluxo das instruções). Essas operações são executadas utilizando os
circuitos eletrônicos dentro da CPU, que manipulam os dados armazenados nos registradores.

As comunicações dentro do computador ocorrem através de barramentos, que são vias de


comunicação que transmitem endereços e dados entre os diversos componentes do sistema. Os
principais tipos de barramentos incluem o barramento de dados, o barramento de endereço e
o barramento de controle.

Existem duas arquiteturas de conjunto de instruções comuns: CISC (Conjunto de Instruções


Complexas) e RISC (Conjunto de Instruções Reduzidas). A arquitetura CISC permite que uma
única instrução execute operações complexas diretamente na CPU, enquanto a arquitetura RISC
utiliza instruções mais simples, mas geralmente mais rápidas, executando operações em etapas
múltiplas.

No âmbito das conexões de entrada e saída, a CPU interage com dispositivos periféricos, como
teclados, mouses e impressoras, através de interfaces de entrada e saída. Os programas são
sequências de instruções que a CPU executa para processar dados, e a memória, unidades de
controle, barramentos e interfaces de entrada e saída se unem para formar um sistema
integrado.

Uma diferença fundamental existe entre a transmissão paralela e serial. A transmissão paralela
envia vários bits ao mesmo tempo através de vários fios, permitindo altas taxas de transferência,

9
enquanto a transmissão serial envia um bit de cada vez por um único fio, sendo mais eficiente
em termos de cabos, mas com menor taxa de transferência.

Uma das arquiteturas de CPU mais amplamente utilizadas é a arquitetura x86, desenvolvida pela
Intel. Essa arquitetura combina elementos de ambas as abordagens CISC e RISC, oferecendo uma
ampla gama de instruções complexas e reduzidas, o que a torna versátil e capaz de lidar com
uma variedade de tarefas computacionais.

Em resumo, a CPU é o coração do computador, executando instruções e operações complexas.


Sua interação com elementos como memória, barramentos e dispositivos periféricos é
fundamental para o funcionamento eficaz de um sistema computacional, e as arquiteturas como
CISC, RISC e x86 moldam a forma como a CPU executa suas tarefas.

Memória
A memória principal é uma das peças fundamentais do funcionamento de qualquer sistema
computacional, responsável por armazenar programas e dados que são utilizados durante a
operação. Essa memória apresenta características cruciais, como capacidade, tempo de acesso
e custo, que definem seu desempenho e utilidade.

A relação entre tempo de acesso e custo é uma consideração chave. Memórias mais rápidas
tendem a ser mais caras de produzir, o que resulta em uma escolha delicada entre velocidade e
economia. Como a tecnologia avançou, a capacidade das memórias principais também cresceu
significativamente, variando agora entre gigabytes e até mesmo terabytes em sistemas mais
avançados.

Para lidar com a crescente demanda por armazenamento rápido e eficiente, surgiu a hierarquia
de memória. Essa estrutura é uma solução elegante para o desafio de equilibrar velocidade e
capacidade. A hierarquia de memória consiste em diferentes níveis de memória, cada um com
suas próprias velocidades de acesso e capacidades. Memórias mais próximas à unidade central
de processamento (CPU) são mais rápidas, porém, com menor capacidade, enquanto as mais
afastadas têm maior capacidade, mas com tempos de acesso mais longos.

Dentro dessa hierarquia, encontramos a Memória RAM (Random Access Memory) e a Memória
ROM (Read-Only Memory). A RAM é um tipo de memória volátil, que permite leitura e escrita
aleatória. Ela é utilizada para armazenar temporariamente dados e programas em execução. Por
outro lado, a ROM é uma memória apenas de leitura e não volátil, usada para armazenar
informações permanentes, como firmware e instruções de inicialização.

Existem diferentes tipos de memórias ROM, como PROM (Programmable ROM), EPROM
(Erasable Programmable ROM) e EEPROM (Electrically Erasable Programmable ROM). Essas
variações permitem diferentes graus de programação e apagamento, atendendo a várias
necessidades de armazenamento de dados não voláteis.

Para otimizar ainda mais o desempenho do sistema, surge a memória cache. A memória cache
é uma memória intermediária posicionada entre a CPU e a memória principal. Ela armazena
dados frequentemente acessados, reduzindo o tempo médio de acesso e aumentando a
eficiência geral do sistema. A hierarquia de cache inclui níveis como L1, L2 e L3, cada um com
diferentes tamanhos e velocidades.

A eficácia da memória cache se baseia no princípio da localidade de referência, onde os dados


que são frequentemente acessados tendem a permanecer na cache. Isso reduz a necessidade
de buscar esses dados na memória principal repetidamente, o que seria mais lento. Portanto, a

10
hierarquia de memória, incluindo RAM, ROM e memória cache, trabalha em conjunto para
proporcionar um sistema computacional eficiente e responsivo.

Em resumo, a memória principal é uma peça vital na arquitetura computacional, com a


hierarquia de memória e diferentes tipos de memória, como RAM, ROM e cache,
desempenhando papéis cruciais para garantir um equilíbrio entre velocidade, capacidade e
eficiência em sistemas modernos.

Sistema de Armazenamento
No mundo digital em constante evolução, os sistemas de armazenamento desempenham um
papel crucial em preservar e acessar informações de maneira eficiente e confiável. Enquanto a
memória RAM proporciona rapidez, é efêmera, apagando-se quando a energia é cortada. No
entanto, existem soluções de armazenamento duradouras que vão além das capacidades da
memória RAM.

Um dos pioneiros no campo do armazenamento duradouro é o disco magnético. Composto por


pratos de alumínio com um revestimento magnetizável, ele é operado por um cabeçote de disco
equipado com uma bobina de indução. Este cabeçote lê e escreve informações na superfície do
disco através do magnetismo e corrente elétrica. O processo ocorre enquanto os pratos giram
sobre o cabeçote, permitindo a leitura e escrita em trilhas distintas.

As trilhas do disco magnético são divididas em setores de tamanho fixo, geralmente em torno
de 512 bytes. Cada trilha abriga uma sequência circular de bits que pode ser lida ou escrita. A
velocidade de rotação dos pratos influencia diretamente na velocidade de acesso aos dados.
Quanto maior a rotação, mais rápido o acesso aos dados armazenados.

Enquanto os discos flexíveis oferecem menor velocidade e densidade em comparação com os


discos rígidos, os discos ópticos, como CDs e DVDs, superam essas limitações. Os discos ópticos
utilizam tecnologia de laser para gravar e ler informações, permitindo capacidades de
armazenamento maiores. Entre as variações de discos ópticos, encontramos os CD-ROM, CD-R,
CD-RW e DVDs, cada um com suas próprias características e capacidades de gravação.

RAID: Redundância e Distribuição para a Segurança dos Dados

Para garantir a segurança dos dados, o RAID (Redundant Array of Independent Disks) é
empregado. Esse sistema distribui e replica os dados em diferentes discos, aumentando a
confiabilidade. Existem vários níveis de RAID, desde o RAID 0, que foca na performance ao dividir
os dados entre os discos, até o RAID 5, que oferece redundância e distribuição.

O futuro do armazenamento é emocionante e diversificado. Uma abordagem inovadora inclui o


armazenamento de materiais biológicos, como o DNA, para alcançar altas densidades de
armazenamento. Além disso, dispositivos microeletrônicos estão ultrapassando limites
magnéticos, permitindo avanços notáveis na capacidade de armazenamento. Outra tecnologia
promissora é o armazenamento holográfico em 3D, que oferece ainda mais espaço para dados.

Além do armazenamento, os periféricos de entrada e saída também desempenham um papel


vital na interação humano-computador. Desde teclados com diferentes tipos de switches, como
contatos mecânicos e lâminas elastoméricas, até os diversos tipos de mouses, como mecânicos,
ópticos e ópticos mecânicos, esses dispositivos permitem aos usuários controlar e operar os
sistemas de armazenamento e computação.

11
Nos últimos anos, as telas sensíveis ao toque se tornaram uma tendência dominante. Diferentes
tecnologias, como infravermelho, resistivo e capacitivo, permitem a detecção do toque do
usuário. Essas telas são amplamente usadas em dispositivos como smartphones, tablets e
laptops, proporcionando uma experiência intuitiva e interativa.

A telecomunicação é a espinha dorsal da conectividade digital. Placas e cabos conectam


computadores para possibilitar a transferência de dados. Dispositivos como modems,
roteadores e switches facilitam a comunicação entre sistemas e redes. À medida que a
tecnologia avança, a telecomunicação se expande, conectando computadores e permitindo uma
troca de informações cada vez mais eficiente.

Em suma, os sistemas de armazenamento evoluíram consideravelmente ao longo dos anos,


desempenhando um papel vital em nossa era digital. Desde os discos magnéticos tradicionais
até as tecnologias emergentes, como armazenamento de DNA e dispositivos microeletrônicos,
o campo continua a se expandir, trazendo inovações empolgantes para a maneira como
armazenamos, acessamos e interagimos com os dados.

Semana 3 - Sistema Operacional e Arquitetura e Organização de


Computadores
O sistema operacional, essencial para o funcionamento de um computador, desempenha
diversas funções cruciais. Em primeiro lugar, ele fornece uma interface que permite aos
programas interagirem com o hardware, ocultando a complexidade subjacente. Além disso, o
sistema operacional é responsável por gerenciar os recursos do computador de forma eficiente.

A estrutura de camadas de um sistema computacional é composta por várias camadas


interconectadas: começa com o hardware físico, seguido pela linguagem de máquina, que
permite a comunicação direta com o hardware. O sistema operacional reside acima dessa
camada, facilitando a execução de programas de sistemas e aplicativos.

Uma das funções principais do sistema operacional é simplificar a interação entre o software e
o hardware. Ele atua como um intermediário, traduzindo as solicitações dos programas em
ações que o hardware pode realizar. Isso abstrai a complexidade do hardware subjacente e
permite que os desenvolvedores se concentrem na lógica de seus programas.

Alguns dos sistemas operacionais mais conhecidos são o Linux, Windows e macOS, cada um com
suas características e usos específicos. Independentemente do sistema operacional, sua função
fundamental é facilitar a interação com o hardware e gerenciar os recursos do computador.

O sistema operacional também realiza o gerenciamento de recursos alocando recursos como a


CPU, dispositivos de entrada e saída e memória de maneira eficiente para garantir um
desempenho otimizado do sistema.

Quando se trata da execução de programas e aplicativos, o sistema operacional coordena o


escalonamento de processos. Esse escalonamento envolve a seleção e o agendamento de
processos para serem executados pela CPU. Processos podem estar em diferentes estados,
como terminado, pronto, bloqueado ou executando. O sistema operacional lida com vários tipos
de escalonamento, como de curto prazo (trocas frequentes de processos na CPU), entrada e
saída (gerenciamento de dispositivos), médio prazo (decidindo quais processos devem ser
colocados em espera) e longo prazo (decidindo quais processos devem ser carregados na
memória).

12
Os objetivos do escalonamento incluem garantir justiça na distribuição de recursos,
implementar políticas específicas (como prioridades de processos) e manter um equilíbrio na
utilização da CPU. Existem diversos algoritmos de escalonamento, como o First-Come, First-
Served (FCFS), loteria e feedback, cada um com suas vantagens e desvantagens.

Uma abordagem mais avançada envolve a divisão de processos em threads, permitindo a


execução concorrente e aprimorando a eficiência. Múltiplas threads podem ser executadas
simultaneamente em um único processo, melhorando a capacidade de resposta do sistema e a
utilização dos recursos.

Em resumo, o sistema operacional desempenha um papel vital ao fornecer uma interface


amigável para programas, gerenciar recursos de hardware e facilitar a execução eficiente de
aplicativos. Ele é o alicerce sobre o qual a computação moderna é construída, garantindo um
ambiente estável e acessível para os usuários e desenvolvedores.

Gerenciamento de memória: Memória Virtual


Além de atuar como intermediário entre o hardware e o software, O Sistema Operacional é
responsável por gerenciar recursos e processos na unidade central de processamento (CPU),
com ênfase especial no gerenciamento de memória.

A memória, com ideais de ser grande, rápida, não volátil e acessível a baixo custo, apresenta
desafios como a necessidade de compartilhamento entre diferentes processos e uma hierarquia
de armazenamento, desde os registradores até a memória principal e o disco.

A memória virtual surge como uma técnica crucial para otimizar o acesso à memória do disco.
Ela se baseia na exploração dos princípios de localidade espacial (dados próximos tendem a ser
usados) e temporal (dados recentemente usados serão usados novamente). O mapeamento de
endereços virtuais para físicos é facilitado pela Memory Management Unit (MMU), que também
trabalha em conjunto com a cache para melhorar o desempenho.

Comparando-a com a monoprogramação, em que um único programa é executado de cada vez,


a multiprogramação permite a execução simultânea de vários processos compartilhando a CPU.
Isso envolve o particionamento da memória, seja com alocação fixa ou variável. Registros de
base e limite são utilizados para evitar que processos invadam o espaço de memória uns dos
outros, apesar de desafios como a fragmentação.

A memória virtual apresenta vantagens significativas. Ela oferece um espaço virtual maior do
que o espaço físico, permitindo que os programas utilizem mais memória do que realmente está
disponível fisicamente. Além disso, promove o isolamento e a segurança entre processos,
evitando interferências indesejadas. Facilita o compartilhamento de recursos entre processos,
melhorando a eficiência. Por fim, a memória virtual contribui para a melhoria geral do
desempenho do sistema, permitindo que diferentes programas coexistam harmoniosamente.

Técnica de memória virtual: paginação e segmentação


A memória virtual é um conceito fundamental em sistemas computacionais, oferecendo uma
maneira eficiente de aprimorar a hierarquia de memória, inclusive incorporando a memória de
disco. Duas técnicas de memória virtual amplamente empregadas são a paginação e a
segmentação, cada uma com suas abordagens distintas.

A paginação é uma técnica que quebra os processos em unidades chamadas páginas, todas com
um tamanho fixo. O endereço virtual é dividido em páginas virtuais, e uma página não contém
dados diferentes. Pode-se pensar nessa divisão de páginas como blocos em uma biblioteca, onde

13
cada página carrega informações específicas. Contudo, o tamanho da página exerce impacto
sobre o controle de endereços, o mapeamento e o desempenho geral do sistema. Páginas
menores resultam em mais controle e precisão, mas podem demandar mais recursos para
mapeamento. Por outro lado, páginas maiores facilitam o mapeamento, mas podem
desperdiçar espaço.

Em contrapartida, a segmentação é uma abordagem que divide processos em segmentos de


tamanhos variáveis. Isso permite adaptar as características de cada segmento, como proteção e
acesso. A técnica busca otimizar o uso da memória ao acomodar diferentes tipos de dados e
requisitos de cada segmento.

Para facilitar o mapeamento de endereços virtuais em físicos, é utilizado um componente


conhecido como TLB (Translation Lookaside Buffer). O TLB atua como uma memória cache para
mapeamentos frequentemente acessados, agilizando a tradução de endereços.

A busca eficiente de endereços é crucial no sistema de memória virtual. Um algoritmo de busca


é empregado, sendo que a TLB é o primeiro local a ser verificado. Caso o mapeamento não esteja
presente, a tabela de páginas é consultada. Se um endereço virtual não mapear para um
endereço físico, ocorre uma falha de página, levando à busca da página correspondente no disco
e seu subsequente carregamento na memória principal.

A integração de memórias é essencial para otimizar o acesso à memória virtual. A CPU, a


memória cache, a memória principal e o disco trabalham em conjunto para criar uma abstração
de memória coerente para os aplicativos. Isso resulta em uma experiência fluida para os
usuários, em que o acesso à informação é rápido e eficiente, independentemente de sua
localização física.

A otimização do acesso à memória é também alcançada através do uso inteligente do


mapeamento virtual-físico na TLB. Essa abordagem minimiza o número de acessos ao disco e
otimiza o desempenho global do sistema.

Em resumo, a memória virtual é uma estratégia poderosa para aumentar a capacidade da


memória em um sistema computacional. As técnicas de paginação e segmentação oferecem
abordagens distintas para dividir e gerenciar processos, enquanto a TLB agiliza a tradução de
endereços. A cooperação entre hardware e software garante uma abstração de memória
integrada e otimizada, resultando em um sistema mais ágil e eficiente.

Semana 4 - Arquiteturas Paralelas e Arquiteturas Avançadas


A necessidade de melhorar o desempenho dos computadores é uma constante na evolução da
tecnologia. A execução sequencial de instruções, embora eficaz, pode ser lenta e ineficiente em
certos cenários. Para abordar isso, as arquiteturas paralelas se tornaram uma solução crucial.

No paralelismo de instruções, múltiplas instruções são executadas simultaneamente em


diferentes núcleos da CPU. Isso permite que a CPU utilize recursos ociosos, melhorando a
eficiência. O paralelismo de dados, exemplificado pelo SMD (Single Instruction, Multiple Data),
envolve a execução repetida de uma única instrução em vários conjuntos de dados. Já o SIMD
(Single Instruction, Single Data) envolve a execução de uma única instrução em um conjunto de
dados.

No nível de dados, as arquiteturas paralelas se estendem para múltiplos processadores. Em


sistemas multiprocessadores e multicomputadores, vários processadores compartilham

14
instruções e podem trocar mensagens para sincronização. Isso pode ser síncrono ou assíncrono.
A escolha entre memória distribuída e compartilhada depende da estrutura do sistema.

A classificação de Flynn, baseada em fluxo de dados e instruções, oferece uma compreensão


clara das arquiteturas paralelas. O modelo SISD (Single Instruction, Single Data) representa o
processador convencional, onde uma única instrução é executada sequencialmente em um
único conjunto de dados. O MISD (Multiple Instruction, Single Data) é raro, com pouca aplicação
prática. O SIMD (Single Instruction, Multiple Data) descreve processadores vetoriais, enquanto
o MIMD (Multiple Instruction, Multiple Data) engloba sistemas multiprocessadores e
multicomputadores.

Em resumo, a arquitetura de um único processador e as arquiteturas paralelas são essenciais


para a evolução dos sistemas computacionais. A busca por maior desempenho, eficiência e
capacidade de processamento levou ao desenvolvimento de estruturas que exploram o
paralelismo no nível de instrução e de dados. A classificação de Flynn fornece um quadro claro
para entender essas diversas abordagens e suas aplicações.

Paralelismo e Memória
Paralelismo em Processadores Únicos:

O paralelismo começa no nível do processador único, onde o processamento simultâneo de


múltiplas tarefas é buscado. No entanto, o ganho de desempenho nesse nível é limitado pela
natureza sequencial das instruções. Ainda assim, técnicas como pipeline de instruções permitem
uma sobreposição de estágios de execução, melhorando a taxa de processamento.

Paralelismo no Nível de Software:

No âmbito do software, o paralelismo é alcançado dividindo tarefas em threads ou processos


independentes que podem ser executados em paralelo. Isso é especialmente valioso para
sistemas multitarefa e multiusuário, onde múltiplos fluxos de execução coexistem.

Paralelismo de Instruções em Diferentes Ciclos:

A arquitetura de processadores modernos busca o paralelismo de instruções, permitindo a


execução de múltiplas instruções em diferentes ciclos de clock. Superscalar e VLIW (Very Long
Instruction Word) são exemplos que exploram esse tipo de paralelismo.

Uso de Linguagem de Programação Paralela:

Linguagens como CUDA e OpenMP permitem aos programadores explicitamente indicar partes
do código que podem ser executadas em paralelo, tirando proveito de GPUs e processadores
com múltiplos núcleos.

Multiprocessadores de Memória Compartilhada:

Nesse modelo, vários processadores compartilham a mesma memória principal, facilitando a


comunicação entre os processos. Arquiteturas como SMP (Symmetric Multiprocessing) e NUMA
(Non-Uniform Memory Access) são exemplos dessa abordagem.

Troca de Mensagens para Sincronização:

Em sistemas com múltiplos processadores de memória compartilhada, a sincronização é crucial.


A troca de mensagens é uma técnica para coordenar processos através do envio de mensagens
entre eles, permitindo a sincronização e a comunicação eficaz.

15
Multicomputadores de Memória Distribuída:

Nesse cenário, múltiplos computadores independentes estão interligados através de uma rede.
Clusters e supercomputadores são exemplos disso. A programação envolve a comunicação por
troca de mensagens e muitas vezes é facilitada por bibliotecas de rotinas.

Processadores Massivamente Paralelos:

Esses processadores são projetados para lidar com cargas de trabalho intensivas, como análise
de dados em data warehouses. Eles apresentam grande escalabilidade e complexidade, muitas
vezes com tolerância a falhas integradas, como observado em sistemas da Intel.

Clusters:

Clusters são compostos por várias estações de trabalho ou PCs interconectados, trabalhando
juntos como uma única entidade de processamento. Eles podem ser centralizados ou
descentralizados, e sua topologia de rede é crucial para o desempenho.

Pipeline
O paralelismo de instrução é a arte de dividir as instruções de um programa em partes menores
e independentes que podem ser executadas simultaneamente em diferentes unidades
funcionais do processador. Para isso, os processadores implementam o conceito de pipeline de
instrução. Esse pipeline é uma estrutura que divide a execução de uma instrução em várias
etapas consecutivas, onde cada etapa é tratada por uma unidade de processamento
especializada.

Pense no pipeline como uma lavanderia com várias etapas: separar as roupas sujas, lavar,
enxaguar, secar e dobrar. Cada etapa representa uma fase no pipeline de instrução. Assim como
diferentes roupas passam pelas várias etapas de lavagem de forma simultânea, várias instruções
podem ser processadas ao mesmo tempo em diferentes etapas do pipeline.

Porém, mesmo nesse ambiente altamente otimizado, surgem desafios. Hazards são situações
em que o pipeline fica temporariamente paralisado devido a conflitos entre instruções. Existem
três tipos principais de hazards:

● Estruturais: quando várias instruções competem pelo mesmo recurso (por exemplo,
uma unidade de processamento), causando um conflito.
● Dados: quando uma instrução depende dos resultados de uma instrução anterior que
ainda não foi concluída.
● Controle: quando uma instrução de salto condicional (como um "if") altera o fluxo
normal do programa, criando incertezas sobre quais instruções devem ser executadas a
seguir.

Para mitigar esses problemas, soluções como busca antecipada (predição de ramificação) e
buffers (armazenamento temporário) são implementadas. A busca antecipada envolve a
previsão de desvios condicionais e a busca de instruções futuras com base nessa previsão. Os
buffers, por sua vez, armazenam temporariamente instruções ou dados, permitindo que o
pipeline continue funcionando, mesmo quando um estágio está temporariamente parado.

Semana 7 - Linguagem Assembly

16
Linguagem Assembly (ASM)
Diferentes Níveis de Abstração de Linguagens

● Linguagens de Alto Nível: No topo da hierarquia de abstração, encontramos as


linguagens de alto nível, como Java, Python e C++. Essas linguagens são projetadas para
serem mais legíveis e compreensíveis para os programadores, permitindo que eles
escrevam código de maneira eficiente, sem se preocupar com os detalhes de baixo nível
do hardware.
● Linguagem de Montagem: Logo abaixo das linguagens de alto nível, temos a linguagem
de montagem. Essa linguagem é uma representação simbólica dos códigos de máquina
que os processadores entendem. Embora seja mais próxima da linguagem de máquina
do que das linguagens de alto nível, a linguagem de montagem ainda é legível para os
humanos, mas está diretamente relacionada à arquitetura de hardware do processador.
● Linguagem de Máquina: Na base da hierarquia, temos a linguagem de máquina,
composta por sequências de 0s e 1s que representam instruções diretamente
compreendidas pela CPU. Essa é a linguagem que os processadores executam, e é
extremamente difícil para os programadores escreverem diretamente.

Comparação com Linguagens Declarativas

É importante notar que linguagens como HTML e JSON são exemplos de linguagens declarativas
que não se encaixam diretamente nessa hierarquia de abstração. Elas são projetadas para
descrever dados e estruturas, não para programar logicamente como linguagens de alto nível.
Enquanto as linguagens de programação lidam com algoritmos e operações, as linguagens
declarativas são usadas para definir estruturas e conteúdo.

Linguagem Assembly e sua Integração com a Arquitetura:

A linguagem assembly é um ponto crucial na transição da abstração de alto nível para a


linguagem de máquina. Ela é projetada para ser uma representação simbólica das instruções de
máquina específicas de uma arquitetura de hardware, como a Intel x86. Isso a torna uma
linguagem de nível mais baixo em comparação com linguagens de alto nível, mas ainda mais
legível do que a linguagem de máquina.

Memória e CPU na Comunicação

A interação entre a memória e a CPU é essencial para o funcionamento de um computador. A


memória principal armazena dados e instruções que a CPU precisa acessar. Quando a CPU
executa um programa, ela busca dados na memória, realiza cálculos e armazena os resultados
de volta na memória.

Registradores da CPU

Os registradores da CPU são pequenos locais de armazenamento interno que a CPU usa para
realizar operações de maneira eficiente. Alguns dos registradores mais importantes incluem o
registrador de instrução, que mantém a próxima instrução a ser executada; o registrador de
dados de memória, que armazena dados temporários; e o registrador de endereço, que mantém
o endereço da memória que está sendo acessada.

Instruções Assembly Básicas

17
A linguagem assembly possui instruções básicas, como MOV (movimento), ADD (adição), SUB
(subtração) e JMP (salto condicional). Estas instruções permitem que a CPU realize operações
aritméticas, mova dados e controle o fluxo do programa.

Registrador de Status

O registrador de status desempenha um papel fundamental na avaliação dos resultados das


instruções. Ele pode indicar se uma operação resultou em zero, se ocorreu um erro, ou outras
informações importantes para o controle do programa.

Comentários e Rótulos

Comentários são usados para fornecer informações adicionais sobre o código, tornando-o mais
compreensível para os programadores. Rótulos são usados como pontos de referência no
código, permitindo que instruções de salto condicional sejam direcionadas a locais específicos.

Linguagem C e Linguagem Assembly (ASM)


Como Fazer Funções Assembly em Programas em C

Uma das habilidades mais valiosas que um programador pode adquirir é a capacidade de
incorporar código Assembly em programas C. Isso permite que partes críticas do código sejam
escritas em Assembly, que é uma linguagem de baixo nível conhecida por sua eficiência e
controle sobre o hardware. Essa fusão é possível graças às funções Assembly.

Uso do Especificador "Inline" para Combinação de Comandos

O especificador "inline" é uma ferramenta fundamental nesse processo. Ele instrui o compilador
a incorporar o corpo de uma função Assembly diretamente no local em que ela é chamada, em
vez de criar uma chamada de função normal. Isso elimina a sobrecarga de chamadas de função
e permite a otimização do código.

Estrutura Básica de Funções Assembly

As funções Assembly têm uma estrutura fundamental que inclui o uso de instruções de
montagem para realizar tarefas específicas. Além disso, elas declaram operandos de entrada e
saída, especificando quais valores serão usados como entrada e quais serão modificados como
saída. Restrições de operandos ajudam a definir como esses valores podem ser usados e
modificados.

Modificadores de Restrição para Operandos de Saída

Os modificadores de restrição são essenciais para indicar que um operando é de saída e apenas
de gravação. Isso garante que os valores corretos sejam atualizados após a execução da função
Assembly.

Uso de Registradores em Programas Assembly

Os registradores desempenham um papel crucial em programas Assembly. Os registradores


"EAX" (acumulador) e "EBX" (ponteiro para dados) são comuns e utilizados para armazenar
temporariamente valores e executar operações. Um exemplo prático é a realização de uma
operação de adição com valores armazenados em registradores, com o resultado final sendo
atualizado em uma variável externa.

Dicas para Desenvolvimento em Assembly

18
Desenvolver em Assembly requer um ambiente adequado. Certifique-se de que um compilador
e depurador para Assembly estejam disponíveis. Ferramentas como o Visual Studio Code podem
ser excelentes para escrita de código Assembly e oferecem suporte a várias linguagens. Verificar
a instalação do compilador via linha de comando é essencial para garantir que tudo funcione
conforme o esperado.

Estrutura Estendida para Funções Assembly

Em funções Assembly estendidas, é possível especificar operandos de entrada e saída, bem


como restrições detalhadas. O uso de um template assembler ajuda a descrever operandos de
forma clara e concisa. No entanto, lembre-se de que o número total de operandos é limitado,
geralmente a 10.

Efeitos Colaterais e Conservação de Registradores

Ao incorporar código Assembly, é vital lembrar que as alterações nos registradores podem afetar
o restante do programa. Portanto, é essencial conservar os registradores após a execução do
código Assembly. O uso de instruções com efeitos colaterais que não modificam registradores é
uma prática recomendada para evitar problemas inesperados.

Linguagem Assembly (ASM) em Prática


Como fazer funções Assembly em programas em C

Quando se trata de combinar o poder da Linguagem C com a eficiência da Linguagem Assembly,


uma técnica essencial é a criação de funções Assembly dentro de programas em C. Isso pode ser
feito usando um especificador conhecido como "ASM". Esse especificador permite a inserção de
código Assembly diretamente em programas em C, possibilitando a otimização de partes críticas
do código. Essas funções Assembly podem ser incorporadas em programas maiores escritos em
C, criando assim uma abordagem híbrida que combina o melhor dos dois mundos.

Uso de especificadores ASM para instruir o compilador a copiar o corpo da função em cada
chamada

O uso de especificadores "ASM" não apenas permite a inclusão de código Assembly, mas
também instrui o compilador a copiar o corpo da função Assembly em cada chamada. Isso evita
o overhead de chamadas de função e pode resultar em um desempenho mais eficiente,
especialmente em operações críticas. No entanto, é importante usar essa abordagem com
cautela, pois pode tornar o código menos legível e portátil.

Estrutura Básica de Funções Assembly

As funções Assembly incorporadas em programas em C geralmente seguem uma estrutura


básica. Isso inclui o uso de instruções de montagem para realizar operações específicas. Além
disso, essas funções devem declarar claramente os operandos de entrada e saída. As restrições
de operandos ajudam a definir como os registradores e memória serão usados durante a
execução da função. Modificadores de restrição podem ser usados para especificar que um
operando de saída é somente de gravação.

Exemplo de código com modificação de registradores

Um exemplo prático pode ser visto em um código Assembly incorporado em um programa C.


Nesse código, os registradores "EAX" e "EBX" são usados. O "EAX" é usado como um acumulador

19
para operações e armazena o resultado de uma adição entre valores em registradores. O "EBX"
age como um ponteiro para dados. O resultado dessa operação é então atualizado em uma
variável externa, demonstrando a capacidade das funções Assembly em interagir com o
ambiente externo do programa C.
#include <stdio.h>
int soma(int x, int y){
return (x+y);
}
int main(){
int resultado=0, resultado2=0, x=3, y=5;

__asm__ (
"movl %1, %%eax;"
"movl %2, %%ebx;"
"addl %%ebx, %%eax;"
: "=r" (resultado)
: "a" (x), "b" (y));

__asm__ (
"addl %%ebx, %%eax;"
: "=r" (resultado2)
: "a" (x), "b" (y));

printf("resultado = %d\n",resultado);
printf("resultado2 = %d\n",resultado2);

Estrutura Básica do Programa

Ponto de Entrada: Um programa em Assembly começa com a definição do seu ponto de


entrada, onde a execução terá início. Esse ponto é geralmente especificado no código
Assembly e pode variar de acordo com a arquitetura do processador.

Palavra-chave "Global": Para tornar identificadores acessíveis a partir de outros módulos ou


programas, a palavra-chave "Global" é usada. Isso permite que o linker (vinculador) encontre
esses identificadores em outros locais.

Exemplo de Código
global _start
_start:
mov eax, 1
mov ebx, 42
mov ebx, 29
int 0x80

Compilação e Execução

Para transformar um programa Assembly em um executável, é necessário usar um montador


(assembler) para traduzir o código Assembly em código de máquina. Em seguida, o linker é
utilizado para criar o executável final.
nasm -f elf32 ex1.asm -o ex1.o
ld -m elf_i386 ex1.o -o ex1

20
./ex1
echo $?

Exemplo de Instruções Assembly

Um programa Assembly consiste em uma série de instruções de baixo nível que controlam o
comportamento do processador. Essas instruções podem incluir movimentação de valores
para registradores, operações aritméticas, controle de fluxo e chamadas de sistema.
mov ebx, 123 ; ebx = 123
mov eax, ebx ; eax = ebx
add ebx, ecx ; ebx += ecx
sub ebx, edx ; ebx -= edx
mul ebx ; eax *= ebx
div edx ; eax /= edx

Manipulação de Dados e Strings

A manipulação de dados e strings em Assembly envolve o uso de sessões de dados (como


"section .data") para incluir informações no programa. As strings são criadas e seu tamanho é
calculado. Chamadas de sistema são usadas para realizar operações, como escrever strings no
terminal.
global _start
section .data
msg db "Hello, world!", 0x0a
len equ $ - msg
section .text
_start:
mov eax, 4
mov ebx, 1
mov ecx, msg
mod edx, len
int 0x80

21

Você também pode gostar