Ayuda con programa .asm de multiplicacion con punto flotante

Que hay gente del foro tengo un problema con este programa que se supone multiplica con punto flotante pero no lo e podido comprobar ya que no me funciona no ce donde esta el error o que me falta declarar la verdad es que lo descarge de un generador de codigo de una pagina de internet e aqui el codigo:

Código:
; multi = multi * 1.15
; Temp = insta
; multi size = 10 bits
; Error = 0.1 %
; Bytes order = little endian
; Round = no

; ALGORITHM:
; Clear accumulator
; Add input * 1 to accumulator
; Add input / 8 to accumulator
; Add input / 64 to accumulator
; Add input / 128 to accumulator
; Add input / 1024 to accumulator
; Move accumulator to result
;
; Approximated constant: 1.14941, Error: 0.0509511 %

;     Input: multi0 .. multi1, 10 bits
;    Output: multi0 .. multi1, 11 bits
; Code size: 56 instructions
#include<p16f877.inc>
		list	p=16f877
#DEFINE	multi	0x78
insta	EQU		0x22			
		org		00
		goto	inicio
inicio 	bsf		STATUS,RP0
		MOVLW	B'00000000'
		MOVWF	TRISD
		BCF		STATUS,RP0
		cblock	0x22
		multi0
		multi1
		insta0
		insta1
		endc

;copy accumulator to temporary
		movf	multi1, w
		movwf	insta1
		movf	multi0, w
		movwf	insta0
		clrc;shift accumulator right 3 times
		rrf	multi1, f
		rrf	multi0, f
		clrc
		rrf	multi1, f
		rrf	multi0, f
		clrc
		rrf	multi0, f

;add temporary to accumulator
		clrf	multi1
		addwf	multi0, f
		movf	insta1, w
		skpnc
		incfsz	insta1, w
		addwf	multi1, f

;shift accumulator right 1 times
		rrf	multi1, f
		rrf	multi0, f
	
;add temporary to accumulator
		movf	insta0, w
		addwf	multi0, f
		movf	insta1, w
		skpnc
		incfsz	insta1, w
		addwf	multi1, f

;shift accumulator right 3 times
		rrf	multi1, f
		rrf	multi0, f
		clrc
		rrf	multi1, f
		rrf	multi0, f
		clrc
		rrf	multi1, f
		rrf	multi0, f

;add temporary to accumulator
		clrf	multi1
		movf	insta0, w
		addwf	multi0, f
		movf	insta1, w
		skpnc
		incfsz	insta1, w
		addwf	multi1, f

;shift accumulator right 3 times
		rrf	multi1, f
		rrf	multi0, f
		CLRC
		rrf	multi1, f
		rrf	multi0, f
		CLRC
		rrf	multi1, f
		rrf	multi0, f

;add temporary to accumulator
		clrf	multi1
		movf	insta0, w
		addwf	multi0, f
		movf	insta1, w
		SKPNC
		incfsz	insta1, w
		addwf	multi1, f
		END
Si alguien me puede explicar lo que me hace falta o que esta mal del codigo se los agradecere.

Saludos, Elemos13
 
Última edición por un moderador:
Buenas gente del foro con la novedad de que ya descifré este programa y realmente es de gran ayuda ya que tiene un error minimo de la multiplicaciòn (en este caso yo multiplico cualquier valor entrante por 1.15) les explico:

Código:
#include<p16f877.inc>
list p=16f877
org 00
goto inicio
inicio bsf STATUS,RP0
MOVLW B'00000000'
MOVWF TRISD
BCF STATUS,RP0
Movlw	0x22	;valor que se va a cargar en el registro Multi0 los otros conviene dejarlos en cero por que hay es donde se van acomodando los acarreos y demás valores temporales.
Movwf	multi0
cblock 0x22; esta instruccion del Mplab es realmente de gran ayuda ya que genera los registros a ocupar durante la ejecucion de programa aqui yo le indique que los registros a ocupar desde la dirección de memoria  22 
multi0; estos son los registros siguientes este toma la dirección de memoria 22
multi1;	este ocupa el siguiente que seria 23
insta0; así consecutivamente este sería el 24
insta1; y este el 25
endc; esta instrucción define el final del direccionamiento de estos registros
;copiar al acumulador lo que tiene la dirección multi
movf multi1, w
movwf insta1
movf multi0, w
movwf insta0
;desplaza lo que tiene el acumulador tres veces
Clrc; esta instrucción quiere decir borra el bit de carry
rrf multi1, f
rrf multi0, f
clrc
rrf multi1, f
rrf multi0, f
clrc
rrf multi0, f

;añade o suma lo que hay en el acumulador con el registro multi1 e insta1
clrf multi1
addwf multi0, f
movf insta1, w
skpnc
incfsz insta1, w
addwf multi1, f

