Na tarde ensolarada do Sábado dia 3/9 tivemos o primeiro encontro do
x86 ASM/boot Dojo (ASM Dojo pra simplificar) lá na Unoesc (novamente
obrigado Tiago!). Tivemos 5 participantes, o que é até uma surpresa dado
o assunto nada popular. :) Eu imagino que a participação se mantenha
entre 5 e 10 pessoas. Compareceram o Álvaro, o Carlos, Fábio (eu),
Franchesco e o Jarbas.
Também apareceram por lá brevemente o Jean e um amigo de sobrenome
Leite, que eu infelizmente esqueci o nome, mas eles estavam procurando
o grupo de estudos de Arduíno (fica a dica que o grupo existe!). De
qualquer forma, da rápida conversa saiu uma sugestão do Jean de
realizarmos installfests de tempos em tempos. Vamos trabalhar essa
idéia em um novo tópico.
Levamos uns minutos conversando e decidindo como estruturar os
trabalhos do grupo, e resolvemos criar algumas imagens de disco para
máquinas virtuais, contendo FreeDOS e outros sistemas igualmente "crus"
para facilitar o trabalho. Eu fiquei com os Action Items de criar
imagens e disponibilizar pro grupo. Com essas imagens a gente pode
trabalhar em um ambiente conhecido, em que todos tenham as mesmas
ferramentas. No caso do FreeDOS, poderemos tabalhar com assembly de
16bits, o que é bem interessante pra entender as limitações do processo
de boot.
http://www.freedos.org/
http://www.freedos.org/freedos/files/
Depois dessas conversas iniciais, começamos a entrar mais no assunto
assembly. Conversamos rapidamente sobre as diferenças entre a notação
Intel e a notação AT&T de assembly, em que na notação Intel o formato
das instruções geralmente é "OPERAÇÃO, DESTINO, FONTE" e a sintaxe em
geral é mais simples, enquando na notação AT&T a ordem dos operandos é
invertida: "OPERAÇÃO, FONTE, DESTINO".
Na notação AT&T também se usa mais prefixos e sufixos, tanto nas
instruções quanto ao referenciar registradores (%eax ao invés de
simplesmente eax) e ao usar valores literais imediatos ($5 ou
$0x42 ao invés de 5 e 0x42). O NASM usa notação Intel, e os GNU
binutils usam notação AT&T, portanto ao montar um programa com NASM e
desmontar ele com objdump, teremos nosso fonte em assembly Intel e a
saída do objdump em AT&T. Mas não complica tanto assim, é só perceber
as pequenas diferenças.
Falando nisso, abaixo vai um link (aqui de casa) para os manuais de
assembly publicados pela própria Intel. Eu lembro de ter baixado em
developer.intel.com/algumacoisa, porém desde então o site parece ter
mudado completamente e eu não acho mais os documentos. Interessante que
a AMD ainda tem um site assim... :) Peço que baixem os manuais aqui de
casa durante a noite, pois uso o link para trabalhar durante o dia. :)
Volume principal:
http://olive.homeunix.org:8080/livros/intel-manuals/253665.pdf
Todos os documentos:
http://olive.homeunix.org:8080/livros/intel-manuals/
Site da AMD:
http://developer.amd.com/documentation/guides/Pages/default.aspx#manuals
Começamos a brincar com um programa simples, teste.asm, que imprime uma
mensagem na tela e termina o programa, usando chamadas de sistema do
Linux diretamente. Já no início tivemos uma pequena complicação
interessante: a maneira de chamar o kernel em um sistema de 64bits (que
todos nós estávamos usando) é bem diferente do que o tradicional
"INT 0x80" que se usa em 32 bits. Tivemos que mexer um pouco nos
parâmetros de montagem e linkagem para criar executáveis de 32bits, que
podem seguir usando a "INT 0x80" para acessar o kernel.
----- teste.asm -----
bits 32
section .text
global _start
_start:
mov eax, 4
mov ebx, 1
mov ecx, msg
mov edx, 10
int 0x80
mov eax, 1
mov ebx, 5
int 0x80
section .data
msg: db "Mensagem!", 10
----- teste.asm -----
Montamos esse programinha com "nasm -f elf32 teste.asm" e linkamos o
executável final com "ld -static -m elf_i386 -o teste teste.o". Depois
disso ficamos algum tempo investigando o formato ELF e o código gerado
com hexedit, mexemos no arquivo e fizemos outras pequenas mudanças em
cima disso pra estudar.
Outro exercício simples mas interessante que fizemos foi criar um
arquivo em assembly que tinha 1000 instruções NOP (não faz nada)
seguidas de uma chamada a sys_exit() para terminar o programa. Parece
idiota, mas ao montar e linkar esse programa, ficamos com um "binário
genérico" pronto, e mexemos diretamente no código binário dele com
hexedit.
Para entender um pouco o que o processo de linkagem faz, nós copiamos
os bytes gerados pelas instruções do teste.asm para dentro do "nops"
diretamente usando hexedit, em um ponto qualquer no meio do programa.
Depois escolhemos outro ponto qualquer e escrevemos a string
"MENSAGEM?". Aí com "objdump -d nops" nós vimos em que endereço caiu o
início da mensagem, e editamos de novo com hexedit e colocamos esse
endereço diretamente nos bytes da instrução "mov ecx, ..." acima. Feito
isso, rodamos o programa "feito à mão" e vimos que ele imprimiu a
mensagem e terminou corretamente.
Também removemos a chamada para sys_exit(), tacando NOPs (hexadecimal
0x90) por cima das instruções no hexedit, e vimos o que acontece quando
um programa sai executando dados (segmentation fault, ou pior).
Enfim, dá pra ver que apesar de simples, foi muita diversão hard-core
no mundo dos bits. Vou tocar adiante meus Action Items de preparar as
imagens de FreeDOS e syslinux que vamos usar nos próximos encontros.
Quando estiverem prontas eu passo o link.
Combinamos de manter os encontros do Dojo a cada 4 semanas, se
possível. Logo logo vamos combinar onde e quando será o próximo!
Abraços!
--
[[ Fábio Olivé Leite, olive, FabioOlive ]]
TcheLinux.org, OeSC-Livre.org, Chapecó, SC
ex sed lex awk yacc, e pluribus unix, amem
Oi Fabio!
Fiquei muito feliz em saber que aconteceu o encontro e mais feliz ainda por
ver um report t�o rico em detalhes - j� estou co�ando os dedos aqui para
reproduzir as brincadeiras com o nasm. Se o grupo n�o se opuser, pe�o que
continuem reportando os resumos dos encontros aqui na lista.
Ali�s, quando montarem as imagens n�o esque�am de postar aqui na lista a
URL para a imagem ou ao menos a lista de ingredientes (ou receita de bolo)
para que os integrantes mais remotos possam participar tamb�m :)
Abra��o,
Luis
--
[ Luis Claudio R. Goncalves Bass - Gospel - RT ]
[ Fingerprint: 4FDD B8C4 3C59 34BD 8BE9 2696 7203 D980 A448 C8F8 ]