SlideShare uma empresa Scribd logo
PROGRAMAÇÃO DE
MICROPROCESSADORES
ARQUITETURA DE COMPUTADORES
ESCOLA:
NOME: DIOGO SILVA
Índice
Introdução
Em que consiste a Linguagem Assembly e o Sistema Binário
Em que consiste o funcionamento de um Sistema Operativo a baixo nível
Onde é utilizada?
Microprocessador, Mnemônicos, Assembler, Nibble, Byte
Comando básico de um processador
Programação e Instalação em Assembly
Processo de criação de programas
Software necessário
Registos da CPU e seus nomes
Estrutura Assembly
Implementação de Chamadas de Sistema e os seus tipos
Características Particulares
Estrutura da Programação
Vantagens e Desvantagens
O que é o "debugging" de pequenos programas em Assembly?
Tratamento de ficheiros
O que é device drivers?
Conclusão
DIOGO SILVA 2
Introdução
Saber programar em linguagem Assembly significa conhecer e saber usar melhor
os requisitos mais íntimos de um microprocessador, e desse modo, saber
controlar melhor as funções de um computador digital.
É usada na criação e desenvolvimento de rotinas escritas nas formas de DLLs,
drivers, programas adaptados (computadores de bordo), etc.
Algumas linguagens de alto nível possuem algum tipo de interação com rotinas
de programas escritos em Assembly.
Códigos Assembly são rápidos e pequenos (compilado) mas o código-fonte é
extenso.
DIOGO SILVA 3
Assembly
Assembly é a linguagem de programação mais
básica disponível para qualquer processador.
Com a linguagem Assembly, um programador só
trabalha com as operações executadas diretamente
sobre a CPU física.
•Linguagem de programação que surgiu entre a
década de 40 e 50;
•Objetivo: facilitar o trabalho de codificação de um
programa de computador;
•É composta por códigos alfabéticos muito mais
fáceis de se utilizar quer códigos binários ou
hexadecimais.
DIOGO SILVA 4
Em que consiste o funcionamento de
um Sistema Operativo a baixo nível
Assembly é uma linguagem de baixo nível, que foi criada a partir da linguagem C,
que também é de baixo nível.
Então, a linguagem Assembly orienta-se para o seu núcleo, que seria
microprocessador, dando instruções para o processador.
•Instruções de registradores;
•Instruções de execução;
•Instruções de memória;
•Instruções para o sistema operacional.
DIOGO SILVA 5
Assembly e o
sistema binário
Além de tudo isso, é preciso entender que o
Assembly e o sistema binário tem uma ligação
muito forte, pois tudo que é programado em
Assembly é convertido para binário, assim a
máquina consegue reconhecer o que de fato a
programação quer lhe "dizer".
DIOGO SILVA 6
Em que consiste a Linguagem Assembly
•É uma linguagem de montagem (edição);
•É utilizada para programar um computador de baixo nível;
•O programa é montado dentro do processador;
•Não é uma linguagem de máquina;
•Assembly é totalmente dependente de hardware;
•Um código Assembly para INTEL não é o mesmo que um para a AMD. Portanto,
não é portável.
DIOGO SILVA 7
Onde é utilizada?
•Utilizada para programar dispositivos computacionais;
•Legível a partir da substituição dos valores;
•A conversão da linguagem de montagem (assembly) para o código de máquina
é feita pelo montador ou Assembler.
DIOGO SILVA 8
Linguagem Assembly
Compiladores disponíveis para a linguagem Assembly:
•MASM (microsoft);
•MASM (ibm);
•TASM (borland);
•EMU8086;
o Ambiente de programação;
o Programa de simulação do modo de operação interna de um
microprocessador padrão 8086;
o Modo gráfico.
DIOGO SILVA 9
Linguagem de máquina
•Utilizada por um MICROPROCESSADOR para controlar funções de um
computador digital;
•Só aceita e manipula informações numéricas expressas em notação de códigos
binários.
DIOGO SILVA 10
Microprocessador
•É um circuito que possui a capacidade de executar diversos tipos de funções
distintas;
•É usado em um computador.
DIOGO SILVA 11
Instruções de um microprocessador
A criação de uma sequência de instruções gera um algorítimo (que executa
determinada tarefa). E, para gerar esta sequência utilizando as instruções do
processador diretamente, utiliza-se a linguagem de programação
chamada Assembly.
Nesta linguagem, os comandos existentes são específicos para cada
processador que nós iremos programar (embora possam existir comandos
parecidos). E estes comandos são transcritos diretamente para as instruções que
o microprocessador executará.
Esta programação direta é chamada de código de máquina (pois são os códigos
que o processador de fato entende). Portanto, é uma linguagem extremamente
eficiente (rápida e que ocupa menos memória possível).
DIOGO SILVA 12
Instruções de um microprocessador
Na linguagem de programação C, por exemplo, existem comandos
(palavras) padronizados que servem para criar algorítimos para inúmeros
processadores diferentes utilizando o mesmo código. Entretanto, um código escrito
em C (ou qualquer outra linguagem) tem que ser traduzido para as instruções
específicas do processador alvo. Esta tradução é feita por um compilador. E a
tradução de uma linguagem não é tão eficiente quanto a programação direta em
Assembly, pois este processo de tradução não é 100% eficiente (adiciona
redundâncias).
O código de máquina é chamado de baixo nível e quanto mais distante uma
linguagem de programação for dele, mais alto nível ela será (menos eficiente).
Entretanto, as linguagens que não são totalmente de baixo nível possuem diversas
vantagens que fazem esta ineficiência ser menos relevante (um exemplo é o
Python). A própria linguagem C ainda é bastante eficiente (baixo nível) e possui uma
série de vantagens sobre o Assembly (principalmente facilidade de
desenvolvimento). Com isto, ela é escolhida como a principal forma de programação
de microcontroladores em diversas situações.
DIOGO SILVA 13
Mnemônicos
•São as instruções da linguagem Assembly.
DIOGO SILVA 14
Assembler
•É o nome dado ao programa montador;
•É o programa utilizado para compilar um programa escrito em linguagem de
montagem, tornando-o executável;
•É o ambiente de programação;
•É responsável por traduzir o programa-fonte para o programa-objeto.
Nota: Assembler é diferente de Assembly!
DIOGO SILVA 15
Nibble
•É um conjunto numérico de 4 bits;
•Representa-se numericamente até 16 valores diferentes;
•É a menor estrutura numérica manipulada internamente em um computador
digital;
•Usa-se Nibble para facilitar a representação de valores binários em formato
hexadecimal.
DIOGO SILVA 16
Byte
•É um conjunto numérico de 8 bits;
•Representa-se numericamente até 256 valores diferentes;
•Um byte é formado pelo conjunto de dois nibbles.
DIOGO SILVA 17
Comando básico de um processador
Exemplo de comando básico de um processador:
184, 0, 184, 142, 216, 198, 6, 158, 15, 36, 205, 32
Esses números em cima são endereços de memória no seu computador, onde se
forem executados em MS-DOS, por exemplo, farão o seguinte, colocarão um
cifrão "$" no canto inferior direito da tela.
DIOGO SILVA 18
Programação em Assembly
A linguagem assembly trouxe uma forma mais simples de se programar, que hoje ainda assim
seria difícil, ela permitiria ao programador usar atalhos de comandos, onde na compilação esses
dados seriam convertidos em 0 e 1 número binário, para que o processador entendesse.
A programação de antigamente era feita dessa forma, com números, o programador teria que
decora-los para se programar ou usar uma espécie de tabela, onde hoje nós usamos uma
linguagem de alto nível, e são usados comando simples como: if (se), else (senão), repeat
(repetir), entre outros.
Dessa forma a programação ficaria em vez disso:
184, 0, 184, 142, 216, 198, 6, 158, 15, 36, 205, 32 para isso:
MOV AX, 47104
MOV DS, AX
MOV [3998], 36
32 INT
É bem mais simples na linguagem assemby como podemos ver.
DIOGO SILVA 19
Instalação em Assembly
O Assembly mesmo sendo uma linguagem de baixo nível, necessita de ser
transformada para ser entendida pela máquina, que no caso o chamamos de
Assembler. O Assembler é um utilitário que traduz os códigos para a máquina.
Existem diversos compiladores Assembly há venda que podem ser transferidos
pelo utilizador para criação do seu código. Os principais compiladores disponíveis
atualmente são:
•Fasm;
•Goasm;
•Masm;
•Nasm;
•Tasm, entre outros.
DIOGO SILVA 20
Processo de criação de programas
Para a criação de programas são necessários os seguintes passos:
1. Desenvolvimento do algoritmo, exercício em que o problema a ser
solucionado é estabelecido e a melhor solução é proposta, criação de
diagramas esquemáticos relativos à melhor solução proposta.
2. Codificação do algoritmo, o que consiste em escrever o programa em
alguma linguagem de programação, linguagem assembly neste caso
específico, tomando como base a solução proposta no passo anterior.
3. A transformação para a linguagem de máquina, ou seja, a criação do
programa objeto, escrito como uma sequência de zeros e uns (0 e 1) que
podem ser interpretados pelo processador.
4. O último exercício é a eliminação de erros detetados no programa na fase
de testes. A correção normalmente requer a repetição de todos os passos,
com observação atenta.
DIOGO SILVA 21
Software necessário
Para que possamos criar um programa, precisamos de algumas ferramentas:
•Primeiro de um editor para criar o programa fonte;
•Segundo de um assembler, um programa que transforma nossa fonte num
programa objeto;
•E, terceiro, de um linker (ativo) que gera o programa executável a partir do
programa objeto.
DIOGO SILVA 22
Software necessário
O editor pode ser qualquer um que dispusermos.
O assembler pode ser o TASM macro assembler da Borland, e o linker ser o
TLINK, também da Borland.
Nós devemos criar os programas fonte com a extensão .ASM para que o TASM
reconheça e o transforme no programa objeto, um "formato intermediário" do
programa, assim chamado porque ainda não é um programa executável e tão
pouco um programa fonte.
O linker gera a partir de um programa .OBJ, ou da combinação de vários deles,
um programa executável, cuja extensão‚ normalmente .EXE, embora possa ser
.COM dependendo da forma como for montado e ligado.
DIOGO SILVA 23
Estrutura de um processador
Os principais blocos que constituem um processador podem ser identificados
como sendo:
•Conjunto de registos para armazenar temporariamente a informação que vem
da memória ou os valores de variáveis (da aplicação ou de gestão do sistema);
•Unidades funcionais (aritméticas, lógicas, de vírgula flutuante, ...) para operar
sobre as variáveis;
•Unidade de controlo, que emite a sequência de sinais adequados ao
funcionamento do processador e para atuação noutros componentes do
computador.
A unidade de controlo é também designada na literatura anglo-saxónica
por control path, enquanto que o bloco que processa directamente a informação
- e que é constituído pelos registos e unidades funcionais - é normalmente
designado por data path.
DIOGO SILVA 24
Registradores
Os registradores são responsáveis por armazenar dados temporários
relacionados à operação momentânea da CPU. Um conjunto deles pode ser
utilizado para armazenar o resultado de alguma operação matemática, que são
os registradores de propósito geral. No caso dos processadores AVR, existem 32
deles.
E, os demais registradores são dedicados a certas funções.
Mas, qual a necessidade destes registradores se existe a memória externa? A
explicação é devido a velocidade de acesso. Mesmo que a memória RAM externa
seja rápida, é mais rápido ainda acessar estes registros internos do que a
memória externa.
DIOGO SILVA 25
Registradores dedicados
•Program Counter (PC)
O PC é um registrador que armazena o endereço de memória da próxima
instrução a ser executada. Este registrador serve para a CPU acompanhar o fluxo
das instruções.
•Current Instruction Register (CIR)
O CIR é um registrador que armazena a instrução que está sendo executada no
momento.
•Acumulador
ALGUNS microprocessadores antigos, invés de possuírem diversos registradores
de propósito geral, possuíam um registrador chamado acumulador
(Accumulator). O acumulador servia para armazenar o resultado de operações
intermediárias da ALU.
DIOGO SILVA 26
Registradores dedicados
•Registrador de Status (SR)
O SR é um registrador que armazena algumas informações da última operação
aritmética executada. Ele possui diversos bits (chamados flags), por exemplo:
oOverflow flag: Indica que o resultado da operação “transbordou” o tamanho
dos bits utilizados na operação. (Ex: o resultado é um número de 9 bits, mas a
operação envolveu dois números de 8 bits).
oZero flag: Indica que a operação resultou em 0 (zero).
oNegative flag: Indica que a operação resultou em um número negativo.
Entre outras flags…
DIOGO SILVA 27
Registradores dedicados
•Memory Address Register (MAR)
O MAR é um registrador que armazena o endereço de memória para ser lido ou
escrito. Isto é, ele é que fornece o endereço da memória para ser conectada.
•Memory Data Register (MDR / MBR)
O MDR é um registrador que armazena o dado que foi lido ou que é para ser
escrito na memória.
Isto é, se a CPU estiver lendo a memória, o MDR conterá o valor lido do
endereço dado pelo MAR. E, se a CPU estiver escrevendo na memória,
o MDR conterá o valor a ser escrito no endereço dado pelo MAR.
DIOGO SILVA 28
Registos da CPU
•Para o propósito didático, vamos focar registos de 16 bits.
•A CPU possui 4 registos internos, cada um de 16 bits.
São eles AX, BX, CX e DX.
São registos de uso geral e também podem ser usados como registos de 8 bits.
Para tanto devemos referenciá-los como, por exemplo, AH e AL, que são,
respetivamente, o byte high e o low do registo AX.
Esta nomenclatura também se aplica para os registos BX, CX e DX.
DIOGO SILVA 29
Os registos, segundo seus respetivos nomes
•AX Registo Acumulador;
•BX Registo Base;
•CX Registo Contador;
•DX Registo de Dados;
•DS Registo de Segmento de Dados;
•ES Registo de Segmento Extra;
•SS Registo de Segmento de Pilha;
•CS Registo de Segmento de Código;
•BP Registo Apontador da Base;
•SI Registo de Índice Fonte;
•DI Registo de Índice Destino;
•SP Registo Apontador de Pilha;
•IP Registo Apontador da Próxima
Instrução;
•F Registo de Flag.
DIOGO SILVA 30
Estrutura Assembly
Nas linhas do código em Linguagem Assembly existem duas partes:
•a primeira é o nome da instrução a ser executada;
•a segunda, é os parâmetros do comando.
Por exemplo: add ah bh.
Aqui "add" é o comando a ser executado, neste caso uma adição, e "ah" bem
como "bh" são os parâmetros.
DIOGO SILVA 31
Chamadas de sistema
Interface de programação para os serviços oferecidos pelo Sistema Operativo.
Geralmente escrita em uma linguagem de alto nível (C, C++).
Na maioria das vezes são utilizadas pelos programas através de uma Application
Program Interface (API) de mais alto nível ao invés de serem chamadas
diretamente.
As três APIs mais comuns são Win32 API do Windows, POSIX API para sistemas
POSIX-based (incluindo praticamente todas as versões do UNIX, Linux, e Mac OS
X), e a API Java para a Java Virtual Machine (JVM).
Por que usar APIs ao invés de chamadas de sistema?
DIOGO SILVA 32
Implementação de chamadas de sistema
Tipicamente, cada chamada de sistema possui um número associado;
•A interface de chamada de sistemas mantém uma tabela indexada com esses
números.
A interface de chamada de sistema invoca a chamada desejada no kernel do
Sistema Operativo e retorna o estado e valores de resposta para o utilizador.
Quem faz a chamada não precisa ter qualquer informação sobre como a
chamada de sistema foi implementada;
•Precisa apenas conhecer a interface e saber o que o SO fará como resultado da
chamada;
•A maioria dos detalhes do SO ficam escondidos dos utilizadores atrás de APIs.
DIOGO SILVA 33
Tipos de chamadas de sistema
•Controle de processos;
•Gerência de arquivos;
•Gerência de dispositivos;
•Manutenção da informação;
•Comunicação;
•Proteção.
DIOGO SILVA 34
Características Particulares
•Atribuir nomes simbólicos a endereços de memória, variáveis e grupos de
instruções;
•Trabalhar em diversas bases de numeração bem como converter caracteres nos
seus códigos ASCII;
•Efetuar cálculos aritméticos simples com constantes ou nomes simbólicos;
•Definir os endereços de memória onde o programa e os dados irão ser
armazenados;
•Reservar áreas de memória para armazenamento temporário de informação;
•Configurar a geração de código máquina e o formato das listagens produzidas;
•Construir e utilizar bibliotecas de funções, ajudando a programar de forma
modular e a reutilizar código já escrito em Assembly ou outras linguagens.
DIOGO SILVA 35
Estrutura da Programação
É importante incluir as seguintes diretivas Assembly:
•MODEL SMALL - Define o modelo de memória a usar no nosso programa;
•CODE - Define as instruções do programa, relacionado ao segmento de código;
•STACK - Reserva espaço de memória para as instruções do programa na pilha;
•END - Finaliza um programa assembly.
DIOGO SILVA 36
Vantagens
Velocidade, os programas em Assembly são, em geral, mais rápidos;
Tamanho dos programas de Assembly são menores;
Assembly permite criar ações de alta complexidade, impossíveis ou difíceis de
se realizar em linguagens de Alto Nível;
Conhecimento, em Assembly possibilita a programação nos outros tipos de
linguagem;
Torna-se de fácil compreensão com algum conhecimento de conceitos de
hardware e seus idiomas.
DIOGO SILVA 37
Desvantagens
Difícil de ler, de aprender, entender, dispersar e de difícil manutenção. Um
programa escrito em linguagem Assembly não é muito legível, por isso ele deve
ser muito bem documentado;
Programar em Assembly consome muito tempo para o programador;
A linguagem não é portável. Ela é portável apenas dentro de uma família de
processadores;
Como é uma linguagem especifica para processadores de cada máquina, é
necessário desenvolver um programa para cada máquina;
Como o programador utiliza diretamente os recursos do processador e
memória, ele deve conhecer muito bem a máquina onde ele está a programar.
DIOGO SILVA 38
O que é o "debugging" de pequenos
programas em Assembly?
Debugging:
É o processo pelo qual se desenvolvem e corrigem bugs de software (ou hardware).
Dominar o debugging é vital para um programador: os bugs vão inevitavelmente aparecer
quando a complexidade (número de programadores, de requisitos, de linhas de código, de
dependências, etc.) aumentar.
No início, fazer debug costuma ser algo chato mas, com a prática, torna-se mais
interessante, pois:
•faz-nos compreender melhor o workflow do programa, o que se passa “por baixo”, assim
como tecnologias envolvidas;
•obriga a criar um bom código que evita bugs semelhantes no futuro;
•alguns bugs estimulam a nossa capacidade de resolução de problemas e motivam-nos
quando são resolvidos.
DIOGO SILVA 39
Evitando o debug
A melhor forma de fazer debug é evitar ter de o fazer. Devemos adotar técnicas e boas
práticas que reduzam a probabilidade de ter bugs e outras que facilitem a sua correção
caso ocorram. Eis algumas (cuja explicação sai fora do âmbito atual):
•Code reviewing e Pair programming;
•Decoupling, encapsulamento e modularidade;
•Uso correto de design patterns;
•TDD;
•Redução de dependências (ex. de tecnologias, de pessoas, do S.O.);
•Uso de convention over configuration;
•Princípios SOLID;
•Não faça copy / paste de código (nunca vale a pena);
•Mantenha o código limpo e tenha pouco código;
•Faça bons comentários, entre muitas outras boas práticas…
DIOGO SILVA 40
O processo de debug
O debugging, apesar de muito ligado à
programação, é uma disciplina com o seu próprio
processo. Mesmo não se pensando nisso, está-se
implicitamente a segui-lo:
•Reprodução: saber os passos a seguir, as condições
iniciais, estimativas, etc;
•Diagnóstico: gravidade, prioridade, impactos,
riscos, a zona em causa. Para este último:
•Correção;
•Reflexão: aplicação de medidas que garantam que
o problema não se repete noutro formato: testes,
documentação, validações de input e corner cases,
criação de código mais resistente, refactoring, etc.
DIOGO SILVA 41
Análise detalhada de um exemplo
A fig. A.5 apresenta uma pequena rotina escrita em C, enquanto a fig. A.4 mostra a mesma rotina,
mas escrita em assembly com algumas extensões, mas sem comentários.
Os seguintes comentários deverão ser feitos à codificação em assembly da fig A.4:
•o programa em assembly contém algumas linhas de comandos exclusivos para o assembler - as
quais não são convertidas para linguagem máquina - que se designam por diretivas para
o assembler, e que começam sempre por um ponto (no caso do assembler do MIPS);
•as diretivas .text e .data indicam ao assembler onde começa a zona do programa com código, e
a zona do programa reservada aos dados; .align x indica ao assembler para alinhar na memória a
informação que vem a seguir, quer em bytes (x=0), em meias-palavras de 16 bits (x=1) - isto é,
colocar a informação apenas em localizações de memória que comecem por um endereço par -
ou em palavras de 32 bits (x=2) - isto é, colocar a informação apenas em localizações de
memória que comecem por um endereço múltiplo de 4; .globl x indica ao assembler que o
símbolo x é um símbolo que tem visibilidade para outros módulos externos (informação para ser
usada pelo linker); .asciiz x indica ao assembler que a string x que se segue é para ser codificada
em ASCII, caracter a caracter, e terminada com um caracter especial, designado em ASCII
por null; várias outras diretivas são suportadas pelo assembler do MIPS, mas serão apresentadas
gradualmente conforme forem sendo necessárias;
DIOGO SILVA 42
Continuação da análise
•as etiquetas main:, loop: e str: indicam ao assembler o início de pedaços de
código ou de dados (isto é, endereços de memória) para referência noutros
locais do programa, poupando ao programador de assembly a necessidade de
efectuar todos os cálculos para a localização de código e de dados;
•embora não exista nenhum registo com o nome $sp, o assembler aceita que
certos registos sejam referenciados por uma designação diferente, de acordo
com uma convenção que se verá adiante; o registo que se aconselha a usar
como stack pointer é o $29, e o assembler converte qualquer referência ao $sp
em $29 (repare que a instrução que contém esta referência está um pouco
incoerente quanto a esta facilidade, e não só, pois a instrução deveria ser
"subiu $sp, $sp, 32");
•o programa em C faz uma referência (printf) que não é resolvida no próprio
módulo (externa), e essa mesma referência transita para o código em assembly;
DIOGO SILVA 43
Continuação da análise
•o código apresentado contém várias simulações de instruções, que facilitam a
interpretação do seu conteúdo por um ser humano; faltam contudo
comentários que facilitem a sua leitura, e que deveriam ser iniciados sempre
pelo caracter # (em cada linha de texto que apareçam).
A fig. A.3 mostra o mesmo programa, mas em assembly e sem quaisquer
extensões: já não há diretivas para o assembler, não há etiquetas nem
comentários, todos os símbolos foram substituídos por valores binários (até
mesmo a referência externa, printf) e as simulações de instruções foram
convertidas para instruções reais do instruction set do MIPS.
Este código é integralmente equivalente ao código em linguagem máquina em
binário (na fig. A.2), usando apenas símbolos para que os humanos identifiquem
com mais facilidade as instruções, os registos referenciados, e os valores
numéricos (em decimal).
DIOGO SILVA 44
Figura apresentada da análise
DIOGO SILVA 45
Tratamento de ficheiros
Até ao momento, todos os dados têm sido inseridos nos programas através do
teclado, sendo guardados em variáveis que residem em memória central
(R.A.M.).
Este tipo de memória apresenta no entanto os inconvenientes de ser
inconstante, pelo que impossibilita o armazenamento de dados após a execução
de um programa.
Para armazenamentos mais demorados é utilizada, a memória secundária (i.e. o
disco rígido, a disquete, …), em que a informação é armazenada sob a forma de
ficheiros.
DIOGO SILVA 46
Tratamento de ficheiros
A linguagem C é “Device Independent”, ou seja, não diferencia os vários
periféricos (de entrada ou saída) ligados ao computador.
Independentemente do tipo de periférico que esteja a utilizar, o C processa todas
as entradas e saídas de dados através de streams.
Stream é um conjunto sequencial de caracteres, isto é, um conjunto de bytes -
ficheiros.
DIOGO SILVA 47
Tratamento de ficheiros
Por defeito, um programa ao executar tem 5 ficheiros automaticamente abertos:
• stdin - standard input (teclado);
• stout - standard output (monitor);
• stderr - standard error (monitor ou outro);
• stdaux - aux device (porta COM1 num PC);
• stdprn - standard printer.
DIOGO SILVA 48
Tratamento de ficheiros
Para trabalhar com ficheiros necessita da biblioteca stdio.h.
A linguagem C suporta dois tipos de ficheiros:
• Ficheiro de Texto - é um ficheiro constituído apenas pelos caracteres
existentes no nosso teclado, e em geral formatado apenas com o carácter
New Line (n);
• Ficheiro Binário - podem ser constituídos por qualquer carácter existente na
tabela ascci.
DIOGO SILVA 49
Tratamento de ficheiros
Operações básicas sobre ficheiros:
• Para trabalhar com um qualquer ficheiro, a primeira operação a realizar é
ligar uma variável do nosso programa a esse ficheiro. A esta operação dá-se o
nome de Abertura do ficheiro.
• Após a abertura do ficheiro, podemos realizar operações sobre o conteúdo
do ficheiro:
o Ler dados;
o Escrever dados.
• Após efetuadas as operações pretendidas sobre o ficheiro terá de Fechar o
ficheiro.
DIOGO SILVA 50
Abertura de um ficheiro
A função que permite a abertura de um ficheiro é a seguinte: fopen(), cuja
sintaxe é a seguinte:
•FILE *fopen(char *nome_do_ficheiro, char *modo_de_abertura).
A função devolve:
•um apontador para um FILE, que passa a ser utilizado em todos os acessos ao
ficheiro (isto se conseguir abrir o ficheiro);
•NULL se ocorrer um erro na abertura.
A função recebe dois parâmetros:
•nome_do_ficheiro - nome do ficheiro a abrir;
•modo_de_abertura - modo de abertura do ficheiro.
DIOGO SILVA 51
Modos de abertura de um ficheiro
R (read)
Abre o ficheiro para leitura.
Caso não seja possível abrir o ficheiro, a função devolve
NULL.
W (write)
Abre o ficheiro para escrita. Se o ficheiro não existir, é
criado com o nome passado à função. Se o ficheiro já
existir, é apagado e criado um novo com o mesmo
nome.
Caso não seja possível criar o ficheiro, a função devolve
NULL.
A (append)
Abre o ficheiro para acrescento, no fim do ficheiro. Se o
ficheiro existir, os novos dados são escritos no fim do
ficheiro. Se o ficheiro não existir, é criado.
DIOGO SILVA 52
Modos de abertura de um ficheiro
R+
Abre o ficheiro para leitura e escrita. Se o ficheiro não
existir, é criado. Se o ficheiro existir, os novos dados são
escritos a partir do início do ficheiro, sobre os que já lá
existem.
W+
Abre o ficheiro para leitura e escrita. Se o ficheiro
não existir, é criado. Se o ficheiro já existir, é apagado e
criado um novo com o mesmo nome.
A+
Abre o ficheiro para leitura e escrita. Se o ficheiro
não existir, é criado. Se o ficheiro já existir, os
novos dados são colocados a partir do fim do ficheiro.
DIOGO SILVA 53
Final de um ficheiro
Após ter feito as operações sobre um ficheiro, terá de o fechar.
A função que permite o final de um ficheiro é a função fclose() , cuja sintaxe é a
seguinte:
•int fclose (FILE *fp).
Esta função fecha o ficheiro apontado por fp.
Em caso de erro (i.e. fechar um ficheiro que ainda não foi aberto) retorna EOF, se
fechou o ficheiro com sucesso retorna zero. Normalmente não se verifica o valor
devolvido por esta função.
DIOGO SILVA 54
O que é device drivers?
É um programa ou processo que é executado em uma região especial de
memória e através do qual o utilizador pode conectar-se a um dispositivo ou
recurso de um processador ou sistema computacional. Ele serve como um
mediador entre o software e o hardware.
Por exemplo, quando você tira uma foto no seu telemóvel ex: Android,
o driver da câmera interage com o software e passa informações a ele referentes
às imagens capturadas e outras informações. O resultado final é a foto. Ou
quando você quer jogar seu jogo preferido, mas não é possível sem o driver da
placa de vídeo, certo? Por meio do driver o jogo acesa recursos da placa de vídeo
que permitem a experiência incrível que os jogos proporcionam.
Então, a ideia é justamente essa. Servir como mediador entre o utilizador e o
hardware ou entre o software e o hardware.
DIOGO SILVA 55
Conclusão
A tendência atual é a favor de uma programação mista, usando principalmente
linguagens de mais alto nível (C em particular) e recorrendo à linguagem
Assembly apenas em rotinas onde a eficiência do código seja o objetivo principal
a atingir.
Esta tendência explica-se por três motivos:
• a pressão do mercado obriga a diminuir o tempo de desenvolvimento e a
aumentar a facilidade de manutenção do código;
• existem atualmente compiladores de C para a maioria dos
microprocessadores, alguns até de domínio público;
• os avanços na microeletrónica permitem que a rapidez de execução se
consiga facilmente pelo aumento da frequência de funcionamento.
DIOGO SILVA 56

Mais conteúdo relacionado

Mais procurados

Introdução à Informática - Módulo 1 - O Computador
Introdução à Informática - Módulo 1 - O ComputadorIntrodução à Informática - Módulo 1 - O Computador
Introdução à Informática - Módulo 1 - O Computador
Ministério Público da Paraíba
 
Aulas 1 e 2 - Hardware
Aulas 1 e 2 - HardwareAulas 1 e 2 - Hardware
Aulas 1 e 2 - Hardware
Jocelma Rios
 
Introdução à Arquitetura de Computadores
Introdução à Arquitetura de ComputadoresIntrodução à Arquitetura de Computadores
Introdução à Arquitetura de Computadores
Mauro Pereira
 
Lista de exercicios 02 hardware
Lista de exercicios 02 hardwareLista de exercicios 02 hardware
Lista de exercicios 02 hardware
Mauro Pereira
 
Modelo de von neumann
Modelo de von neumannModelo de von neumann
Modelo de von neumann
Elaine Cecília Gatto
 
Técnicas de detecção de avarias
Técnicas de detecção de avariasTécnicas de detecção de avarias
Técnicas de detecção de avarias
Andre Santos
 
Pseudocódigo - Estrutura de Repetição (Lógica de Programação)
Pseudocódigo - Estrutura de Repetição (Lógica de Programação)Pseudocódigo - Estrutura de Repetição (Lógica de Programação)
Pseudocódigo - Estrutura de Repetição (Lógica de Programação)
Gercélia Ramos
 