;desplaza lo que tienen los siguientes registros  1 vez
rrf multi1, f
rrf multi0, f

; añade o suma lo que hay en el acumulador con el registro multi1 e insta1
movf insta0, w
addwf multi0, f
movf insta1, w
skpnc	;esta instrucción es de gran ayuda evita bastantes instrucciones y quiere decir salta si no hay acarreo 
incfsz insta1, w
addwf multi1, f

;desplaza lo que tienen los siguientes registros  3 vez
rrf multi1, f
rrf multi0, f
clrc
rrf multi1, f
rrf multi0, f
clrc
rrf multi1, f
rrf multi0, f

; añade o suma lo que hay en el acumulador con el registro multi1 e insta1
clrf multi1
movf insta0, w
addwf multi0, f
movf insta1, w
skpnc
incfsz insta1, w
addwf multi1, f

;desplaza lo que tienen los siguientes registros  3 vez
rrf multi1, f
rrf multi0, f
CLRC
rrf multi1, f
rrf multi0, f
CLRC
rrf multi1, f
rrf multi0, f

; añade o suma lo que hay en el acumulador con el registro multi1 e insta1
clrf multi1
movf insta0, w
addwf multi0, f
movf insta1, w
SKPNC
incfsz insta1, w
addwf multi1, f
END
Espero que les sea de utilidad.

SALUDOS, Elemos13
 
Última edición por un moderador:
Buenas gente del foro con la novedad de que ya descifré este programa y realmente es de gran ayuda ya que tiene un error minimo de la multiplicaciòn (en este caso yo multiplico cualquier valor entrante por 1.15) les explico:

Código:
#include<p16f877.inc>
list p=16f877
org 00
goto inicio
inicio bsf STATUS,RP0
MOVLW B'00000000'
MOVWF TRISD
BCF STATUS,RP0
Movlw    0x22    ;valor que se va a cargar en el registro Multi0 los otros conviene dejarlos en cero por que hay es donde se van acomodando los acarreos y demás valores temporales.
Movwf    multi0
cblock 0x22; esta instruccion del Mplab es realmente de gran ayuda ya que genera los registros a ocupar durante la ejecucion de programa aqui yo le indique que los registros a ocupar desde la dirección de memoria  22 
multi0; estos son los registros siguientes este toma la dirección de memoria 22
multi1;    este ocupa el siguiente que seria 23
insta0; así consecutivamente este sería el 24
insta1; y este el 25
endc; esta instrucción define el final del direccionamiento de estos registros
;copiar al acumulador lo que tiene la dirección multi
movf multi1, w
movwf insta1
movf multi0, w
movwf insta0
;desplaza lo que tiene el acumulador tres veces
Clrc; esta instrucción quiere decir borra el bit de carry
rrf multi1, f
rrf multi0, f
clrc
rrf multi1, f
rrf multi0, f
clrc
rrf multi0, f

;añade o suma lo que hay en el acumulador con el registro multi1 e insta1
clrf multi1
addwf multi0, f
movf insta1, w
skpnc
incfsz insta1, w
addwf multi1, f

;desplaza lo que tienen los siguientes registros  1 vez
rrf multi1, f
rrf multi0, f

; añade o suma lo que hay en el acumulador con el registro multi1 e insta1
movf insta0, w
addwf multi0, f
movf insta1, w
skpnc    ;esta instrucción es de gran ayuda evita bastantes instrucciones y quiere decir salta si no hay acarreo 
incfsz insta1, w
addwf multi1, f

;desplaza lo que tienen los siguientes registros  3 vez
rrf multi1, f
rrf multi0, f
clrc
rrf multi1, f
rrf multi0, f
clrc
rrf multi1, f
rrf multi0, f

; añade o suma lo que hay en el acumulador con el registro multi1 e insta1
clrf multi1
movf insta0, w
addwf multi0, f
movf insta1, w
skpnc
incfsz insta1, w
addwf multi1, f

;desplaza lo que tienen los siguientes registros  3 vez
rrf multi1, f
rrf multi0, f
CLRC
rrf multi1, f
rrf multi0, f
CLRC
rrf multi1, f
rrf multi0, f

; añade o suma lo que hay en el acumulador con el registro multi1 e insta1
clrf multi1
movf insta0, w
addwf multi0, f
movf insta1, w
SKPNC
incfsz insta1, w
addwf multi1, f
END
Espero que les sea de utilidad.

SALUDOS, Elemos13


Que tal Elemos13, esta muy interesante esto y justamente ando necesitando un codigo en ensamblador para realizar multiplicaciones flotantes, pero la verdad es que yo programo en AVR y las instrucciones pues no son las mismas aunque muchas hagan lo mismo, entonces te agradeceria enoormemente si me pasaras el mismo codigo pero con algo mas de comentarios de que es lo que van haciendo las instrucciones porfavor!
 
Atrás
Arriba