Na visão "final", de usuário, temos a interação com uma aplicação como um jogo ou um sistema de transações financeiras...
No hardware, temos apenas a linguagem de máquina.
aplicação . . . . . . . . . . . . . . . . . hardware o que temos entre um e outro...? ^ ^ ^ | | | camadas intermedárias... linguagem | programa | sistema | programa em de "alto | assembly | operacional | ling. máquina nível"
A linguagem de máquina é composta de sequências binárias (1's e 0's) que são interpretadas como instruções pelo hardware.
... não muito legível por nós...
A linguagem de montagem (assembly language) é um mapeamento bastante direto da linguagem de máquina, mas que introduz várias facilidades para o programador. Um dos mais importantes é o uso de mneumônicos para representar as instruções (nomes para as instruções).
Um programa assembly também fica acima da camada do sistema operacional, podendo fazer chamadas a ele para requisitar serviços, por exemplo de entrada e saída.
Um programa montador ou assembler faz a tradução da linguagem assembly para a linguagem de máquina (uma espécie de compilador, porém bastante restrito).
Esse curso lida com os aspectos de software da programação em assembly e da linguagem de máquina. O hardware só nos interessa na medida em que influencia essa programação.
Considere o clássico programa hello.c
:
hello.c hello.i hello.o hello.exe -------> pre-processador -------> compilador -------> ligador -------> ^ printf.o | (biblioteca) |
O executável contém todas as instruções do programa, em linguagem de máquina. Para entender como é o processo de execução, vamos ver a arquitetura básica de um computador.
diagrama (bem) simplificado da orgranização de um computador: dispositivos: teclado, mouse, disco, etc | | | ------- ----------- --- --- --- | CPU | | memoria | controladoras de | | | | ... | | ------- ----------- dispositivos --- --- --- | | | | | | | | | | ------------------------------------------------------------------ bus CPU -- controla a execução de programas executa instruções faz requisiçãoes à memória memória (principal) -- armazena programas e dados (variáveis) atende requisições da CPU
Uma CPU tipica contém:
Os registradores funcionam como uma memória de acesso extremamente rápido dado que não dependem da memória principal (cujo acesso requer uso do barramento) pois estão contidos na propria CPU. Em muitas máquinas os operandos de diversas instruções devem obrigatoriamente estar em registradores. Tipicamente existem outras instruções, de transferência de dados, que transferem dados entre memória e registradores.
Tipicamente temos também um registrador chamado program counter (PC), que contém o endereço da próxima instrução a ser executada, e um registrador chamado instruction register, para onde é copiada cada instrução a ser executada.
A idéia básica do modelo de computação que usamos é que a CPU seguidamente executa instruções requisitadas à memória. Para isso, a CPU seguidamente executa um ciclo conhecido como fetch-decode-execute:
Logicamente, a memória principal corresponde a um enorme array de bytes (conjuntos de 8 bits), cada um com seu endereço (o índice do array). Os endereços começam de 0.
Os registradores da CPU muitas vezes são usados para armazenar endereços de memória. Assim, o número de bits em cada registrador limita o número de posições de memória endereçáveis.
Os dados utilizados em um programa de linguagem C (ou outra) ocupam diferentes números de bytes na memória principal.
Quando pedimos a execução do programa, o sistema operacional o carrega em algum endereço de memória e, entre outras coisas, faz com que o registrador PC aponte para esse endereço.
Referência: