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.
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.
[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...
[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.
[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.
[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
[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.
[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.