sábado, 20 de novembro de 2010

Basico Assembly AT&T

Bom, existem duas formas diferentes de se representar códigos em ASM(Assembly)
Lembrando que a sintexe INTEL é usada para ambientes Win32 e AT&T para abientes Unix.

Vamos as duas sintexes:

-INTEL: não se usam os prefixos: '$' destinados a valores e '%' destinados aos registradores
-AT&T: usa-se os prefixos $ e % alem do '$0x' para Hexadecimais.
exemplo:

INTEL : mov eax,4
AT&T : movl $4,%eax

Bom, se vocês observaram direito, além dos prefixos existe uma outra diferença, e está na estrutura de se desenvolver os códigos, veja que na sintexe intel, os registradores vem antes dos valores e na AT&T é ao contrário.

E outra diferença básica são os [] e () usados, pois na sintexe intel usa-se [] <- colchetes e na AT& usa-se () <- parenteses
exmplo:
INTEL : mov eax,[ebx]
AT&T : movl (%ebx),%eax

Bom, agora que sabemos as diferenças de cada um, vamos partir para a sintaxe que será o foco neste topico, AT&T !

O que são registradores ?!

Os registradores, são como gavetas no ASM, podendo armazenar dados, variáveis e até outros registradores. Cada registrador tem como valor padrão 16bits, porém nos iremos ver os registradores expandidos, que hoje são praticamente padrão, pois os de 16bits ja sao meio que ultrapassados porque a maioria dos hardwares admitirem o uso de registradores expandidos.
E lembrando que os registradores só tem o "e" no inicio poque sao expandidos, pois os de 16bits nao tem e o valor dos registradores expandidos é 32bits

Então, vejamos quais sao os registradores Gerais:

EAX: Conhecido como Registrador Acumulador, possui 32bit's, podemos acessar uma parte apenas se quizesemos, tendo apenas que declaralo como %AL ou %AH. %AL para acesar-mos a parte baixa e %AH para acesarmos a parte Alta. ele é muito usado para a entrada e saida de dados

EBX: Este Registrador é conhecido como registrador base, e ele como todos os outros possui o %BL e o %BH muito usado para offsets

ECX: Este registrador é conhecido como 'contador' Ele tem o %CL e o %CH

EDX: Este é o Registrador de Dados que é bastante usado para receber(guardar) dados. %DL parte baixa e %DH parte alta.

EDI: Registrador conhecido como Indice Destino(Index Destination), ele pode ser usado como um registrador de offset's.

EIP: Este registrador é conhecido como apontador de instrução ele eh o offset do segmento de codigo que contem a proxima instrucao a ser executada. Este registrador nao eh acessivel por qualquer instrucao.
OBS: quando voce ler algo sobre Stack Overflow, concerteza vai ver o nosso amigo registrador EIP, atraves da sua função que contem a a proxima instrução a ser executada que poderemos modificar o segmento do codigo para setarmos a proxima instrução executada a outro lugar, mas isso ae depois voce estudam..

Existem outros mais gerais, o EIP(Instrucion Pointer) os FS e GS
que sao para Segemento de Dados. Os registradores CS, DS, ES, SS,
nao mudaram de tamanho e ainda possuem o tamanho de 16bit's.

Bom agora vamos a um codezinho bem comentado pra eu poder explicar melhor o ASM

.text # declaração de seção


.global _start

_start:

movl $drk,%edx # tamanho da mensagem
movl $msg,%ecx # ponteiro para escever a mensagem
movl $1,%ebx # identificador de arquivo (stdout)
movl $4,%eax # número de chamada de sistema (sys_write)
int $0x80 # chamada do kernel


movl $0,%ebx # código de saída
movl $1,%eax # número de chamada de sistema (sys_exit)
int $0x80 # chamada do kernel

.data # declaração de seção

msg:
.ascii "ASM rlz! iniciando na linguagem..\n" # nossa string
drk = . - msg # comprimento da nossa string

pronto, quem ainda é meio leigo, sugiro que dê uma pesquisadinha, e garanto que nao é difícil, não tentem entender de cara o código, seria bom se vocês compilacem, pra isso vocês precisam de um linux e do gcc, primeiramente salve ele com a extenção .s

para compilar é facil:

drk@Linux:~$ as -o teste.o teste.s

e depois nos geramos o executavel:

drk@Linux:~$ ld -s -o teste teste.o

agora é só rodar o programa, e o resultado é:

drk@Linux:~$ ./teste
ASM rlz! iniciando na linguagem..
drk@Linux:~$

Espero que tenham gostado e até a próxima.

Fonte: Angry Hacker

0 comentários:

Postar um comentário

 
Design by Eddy Oliveira