Nesse laboratório vamos explorar a interface com o sistema operacional.
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
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
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.cPara 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:
int $0x80
man 2 open, por exemplo) devem ser passados em %ebx, %ecx, ...,
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.