Jump to content

Recommended Posts

Posted

A linguagem Assembly

Assembly é uma linguagem de programação e uma linguagem de programação serve para fazer... programas. Os programas são escritos em forma de texto: usando um editor de texto criamos o chamado código fonte. Este código fonte é transformado pelo compilador e pelo linker num programa executável.

Muitas vezes ouvimos "linguagem assembler". É um erro muito difundido. Na realidade, Assembly é o nome da linguagem e assembler é um programa capaz de compilar código fonte em arquivos objeto.

A linguagem Assembly é considerada de baixo nível. Isto não significa que seja menos importante ou eficiente que uma linguagem chamada de alto nível: são apenas modos diferentes de se programar e níveis diferentes de atuação. O que posso dizer é que, com uma linguagem de baixo nível como a Assembly, você pilota diretamente a CPU do seu computador - nada de intermediários.

Uma das características da Assembly é que cada linha do código fonte possui apenas uma instrução para o processador (CPU). Por exemplo, MOV EAX,EDX irá MOVer o conteúdo do registrador EDX para o registrador EAX. Neste caso, a instrução "MOV" é chamada de mneumônico. Os mneumônicos são os "apelidos" das instruções, mais fáceis de guardar na memória do que seu valor hexadecimal exigido pelo processador. De mneumônico em mneumônico podemos escrever nosso código fonte e fazer com que o processador faça exatamente o que queremos sem firulas ou perda de tempo.

O resultado é um programa enxuto, rápido e altamente eficiente. Tome coragem! Experimente programar em Assembly!

Os componentes da linguagem Assembly

Os componentes da linguagem Assembly são basicamente as instruções para o processador. Ignorando as instruções que não podem ser utilizadas pelo sistema operacional Windows, assembly condicional, macros, ponto flutuante, MMX e instruções de 64 bits, os componentes da linguagem Assembly podem ser divididos nas seguintes categorias:

    * Instruções de registradores

    * Instruções de pilha

    * Instruções de execução

    * Instruções de memória

    * Instruções de flag

    * Declarações de memória

    * Diretivas para o assembler

    * Comentários

    * Instruções para o sistema operacional (Windows)

Instruções de registradores 

Estas instruções transferem dados ou realizam cálculos utilizando os registradores de 32 bits da CPU. Existem seis registradores de uso geral chamados de EAX, EBX, ECX, EDX, ESI e EDI. Exemplos deste tipo de instrução são:

MOV ESI,EBX     ;move o conteúdo do registrador EBX para o registrador ESI
ADD EAX,EDI     ;soma o conteúdo do registrador EDI com o do registrador EAX
BT ECX,0        ;testa o bit 0 do registrador ECX
CMP EDX,450     ;compara o conteúdo de EDX com 450
DIV ECX         ;divide EDX:EAX (inteiro longo) por ECX
MUL ECX         ;multiplica EAX por ECX e põe o resultado em EDX:EAX
SHL EDX,4       ;desloca os bits de EDX para a esquerda em 4 bits (multiplica por 16)
TEST EAX,8      ;testa o bit 3 do registrador EAX

Instruções de pilha 

A pilha é uma área de memória reservada pelo sistema operacional para cada programa que estiver rodando usar como área de arquivamento temporário. São exemplos deste tipo de instrução:

PUSH EAX        ;põe o conteúdo do registrador EAX na pilha
POP EDX         ;retira o último valor colocado na pilha e põe em EDX
PUSH 1000h      ;põe o valor hexadecimal 1000 na pilha
MOV EBP,ESP     ;move o valor do ponteiro da pilha para o registrador EBP
SUB ESP,30h     ;move o ponteiro da pilha para abrir uma área de armazenamento para dados locais
MOV D[EBP-20h],500h  ;insere o valor 500 hexa para a área de dados locais

Instruções de execução 

Estas instruções desviam o processador para que execute código a partir de um ponto que não seja a próxima linha de execução. São exemplos:

CALL MAKEWINDOW ;executa o código do procedimento e depois retorna
CALL EAX        ;executa o código a partir do endereço presente em EAX e depois retorna
RET             ;termina este procedimento retornando ao chamador
JZ 4            ;se o resultado for zero, continua a execução a partir do marcador 4:
JC >.fim        ;se a flag estiver ativa, continua a execução a partir de .fim
JMP MAKEWINDOW  ;continua a execução a partir do procedimento nominado
LOOP 2          ;decrementa ECX e salta para o marcador 2: a não ser que ECX=0

Instruções de memória 

Estas instruções lêem ou escrevem em áreas de memória que não sejam da pilha. Normalmente estas áreas estão na seção de dados do próprio executável ou podem ser alocadas pelo sistema operacional em tempo de execução. São exemplos:

ADD EAX,[ESI]     ;adiciona a EAX o conteúdo de memória cujo ponteiro de endereço está no registrador ESI
MOV EAX,[MEUSDADOS]     ;move para EAX o conteúdo de memória cujo marcador é MEUSDADOS
SUB D[MYDATA+64],10h	;subtrai 10h do dword em MEUSDADOS mais 64 bytes
CMP B[MYDATA+EDX*4],2	;compara um byte com 2 numa parte do array MEUSDADOS
LODSB           ;carrega o byte na memória apontada por ESI em al
STOSD           ;carrega o conteúdo de EAX na memória apontada por EDI

Instruções de flag 

As principais flags usadas são a Z (flag zero), C (flag carry), S (flag de sinal) e D (flag de direção). A maioria das instruções alteram as flags automaticamente para dar o resultado da instrução. Existem determinadas instruções que podem ser usadas para alterar o valor das flags manualmente:

STC              ;ativa a flag de carry
CLC              ;limpa a flag de carry
STD              ;ativa a flag de direção para LODS, STOS, CMPS, SCAS, MOVS
CLD              ;limpa a flag de direção

Declarações de memória 

O sistema operacional reserva memória para o executável quando ele é executado. Declarações são feitas para reservar memória na seção de dados ou na seção de constantes se os dados devem ser inicializados, isto é, devem receber um valor. Se forem dados não inicializados, a área de dados pode ficar reservada na seção de dados não inicializados. Isto não toma espaço algum no arquivo executável porque um espaço de memória é alocado para este tipo de dado quando o executável é iniciado pela primeira vez.

Seguem exemplos de como a memória é declarada, o que pode variar de acordo com o assembler utilizado:

DB 4		;declara um byte e lhe atribui o valor inicial 4
MEUDADO DB 4	;um byte de valor inicial 4 com o marcador MEUDADO
MYSTRUCT DD 16 DUP 0   ;16 dwords, todos com valor zero, chamados MYSTRUCT
BUFFER DB 1024 DUP ?   ;1024 bytes chamados BUFFER como dados não definidos

Diretivas para o assembler 

São instruções que orientam onde o Assembler deve colocar o código fonte que as segue. O Assembler marca a seção de código como apenas para leitura e executável; as seções de dados definidos e indefinidos como leitura/escrita. Veja alguns exemplos (que podem variar de acordo com o assembler):

CODE SECTION     ;tudo o que se segue deve ser colocado numa seção
                 ;marcada para apenas leitura e executável (código)
DATA SECTION     ;tudo o que se segue deve ser colocado numa seção
                 ;com atributos de leitura e escrita mas não de código
CONST SECTION    ;tudo o que se segue deve ser colocado numa seção 
                 ;com atributo de apenas leitura

Comentários

Após ponto e vírgula, o texto é ignorado até a próxima quebra de linha. Desta forma é possível associar descrições e explicações ao código fonte, as quais serão ignoradas pelo assembler.

Instruções para o sistema operacional

Proporcionam ao programador o acesso a uma grande variedade de funções. No caso do sistema operacional Windows, proporcionam acesso  API (Applications Programming Interface). Veja os exemplos abaixo: 

PUSH 12h             ;põe valor hexa 12 na pilha para a chamada   API
CALL GetKeyState     ;pede ao Windows para por o estado da tecla Alt em EAX
TEST EAX,80000000h   ;testa se a tecla Alt está sendo pressionada (bit 31 ligado)
JZ >L22              ;não, saltar para L22

