Esta secção irá delinear o uso do
Linux syscalls na linguagem Assembly, para quem não está acostumado com o termo, são chamadas de sistema, a qualquer momento você poderá consultar as funções Syscalls na segunda seção do manual localizadas em /usr/man/man2, também é possível achar listados em: /usr/include/sys/syscall.h ou dentro da fonte do Kernel, em caso de uma estrutura diferente de diretórios. Os nomes das chamadas estão no formato SYS_<função>, por exemplo:
SYS_write, SYS_read.
Uma grande lista está em
http://www.linuxassembly.org/syscall.html. Essas funções podem ser executadas através da interrupção de serviço Linux: int $0x80.
* Para realizar nossas compilações iremos utilizar o (nasm) presente em quase todas as distribuições Linux, ainda temos o Linker (ld), portanto primeiro será gerado um arquivo objeto, com extensão .o e, depois, com o uso do Linker ld será transformado em um executável.
Com uma pesquisa ao manual do ld (man ld) você pode aprender um pouco mais sobre suas opções e recursos.
Agora as opções utilizadas são somente as necessárias para gerarmos um arquivo executável, lembrando que qualquer introdução a uma linguagem assim como compilador ou qualquer ferramenta ligada à programação não é completa sem o famoso exemplo Hello World. Sendo assim teremos nosso clássico exemplo do Hello World, aqui irei dar um exemplo para Linux, digo isso por que se caso fosso nosso desejo criar o mesmo exemplo para o sistema FreeBSD ou ainda para um BeOS o código seria diferente, ou seja, teria que se criar três exemplos, não vou mostrar aqui como criar para outros sistemas, mas vou dar três arquivos para download, estes são os três exemplos.
1 ;Por Cleber J Santos <cleber@cleberjsantos.com.br>
2 ;
3 ;"hello, world" em linguagem assembly para Linux
4 ;
5 ;Para compilar use:
6 ;
7 ;nasm -f elf hello.asm
8 ;ld -s -o hello hello.o
9
10 section .text
11 global _start ;devemos declarar para o linker (LD)
12
13 _start: ;Dizemos para o linker que aqui é o ponto de partida, ou ponto de execução inicial
14
15 mov edx,len ;Comprimento da mensagem
16 mov ecx,msg ;Ponteiro da mensagem
17 mov ebx,1 ;Número do fd (file descriptor) no caso (stdout)
18 mov eax,4 ;Número de chamadas de sistema, ou número da função (sys_write) write
19 int 0x80 ;Chamada do kernel
20
21 mov eax,1 ;Número de chamadas de sistema, ou número da função (sys_exit) exit
22 int 0x80 ;Chamada do kernel
23
24 section .data
25
26 msg db 'Hello, world!',0xa ;Mensagem string a ser impressa na tela
27 len equ $ - msg ;Comprimento da nosso mensagem string
Copie o código acima, retire os números, aqui usei apenas para poder fazer alguns comentários caso necessitasse, mas acho que está bem claro da forma que está. Continuando, após copiar o código, cole em um arquivo texto e salve com a extensão .asm (hello.asm), então abra um terminal de sua preferência, aqui estou usando o Konsole (terminal de comandos executado em modo gráfico, padrão do KDE), execute o comando:
nasm -f elf hello.asm
Com isso será gerado o arquivo objeto com a extensão .o, sendo assim teremos o hello.o. Agora temos que transformar este objeto em um executável, aí é onde o linker entra, então execute o comando:
ld -s -o hello hello.o
Onde a opção -s tira todos os símbolos e -o para o arquivo de saída neste caso quem será nosso executável, agora você pode usar o mesmo terminal e executar o nosso exemplo para Linux:
./hello
Simples né!?
Referências
Exemplos