Fandom

Students

LAPIS/Disciplinas/Ciência da Computação:Assembly

< LAPIS | Disciplinas

1,331pages on
this wiki
Add New Page
Talk0 Share

Ad blocker interference detected!


Wikia is a free-to-use site that makes money from advertising. We have a modified experience for viewers using ad blockers

Wikia is not accessible if you’ve made further modifications. Remove the custom ad blocker rule(s) and the page will load as expected.

Introdução e Histórico

Uma linguagem de montagem ou assembly é uma notação legível por humanos para o código de máquina, que uma arquitetura de computador específica usa. A linguagem de máquina, que é um mero padrão de bits, torna-se legível pela substituição dos valores em bruto por símbolos chamados mnemônicos.

O Assembly foi provavelmente à primeira linguagem de programação da história, surgida na década de 50, época em que os computadores ainda usavam válvulas. A idéia do Assembly era usar um comando em substituição a cada instrução de máquina.

A história da programação foi gradualmente aumentando os níveis de granularidade. Muito antigamente os programadores manipulavam bits individuais. Então a linguagem Assembly foi inventada e os programadores começaram a escrever instruções que eram equivalentes a alguns bytes. A vantagem era clara: em vez de pensar em termos de insignificantes 1s e 0s, você poderia pensar em termos do que o computador estava fazendo em um nível funcional (mova este valor para aquela posição de memória, multiplique esses dois bytes).

Isto é chamado de aumento do nível de abstração. Cada vez que você aumenta o nível de abstração em uma linguagem de programação, você obtém mais programas (medido em termos de bits) com menos esforço. Você também altera a linguagem com a qual você se comunica com o computador de uma linguagem binária para algo mais próximo da forma com que nos comunicamos em qualquer outra língua. Cada unidade do nível de abstração tem um contrato: a linguagem faz uma promessa exata do que o computador fará quando a unidade for executada. Para a seguinte instrução na linguagem Assembly:

LD (BC),A

a linguagem promete que moverá o valor do registrador de nome A para a posição na memória apontada pelos registradores B e C. Obviamente, este é apenas um pequeno pedaço do que você gostaria que o computador realmente fizesse, tal como "ser um processador de textos" ou "renderizar um frame de um vídeo game", mas é muito mais claro e mais fácil de usar do que isto:

00000010

Pode não parecer tão fácil assim de se lembrar de LD (BC), A, mas cada uma das letras tem um significado correto e relativamente fácil de lembrar: LD é a abreviação para LOAD; A, B e C referem a alguns registradores, e (BC) refere à forma de se fazer endereçamento na memória. 00000010 pode ser apenas sete 0s e um 1, mas a ordem é tão crítica quanto difícil de memorizar. Trocar dois dos bits para 00000100 significa INC B (incrementar o registrador B), o que é totalmente diferente.

Arquitetura Prós e contras Ao contrário do que acontece nas linguagens de alto nível, existe (até certo ponto) uma correspondência de 1 para 1 entre a linguagem de montagem simples e a linguagem de máquina. Por isso a tradução do código de montagem em código de máquina não é chamada compilação, mas montagem. Consegue-se transformar a linguagem de montagem em linguagem de máquina recorrendo a um montador (também chamado assembler, originado do termo em inglês), e a transformação inversa faz-se recorrendo a um desmontador (também chamado disassembler, originado do termo em inglês). Cada arquitetura de computador tem a sua própria linguagem de máquina e, portanto, sua própria linguagem de montagem. Essas linguagens de montagem diferem no número e tipo de operações que suportam. Também têm diferentes tamanhos e números de registros, e diferentes representações dos tipos de dados armazenados. Enquanto todos os computadores de utilização genérica são capazes de desempenhar essencialmente as mesmas funções, o modo como o fazem é diferente. Além disso, podem existir conjuntos múltiplos de mnemônicas, ou sintaxes de linguagem de montagem, para um único conjunto de instruções. Nestes casos, o conjunto mais popular é aquele que é utilizado pelo fabricante na sua documentação. A maioria dos processadores só consegue manipular os dados que estão em registradores e a linguagem de montagem facilita o trabalho direto com os registradores. O assembly é muito utilizado em áreas que utiliza eletrônica digital e micro-controladores (por ter um rápido desempenho e utilização de pouca memória). Por ser uma linguagem de baixo nível e de difícil aprendizado, poucas pessoas tem acesso a este tipo de programação, “hackers” usam assembly para desenvolver cracks e outros meios de burlar segurança em software e hardware tais como DVD e outros softwares de PC’s.

Características


No Assembly, cada uma destas instruções equivale a uma instrução do processador. Ao invés de usar instruções como 10101011, você pode usar outras bem mais fáceis de entender e de memorizar, como add, div, mul, and, or, not, etc. Por exemplo, a instrução "add" faz com que o processador some duas variáveis; "add x, y".

Você também pode criar variáveis, que são pequenos espaços na memória RAM reservados para guardar algum tipo de informação, que o programa precisará mais tarde.

Apesar de ser exaustivamente trabalhoso, você pode perfeitamente desenvolver pequenos programas em Assembly. Para isso só vai precisar de um compilador e bastante paciência para aprender.

O compilador transforma o código escrito em Assembly em linguagem de máquina, que finalmente poderá ser entendida pelo processador. Existem também os decompiladores, que fazem o trabalho inverso, de transformar um programa já compilado em código Assembly. Este recurso é chamado de engenharia reversa. É assim que conseguem crackear programas, quebrar códigos de proteção (como o do DVD), etc. Claro que para isso, é preciso alguém que conheça muito de Assembly e que tenha disposição para ficar estudando o código até encontrar o que procura. Por causa desta característica de permitir trabalhar diretamente com as instruções do processador, o Assembly é uma linguagem de baixo nível. Existem também linguagens de alto nível, como C++ ou Pascal, onde é possível usar várias funções já prontas ou mesmo ferramentas visuais, como o Kdeveloper ou o Kylix, que são ainda mais fáceis.

Em se tratando de programação, o fato de uma linguagem ser "de baixo nível", não significa que ela é ruim, mas apenas que ela manipula diretamente as instruções e endereços de memória e, por isso, é mais trabalhosa e voltada para o desenvolvimento de aplicativos otimizados.

Os compiladores de várias linguagens de alto nível fazem a compilação dos programas em duas etapas, na primeira transformando o código fonte em código Assembly e em seguida gerando o binário com a ajuda de um Assembler. Um erro comum é usar o termo Assembler em substituição do Assembly, o que ocorre muito freqüentemente, devido à semelhança dos termos. "Assembler" soa como uma tradução de "Assembly" mas na verdade ambos são termos estrangeiros, com significados diferentes. O termo também pode ser usado em relação a um "montador" de micros. Um "PC Assembler" pode não ser um programa, mas sim um técnico de carne e osso que trabalha para algum integrador de PCs.


Exemplo de um programa em Assembly Este programa configura as portas do microcontrolador pic 16F84, os endereços de memória, as variáveis do sistema e a lógica de programação. PROCESSOR 16F84 ; TIPO DE PROCESSADOR RADIX DEC ; NUMEROS SEM ESPECIFICAÇÃO SERÃO DECIMAIS INCLUDE "P16F84.INC" ; INVOCA SET DE INSTRUÇÕES __CONFIG 0x3FF1 ; CONFIGURA A INCICIALIZAÇÃO DO OSCILADOR LED EQU 0 ; DEFINIÇÃO INTERNA DO PROGRAMA (LED=0) ORG 0x0C ; LUGAR DA MEMORIA ONDE FICARAM AS VARIAVEIS Count RES 2 ; VARIAVEL E TAMANHO ORG 0x00 ; LUGAR DA MEMORIA ONDE DO PONTO DE RESET bsf STATUS,RP0 ; ACESSA O BANCO “0” DE NDEREÇOS/COMANDOS movlw B'00011111' ; ADICIONA ESTE VALOR PARA WORKS (W) movwf TRISA ; DEFINE AS ENTRADAS/SAIDAS DO PORTA movlw B'11111110' ; ADICIONA ESTE VALOR PARA WORKS (W) movwf TRISB ; DEFINE AS ENTRADAS/SAIDAS DO PORTB bcf STATUS,RP0 ; VOLTA P/ BANCO “1” DE ENDEREÇOS/COMANDOS bsf PORTB,LED ; DESLIGA O PINO 6 (RB0) DO CI, APAGANDO O LED MainLoop ; DECLARAÇÃO DE ROTINA PRINCIPAL call Delay ; CHAMADA DE ROTINA DE TEMPO btfsc PORTB,LED ; TESTA SE O LED ESTA ACESO (1 OU 0) goto SetToZero ; SE APAGADO ENTÃO EXECUTA ESTA ROTINA bsf PORTB,LED ; SE NÃO, APAGA O LED (RBO = 0) goto MainLoop ;VOLTA PARA A ROTINA PRINCIPAL SetToZero ; ROTINA QUE ACENDE O LED bcf PORTB,LED ; COMANDO QUE ACENDE O LED goto MainLoop ; VOLTA PARA ROTINA PRINCIPAL Delay ; ROTINA DE TEMPO clrf Count ; LIMPA COUNT clrf Count+1 ; LIMPA COUNT+1 DelayLoop ; ROTINA DE LOOP DE TEMPO decfsz Count,1 ; DECREMENTA E PULA A PROXIMA LINHA SE 0 goto DelayLoop ; VOLTA PARA O LOOP DE TEMPO decfsz Count+1,1 ; DECREMENTA E PULA A PROXIMA LINHA SE 0 goto DelayLoop ; VOLTA PARA O LOOP DE TEMPO return ; VOLTA PARA ONDE CHAMOU A ROTINA END ; FINALIZA O PROGRAMA

Conclusão

Mesmo após muitos anos desde sua criação, o assembly ainda é e vai ser muito utilizado por técnicos e programadores de diversas áreas. Como foi dito anteriormente o assembly tem como características positivas a sua velocidade de execução e compilação, e também a pouca memória que é usada quando se programa em assembly. Muitas vezes programadores usam assembly no meio de outros programas de outras linguagens, para promover mais performance e eficiência e executar uma função específica de maquina não disponível em outras linguagens.

Porém convenhamos que assembly não é uma linguagem de fácil didática e compreensão por muitos, sendo visível que precisa de bastante conhecimento de binário e hexadecimal para bom uso da linguagem.

Bibliografia

Sites na Internet:

http://www.ime.uerj.br/~alexszt/cursos/softsis/material/asm/tutasm/exdebug.html

http://www.guiadohardware.net/termos/assembler

http://sp4br75.digiweb.psi.br/curso_ensamblador/lec04.htm

http://manoelnetom.googlepages.com/dobitapoo

Livros:

C completo e Total; Herbert Schildt

Also on Fandom

Random Wiki