INF1018 - Software Básico - 2012.2

Aulas de Laboratório

Chamadas ao Sistema Operacional em Assembler

Nesse laboratório vamos explorar a interface com o sistema operacional.

  1. Para começar, pegue o programa em C, que copia o arquivo dado na linha de comando para a saída padrão (tela), e salve-o em um arquivo copia.c. Compile e execute esse programa, testando-o com alguns arquivos texto como entrada:

    > gcc -Wall -o copia copia.c
    > ./copia arquivodeentrada
    
  2. Observe o código de copia.c. A rotina main chama quatro funções definidas no mesmo arquivo: myopen, myread, mywrite e myclose. cada uma dessas funções é implementada por uma única linha, que contém uma chamada ao sistema operacional. As chamadas ao sistema operacional são documentadas na seção 2 do manual do linux. Para ver a documentação de uma delas, basta escrever, por exemplo:
    > man 2 open
    
  3. Agora você deve substituir cada uma dessas funções por equivalentes a elas escritas em assembler. Para isso, crie um arquivo chamadas.s, e comece com a função myopen. Comente a definição (não o protótipo!) dessa função no arquivo copia.c e declare-a como pública (globl) em chamadas.s, programe-a (ver abaixo), e compile tudo agora com:
    > gcc -Wall -m32 chamadas.s copia.c
    
    Para saber o código das chamadas ao sistema, consulte a tabela de chamadas ou o arquivo "/usr/include/asm/unistd.h" Observe os seguinte pontos:

  4. Vá comentando, uma a uma, a definição das demais funções no arquivo copia.c e substituindo-a pela implementação em assembler em chamadas.s.

    A implementação em assembler de chamadas a serviços do sistema operacional que você acabou de fazer é semelhante à implementação das funções (chamadas funções wrapper) open, read, write e close, disponíveis na biblioteca C.