Trabalho sobre periféricos de entrada, saída, entrada e de entrada saída
Trabalho sobre periféricos de entrada, saída, entrada e de entrada saídaTrabalho sobre periféricos de entrada, saída, entrada e de entrada saída
Trabalho sobre periféricos de entrada, saída, entrada e de entrada saída
Taniabastos15
 
Informática Básica - Aula 03 - Hardware
Informática Básica - Aula 03 - HardwareInformática Básica - Aula 03 - Hardware
Informática Básica - Aula 03 - Hardware
Joeldson Costa Damasceno
 
Aula Introdução a Arquitetura e Organização de Computadores
Aula Introdução a Arquitetura e Organização de ComputadoresAula Introdução a Arquitetura e Organização de Computadores
Aula Introdução a Arquitetura e Organização de Computadores
Gilvan Latreille
 
Aula de hardware
Aula de hardwareAula de hardware
Aula de hardware
Clayton de Almeida Souza
 
Sistemas Operativos
Sistemas OperativosSistemas Operativos
Introdução - Arquitetura e Organização de Computadores
Introdução - Arquitetura e Organização de ComputadoresIntrodução - Arquitetura e Organização de Computadores
Introdução - Arquitetura e Organização de Computadores
Wellington Oliveira
 
Microprocessadores
MicroprocessadoresMicroprocessadores
Microprocessadores
Susana Oliveira
 