PUSH 24h             ;valor hexa 24 = ponto de interrogação, botões yes e no
PUSH ESI,EDI         ;endereço do título, endereço da mensagem
PUSH [hWnd]          ;manipulador da janela proprietária
CALL MessageBoxA     ;mostra a caixa de mensagem Windows pedindo yes/no
CMP AL,7             ;checa se "no" foi clicado pelo usuário
JNZ >L40             ;não, saltar para L40

PUSH 0
PUSH ADDR FILE_DONE  ;dá endereço do arquivo FILE_DONE para receber o resultado
PUSH ECX,EDX         ;ECX = bytes que devem ser escritos, EDX=fonte de dados, 
PUSH ESI             ;ESI = manipulador do arquivo
CALL WriteFile       ;escrever ECX bytes de EDX para ESI

PUSH 808h,5h         ;808 = em baixo e meio preenchido, 5 = elevado
PUSH EBX,EDX         ;ebx = RECT, EDX = contexto do dispositivo
CALL DrawEdge        ;desenhar retângulo especial com bordas na tela

PUSH 4h,3000h,ESI,0  ;4h = fazer memória leitura/escrita, 3000h = reservar
CALL VirtualAlloc    ;reservar e consignar ESI bytes de memória leitura/escrita

PUSH 0,[hInst],0,0   ;param, manipulador do módulo, menu e proprietário
PUSH 208,130,30,300  ;altura, largura, y, x
PUSH 80C80000h       ;estilo (POPUP+CAPTION+SYSMENU)
PUSH EAX             ;EAX = endereço da string terminada em zero com o título
PUSH 'LISTBOX'       ;por ponteiro para 'LISTBOX' na pilha
PUSH 0               ;estilo extended (nenhum)
CALL CreateWindowExA ;criar a janela listbox

...... ou, se preferir, usar INVOKE ..
INVOKE CreateWindowExA, 0,'LISTBOX',EAX,80C80000h,300,30,130,208 \
                      0,0,[hInst],0

.............

INVOKE ShowWindow, [hWnd], 1
Posted

uma linguagem de alto nível e bastante complexa....

Penso que quererias dizer baixo nível...😛

Outra coisa...olhem lá os plágios.

Eu sei que a net é muito grande e geralmente 'ninguem dá por nada', mas os textos têm autores e têm de ser respeitados...

Acho que é compreensivel para qualquer um...

Abraços!!

Posted
Citação

Penso que quererias dizer baixo nível...😛

Outra coisa...olhem lá os plágios.

Eu sei que a net é muito grande e geralmente 'ninguem dá por nada', mas os textos têm autores e têm de ser respeitados...

Acho que é compreensivel para qualquer um...

Abraços!!

Boas,

Podes então explicar-me porque é que é de baixo nivel? é que eu pensei que por se uma das linguagens mãe, das mais complexas, com uma estrutura muito própria é que era de alto nivel mas plos vistos enganeime...

Cumps

Posted

Podes então explicar-me porque é que é de baixo nivel? é que eu pensei que por se uma das linguagens mãe, das mais complexas, com uma estrutura muito própria é que era de alto nivel mas plos vistos enganeime...

Vou tentar...

A classificação de nível de uma linguagem relaciona-se com a proximidade que esta tem com o utilizador

Seguindo este critério as linguagens podem ser de alto nível, nível intermediário ou baixo nível.

Alto:

É uma linguagem que se aproxima mais da linguagem utilizada pelo ser humano.

Exemplos típicos são Pascal, COBOL, C e SQL.

Intermédio:

São códigos chamados de mnemônicos, mais conhecidos como assembly. Exemplos típicos são o assembly do processador 8085, do Pentium, do AMD K6 e do Motorola.

Baixo:

Linguagem de baixo nível é o código que o computador executa diretamente, chamada de micro-programação.

É composta de 0´s e 1´s e conhecida como linguagem binária.

“bviamente diz-se que o assembly é de baixo nível, pois nenhum programador pensa sequer em praticar a micro-programação no seu dia-a-dia.

Existem outros tipos de classificações para as linguagens de programação.

