Assembler no Linux

Assembly no Linux é possível? Essa é a pergunta que muitos fazem, velhos tempos DOS e MSX, tempos que não voltam mais, será? Neste artigo abordo como os veteranos de Assembly podem voltar a se divertir sem a necessidade de DOS ou MSX.

[ Hits: 33.275 ]

Por: Cleber J Santos em 17/02/2009


Syscalls



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 <[email protected]>
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


Página anterior    

Páginas do artigo
   1. Assembly no Linux é possível?
   2. Sintaxes Intel e AT&T
   3. Syscalls
Outros artigos deste autor

Linux (kernel) - A história do seu criador

Escrevendo scripts no GIMP, pintando a cobra

Software Livre é o futuro

Screen, eita ferramenta porreta!

FreeBSD + Zope/Plone, uma idéia frustrante?

Leitura recomendada

Linux Mint - Num Lock, Caps Lock e brilho no painel

Executando (entre outras funcionalidades) qualquer vídeo no Mozilla a partir do add-on Media Player Connectivity

Utilizando o X-Deep32 para rodar programas Linux em máquina Windows

Instalando o Asterisk com suporte a MFC/R2

Instalando o KBFX e mudando a imagem do Menu K de uma vez por todas

  
Comentários
[1] Comentário enviado por removido em 17/02/2009 - 20:55h

Artigo muito bom!
Até lembrei dos velhos tempos do MSX com o cartucho Mega Assembler. Para aumentar as vidas dos joguinhos era sensacional.

[2] Comentário enviado por f_Candido em 17/02/2009 - 21:53h

Me lembra um certo livro...
Bibliografia seria interessante.


Abraços

[3] Comentário enviado por Teixeira em 18/02/2009 - 07:02h

Viajei!!!!!

Muito boa essa "pequena" abordagem da Assembly Language dentro do universo Linux.

Se possível, gostaria de saber algo sobre utilização de cores, e diferenças de abordagem entre VGA e SVGA, e também que ferramentas ideais deveremos ter para programar em Assembly, tanto em computadores antigos quanto nos mais modernos.
Também como lidar com periféricos especiais (PCMCIA, USB, SATA, etc.).
Não precisa descer a detalhes, apenas alguma informação básica.

Uma opinião pessoal: TUDO que se refere ao Assembly sempre lembra algum livro...

Parabéns.


[4] Comentário enviado por m4iir1c10 em 18/02/2009 - 08:05h

Fiquei com vontade de voltar no tempo, muito bacana mesmo esse artigo, lendo ele me lembrei daquela interface de fundo azul com letras brancas que eu passava horas em frente dela sem me dar conta que o tempo estava voando... e claro que lembrei de um livro tmb... (concordo com o Teixiera)

[5] Comentário enviado por cleberjsantos em 18/02/2009 - 09:59h

Opa galera...

Valeu, legal mesmo, Texeira sobre VGA e SVGA inclusive sobre diversas abordagens estarei escrevendo novos artigos ;) Acho que é a forma mais fácil de entrar e falar do assunto, quanto a ferramentas ideais... Boa pergunta, normalmente vai de programador para programador, por exemplo neste artigo eu usei nada mais que o Kate como IDE para escrever o código, mas só fiz isso por que não havia ainda configurado meu VIM.

O que eu recomendo fortemente é que tanto para PC's novos quanto os da época da pedra lascada, use Linux claro :D tenha em mãos o <a href="http://www.gnu.org/software/binutils/">binutils</a>;, com ele você vai poder determinar que tipo de assembler deseja ter, sendo assim a cada desenvolvimento você terá que compilar o binutils para trabalhar com o assembler para determinado ambiente, ter o GCC para compilar e um bom chimarrão ou uma boa xícara de café ;)

Bem, conforme eu disse eu vou escrever mais sobre assembler, no meu site (www.cleberjsantos.com.br) claro, vai sair primeiro e depois estarei postando aqui, dai pretendo abordar o máximo possível de assembler para o Linux.

Ah, uma dica legal, vejam este artigo, é um sistema operacional feito em Assembler, e o mais bacana é que roda em um disquete, sendo assim não precisa dizer o poder do assembler: http://www.vivaolinux.com.br/artigo/MenuetOS-O-extraordinario-minisistema-operacional/

[6] Comentário enviado por cabrulcs_ em 19/02/2009 - 23:32h

De uma utilidade incrivel para mim. Até porque para programar antenas e microprocessadores, ou é assembly, ou não se programa! E infelizmente na faculdade ainda se necessita muito do DOS. Agora tenho uma saída na minha interminável luta de somente usar GNU/Linux.

... No final das contas, tudo é ASSEMBLY!!!

=D

Muito bom artigo!!!

[7] Comentário enviado por admtempos em 20/02/2009 - 09:16h

Muito bom este post ainda mais eu como sou iniciante no mundo de programação apesar de esta programando em php, ja tenho um pequeno conhecimento em c, mais o meu maior sonho e aprender a programar em assemble

[8] Comentário enviado por cleberjsantos em 20/02/2009 - 10:02h

Pois é, eu tbm estava me perguntando por que só DOS???? Ai batendo a cabeça no teclado eu vi a luz no final do tunel... hehehe.

[9] Comentário enviado por femars em 20/02/2009 - 14:34h

Só para título de curiosidade sobre AT&T, O "Criador" de C++ é o Bjarne Stroustrup (http://pt.wikipedia.org/wiki/Ficheiro:BjarneStroustrup.jpg), e que trampa para AT&T, inclusive o projeto que hj é o vnc tb saiu da AT&T.

[10] Comentário enviado por zend em 06/03/2009 - 11:31h

owww coisa boaaaaaaaa

[11] Comentário enviado por hra em 06/03/2009 - 14:18h

Muito bom.
É comovente saber que ainda existem programadores em linguagem de baixo nível (linguagens mais próximas da maquina que do homem).

Vou dar algumas informações para tentar complementar:

Em DOS a interrupção de serviços do sistema era a 21, onde se fazia quase tudo, ler teclado, mandar texto para a tela, acessar sistema de arquivos, etc. Essa interrupção é provida pelo kernel do DOS para ser acionada pelo programa, diferentemente de interrupções de hardware.
No linux é a interrupção 80 que provê todos esses recursos, claro que com um mapeamento totalmente próprio.

Em programação de Modo Real podíamos acessar a placa de vídeo diretamente pelo endereço de memória B800:0000, cada par de bytes correspondia a um caractere na tela. Em modo protegido esse endereço não existe, já que nesse modo cada processo recebe blocos de memória conforme requisita ao sistema, e esses blocos não correspondem a memória real e sim a memória virtual (que inclusive pode estar em swap).
Mesmo que tivesse acesso a placa de vídeo, no linux cada usuário tem um pseudo-terminal que não está necessariamente sendo exibido no hardware local.

Acesso a portas de hardware também é restrito. Nem adianta tentar acessar o hardware por uma seção de usuário, apenas módulos do kernel tem esse acesso.

É isso aí.
Assembly é tudo de bom.


Contribuir com comentário