Placa mãe
Placa mãePlaca mãe
Placa mãe
Douglas Vieira
 
Linguagem Assembly
Linguagem AssemblyLinguagem Assembly
Linguagem Assembly
Suzana Viana Mota
 
Classificação – sistemas operativos
Classificação – sistemas operativosClassificação – sistemas operativos
Classificação – sistemas operativos
TROLITO LALALAL
 
Manutenção de Computadores - Aula 1
Manutenção de Computadores - Aula 1Manutenção de Computadores - Aula 1
Manutenção de Computadores - Aula 1
Guilherme Nonino Rosa
 
Aula 12 - Processador
Aula 12 - ProcessadorAula 12 - Processador
Aula 12 - Processador
Suzana Viana Mota
 
ApresentaçãO2 Sistema Operacional
ApresentaçãO2  Sistema OperacionalApresentaçãO2  Sistema Operacional
ApresentaçãO2 Sistema Operacional
Cláudia Costa
 

Mais procurados (20)

Introdução à Informática - Módulo 1 - O Computador
Introdução à Informática - Módulo 1 - O ComputadorIntrodução à Informática - Módulo 1 - O Computador
Introdução à Informática - Módulo 1 - O Computador
 
Aulas 1 e 2 - Hardware
Aulas 1 e 2 - HardwareAulas 1 e 2 - Hardware
Aulas 1 e 2 - Hardware
 
Introdução à Arquitetura de Computadores
Introdução à Arquitetura de ComputadoresIntrodução à Arquitetura de Computadores
Introdução à Arquitetura de Computadores
 
Lista de exercicios 02 hardware
Lista de exercicios 02 hardwareLista de exercicios 02 hardware
Lista de exercicios 02 hardware
 
Modelo de von neumann
Modelo de von neumannModelo de von neumann
Modelo de von neumann
 
Técnicas de detecção de avarias
Técnicas de detecção de avariasTécnicas de detecção de avarias
Técnicas de detecção de avarias
 
Pseudocódigo - Estrutura de Repetição (Lógica de Programação)
Pseudocódigo - Estrutura de Repetição (Lógica de Programação)Pseudocódigo - Estrutura de Repetição (Lógica de Programação)
Pseudocódigo - Estrutura de Repetição (Lógica de Programação)
 
Trabalho sobre periféricos de entrada, saída, entrada e de entrada saída
Trabalho sobre periféricos de entrada, saída, entrada e de entrada saídaTrabalho sobre periféricos de entrada, saída, entrada e de entrada saída
Trabalho sobre periféricos de entrada, saída, entrada e de entrada saída
 
Informática Básica - Aula 03 - Hardware
Informática Básica - Aula 03 - HardwareInformática Básica - Aula 03 - Hardware
Informática Básica - Aula 03 - Hardware
 
Aula Introdução a Arquitetura e Organização de Computadores
Aula Introdução a Arquitetura e Organização de ComputadoresAula Introdução a Arquitetura e Organização de Computadores
Aula Introdução a Arquitetura e Organização de Computadores
 
Aula de hardware
Aula de hardwareAula de hardware
Aula de hardware
 
Sistemas Operativos
Sistemas OperativosSistemas Operativos
Sistemas Operativos
 
Introdução - Arquitetura e Organização de Computadores
Introdução - Arquitetura e Organização de ComputadoresIntrodução - Arquitetura e Organização de Computadores
Introdução - Arquitetura e Organização de Computadores
 
Microprocessadores
MicroprocessadoresMicroprocessadores
Microprocessadores
 
Placa mãe
Placa mãePlaca mãe
Placa mãe
 
Linguagem Assembly
Linguagem AssemblyLinguagem Assembly
Linguagem Assembly
 
Classificação – sistemas operativos
Classificação – sistemas operativosClassificação – sistemas operativos
Classificação – sistemas operativos
 
Manutenção de Computadores - Aula 1
Manutenção de Computadores - Aula 1Manutenção de Computadores - Aula 1
Manutenção de Computadores - Aula 1
 
Aula 12 - Processador
Aula 12 - ProcessadorAula 12 - Processador
Aula 12 - Processador
 
ApresentaçãO2 Sistema Operacional
ApresentaçãO2  Sistema OperacionalApresentaçãO2  Sistema Operacional
ApresentaçãO2 Sistema Operacional
 

Semelhante a Programação de Microprocessadores

Int. sistemas de informação iii
Int. sistemas de informação iiiInt. sistemas de informação iii
Int. sistemas de informação iii
Ray Fran Pires
 
Paradigmas de Linguagem
Paradigmas de LinguagemParadigmas de Linguagem
Paradigmas de Linguagem
Flávio Ricardo B. Meira
 
A linguagem assembly
A linguagem assemblyA linguagem assembly
A linguagem assembly
Fernandes Luiz
 
Linguagem de programação
Linguagem de programaçãoLinguagem de programação
Linguagem de programação
Sandro Lopes
 
Aula 03 - Interpretador [mr_@@@@@].pdf
Aula 03 - Interpretador [mr_@@@@@].pdfAula 03 - Interpretador [mr_@@@@@].pdf
Aula 03 - Interpretador [mr_@@@@@].pdf
mouzinhoconcursos
 
Linguagem de programação
Linguagem de programação Linguagem de programação
Linguagem de programação
Marcos Gregorio
 
paradigmasdlsksmmskskkekekekekedmmmdmdmmf.pdf
paradigmasdlsksmmskskkekekekekedmmmdmdmmf.pdfparadigmasdlsksmmskskkekekekekedmmmdmdmmf.pdf
paradigmasdlsksmmskskkekekekekedmmmdmdmmf.pdf
AndreiaCristinaFlore
 
Processador CISC RISC SET de instruções
Processador CISC RISC SET de instruçõesProcessador CISC RISC SET de instruções
Processador CISC RISC SET de instruções
Carlos Pereira
 
Processo de Desenvolvimento de Software - Linguagens Compiladas x Interpretadas
Processo de Desenvolvimento de Software - Linguagens Compiladas x InterpretadasProcesso de Desenvolvimento de Software - Linguagens Compiladas x Interpretadas
Processo de Desenvolvimento de Software - Linguagens Compiladas x Interpretadas
Natanael Simões
 
Conceitos Fundamentais de Programacao
Conceitos Fundamentais de ProgramacaoConceitos Fundamentais de Programacao
Conceitos Fundamentais de Programacao
Jorge Cardoso
 
Oc2 cap03
Oc2 cap03Oc2 cap03
Oc2 cap03
RogerMasters
 
Engenharia Reversa no Linux
Engenharia Reversa no LinuxEngenharia Reversa no Linux
Engenharia Reversa no Linux
Fernando Mercês
 
Apostila c
Apostila cApostila c
Apostila de C# & Asp.Net
Apostila de C# & Asp.NetApostila de C# & Asp.Net
Apostila de C# & Asp.Net
Andre Nascimento
 
Aula 3 - Professor Panda
Aula 3 - Professor PandaAula 3 - Professor Panda
Aula 3 - Professor Panda
Raul Rabelo
 
Construção de compiladores - introducao Compilador.pdf
Construção de compiladores - introducao Compilador.pdfConstrução de compiladores - introducao Compilador.pdf
Construção de compiladores - introducao Compilador.pdf
Gerhard Saboia
 
Aula 2 programas e linguagens de programação
Aula 2   programas e linguagens de programaçãoAula 2   programas e linguagens de programação
Aula 2 programas e linguagens de programação
LCCIMETRO
 
Organização de computadores
Organização de computadoresOrganização de computadores
Organização de computadores
Tiago
 
Isc aula 7
Isc   aula 7Isc   aula 7
Isc aula 7
Fábio Andrade
 
Aula 2 - Introducao e Algoritmos.ppt
Aula 2 - Introducao e Algoritmos.pptAula 2 - Introducao e Algoritmos.ppt
Aula 2 - Introducao e Algoritmos.ppt
Jadna Almeida
 

Semelhante a Programação de Microprocessadores (20)

Int. sistemas de informação iii
Int. sistemas de informação iiiInt. sistemas de informação iii
Int. sistemas de informação iii
 
Paradigmas de Linguagem
Paradigmas de LinguagemParadigmas de Linguagem
Paradigmas de Linguagem
 
A linguagem assembly
A linguagem assemblyA linguagem assembly
A linguagem assembly
 
Linguagem de programação
Linguagem de programaçãoLinguagem de programação
Linguagem de programação
 
Aula 03 - Interpretador [mr_@@@@@].pdf
Aula 03 - Interpretador [mr_@@@@@].pdfAula 03 - Interpretador [mr_@@@@@].pdf
Aula 03 - Interpretador [mr_@@@@@].pdf
 
Linguagem de programação
Linguagem de programação Linguagem de programação
Linguagem de programação
 
paradigmasdlsksmmskskkekekekekedmmmdmdmmf.pdf
paradigmasdlsksmmskskkekekekekedmmmdmdmmf.pdfparadigmasdlsksmmskskkekekekekedmmmdmdmmf.pdf
paradigmasdlsksmmskskkekekekekedmmmdmdmmf.pdf
 
Processador CISC RISC SET de instruções
Processador CISC RISC SET de instruçõesProcessador CISC RISC SET de instruções
Processador CISC RISC SET de instruções
 
Processo de Desenvolvimento de Software - Linguagens Compiladas x Interpretadas
Processo de Desenvolvimento de Software - Linguagens Compiladas x InterpretadasProcesso de Desenvolvimento de Software - Linguagens Compiladas x Interpretadas
Processo de Desenvolvimento de Software - Linguagens Compiladas x Interpretadas
 
Conceitos Fundamentais de Programacao
Conceitos Fundamentais de ProgramacaoConceitos Fundamentais de Programacao
Conceitos Fundamentais de Programacao
 
Oc2 cap03
Oc2 cap03Oc2 cap03
Oc2 cap03
 
Engenharia Reversa no Linux
Engenharia Reversa no LinuxEngenharia Reversa no Linux
Engenharia Reversa no Linux
 
Apostila c
Apostila cApostila c
Apostila c
 
Apostila de C# & Asp.Net
Apostila de C# & Asp.NetApostila de C# & Asp.Net
Apostila de C# & Asp.Net
 
Aula 3 - Professor Panda
Aula 3 - Professor PandaAula 3 - Professor Panda
Aula 3 - Professor Panda
 
Construção de compiladores - introducao Compilador.pdf
Construção de compiladores - introducao Compilador.pdfConstrução de compiladores - introducao Compilador.pdf
Construção de compiladores - introducao Compilador.pdf
 
Aula 2 programas e linguagens de programação
Aula 2   programas e linguagens de programaçãoAula 2   programas e linguagens de programação
Aula 2 programas e linguagens de programação
 
Organização de computadores
Organização de computadoresOrganização de computadores
Organização de computadores
 
Isc aula 7
Isc   aula 7Isc   aula 7
Isc aula 7
 
Aula 2 - Introducao e Algoritmos.ppt
Aula 2 - Introducao e Algoritmos.pptAula 2 - Introducao e Algoritmos.ppt
Aula 2 - Introducao e Algoritmos.ppt
 

Mais de Diogo Silva

O Corpo Humano
O Corpo HumanoO Corpo Humano
O Corpo Humano
Diogo Silva
 
Sistema Operativo Open Source
Sistema Operativo Open SourceSistema Operativo Open Source
Sistema Operativo Open Source
Diogo Silva
 
Template de um Trabalho / Tema
Template de um Trabalho / TemaTemplate de um Trabalho / Tema
Template de um Trabalho / Tema
Diogo Silva
 
A Dopagem e os riscos de vida e saúde
A Dopagem e os riscos de vida e saúdeA Dopagem e os riscos de vida e saúde
A Dopagem e os riscos de vida e saúde
Diogo Silva
 
Futebol
FutebolFutebol
Futebol
Diogo Silva
 
Danças Sociais
Danças SociaisDanças Sociais
Danças Sociais
Diogo Silva
 

Mais de Diogo Silva (6)

O Corpo Humano
O Corpo HumanoO Corpo Humano
O Corpo Humano
 
Sistema Operativo Open Source
Sistema Operativo Open SourceSistema Operativo Open Source
Sistema Operativo Open Source
 
Template de um Trabalho / Tema
Template de um Trabalho / TemaTemplate de um Trabalho / Tema
Template de um Trabalho / Tema
 
A Dopagem e os riscos de vida e saúde
A Dopagem e os riscos de vida e saúdeA Dopagem e os riscos de vida e saúde
A Dopagem e os riscos de vida e saúde
 
Futebol
FutebolFutebol
Futebol
 
Danças Sociais
Danças SociaisDanças Sociais
Danças Sociais
 