Deixo aki o link com algumas informações, e de onde retirei estes excertos.

Espero ter ajudado 😛

Abraços!!

Posted
é pá,....se não estou em erro, a designação de "baixo nivel" refere-se ao facto de actuar directamente na maquina, (nas camadas mais baixas por assim dizer,... :? )

ps: +- isso, não sei se me fiz entender...... :oops:

Hmmm....é mesmo só isso?

Posted

Fui eu k tive a iniciativa para fazermos uma cena so para o assembly mas nestes dias tive com o pc pifado :oops:

Não fikei mt a par sorry

Mss a introduçao ta louca

www.sutchamos.blogspot.com

  • 9 months later...
Posted

é tal como o ricardo disse...

é muito mais fácil programar em C ou Visual Basic porque é fácil perceber... agora assembly?? bem... experimentem fazer um programa 🙂

falo com relativa experiência... nas minhas aulas tenho de analisar código assembly gerado por códigos em C, e é muito complicado... existem várias coisas que nos passam completamente ao lado. uma pequena função em C com umas 5 linhas ocupa umas 50 em assembly, uma instrução por linha...

o que talvez muita gente não sabe é que a maioria das linguagens foram feitas em assembly. quando fazemos um programa em C, por exemplo, ao compilar, o compilador passa tudo para assembly 🙂 sim, C foi criado em assembly.

para quem quiser dar uma olhadela nos assembly's, é possível com o linux.

peguem num programa compilado, vão à consola, na pasta onde têm o programa, e escrevam "objdump -d nomedoficheiro", e ser-vos-á mostrado o código do programa 🙂

  • 5 weeks later...
Posted

Assembly é uma linguagem (se é k assim se pode chamar) bastante interessante.

Acima de tudo, código em assembly é código em que se podem escrever 1000 linhas de código, onde não há um único erro de sintaxe, de tamanho de dados, enfim, de assemblamento. Mas onde os erros estão apenas na execução (Run time), com problemas de arquitectura dos sistemas, contas com o stack, etc..

Para mim o assembly é importante, porque para fazer o mínimo, é preciso conhecer a arquitectura onde se está a trabalhar, quer seja fazer brincadeiras com o boot, como programas p windows/linux/etc, etc, etc... enfim, tudo.  Mas nao nos podemos esquecer que é muitíssimo mais trabalhoso.Deve ser utilizado apenas quando não houver outra opção.Por exemplo, para passar argumentos a uma função, somos nós que tratamos disso.

há diversas formas, mas a mais comum e eficiente (utilizada um casos gerais knd n é possivel optimizar) é a utilizada pelos compiladores de C chamada C-type call ou C.decl, linguagem essa muito próxima do assembly, uma vez que o controlo que se tem é praticamente o mesmo. (alguns compiladores de C permitem até incluir assembly no código)

Por exemplo, para chamar a função strlen(char * string) utilizando o método C

push string ; Lista de argumentos. os últimos em primeiro lugar(de cima para baixo)

call strlen  ;funcao call. Coloca o eip (endereco do codigo actual) no topo do stack e salta para strlen

.......

