quinta-feira, 6 de dezembro de 2012

Tutorial para Operações Básicas em Linguagem Assembly


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!




Nenhum comentário:

Postar um comentário