Como multiplicarHá 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
nopPassemos 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...