MAC-211 -- Laboratório de Programação

Primeiro Semestre de 1999

. Informações gerais
. Ementa da disciplina
. Tópicos tratados em aula
. Leitura recomendada
. Exemplos
        
. Exercícios-programa
. Notas
. Recuperação
. Lista de discussão da disciplina
. Referências

[at work icon] Esta página estará em permanente construção até o final do semestre...

Informações Gerais

. Local: IME-USP, bloco B, sala B-9
. Horário: terças das 8:00 às 9:40, quintas das 10:00 às 11:40
. Professor: Francisco Reverbel
. Avaliação: duas provas, exercícios-programa, projeto em equipe de até dois alunos
. Primeira prova: 22 de abril
. Segunda prova: 24 de junho (era 22 de junho e foi adiada porque coincidia com outra prova )
. Prova substitutiva: 01 de julho, às 10:00 (para quem perdeu alguma das provas anteriores)
. Entrevistas sobre os projetos: leia esta mensagem
. Pasta Xerox CAMAT: número 55
. Entrega de trabalhos: pelo sistema de entrega eletrônica, mais listagens impressas

Tópicos Tratados em Aula

. 23/02/99: Apresentação. Plano do curso. Arquitetura dos microprocessadores x86 (386/486/586) da Intel.
. 25/02/99: Bytes, words e doublewords na memória do x86: o esquema "little endian" (byte menos significativo primeiro). Memória linear versus memória segmentada. Programa "hello, world" para o NASM. A pilha do x86. Instruções push, pop, call e ret.
. 02/03/99: Chamadas diretas ao Linux: outra versão do programa "hello, world". Uso de equ e $: mais uma versão do "hello, world". Seções de um programa: código (.text), dados inicializados (.data) e dados não inicializados (.bss). Diretivas db, dw, dd, resb, resw e resd. Acesso a variáveis na memória: rótulos de variáveis, uso do operador [ ]. Instruções de comparação (cmp), desvio condicional (jne, ...) e desvio incondicional (jmp). Programa que soma uma seqüência de inteiros.
. 09/03/99: Análise de uma listagem gerada pelo NASM. Introdução à relocação de código: acerto de endereços em tempo de link e em tempo de carga. Classificação dos operandos de instruções: registrador, imediato, direto, indireto via registrador, indexado (com ou sem fator de escala).
. 11/03/99: Passagem de parâmetros na pilha: como a rotina chamada acessa os parâmetros empilhados. Exemplo: o módulo syscalls.asm. Variáveis alocadas na pilha. Recursão em linguagem de montagem. Exemplo: torres de Hanoi.
. 16/03/99: Comentários finais sobre passagem de parâmetros e alocação de variáveis na pilha. Observações sobre o primeiro EP. Números inteiros com sinal: representação em complemento de dois. Significado dos flags de "carry" (CF) e de "overflow" (OF) do x86.
. 18/03/99: Instruções de desvio condicional: o que elas realmente fazem (que flags elas testam) e como usá-las após comparações de números com sinal e sem sinal. Conversão (alargamento) de tipos por extensão de sinal ("sign-extension"). Deslocamentos para a direita: shr (números sem sinal) e sar (números com sinal).
. 23/03/99: Arquivos no Linux: seqüências de bytes. System calls para manipulação de arquivos: open, read, write, lseek, close, fsync. Organização física de um disco: cilindros, faces, trilhas e setores. O conceito de "arquivo" como uma abstração que o S.O. constrói sobre o disco físico. Importância dos buffers de entrada e saída. Conversa inicial sobre o projeto do curso.
. 25/03/99: Gerenciamento de buffers. Discussão sobre a primeira etapa do projeto do curso.
. 06/04/99: Ainda sobre manipulação de arquivos no Linux: o file descriptor como um índice para a tabela de arquivos abertos do processo. Bufferização no ambiente Unix/Linux: a bufferização feita pelo sistema operacional (para economizar acessos a disco) e a feita pela libc (para economizar chamadas ao sistema). Níveis de privilégio numa CPU protegida: modo sistema (mais privilegiado) e modo usuário (menos privilégio). Custo relativamente alto de chamadas a um S.O. protegido (como o Linux ou o Windows NT).
. 08/04/99: Modularização de código em C: arquivos-fonte compilados separadamente, uso de static para esconder variáveis ou funções internas a um módulo, uso de header files (arquivos .h) com protótipos das funções exportadas pelo módulo e (mais raramente) com declarações de variáveis exportadas pelo módulo. Modularização de código em Java: a "unidade de modularização" é a classe. (Em C é o arquivo.) Significado de static em Java: campos de instância versus variáveis de classe (static), métodos de instância versus métodos de classe.
. 13/04/99: Resolução de dúvidas sobre a primeira etapa do projeto do curso.
. 15/04/99: Resolução de mais dúvidas sobre a primeira etapa do projeto do curso.
. 20/04/99: Revisão: módulos montados ou compilados separadamente; ligação de módulos (link); modularização de programas em C; manipulação de arquivos via chamadas ao sistema e manipulação de arquivos via funções de biblioteca.
. 22/04/99: Primeira prova.
. 27/04/99: Iniciação de variáveis de classe em Java; blocos de inicialização estáticos. O programa make.
. 29/04/99: Recomendações sobre a entrega do EP2. O programa tar. Interfaces em Java.
. 04/05/99: A segunda etapa do projeto do curso: o gerenciador de arquivos do JBase, API do JBase.
. 06/05/99: Conceitos sobre organização de discos: formatação física e formatação lógica, alocação de blocos a arquivos, diretório de arquivos. Heapfiles orientados para registros: formato de página, diretório dos slots numa página, implementação de um heapfile como lista ligada de páginas ou como diretório de páginas. Analogias na segunda etapa do projeto do curso: DBFile <-> disco sem formatação lógica, Database <-> disco formatado logicamente, RecordSets num Database <-> arquivos num disco.
. 13/05/99: Herança de classes em Java.
. 18/05/99: Resolução de dúvidas sobre a segunda etapa do projeto do curso.
. 20/05/99: Resolução de dúvidas sobre a segunda etapa do projeto do curso.
. 25/05/99: Exceções: motivação (comparação com códigos de erros) e implementação (como desvios não locais que "abaixam" a pilha de execução). Exceções em Java. Desvios não locais em C (funções setjmp e longjmp). O programa grep.