Programação de Microprocessadores

  • 1. PROGRAMAÇÃO DE MICROPROCESSADORES ARQUITETURA DE COMPUTADORES ESCOLA: NOME: DIOGO SILVA
  • 2. Índice Introdução Em que consiste a Linguagem Assembly e o Sistema Binário Em que consiste o funcionamento de um Sistema Operativo a baixo nível Onde é utilizada? Microprocessador, Mnemônicos, Assembler, Nibble, Byte Comando básico de um processador Programação e Instalação em Assembly Processo de criação de programas Software necessário Registos da CPU e seus nomes Estrutura Assembly Implementação de Chamadas de Sistema e os seus tipos Características Particulares Estrutura da Programação Vantagens e Desvantagens O que é o "debugging" de pequenos programas em Assembly? Tratamento de ficheiros O que é device drivers? Conclusão DIOGO SILVA 2
  • 3. Introdução Saber programar em linguagem Assembly significa conhecer e saber usar melhor os requisitos mais íntimos de um microprocessador, e desse modo, saber controlar melhor as funções de um computador digital. É usada na criação e desenvolvimento de rotinas escritas nas formas de DLLs, drivers, programas adaptados (computadores de bordo), etc. Algumas linguagens de alto nível possuem algum tipo de interação com rotinas de programas escritos em Assembly. Códigos Assembly são rápidos e pequenos (compilado) mas o código-fonte é extenso. DIOGO SILVA 3
  • 4. Assembly Assembly é a linguagem de programação mais básica disponível para qualquer processador. Com a linguagem Assembly, um programador só trabalha com as operações executadas diretamente sobre a CPU física. •Linguagem de programação que surgiu entre a década de 40 e 50; •Objetivo: facilitar o trabalho de codificação de um programa de computador; •É composta por códigos alfabéticos muito mais fáceis de se utilizar quer códigos binários ou hexadecimais. DIOGO SILVA 4
  • 5. Em que consiste o funcionamento de um Sistema Operativo a baixo nível Assembly é uma linguagem de baixo nível, que foi criada a partir da linguagem C, que também é de baixo nível. Então, a linguagem Assembly orienta-se para o seu núcleo, que seria microprocessador, dando instruções para o processador. •Instruções de registradores; •Instruções de execução; •Instruções de memória; •Instruções para o sistema operacional. DIOGO SILVA 5
  • 6. Assembly e o sistema binário Além de tudo isso, é preciso entender que o Assembly e o sistema binário tem uma ligação muito forte, pois tudo que é programado em Assembly é convertido para binário, assim a máquina consegue reconhecer o que de fato a programação quer lhe "dizer". DIOGO SILVA 6
  • 7. Em que consiste a Linguagem Assembly •É uma linguagem de montagem (edição); •É utilizada para programar um computador de baixo nível; •O programa é montado dentro do processador; •Não é uma linguagem de máquina; •Assembly é totalmente dependente de hardware; •Um código Assembly para INTEL não é o mesmo que um para a AMD. Portanto, não é portável. DIOGO SILVA 7
  • 8. Onde é utilizada? •Utilizada para programar dispositivos computacionais; •Legível a partir da substituição dos valores; •A conversão da linguagem de montagem (assembly) para o código de máquina é feita pelo montador ou Assembler. DIOGO SILVA 8
  • 9. Linguagem Assembly Compiladores disponíveis para a linguagem Assembly: •MASM (microsoft); •MASM (ibm); •TASM (borland); •EMU8086; o Ambiente de programação; o Programa de simulação do modo de operação interna de um microprocessador padrão 8086; o Modo gráfico. DIOGO SILVA 9
  • 10. Linguagem de máquina •Utilizada por um MICROPROCESSADOR para controlar funções de um computador digital; •Só aceita e manipula informações numéricas expressas em notação de códigos binários. DIOGO SILVA 10
  • 11. Microprocessador •É um circuito que possui a capacidade de executar diversos tipos de funções distintas; •É usado em um computador. DIOGO SILVA 11
  • 12. Instruções de um microprocessador A criação de uma sequência de instruções gera um algorítimo (que executa determinada tarefa). E, para gerar esta sequência utilizando as instruções do processador diretamente, utiliza-se a linguagem de programação chamada Assembly. Nesta linguagem, os comandos existentes são específicos para cada processador que nós iremos programar (embora possam existir comandos parecidos). E estes comandos são transcritos diretamente para as instruções que o microprocessador executará. Esta programação direta é chamada de código de máquina (pois são os códigos que o processador de fato entende). Portanto, é uma linguagem extremamente eficiente (rápida e que ocupa menos memória possível). DIOGO SILVA 12
  • 13. Instruções de um microprocessador Na linguagem de programação C, por exemplo, existem comandos (palavras) padronizados que servem para criar algorítimos para inúmeros processadores diferentes utilizando o mesmo código. Entretanto, um código escrito em C (ou qualquer outra linguagem) tem que ser traduzido para as instruções específicas do processador alvo. Esta tradução é feita por um compilador. E a tradução de uma linguagem não é tão eficiente quanto a programação direta em Assembly, pois este processo de tradução não é 100% eficiente (adiciona redundâncias). O código de máquina é chamado de baixo nível e quanto mais distante uma linguagem de programação for dele, mais alto nível ela será (menos eficiente). Entretanto, as linguagens que não são totalmente de baixo nível possuem diversas vantagens que fazem esta ineficiência ser menos relevante (um exemplo é o Python). A própria linguagem C ainda é bastante eficiente (baixo nível) e possui uma série de vantagens sobre o Assembly (principalmente facilidade de desenvolvimento). Com isto, ela é escolhida como a principal forma de programação de microcontroladores em diversas situações. DIOGO SILVA 13
  • 14. Mnemônicos •São as instruções da linguagem Assembly. DIOGO SILVA 14
  • 15. Assembler •É o nome dado ao programa montador; •É o programa utilizado para compilar um programa escrito em linguagem de montagem, tornando-o executável; •É o ambiente de programação; •É responsável por traduzir o programa-fonte para o programa-objeto. Nota: Assembler é diferente de Assembly! DIOGO SILVA 15
  • 16. Nibble •É um conjunto numérico de 4 bits; •Representa-se numericamente até 16 valores diferentes; •É a menor estrutura numérica manipulada internamente em um computador digital; •Usa-se Nibble para facilitar a representação de valores binários em formato hexadecimal. DIOGO SILVA 16
  • 17. Byte •É um conjunto numérico de 8 bits; •Representa-se numericamente até 256 valores diferentes; •Um byte é formado pelo conjunto de dois nibbles. DIOGO SILVA 17
  • 18. Comando básico de um processador Exemplo de comando básico de um processador: 184, 0, 184, 142, 216, 198, 6, 158, 15, 36, 205, 32 Esses números em cima são endereços de memória no seu computador, onde se forem executados em MS-DOS, por exemplo, farão o seguinte, colocarão um cifrão "$" no canto inferior direito da tela. DIOGO SILVA 18
  • 19. Programação em Assembly A linguagem assembly trouxe uma forma mais simples de se programar, que hoje ainda assim seria difícil, ela permitiria ao programador usar atalhos de comandos, onde na compilação esses dados seriam convertidos em 0 e 1 número binário, para que o processador entendesse. A programação de antigamente era feita dessa forma, com números, o programador teria que decora-los para se programar ou usar uma espécie de tabela, onde hoje nós usamos uma linguagem de alto nível, e são usados comando simples como: if (se), else (senão), repeat (repetir), entre outros. Dessa forma a programação ficaria em vez disso: 184, 0, 184, 142, 216, 198, 6, 158, 15, 36, 205, 32 para isso: MOV AX, 47104 MOV DS, AX MOV [3998], 36 32 INT É bem mais simples na linguagem assemby como podemos ver. DIOGO SILVA 19
  • 20. Instalação em Assembly O Assembly mesmo sendo uma linguagem de baixo nível, necessita de ser transformada para ser entendida pela máquina, que no caso o chamamos de Assembler. O Assembler é um utilitário que traduz os códigos para a máquina. Existem diversos compiladores Assembly há venda que podem ser transferidos pelo utilizador para criação do seu código. Os principais compiladores disponíveis atualmente são: •Fasm; •Goasm; •Masm; •Nasm; •Tasm, entre outros. DIOGO SILVA 20
  • 21. Processo de criação de programas Para a criação de programas são necessários os seguintes passos: 1. Desenvolvimento do algoritmo, exercício em que o problema a ser solucionado é estabelecido e a melhor solução é proposta, criação de diagramas esquemáticos relativos à melhor solução proposta. 2. Codificação do algoritmo, o que consiste em escrever o programa em alguma linguagem de programação, linguagem assembly neste caso específico, tomando como base a solução proposta no passo anterior. 3. A transformação para a linguagem de máquina, ou seja, a criação do programa objeto, escrito como uma sequência de zeros e uns (0 e 1) que podem ser interpretados pelo processador. 4. O último exercício é a eliminação de erros detetados no programa na fase de testes. A correção normalmente requer a repetição de todos os passos, com observação atenta. DIOGO SILVA 21
  • 22. Software necessário Para que possamos criar um programa, precisamos de algumas ferramentas: •Primeiro de um editor para criar o programa fonte; •Segundo de um assembler, um programa que transforma nossa fonte num programa objeto; •E, terceiro, de um linker (ativo) que gera o programa executável a partir do programa objeto. DIOGO SILVA 22
  • 23. Software necessário O editor pode ser qualquer um que dispusermos. O assembler pode ser o TASM macro assembler da Borland, e o linker ser o TLINK, também da Borland. Nós devemos criar os programas fonte com a extensão .ASM para que o TASM reconheça e o transforme no programa objeto, um "formato intermediário" do programa, assim chamado porque ainda não é um programa executável e tão pouco um programa fonte. O linker gera a partir de um programa .OBJ, ou da combinação de vários deles, um programa executável, cuja extensão‚ normalmente .EXE, embora possa ser .COM dependendo da forma como for montado e ligado. DIOGO SILVA 23
  • 24. Estrutura de um processador Os principais blocos que constituem um processador podem ser identificados como sendo: •Conjunto de registos para armazenar temporariamente a informação que vem da memória ou os valores de variáveis (da aplicação ou de gestão do sistema); •Unidades funcionais (aritméticas, lógicas, de vírgula flutuante, ...) para operar sobre as variáveis; •Unidade de controlo, que emite a sequência de sinais adequados ao funcionamento do processador e para atuação noutros componentes do computador. A unidade de controlo é também designada na literatura anglo-saxónica por control path, enquanto que o bloco que processa directamente a informação - e que é constituído pelos registos e unidades funcionais - é normalmente designado por data path. DIOGO SILVA 24
  • 25. Registradores Os registradores são responsáveis por armazenar dados temporários relacionados à operação momentânea da CPU. Um conjunto deles pode ser utilizado para armazenar o resultado de alguma operação matemática, que são os registradores de propósito geral. No caso dos processadores AVR, existem 32 deles. E, os demais registradores são dedicados a certas funções. Mas, qual a necessidade destes registradores se existe a memória externa? A explicação é devido a velocidade de acesso. Mesmo que a memória RAM externa seja rápida, é mais rápido ainda acessar estes registros internos do que a memória externa. DIOGO SILVA 25
  • 26. Registradores dedicados •Program Counter (PC) O PC é um registrador que armazena o endereço de memória da próxima instrução a ser executada. Este registrador serve para a CPU acompanhar o fluxo das instruções. •Current Instruction Register (CIR) O CIR é um registrador que armazena a instrução que está sendo executada no momento. •Acumulador ALGUNS microprocessadores antigos, invés de possuírem diversos registradores de propósito geral, possuíam um registrador chamado acumulador (Accumulator). O acumulador servia para armazenar o resultado de operações intermediárias da ALU. DIOGO SILVA 26
  • 27. Registradores dedicados •Registrador de Status (SR) O SR é um registrador que armazena algumas informações da última operação aritmética executada. Ele possui diversos bits (chamados flags), por exemplo: oOverflow flag: Indica que o resultado da operação “transbordou” o tamanho dos bits utilizados na operação. (Ex: o resultado é um número de 9 bits, mas a operação envolveu dois números de 8 bits). oZero flag: Indica que a operação resultou em 0 (zero). oNegative flag: Indica que a operação resultou em um número negativo. Entre outras flags… DIOGO SILVA 27
  • 28. Registradores dedicados •Memory Address Register (MAR) O MAR é um registrador que armazena o endereço de memória para ser lido ou escrito. Isto é, ele é que fornece o endereço da memória para ser conectada. •Memory Data Register (MDR / MBR) O MDR é um registrador que armazena o dado que foi lido ou que é para ser escrito na memória. Isto é, se a CPU estiver lendo a memória, o MDR conterá o valor lido do endereço dado pelo MAR. E, se a CPU estiver escrevendo na memória, o MDR conterá o valor a ser escrito no endereço dado pelo MAR. DIOGO SILVA 28
  • 29. Registos da CPU •Para o propósito didático, vamos focar registos de 16 bits. •A CPU possui 4 registos internos, cada um de 16 bits. São eles AX, BX, CX e DX. São registos de uso geral e também podem ser usados como registos de 8 bits. Para tanto devemos referenciá-los como, por exemplo, AH e AL, que são, respetivamente, o byte high e o low do registo AX. Esta nomenclatura também se aplica para os registos BX, CX e DX. DIOGO SILVA 29
  • 30. Os registos, segundo seus respetivos nomes •AX Registo Acumulador; •BX Registo Base; •CX Registo Contador; •DX Registo de Dados; •DS Registo de Segmento de Dados; •ES Registo de Segmento Extra; •SS Registo de Segmento de Pilha; •CS Registo de Segmento de Código; •BP Registo Apontador da Base; •SI Registo de Índice Fonte; •DI Registo de Índice Destino; •SP Registo Apontador de Pilha; •IP Registo Apontador da Próxima Instrução; •F Registo de Flag. DIOGO SILVA 30
  • 31. Estrutura Assembly Nas linhas do código em Linguagem Assembly existem duas partes: •a primeira é o nome da instrução a ser executada; •a segunda, é os parâmetros do comando. Por exemplo: add ah bh. Aqui "add" é o comando a ser executado, neste caso uma adição, e "ah" bem como "bh" são os parâmetros. DIOGO SILVA 31
  • 32. Chamadas de sistema Interface de programação para os serviços oferecidos pelo Sistema Operativo. Geralmente escrita em uma linguagem de alto nível (C, C++). Na maioria das vezes são utilizadas pelos programas através de uma Application Program Interface (API) de mais alto nível ao invés de serem chamadas diretamente. As três APIs mais comuns são Win32 API do Windows, POSIX API para sistemas POSIX-based (incluindo praticamente todas as versões do UNIX, Linux, e Mac OS X), e a API Java para a Java Virtual Machine (JVM). Por que usar APIs ao invés de chamadas de sistema? DIOGO SILVA 32
  • 33. Implementação de chamadas de sistema Tipicamente, cada chamada de sistema possui um número associado; •A interface de chamada de sistemas mantém uma tabela indexada com esses números. A interface de chamada de sistema invoca a chamada desejada no kernel do Sistema Operativo e retorna o estado e valores de resposta para o utilizador. Quem faz a chamada não precisa ter qualquer informação sobre como a chamada de sistema foi implementada; •Precisa apenas conhecer a interface e saber o que o SO fará como resultado da chamada; •A maioria dos detalhes do SO ficam escondidos dos utilizadores atrás de APIs. DIOGO SILVA 33
  • 34. Tipos de chamadas de sistema •Controle de processos; •Gerência de arquivos; •Gerência de dispositivos; •Manutenção da informação; •Comunicação; •Proteção. DIOGO SILVA 34
  • 35. Características Particulares •Atribuir nomes simbólicos a endereços de memória, variáveis e grupos de instruções; •Trabalhar em diversas bases de numeração bem como converter caracteres nos seus códigos ASCII; •Efetuar cálculos aritméticos simples com constantes ou nomes simbólicos; •Definir os endereços de memória onde o programa e os dados irão ser armazenados; •Reservar áreas de memória para armazenamento temporário de informação; •Configurar a geração de código máquina e o formato das listagens produzidas; •Construir e utilizar bibliotecas de funções, ajudando a programar de forma modular e a reutilizar código já escrito em Assembly ou outras linguagens. DIOGO SILVA 35
  • 36. Estrutura da Programação É importante incluir as seguintes diretivas Assembly: •MODEL SMALL - Define o modelo de memória a usar no nosso programa; •CODE - Define as instruções do programa, relacionado ao segmento de código; •STACK - Reserva espaço de memória para as instruções do programa na pilha; •END - Finaliza um programa assembly. DIOGO SILVA 36
  • 37. Vantagens Velocidade, os programas em Assembly são, em geral, mais rápidos; Tamanho dos programas de Assembly são menores; Assembly permite criar ações de alta complexidade, impossíveis ou difíceis de se realizar em linguagens de Alto Nível; Conhecimento, em Assembly possibilita a programação nos outros tipos de linguagem; Torna-se de fácil compreensão com algum conhecimento de conceitos de hardware e seus idiomas. DIOGO SILVA 37
  • 38. Desvantagens Difícil de ler, de aprender, entender, dispersar e de difícil manutenção. Um programa escrito em linguagem Assembly não é muito legível, por isso ele deve ser muito bem documentado; Programar em Assembly consome muito tempo para o programador; A linguagem não é portável. Ela é portável apenas dentro de uma família de processadores; Como é uma linguagem especifica para processadores de cada máquina, é necessário desenvolver um programa para cada máquina; Como o programador utiliza diretamente os recursos do processador e memória, ele deve conhecer muito bem a máquina onde ele está a programar. DIOGO SILVA 38
  • 39. O que é o "debugging" de pequenos programas em Assembly? Debugging: É o processo pelo qual se desenvolvem e corrigem bugs de software (ou hardware). Dominar o debugging é vital para um programador: os bugs vão inevitavelmente aparecer quando a complexidade (número de programadores, de requisitos, de linhas de código, de dependências, etc.) aumentar. No início, fazer debug costuma ser algo chato mas, com a prática, torna-se mais interessante, pois: •faz-nos compreender melhor o workflow do programa, o que se passa “por baixo”, assim como tecnologias envolvidas; •obriga a criar um bom código que evita bugs semelhantes no futuro; •alguns bugs estimulam a nossa capacidade de resolução de problemas e motivam-nos quando são resolvidos. DIOGO SILVA 39
  • 40. Evitando o debug A melhor forma de fazer debug é evitar ter de o fazer. Devemos adotar técnicas e boas práticas que reduzam a probabilidade de ter bugs e outras que facilitem a sua correção caso ocorram. Eis algumas (cuja explicação sai fora do âmbito atual): •Code reviewing e Pair programming; •Decoupling, encapsulamento e modularidade; •Uso correto de design patterns; •TDD; •Redução de dependências (ex. de tecnologias, de pessoas, do S.O.); •Uso de convention over configuration; •Princípios SOLID; •Não faça copy / paste de código (nunca vale a pena); •Mantenha o código limpo e tenha pouco código; •Faça bons comentários, entre muitas outras boas práticas… DIOGO SILVA 40
  • 41. O processo de debug O debugging, apesar de muito ligado à programação, é uma disciplina com o seu próprio processo. Mesmo não se pensando nisso, está-se implicitamente a segui-lo: •Reprodução: saber os passos a seguir, as condições iniciais, estimativas, etc; •Diagnóstico: gravidade, prioridade, impactos, riscos, a zona em causa. Para este último: •Correção; •Reflexão: aplicação de medidas que garantam que o problema não se repete noutro formato: testes, documentação, validações de input e corner cases, criação de código mais resistente, refactoring, etc. DIOGO SILVA 41
  • 42. Análise detalhada de um exemplo A fig. A.5 apresenta uma pequena rotina escrita em C, enquanto a fig. A.4 mostra a mesma rotina, mas escrita em assembly com algumas extensões, mas sem comentários. Os seguintes comentários deverão ser feitos à codificação em assembly da fig A.4: •o programa em assembly contém algumas linhas de comandos exclusivos para o assembler - as quais não são convertidas para linguagem máquina - que se designam por diretivas para o assembler, e que começam sempre por um ponto (no caso do assembler do MIPS); •as diretivas .text e .data indicam ao assembler onde começa a zona do programa com código, e a zona do programa reservada aos dados; .align x indica ao assembler para alinhar na memória a informação que vem a seguir, quer em bytes (x=0), em meias-palavras de 16 bits (x=1) - isto é, colocar a informação apenas em localizações de memória que comecem por um endereço par - ou em palavras de 32 bits (x=2) - isto é, colocar a informação apenas em localizações de memória que comecem por um endereço múltiplo de 4; .globl x indica ao assembler que o símbolo x é um símbolo que tem visibilidade para outros módulos externos (informação para ser usada pelo linker); .asciiz x indica ao assembler que a string x que se segue é para ser codificada em ASCII, caracter a caracter, e terminada com um caracter especial, designado em ASCII por null; várias outras diretivas são suportadas pelo assembler do MIPS, mas serão apresentadas gradualmente conforme forem sendo necessárias; DIOGO SILVA 42
  • 43. Continuação da análise •as etiquetas main:, loop: e str: indicam ao assembler o início de pedaços de código ou de dados (isto é, endereços de memória) para referência noutros locais do programa, poupando ao programador de assembly a necessidade de efectuar todos os cálculos para a localização de código e de dados; •embora não exista nenhum registo com o nome $sp, o assembler aceita que certos registos sejam referenciados por uma designação diferente, de acordo com uma convenção que se verá adiante; o registo que se aconselha a usar como stack pointer é o $29, e o assembler converte qualquer referência ao $sp em $29 (repare que a instrução que contém esta referência está um pouco incoerente quanto a esta facilidade, e não só, pois a instrução deveria ser "subiu $sp, $sp, 32"); •o programa em C faz uma referência (printf) que não é resolvida no próprio módulo (externa), e essa mesma referência transita para o código em assembly; DIOGO SILVA 43
  • 44. Continuação da análise •o código apresentado contém várias simulações de instruções, que facilitam a interpretação do seu conteúdo por um ser humano; faltam contudo comentários que facilitem a sua leitura, e que deveriam ser iniciados sempre pelo caracter # (em cada linha de texto que apareçam). A fig. A.3 mostra o mesmo programa, mas em assembly e sem quaisquer extensões: já não há diretivas para o assembler, não há etiquetas nem comentários, todos os símbolos foram substituídos por valores binários (até mesmo a referência externa, printf) e as simulações de instruções foram convertidas para instruções reais do instruction set do MIPS. Este código é integralmente equivalente ao código em linguagem máquina em binário (na fig. A.2), usando apenas símbolos para que os humanos identifiquem com mais facilidade as instruções, os registos referenciados, e os valores numéricos (em decimal). DIOGO SILVA 44
  • 45. Figura apresentada da análise DIOGO SILVA 45
  • 46. Tratamento de ficheiros Até ao momento, todos os dados têm sido inseridos nos programas através do teclado, sendo guardados em variáveis que residem em memória central (R.A.M.). Este tipo de memória apresenta no entanto os inconvenientes de ser inconstante, pelo que impossibilita o armazenamento de dados após a execução de um programa. Para armazenamentos mais demorados é utilizada, a memória secundária (i.e. o disco rígido, a disquete, …), em que a informação é armazenada sob a forma de ficheiros. DIOGO SILVA 46
  • 47. Tratamento de ficheiros A linguagem C é “Device Independent”, ou seja, não diferencia os vários periféricos (de entrada ou saída) ligados ao computador. Independentemente do tipo de periférico que esteja a utilizar, o C processa todas as entradas e saídas de dados através de streams. Stream é um conjunto sequencial de caracteres, isto é, um conjunto de bytes - ficheiros. DIOGO SILVA 47
  • 48. Tratamento de ficheiros Por defeito, um programa ao executar tem 5 ficheiros automaticamente abertos: • stdin - standard input (teclado); • stout - standard output (monitor); • stderr - standard error (monitor ou outro); • stdaux - aux device (porta COM1 num PC); • stdprn - standard printer. DIOGO SILVA 48
  • 49. Tratamento de ficheiros Para trabalhar com ficheiros necessita da biblioteca stdio.h. A linguagem C suporta dois tipos de ficheiros: • Ficheiro de Texto - é um ficheiro constituído apenas pelos caracteres existentes no nosso teclado, e em geral formatado apenas com o carácter New Line (n); • Ficheiro Binário - podem ser constituídos por qualquer carácter existente na tabela ascci. DIOGO SILVA 49
  • 50. Tratamento de ficheiros Operações básicas sobre ficheiros: • Para trabalhar com um qualquer ficheiro, a primeira operação a realizar é ligar uma variável do nosso programa a esse ficheiro. A esta operação dá-se o nome de Abertura do ficheiro. • Após a abertura do ficheiro, podemos realizar operações sobre o conteúdo do ficheiro: o Ler dados; o Escrever dados. • Após efetuadas as operações pretendidas sobre o ficheiro terá de Fechar o ficheiro. DIOGO SILVA 50
  • 51. Abertura de um ficheiro A função que permite a abertura de um ficheiro é a seguinte: fopen(), cuja sintaxe é a seguinte: •FILE *fopen(char *nome_do_ficheiro, char *modo_de_abertura). A função devolve: •um apontador para um FILE, que passa a ser utilizado em todos os acessos ao ficheiro (isto se conseguir abrir o ficheiro); •NULL se ocorrer um erro na abertura. A função recebe dois parâmetros: •nome_do_ficheiro - nome do ficheiro a abrir; •modo_de_abertura - modo de abertura do ficheiro. DIOGO SILVA 51
  • 52. Modos de abertura de um ficheiro R (read) Abre o ficheiro para leitura. Caso não seja possível abrir o ficheiro, a função devolve NULL. W (write) Abre o ficheiro para escrita. Se o ficheiro não existir, é criado com o nome passado à função. Se o ficheiro já existir, é apagado e criado um novo com o mesmo nome. Caso não seja possível criar o ficheiro, a função devolve NULL. A (append) Abre o ficheiro para acrescento, no fim do ficheiro. Se o ficheiro existir, os novos dados são escritos no fim do ficheiro. Se o ficheiro não existir, é criado. DIOGO SILVA 52
  • 53. Modos de abertura de um ficheiro R+ Abre o ficheiro para leitura e escrita. Se o ficheiro não existir, é criado. Se o ficheiro existir, os novos dados são escritos a partir do início do ficheiro, sobre os que já lá existem. W+ Abre o ficheiro para leitura e escrita. Se o ficheiro não existir, é criado. Se o ficheiro já existir, é apagado e criado um novo com o mesmo nome. A+ Abre o ficheiro para leitura e escrita. Se o ficheiro não existir, é criado. Se o ficheiro já existir, os novos dados são colocados a partir do fim do ficheiro. DIOGO SILVA 53
  • 54. Final de um ficheiro Após ter feito as operações sobre um ficheiro, terá de o fechar. A função que permite o final de um ficheiro é a função fclose() , cuja sintaxe é a seguinte: •int fclose (FILE *fp). Esta função fecha o ficheiro apontado por fp. Em caso de erro (i.e. fechar um ficheiro que ainda não foi aberto) retorna EOF, se fechou o ficheiro com sucesso retorna zero. Normalmente não se verifica o valor devolvido por esta função. DIOGO SILVA 54
  • 55. O que é device drivers? É um programa ou processo que é executado em uma região especial de memória e através do qual o utilizador pode conectar-se a um dispositivo ou recurso de um processador ou sistema computacional. Ele serve como um mediador entre o software e o hardware. Por exemplo, quando você tira uma foto no seu telemóvel ex: Android, o driver da câmera interage com o software e passa informações a ele referentes às imagens capturadas e outras informações. O resultado final é a foto. Ou quando você quer jogar seu jogo preferido, mas não é possível sem o driver da placa de vídeo, certo? Por meio do driver o jogo acesa recursos da placa de vídeo que permitem a experiência incrível que os jogos proporcionam. Então, a ideia é justamente essa. Servir como mediador entre o utilizador e o hardware ou entre o software e o hardware. DIOGO SILVA 55
  • 56. Conclusão A tendência atual é a favor de uma programação mista, usando principalmente linguagens de mais alto nível (C em particular) e recorrendo à linguagem Assembly apenas em rotinas onde a eficiência do código seja o objetivo principal a atingir. Esta tendência explica-se por três motivos: • a pressão do mercado obriga a diminuir o tempo de desenvolvimento e a aumentar a facilidade de manutenção do código; • existem atualmente compiladores de C para a maioria dos microprocessadores, alguns até de domínio público; • os avanços na microeletrónica permitem que a rapidez de execução se consiga facilmente pelo aumento da frequência de funcionamento. DIOGO SILVA 56