O objetivo deste tutorial é primeiramente dar ao leitor uma breve
introdução sobre a linguagem de programação Assembly e posteriormente mostrar
como realizar operações básicas com a mesma.
A primeira coisa que deve ser esclarecida e que percebi em muitas
páginas na web é a grande confusão que os estudantes e, até mesmo
profissionais, fazem entre a Assembly e o Assembler. Como já pude aprender em
algumas aulas e também através de leituras complementares sobre o assunto estas
são duas coisas diferentes e que não devem ser confundidas.
Bem, o Assembler é uma ferramenta usada para criar programas que é
responsável por converter as instruções em linguagem de máquina, ou seja, quem
fica encarregado pelo “trabalho sujo” é o próprio computador. Já a Assembly é a
linguagem de programação de mais baixo nível existente, ou seja, não é a
linguagem de máquina em si, como também já ouvi alguns falarem, mas sim uma das
linguagens mais próximas da própria linguagem de máquina. Sendo mais prática a Assembly
é a linguagem de programação, também chamada de linguagem de montagem, e o
Assembler, também chamado de montador, é o software que compila programas
escritos em Assembly.
Nas minhas aulas de Arquitetura de Computadores estamos usando um
simulador escrito em Java muito interessante, o Simple Computer Simulator, que
pode ser baixado facilmente ou até mesmo usado online. Com este simulador tudo
fica bem mais fácil de ser escrito e compreendido então recomendo a quem
estiver procurando aprender um pouco desta linguagem.
Em Assembly temos apenas 13 comandos que nos permitem criar qualquer
programa. Segue abaixo cada comando e sua função.
- STORE:
grava em dado local da memória o conteúdo do registrador;
- LOAD:
carrega o conteúdo da posição indicada no registrador;
- ADDI:
realiza uma operação de adição imediata;
- SUBI:
realiza uma operação de subtração imediata;
- ADD:
realiza uma operação de adição, não imediata;
- SUB:
realiza uma operação de subtração, não imediata;
- MUL:
realiza uma operação de multiplicação;
- DIV:
realiza uma operação de divisão;
- INPUT:
realiza uma operação de entrada de dados;
- OUTPUT:
realiza uma operação de saída de dados;
- JPOS:
realiza a comparação do valor do registrador, voltando para a posição
indicada caso o valor comparado seja maior que zero;
- JZERO:
realiza uma comparação do valor do registrador, voltando para a posição
indicada caso o valor comparado seja igual a zero;
- HALT: finalize a execução das instruções;
Abaixo temos uma imagem do Simple
Computer Simulator que já vem com todos os 13 comandos.
Bem, como é sempre
mais fácil aprender por meio de exemplos vamos começar com um exemplo bem
básico de como realizar a soma de dois valores em Assembly. Devemos primeiro
ter em mente os conceitos de registradores e de um registrador que acumula
resultados. O miniprograma proposto realiza a seguinte operação:
C = A+B
Em Assembly a operação seria escrita com
4 ou 5 comandos apenas e ficaria estruturada da seguinte maneira:
LOAD posiçãoDoValorA -- O programa carrega o valor de A no registrador
ADD posiçãoDoValorB -- O programa adiciona ao valor de A o valor de B
STORE posiçãoDoValorC -- O programa grava o resultado da soma em C
HALT -- A execução é finalizada
OU
LOAD posiçãoDoValorA -- O programa carrega o valor de A no registrador
ADD posiçãoDoValorB -- O programa adiciona ao valor de A o valor de B
STORE posiçãoDoValorC -- O programa grava o resultado da soma em C
OUTPUT posiçãoDoValorC -- O programa escreve a saída no campo Output
HALT -- A execução é finalizada.
Usando o Simple Computer Simulator
teríamos:
Ou ainda
Temos agora um exemplo um pouco mais
complexo de como realizar o calculo de um fatorial utilizando instruções
Assembly. A seguinte operação será realizada:
Fatorial de n = n*(n-1)*(n-2)*(n-3)*...*1
Será preciso, portanto trabalhar com três
espaços da memória, um para armazenar o valor que se deseja calcular a
fatorial, um para guardar o elemento neutro da multiplicação, o valor 1, e um
último para realizar o decremento do valor inicial até 0. Teríamos o seguinte
código:
LOAD posicaoDoValor1 -- Carrega 1 no registrador
STORE posicaoDoValorDaFatorial -- Guarda o valor multiplicado
LOAD posicaoDoValorInformadoParaOCalculo -- Carrega o valor que se quer decrementar
MULT posicaoDoValorDaFatorial -- Multiplica o valor atual pelo acumulado anteriormente para produzir o
resultado até o final do calculo da fatorial.
STORE posicaoDoValorDaFatorial -- Grava o resultado da multiplicação para substituir o valor passado
com o objetivo de acumular os resultados a cada nova operação para que ao
término da execução se tenha o valor de todas as multiplicações guardado
LOAD posicaoDoValorInformadoParaOCalculo -- Carrega o valor novamente para o decremento
SUBI 1 -- Decrementa o valor em 1
STORE posicaoDoValorInformadoParaOCalculo -- Grava o resultado
no mesmo local para substituir o valor anterior
JPOS posicaoDoComandoMUL -- Compara o valor decrementado com 0 e se o mesmo for maior que zero
volta para o local onde a multiplicação acontece. Isso faz com que o desvio
aconteça até que o valor da fatorial seja calculado.
OUTPUT posicaoDoValorDaFatorial -- Escreve o valor calculado
HALT -- Finaliza a execução
Usando o Simple Computer Simulator teríamos:
Agora que você já sabe a diferença entre
Assembly e Assembler, os comandos disponíveis para a criação de qualquer
programa em Assembly e já abriu um pouco a cabeça com os exemplos é só utilizar
um simulador, ou o Simple Computer Simulator, e praticar bastante. Espero que
este pequeno tutorial tenha conseguido atingir seu objetivo. Até o próximo
assunto!