Leitura Recomendada

. Em 04/03/97:
  • Os seguintes trechos do livro The Art of Assembly Language Programming:
    • Capítulo 1 (Data Representation), até a secção 1.12.
    • Capítulo 4 (Memory Layout and Access), até a secção 4.7. Dê menos atenção à secção 4.6, que é específica do 8086 e não será usada no curso.
  • Os seguintes trechos do manual do Netwide Assembler:
    • Capítulo 3 (The NASM Language), até a secção 3.5.
    • O início do capítulo 8 (Writing 32-bit Code), até a secção 8.1.3.
  • Use uma das opções abaixo para ir se familiarizando com o conjunto de instruções do x86. Faça isso aos poucos, não tente absorver tudo de uma vez! Seu objetivo não é memorizar o conjunto de instruções dessa CPU e sim ter uma boa idéia do que ela pode fazer!
    • Capítulo 3 (Basic Execution Environment) e capítulo 6 (Instruction Set Summary) do Intel Architecture Software Developer's Manual.
    • Capítulo 6 (The 80x86 Instruction Set) do livro The Art of Assembly Language Programming.
    • Apêndice A (Intel x86 Instruction Reference) do manual do NASM.

Exemplos

. Programas em linguagem de montagem do x86:
       . "Hello, world" para o NASM:
. Usando a libc
. Sem usar a libc (chamando diretamente o Linux)
. Também sem usar a libc (ilustra o uso de equ e $)
. Dividido em dois módulos montados separadamente: hello4.asm (o módulo principal) e syscalls.asm (módulo com chamadas diretas ao Linux)
       . Soma seqüência de inteiros
       . Torres de Hanoi

Exercícios-programa

. Programa dump em linguagem de montagem
. JBase - Gerenciador de Buffers (documentação da classe Buffer, arquivo Buffer.java)
. JBase - Gerenciador de Arquivos (documentação da classe HFPage, arquivo HFPage.java)
. JBase - Gerenciador de Índices (leia esta mensagem)

Referências

. Linguagem de montagem do x86:
       . Linux Assembly HOWTO
       . Cópia local da documentação do NASM (o software pode ser obtido aqui)
       . Randall Hyde, The Art of Assembly Language Programming (livro online), 1996
       . Intel Architecture Software Developer's Manual Os ponteiros acima são para uma cópia local de parte da documentação disponibilizada pela Intel.
       . x86 Assemby Language ASM FAQ

. Conceitos gerais sobre montadores, linkers e loaders:
       . Leland L. Beck, System Software: An Introduction to Systems Programming, 3rd edition, Addison-Wesley, 1997

. Linguagem C:
       . Brian Kernighan & Dennis Ritchie, The C Programming Language, second edition (ANSI C), Prentice-Hall, 1988

. Java:
       . Ken Arnold & James Gosling, The Java Programming Language, second edition (Java 1.1), Addison-Wesley, 1997
       . David Flanagan, Java in a Nutshell, second edition (Java 1.1), O'Reilly, 1997
       . Mary Campione & Kathy Wolrath, The Java Tutorial, second edition (Java 1.1), Addison-Wesley, 1997 (cópia local)
       . The Java Platform API Specification: release 1.1, release 1.2 (estes ponteiros são para cópias locais)
       . Java Code Conventions (o ponteiro é para uma cópia local)

. Outros assuntos:
       . Eric S. Raymond, How to Become a Hacker (tradução para o português, por Rafael Caetano dos Santos)


Valid HTML 4.0! Last modified: Thu Jul 29 16:05:52 EST 1999
Francisco Reverbel
reverbel at ime.usp.br