210 likes | 280 Views
Software Básico (INF1612) 2008.2. http://www.inf.puc-rio.br/~inf1612 Turma 3WA – Roberto Ierusalimschy (abraposo@tecgraf.puc-rio.br) Turma 3WB – Markus Endler (endler@inf.puc-rio.br). Material básico de referência.
E N D
Software Básico (INF1612)2008.2 http://www.inf.puc-rio.br/~inf1612 Turma 3WA – Roberto Ierusalimschy (abraposo@tecgraf.puc-rio.br) Turma 3WB – Markus Endler (endler@inf.puc-rio.br)
Material básico de referência • Computer Systems, A Programmer's Perspective. Randal Bryant and David O'Hallaron. Prentice Hall. 2003. (CS:APP) • Resumos, slides e exercícios no site do curso http://www.inf.puc-rio.br/~inf1612
Critério de avaliação • Cada Grau é calculado como a média geométrica de uma prova (peso 2) e um trabalho (em dupla) • G1 = (P1^2 x T1)^{1/3} • G2 = (P2^2 x T2)^{1/3} • M = (G1 + G2)/2 • Se G1 e G2 ≥ 3.0 e M ≥ 6.0, M é a nota final (NF) • Caso contrário: • NF = (G1+G2+2xPF)/4
Objetivo do curso • Entender em profundidade como funciona um computador típico, como visto pelo nível de Linguagem de Montagem e pela Linguagem de Máquina. • Próximo do que seria um curso de “Arquitetura de Computadores”, mas focando no programador, e não no projetista de computadores • Conhecendo mais sobre o que está “por baixo” do programa, você pode escrever programas mais eficientes e confiáveis. Semanalmente: aula teórica (2ª) e aula de laboratório (4ª feira).
Hierarquia de abstrações em um sistema de computação Programa “final” do usuário hardware ???? Programa Assembly Sistema Operacional Linguagem de máquina: binária (0’s e 1’s) – não muito legível por humanos. Aplicações:jogos, editores de texto, sistemasbancários, etc. Escritos geralmente em linguagem de alto nível (C, C++, Java, etc).
Linguagem Assembly • A linguagem de montagem (assembly language) é um mapeamento bastante direto da linguagem de máquina, mas que introduz várias facilidades para o programador. • Uso de mnemônicos* para representar as instruções • "apelidos" das instruções, mais fáceis de guardar na memória do que seu valor hexadecimal exigido pelo processador • cada linha do código fonte possui apenas uma instrução para o processador (CPU) • Ex.: MOV EAX, EDX mnemônico *Que facilmente se grava na memória(Diciionário Michaelis).
Assembly e Assembler • 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.
Processo geral de um executável • Hello world
Processo geral de um executável • Modifica o programa em C de acordo com diretivas começadas com # • Ex.: #include <stdio.h> diz ao pré-processador para ler o arquivo stdio.h e inseri-lo no programa fonte (o resultado é um programa expandido em C, normalmente com extensão .i, em Unix) (usaremos o compilador gcc doLinux no curso)
Processo geral de um executável • Compilador traduz o programa .i em programa assembly. É o formato de saída comum para os compiladores nas várias linguagens de programação de alto nível • I.e., programas em C, Java, Fortran, etc vão ser traduzidos para a mesma linguagem Assembly.
Processo geral de um executável • Transforma o programa assembly em um programa binário em linguagem de máquina (chamado programa objeto – extensão .o).
Processo geral de um executável • O ligador (linker) gera o programa executável a partir do .o gerado pelo assembler. Porém, pode haver funções padrão da linguagem (por ex., printf) que não estão definidas no programa, mas em outro arquivo .o pré-compilado (no caso, printf.o). • O ligador faz a junção dos programas objetos necessários para gerar o executável.
Por que o curso? • Programando em linguagem de alto nível (C, C++, etc.) o programador não se preocupa com o gerenciamento de memória, e compilador ajuda a detectar vários erros relacionados a sintaxe e tipos de dados. Porém, é importante conhecer linguagem assembly e o que está por baixo do programa para: • Otimizar desempenho de programas • Um switch é sempre mais eficiente que uma cadeia de if-else? • Por que loops funcionalmente equivalentes podem ter desempenhos significativamente diferentes na execução?
Entender erros de ligação • Costumam ser os erros mais “chatos” em programação: referências não resolvidas, etc. • Se tornar mais preparado para evitar bugs, por exemplo, devido às limitações das representações dos tipos e na manipulação da memória • Representações finitas de tipos: int’s não são inteiros e float’s não são reais e máquina arredonda ou trunca números. • x2 > 0 int: 50000 * 50000 = ??? • (x + y) + z = x + (y + z) float: 1e20 + (-1e20 + 3.14) = ?? • Memória não é confinada (bounded) em C. Exemplo de possível erro: main () { long int a[2]; double d = 3.14; a[2] = 1073741824; /* Referência “out of bounds” */ printf("d = %.15g\n", d); exit(0); }
Ser capaz de fazer engenharia reversa • entender como um compilador gera código, ou como (uma parte) de um executável funciona • Obter uma primeira noção de como programar sistemas embarcados • processadores específicos – controle de máquinas- para os quais não existe ainda linguagem de alto nível
CPU – Central Processing Unit • Unidade de Controle • Unidade Aritméticae Lógica • Conjunto de 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 própria CPU • instruções de transferência de dados transferem dados entre memória e registradores • Em muitas máquinas os operandos de diversas instruções devem obrigatoriamente estar em registradores • Exemplos de registradores • PC (program counter): contém o endereço da próxima instrução a ser executada • IR (Instruction register): onde é copiada cada instrução a ser executada • Registradores de propósito geral
CPU – Central Processing Unit • CPU seguidamente executa instruções requisitadas à memória. Ciclo fetch-decode-execute: • busca nova instrução na memória (e copia para IR) • atualiza PC • decodifica instrução • busca operandos da memória • executa instrução • escreve resultado na memória • seta flags de status • Tipos de instruções: • aritméticas e lógicas • transf. Reg Mem • desvio de fluxo
Barramentos e Dispositivos de E/S • Barramentos: • “conduítes” elétricos que carregam a informação entre os vários componentes da máquina • Projetados para transportar “pedaços” de tamanho fixo de bytes (chamados palavras). Ex.: Intel Pentium tem palavras de 4 bytes (32 bits), e mais recentemente, passou a ter 64. • Adotaremos a Intel Architecture 32 bits (IA32) • Dispositivos de E/S: • Conexão da máquina com o mundo externo • Conectados ao barramento de E/S por controladores (chipsets no próprio dispositivo ou na placa mãe) ou adaptadores (quando placa separada).
Memória • 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. • Na IA32, cada registrador tem a capacidade de 32 bits (4 bytes) – e esta será a unidade de acesso à memória
Programa do curso Próximos assuntos: • Armazenamento e Representação de tipos básicos e tipos compostos • Linguagem de Montagem • Conjunto típico de instruções • Modelo de Execução de Uma Linguagem de Alto Nível (C) Implementação de instruções • Chamada de procedimentos, Pilha de execução e passagem de parâmetros • Representação de números em ponto flutuante e Processamento em Ponto Flutuante • Link-edição • Interação com o Sistema Operacional (interrupções)