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: 34.452 ]

Por: Cleber J Santos em 17/02/2009


Sintaxes Intel e AT&T



Basicamente existem dois tipos de representações do código Assembly, muito diferentes e isso vai levar a uma confusão quando se chega na sintaxe AT & T depois de ter aprendido a sintaxe Intel, ou vice-versa, o AT&T vem acompanhando o Unix desde sua criação e já é conhecido por muitos. E a sintaxe Intel também é outra velha conhecida pela velha guarda de fuçadores DOS. Então vamos começar com o básico.

Prefixos

  • No Intel não se usa prefixos para registros ou valores.
  • Na AT&T no entanto, os registos são prefixados com um '%' e  '$' para valores, também usa-se $0x para hexadecimais.

Intel AT&T
mov    eax,1 movl    $1,%eax
mov    ebx,0ffh movl    $0xff,%ebx
int    80h int     $0x80


Direção dos operadores

Sendo muito claro e enxuto: Intel: primeiro operador é o destino, segundo a fonte, AT&T: contrário de Intel, primeiro á fonte, segundo é destino. A vantagem da sintaxe AT&T nesta situação é óbvia. Nós lemos da esquerda para a direita, que escrevemos da esquerda para a direita, de modo que este caminho é apenas natural.

Intel AT&T
instr    dest,source instr     source,dest
mov    eax,[ecx] movl    (%ecx),%eax


Operadores de memória

Assim como no exemplo acima os operadores de memória são também diferentes. Intel na sintaxe da base no cadastro está fechado '[]',  e na sintaxe AT&T é vedado em '()'.

Intel AT&T
mov    eax,[ebx] movl    (%ebx),%eax
mov    eax,[ebx+3] movl    3(%ebx),%eax


Sufixos

A sintaxe AT&T para obter instruções envolvendo operações complexas é muito obscura, em comparação com a sintaxe Intel. Sendo assim a AT&T utiliza-se de sufixos para indicar o tipo de dado, semelhante à linguagem C, com I para long, W para word(palavra) , b para byte. A sintaxe Intel tem diretivas semelhantes para uso com operadores de memória, por exemplo: dword ptr, byte ptr, sendo dword igual a long, isto é semelhante ao tipo de vazamento em C.

Intel AT&T
mov    al,bl movb    %bl,%al
mov    ax,bx movw    %bx,%ax
mov    eax,ebx movl    %ebx,%eax
mov    eax, dword ptr [ebx] movl    (%ebx),%eax


** NOTA: todos os exemplos a partir daqui serão na sintaxe da AT&T, justamente por estar trabalhando com Linux.

Página anterior     Próxima página

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

Escrevendo scripts no GIMP, pintando a cobra

Ajustando o desempenho de discos rígidos

Software Livre é o futuro

Screen, eita ferramenta porreta!

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

Leitura recomendada

Visual Studio no Linux

Squid + Iptables - Combinação Infalível

Instalação do Fedora Workstation 33

Instalando fontes TTF de forma fácil com rpm-buid

Instalando o asterisk no Debian GNU/Linux

  
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




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts