TODOPIC
Microcontroladores PIC => Almacén del Assembler => Mensaje iniciado por: summer en 09 de Diciembre de 2006, 14:35:21
-
Hola!Soy nueva por aqui.Tb soy nueva programando en ensamblador, anteriormente lo habia hecho en C,y será por eso que no lo termino de entender, yo todo lo haria d otras formas! :lol:
Necesito que alguien me explique como se multiplican dos numeros de 8 bits en ensamblador, usaria el pic16f877, y el mplab para hacerlo.No entiendo bien por qué se rotan los numeros...si alguien tiene un programita de multiplicacion hecho se lo agradeceria, ya que busque por aqui pero no hay nada.Saludos! :P
-
Hola summer. El método básico para multiplicar en ensamblador es mediante la suma sucesiva, es decir, si tenemos por ej: 4x3 se puede interpretar sumar el numero cuatro, tres veces: 4+4+4
en terminos generales, sería la suma del operando1, tantas veces operando2.
llevandolo al switcheo de transistores de los pic (en asm, ;-))
- el primer paso es ir sumando el operando1 y guardarla en un registro (GPR), llamemoslo resultado_lsb, recuerden que si el producto es con 8 bits, el resultado podria pasar de 8 bits, bueno el asunto es que mientras se va haciendo una suma en resultado_lsb. Por otro lado se va decrementando operando2 y éste actuará como un contador, el contador de las veces que sumara operando1 y cuando operando2 llegue a cero se habrá completado la suma y por tanto, la multiplicación.
- para saber si el resultado de la multiplicación es mayor de 8 bits, está el bit Carry y cada vez que acuse un desbordamiento se incrementará resultado_msb
movlw 4
movwf operando1
movlw 3
movwf operando2
movlw 0
bcf STATUS,C ; limpia el acarreo
sumar:
addwf operando1,w ; operando1 + w -> w
movwf resultado_lsb ; w -> resultado_lsb
btfss STATUS,C ; si hay acarreo hacer resultado_msb + 1 --> resultado_msb
goto pabajo ; continua la suma
bcf STATUS,C ; limpia el acarreo
incf resultado_msb,1 ; el resultado es mayor de 255
pabajo:
decfsz operando2,1 ; decrementar operando2 si es 0 salir
goto sumar
nop ; termina la suma sucesiva
nota: para la división es de una manera similar, solo que en vez de sumar, se usa la resta
salu2
Pedro
-
Hola Palitroquez, muchas gracias.Aunque no era eso exactamente lo que preguntaba ya que si el nuemero está em hexadecimal, no es exactamente "sumar el numero 4 tres veces", si por ej se tiene F8 x D1 , se que sería un resultado de mas de 8 bits, asi que no se muy bien como tendria que ir desplazando los numeros, ya que por ej en una multiplicacion normal se va haciendo asi, hasta llegar a unos bits que serian los bits altos del resultado...bueno que estoy hecha un lio!gracias igualmen
te!!
-
Hola, acá dejo un programita para multiplicar dos números, y el resultado lo deja en dos registros, en uno la parte alta y en otro la parte baja.
Esta hecho para otro pic, pero fácilmente podrás adaptarlo a tu pic. Ya se simplemente trabaja con registros.
Saludos y cualquier cosa pregunta.
-
gracias a ver si con esto me aclaro :P
-
... no es exactamente "sumar el numero 4 tres veces", si por ej se tiene F8 x D1 , se que sería un resultado de mas de 8 bits, ...
no habría problema alguno, acuerdate que el pic no ve el sistema de numeración (octal, hexa, dec) él lo que ve son unos y ceros. Con la rutina que expuse se puede multiplicar dos números hasta 255x255, esto es 0xFF(hexa) ó 377(octal), también existen otras tecnicas para multiplicar, como la del código que expuso ESTECA55.
Salu2
Pedro
-
Hola quisiera que me ayudaran porque estuve haciendo un ejercicio y no le podido dar solucion. Me pedia un fragmento de codigo para multiplicar un numero de 16bit por uno de 8bit. saludos
-
Suma el numero de 16 bits, la cantidad de veces que tenes en el numero de 8 bits.
Ejemplo suponete que tenes el numero 4 en los 16 bits, y tenes el numero 3 en el de 8.
Te reservas al menos 24 bits que es lo que vas a necesitar y empezas a sumar.. en este caso la operacion es 4 * 3, O que es lo mismos que sumar 3 veces 4.
3 * 4 = 4 + 4 + 4
el pseudo codigo seria:
Loop:
var24bits = var24bits + var16bits
var8bits = var8bits - 1
var8bits igual a 0 ?
No.. voy a loop
Si, multiplicacion terminada.
-
Ese método funciona pero es muy lento.
Este es el método correcto:
a = 25 (primer número guardado en 8 bit)
b = 86 (segundo número guardado en 8 bit)
suma = 0 (resultado de 16 bit)
repite 8 veces:
desplaza suma a la izquierda (es igual a multiplicarlo por 2)
si bit7 de b vale 1:
suma = suma + a
desplaza b a la izquierda (es igual a multiplicarlo por 2)
Y ya está. Con 8 desplazamientos y 8 sumas lo tienes. Mucho más rápido.
-
En c:
main() {
unsigned char a = 25;
unsigned char b = 86;
unsigned int suma = 0;
unsigned char i = 8;
do {
suma = (suma << 1);
if (b & 0x80)
suma = suma + a;
b = (b << 1);
i = i - 1;
} while(i != 0);
-
Ese método funciona pero es muy lento.
Si lo se, pero es el metodo mas simple de entender, siendo que no le sale mutiplicar 2 numeros. Y requiere un conocimiento basico de la matematica para entenderle.
-
Hola!Soy nueva por aqui.Tb soy nueva programando en ensamblador, anteriormente lo habia hecho en C,y será por eso que no lo termino de entender, yo todo lo haria d otras formas! :lol:
También puedes programar en c, compilar y mirar después el código ensamblador generado. Los compiladores normales generan código assembler un poco complejo así que te recomiendo este otro compilador que es muy bueno para ese propósito:
http://www.bknd.com/cc5x/