strlen:

  push ebp  ;guarda o ebp (base pointer (32bits) no stack

  mov ebp,esp ; e atribui-lhe o endereco do stack actual

  mov esi,[ebp+8]

  xor eax,eax

  push ecx

cont:

  mov cl,[esi]

jz fim_strlen

  inc eax

  inc esi

jmp cont

fim_strlen:

  pop ecx

 

  pop ebp

ret 4

no final, o eax contem sempre o valor devolvido. Se é um endereço ou um valor imediato depende apenas do programa

o ret 4 corresponde ao ajuste a fazer depois do ret ao stack. Corresponde ao número (em bytes) dos argumentos Pushados

O assembly continua a ser temido por muitos como um bixo, mas acaba por ser bastante intuitiva. É apenas necessário duas coisas p fazer um programa: trabalho/vontade, e muitos, muitos comentários,pk ao fim de algumas centenas de linhas, o código começa a parecer todo igual! 😄

Passem Bem 😉

Posted

Convém não esquecer que o assembly tem uma grande desvantagem: não é portável

Ou seja, enquanto que quando nós fazemos um programa em C o podemos compilar para uma série de máquinas diferentes, o assembly só vai funcionar numa arquitectura e SO.

E se aprender  assembly para um tipo de arquitectura já não é fácil, então imagine-se aprender para várias aruitecturas...

  • 1 month later...
Posted

ou seja, enquanto que quando nós fazemos um programa em C o podemos compilar para uma série de máquinas diferentes, o assembly só vai funcionar numa arquitectura e SO.

Erm... desculpa lá, mas no que se refere a sistemas operativos, C é tão portável quanto Assembly. Se não utilizares código específico do sistema operativo, tanto compilas um programa (Assembly ou C) em Windows, como em Linux, como em Unix. Agora se usares por exemplo APIs do Windows num programa C, já não te safas no resto dos SOs. (E em Assembly acontece o mesmo 😄 )

Para não ficarem dúvidas, concordo plenamente com a parte das arquitecturas. Não tentem compilar um programa em Assembly do ARM com um compilador para IA32... 😄

Desaparecido.

Posted

Erm... desculpa lá, mas no que se refere a sistemas operativos, C é tão portável quanto Assembly. Se não utilizares código específico do sistema operativo, tanto compilas um programa (Assembly ou C) em Windows, como em Linux, como em Unix.

Acho que não é bem assim, porque os SO's funcionam de maneira diferente e interacção entre o programa e o SO é diferente. nunca fiz o teste, mas acho um programa compiladdo em Linux não funciona em Windows (mesma que a arquitectura não mude). mas não tenho a certeza quanto a isto.

Posted

(...)mas acho um programa compiladdo em Linux não funciona em Windows (mesma que a arquitectura não mude)

Isso é certo... mas a portabilidade é conseguires compilar o mesmo código em sistemas diferentes... e não utilizar o código já compilado em sistemas diferentes.

Se pensares no que disseste sobre o C vês que é isso 🙂

Desaparecido.

  • 1 month later...
Posted

eu no semestre passado na disciplina de arquitectura de computadores tive que aprender assembly e inclusive fazer um projecto. nao gostei muito da linguagem pk, apesar das poucas instrucoes que tem, é de dificil programacao devido ao facto de ser exactamente uma linguagem de baixo nivel e dai o raciocinio de programacao que normalmente utilizamos tem de ser mudado. mas convem spr aprender para essencialmente perceber como funciona um programa, ou seja como e ke e feito a passagem de codigo percetivel para codigo makina. cada instrucao em assembly tem um opcode, e essa passagem é feita pelos compiladores de assembly.

é necessário também ter cuidado quando se pergunta em assembly à arquitectura para a qual se programa, pois cada prossador tem diferentes opcodes e possiveis instrucoes. dai tb que alguns so terem versoes diferentes para diferentes arquitecturas

se quiserem ter alguma informacao sobre assembly e essencialmente sobre o processamento do computador visitem o site da cadeira de arquitectura de computadores lecionada no segundo semestre do ano lectivo de 2005/2006 no IST-TP: http://ac.tagus.ist.utl.pt

cumps

  • 5 months later...
Posted

Pessoal e que tal darem dicas para quem queira começar em asm? Tipo onde ir buscar as ferramentas pa começar a fazer algo em assembly!! Eu tive uma cadeira em q fiz umas coisas em asm mas muito poucas mas nos usamos um emulador. Se alguem souber onde posso ir buscar algo pa começar a fazer coisas simples e depois passar pa algo mais complicado q me diga 😛 )

  • 2 weeks later...
Posted

gostava de  saber kais programas ke posso sustar para começar

sei de um : fasm mas este não descompila 😛 sabem um lê descompila

Citação

A ironia é o primeiro indício de que a consciência se tornou consciente.

 

Posted

Boas,

há uns anos atrás tive que fazer um trabalho final de uma cadeira em assembly.

Era sobre o euro2004 e era uma cena para gerir equipas. fiz 2 versões, uma com mouse e outra com teclado.

Deixo-o aqui, pode ser que sirva para algum de voces...

Fiquem bem

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.