Páginas: [1]   Ir para o fundo
  Imprimir  
Autor Tópico: Pequenos codigos em ASSEMBLER  (Lida 547 vezes)
resinba
Moderador Global
Cristal
*****
Offline Offline

Mensagens: 449


« em: Abril 20, 2008, 20:29:48 »

Com este tópico pretendo, dar a entender pequenos troços de código, que muitas vezes nos faz falta...
De certa maneira poderemos dizer que são macros...
Claro que, apelo a toda a comunidade que tenha vontade em dar a conhecer os seus códigos que os coloquem por cá com uma explicação o mais detalhada que possível sobre o que o seu código faz, pois nem todos usam os mesmos processadores e assim com uma boa explicação o pessoal consegue lá chegar (fazendo as necessárias alterações ao código para o seu "bichinho")...

Registado

Por favor, alterem o meu email no msn pois tenho outro email dedicado aos foruns, e vou bloquear todos os que se encontram no antigo email.
resinba
Moderador Global
Cristal
*****
Offline Offline

Mensagens: 449


« Responder #1 em: Abril 20, 2008, 21:50:17 »

Como multiplicar

Há a multiplicação... que nostalgia aquela do meu tempo de escola quando a professora usava um auxiliar de memoria um pouco macabro e doloroso (pelo menos para nós alunos da velha guarda), e na altura eu qua não sabia que a multiplicação não passava de somas consecutivas do mesmo numero... o quê? ... vocês também não sabiam...
Não faz mal só muito recentemente é que descobri que a multiplicação era isso...

Bem deixemos de tretas e vamos lá há explicação...
na multiplicação temos o Multiplicando, o Multiplicador e o resultado, com isto o que eu quero dizer?
Bem, se tivermos por exemplo 3 como multiplicando, 5 como multiplicador teremos então 15 como resultado...

De outra maneira...
3x5=15
e por fim ainda de outra forma
3+3+3+3+3=15
consigo fazer-me entender?

Bem a minha matemática é um pouco limitada, mas o que interessa é mesmo a intenção...

Eis então um possível fluxograma da ideia...



e aqui então se encontra o código em Assembler para um PIC, há que levar em conta que este codigo só é valido para numeros inteiros, e que o resultado não passe do valor 255.
Para o caso de se usarem valores valores fraccionarios ou mesmo resultados maiores teremos que fazer alterações no código, em que incluem o um maior numero de registos...

      movlw 7
   movwf multiplicador
   movwf multiplicador_1
   movlw 3
   movwf multiplicando
   clrf resultado
LOOP
   addwf resultado
   decfsz multiplicador_1,1
      goto LOOP
      nop


Passemos há explicação do código...

1 - movlw 7
com esta instrução carregamos o literal de valor 7 no registo de trabalho, ou de outra maneira no registo W

2 - movwf multiplicador
3 - movwf multiplicador_1
Nestas duas linhas de instrução carregamos o valor que se encontra no registo W, tanto em divisor, como em divisor_1, e o porquê destes dois registos???
Bem na realidade, com estes dois registos poderemos ver o que se passa no código quando o corremos com o "SIM" do MPLAB e estamos a ver o que se passa nos registos dentro da janela "watch", assim o registo multiplicador fica inalterado e o registo multiplicador_1 irá decrementando até ficar com o valor zero.

4 - movlw 3
novamente iremos carregar um literal no registo W, mas neste caso será com o valor 3

5 - movwf multiplicando
novamente iremos carregar o registo W em outro registo neste caso será no multiplicando

6 - clrf resultado
com esta instrução iremos limpar o registo resultado

7 - LOOP
Bem o que se poderá dizer desta, é uma lable...
Mas muito importante... é aqui que começa de facto o código, para a multiplicação. Todo o código anterior pode ser omitido, desde que não nos esqueçamos das variáveis (claro que poderam ter outros nomes), mas sem esta parte do codigo a multiplicação não funciona.

8 - addwf resultado
com esta instrução, iremos somar ao registo resultado, o que se encontra no registo W (neste caso o valor 3)

9 - decfsz multiplicador_1,1
Eis uma instrução de decisão, esta instrução quer dizer: decrementa o registo F (neste caso será multiplicador_1), e salta uma instrução se for zero o valor do registo F

10 - goto LOOP
se o resultado da instrução Nº9 não for zero então esta instrução é executada, e tem como finalidade fazer com que o programa salte para a linha Nº6 ou melhor salte para LOOP.

11 - nop
neste ponto podem por o resto vosso programa e claro que podem eliminar esta instrução.

No topico sobre o speed control...

http://www.electronicapt.com/forum/index.php/topic,1209.0.html

 encontra-se lá dentro do código em C um troço de código em Assembler para fazer uma multiplicação, para minimizar o tamanho do código, claro e a passagem é esta:

#asm
         movlw 4
         movwf temp_asm
         movf var_1,w
         
         LOOP_ASM
         addwf var_1,f
         decfsz temp_asm,f
         goto LOOP_ASM
         bsf INTCON,7
         btfss flag,2
         bsf INTCON,2
         #endasm

Para duvidas é só avisar...
« Última modificação: Abril 20, 2008, 22:40:42 por resinba » Registado

Por favor, alterem o meu email no msn pois tenho outro email dedicado aos foruns, e vou bloquear todos os que se encontram no antigo email.
Páginas: [1]   Ir para o topo
  Imprimir  
 
Ir para: