begin process at 2010 03 19 05:25:38
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Autres cpu

 > MULTIPLICATION/DIVISIONS SUR 64BITS POUR REGISTRE 32BITS

MULTIPLICATION/DIVISIONS SUR 64BITS POUR REGISTRE 32BITS


 Information sur la source

Note :
10 / 10 - par 1 personne
10,00 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10
Catégorie :Autres cpu Classé sous :multiplication, division, regitre, 64bits, 32bits Niveau :Débutant Date de création :15/11/2003 Vu :13 830

Auteur : BarthOlivier

Ecrire un message privé
Site perso
Commentaire sur cette source (7)
Ajouter un commentaire et/ou une note

 Description

Voici deux petites fonctions permettant d'effectuer rapidement des multiplications et des divisions sur des registres 32 bits ....

J'ai développé ce code pour un Microcontroleur type H8 (Hitachi)

A noter que si vous utiliser un processeur avec des registre 64Bits, vous pourrez faire des multis sur 64Bits.... à l'inverse, si vous n'avez qu'un µC 8Bits, rien ne vous empeche d'etendre a chose sur 16 bits (juste la variable d'occurence à changer)

A noter :

_L_reg32_1      &     _H_reg32_1
_L_reg32_2      &     _H_reg32_2

sont des variables 32 bits L(Low) H(High)
// la c'est pour les nouveaux, pour les pros c'etait evident ...

Source

  • ;****************************************************;
  • ;* Multiplication avec expansion en 64 bits *;
  • ;* *;
  • ;* Entrées : er2 :: nombre 1 (32 bits) *;
  • ;* er3 :: nombre 2 (32 bits) *;
  • ;* *;
  • ;* Sorties : er2 :: 32 bits bas *;
  • ;* er6 :: 32 bits haut *;
  • ;****************************************************;
  • mulxu.64:
  • sub.l er4,er4
  • mov.l er4,er5
  • mov.l er4,er6
  • mov.b #32,r4l ; charge le nombre de bits de multiplication.
  • andc #254,ccr
  • bou64_1:
  • rotxr.l er2 ;
  • bcc suite64_1 ;
  • add.l er3,er5 ; er5 : H_reg
  • suite64_1: ; er6 : L_reg
  • rotxr.l er5 ;
  • rotxr.l er6 ;
  • dec.b r4l ;
  • bne bou64_1 ;
  • fin64_1:
  • mov.l er6,@_L_reg32_1 ;
  • mov.l er5,@_H_reg32_1 ;
  • mov.l er6,er2 ;
  • mov.l er5,er6 ;
  • rts
  • .align 1
  • ;****************************************************;
  • ;* Division 64 Bits / 32 Bits (2) *;
  • ;* *;
  • ;* Entrées : @_H_reg32_1 :: nombre 1 (32 bits) *;
  • ;* @_L_reg32_1 :: nombre 2 (32 bits) *;
  • ;* @_L_reg32_2 :: diviseur (32 bits) *;
  • ;* *;
  • ;* Sorties : er1 :: 32 bits haut *;
  • ;****************************************************;
  • divxu.64:
  • sub.l er5,er5
  • mov.l @_L_reg32_2,er4 ;
  • mov.l @_H_reg32_1,er3 ;
  • mov.l @_L_reg32_1,er2 ;
  • cmp.l #0,er4 ; Verifie si le diviseur est à 0.
  • beq div64_6 ;
  • mov.b #33,r6l ; charge le nombre de bits de multiplication.
  • andc #254,ccr
  • div64_1:
  • bcs div64_3 ;
  • cmp.l er4,er3 ;
  • bhi div64_3 ;
  • beq div64_3 ;
  • div64_2:
  • shll.l er5 ;
  • jmp div64_4 ;
  • div64_3:
  • orc #1,ccr ; Met la carry à 1
  • rotxl.l er5 ;
  • sub.l er4,er3 ;
  • div64_4:
  • shll.l er2 ;
  • rotxl.l er3 ;
  • dec.b r6l ;
  • bne div64_1 ;
  • div64_6:
  • mov.l er5,@_L_reg32_1 ;
  • mov.l er5,@_L_reg32_2 ;
  • mov.l er5,er2 ;
  • rts
;****************************************************;
;* Multiplication avec expansion en 64 bits         *;
;*                                                  *;
;* Entrées : er2 :: nombre 1 (32 bits)              *;
;*           er3 :: nombre 2 (32 bits)              *;
;*                                                  *;
;* Sorties : 	er2 :: 32 bits bas                  	*;
;*		er6 :: 32 bits haut                 					*;
;****************************************************;
mulxu.64:
	sub.l	er4,er4
	mov.l	er4,er5
	mov.l	er4,er6

	mov.b	#32,r4l		; charge le nombre de bits de multiplication.	
	andc	#254,ccr
bou64_1:
	rotxr.l	er2			;
	bcc	suite64_1		;
	add.l	er3,er5		;	er5 : H_reg
suite64_1:				;	er6 : L_reg
	rotxr.l	er5			;
	rotxr.l	er6			;
	dec.b	r4l				;
	bne	bou64_1			;
fin64_1:
	mov.l	er6,@_L_reg32_1	;
	mov.l	er5,@_H_reg32_1	;

	mov.l	er6,er2 ;
	mov.l	er5,er6	;
	rts


	.align 1
;****************************************************;
;*         Division 64 Bits / 32 Bits           (2) *;
;*                                                  *;
;* Entrées : @_H_reg32_1 :: nombre 1 (32 bits)      *;
;*           @_L_reg32_1 :: nombre 2 (32 bits)      *;
;*           @_L_reg32_2 :: diviseur (32 bits)      *;
;*                                                  *;
;* Sorties : 	er1 :: 32 bits haut                 *;
;****************************************************;
divxu.64:
	sub.l	er5,er5
	mov.l	@_L_reg32_2,er4	;
	mov.l	@_H_reg32_1,er3 ;
	mov.l	@_L_reg32_1,er2 ;

	cmp.l	#0,er4		; Verifie si le diviseur est à 0.
	beq	div64_6			;
	mov.b	#33,r6l		; charge le nombre de bits de multiplication.	
	andc	#254,ccr
div64_1:	
	bcs	div64_3			;
	cmp.l	er4,er3		;
	bhi	div64_3			;
	beq	div64_3			;
div64_2:
	shll.l	er5			;
	jmp	div64_4			;
div64_3:
	orc	#1,ccr			; Met la carry à 1
	rotxl.l	er5			;
	sub.l	er4,er3		;
div64_4:
	shll.l	er2			;
	rotxl.l	er3			;
	dec.b	r6l				;
	bne	div64_1			;
div64_6:
	mov.l	er5,@_L_reg32_1 ;
	mov.l	er5,@_L_reg32_2 ;
	mov.l	er5,er2					;
	rts

 Conclusion

Pour la multiplication, je l'ai repris d'un livre de Maths App.
Pour la division, Je me suis creusé les meninges (en fait j'ai pas trouvé d'infos)


J'ai aussi fait une extraction de racine carré sur un registre 32 bits, mais très lent... Si l'un de vous à des algo sur le sujet je suis preneur (Pas de virgule flottante/Approximation_succesive, ca m'oblige à recasser tout mon code)... Et oui je suis feignant



 Sources de la même categorie

TROIS CODE EN MOTOROLA X68K, SPARC ET EN MIPS R3000 par inform113
Source avec Zip ANNUAIRE TELEPHONIQUE EN M68K par izou
Source avec Zip BOOTCOM par patatalo
CLÉ DALLAS + I2C (24C32) par MiTcH37
PIC 16F84 - TIMER PCF8583 - EEPROM 24LC65, COMMUNICATION I2C... par darktears

 Sources en rapport avec celle ci

Source avec Zip Source avec une capture LIBRAIRIE DE DÉSASSEMBLAGE 32 BITS ET 64 BITS par beatrix2004
Source avec Zip V86 HOOK BIOS/DOS par patatalo

Commentaires et avis

Commentaire de Vermifuge le 15/11/2003 11:34:22

Pourquoi tu utilise pas le coprocesseur ? C'est bcp plus rapide et plus simple à mettre en place...

@+
Vermi

Commentaire de BarthOlivier le 15/11/2003 12:04:33

Le malheur c'est que c'est une carte que j'ai fabriquée. Je n'ai pas de coprocesseur arithmetique dessus !!! Ca aurait été intéressant et effectivement plus rapide mais vu le prix  ....

On vas dire que c'est un compromis... On paye souvent le prix de ses erreurs ou de ses choix ....

Commentaire de Vermifuge le 15/11/2003 12:14:35

lol, oki. si tu veux j'ai toutes les routines pour calculer sans le coprocesseur. Passe moi ton mail et je t'envoi ça. :)

@+
Vermi

Commentaire de BarthOlivier le 15/11/2003 12:44:56

voici : BarthOlivier@free.fr et merci pour tout

Commentaire de jc_amacher le 16/11/2003 15:37:38

Bonjour,

J'ai implémenté l'algorithme dit "Héron d'Alexadrie" sur AT mega 128 (8 bits, 16 MHz) qui me permet d'extraire une racine avec une précision de 10E7 en 300us.

Pas de virgule flottante, uniquement des long.

Le code s'inscrit dans une routine un peu longue qui m'a permis d'obtenir une meilleure précision qu'en flottant pour des calculs trigo. Il mixte C et assembleur. Il est dispo et toutes les remarques seront les bienvenues.

Je suis aussi à la recherche d'un algo rapide (8bits) pour diviser par 100.000.000, le mien se traîne un peu  

Commentaire de frobinet le 18/11/2003 09:59:19

Bonjour,

Je suis aussi interressé par des routines pour calculer sans le coprocesseur. Mon adresse mail est robinet.gemic@wanadoo.fr
merci d'avance !

Commentaire de jod1019 le 10/07/2008 00:08:05

Merci cela me permettra de faire mon projet

 Ajouter un commentaire


Discussions en rapport avec ce code source dans le forum

operands 16/32bits [ par gblade ] qqun sait comment l'assembleur de débrouille pour qu'au chargement de notre exécutable les segments soient en 16 ou 32bits ? existe t il une instruct je veux faire une multiplication sur 64bit [ par falcon007de ] je programme avec masm 5.11 est je veux faire une multiplication sur 64bit ou plus s´il le fautdivision aussi sur 64bitdefinire des variable sur Projet X-OS (un mini système d'exploitation 16/32bits) [ par aladdin ] je suis entrain de développer un mini OS en 16/32 bits (surtout 32bits)et j'aimerais avoir des idées des propositions, et de participation au developp tasm, couleurs 32bits ou 24bits? [ par qbced ] Lu all! J'me suis mit à la prog asm, la j'arrive à afficher une image en 800*600*32bits, mais mon prob c'est que la plage memoire pour un pixel est de Division par 5 avec PIC [ par lionel57 ] Bonjour,Je suis débutant dans la programmation des PIC et j'aurait besoin d'aide pour élaborer une routine qui permet de diviser une varaible N de 16 le pic 16F84 [ par nassimapfe ] salut monsieur ou madame ToutEnMasmje vous envois mon message , et je vous remercier de  votre aide.ma question cette fois est com division sur 32 bits [ par biboucat ] Bonsoir tout le monde, je suis à la recherche dans le cadre d'un projet d'un algorithme permettant de faire des divisions avec un diviseur et div multiplication et overflow [ par piopium ] Alors voilà, je dois faire une calculatrice en assembleur, l'utilisateur peut rentrer 2 entiers nombres compris en 0 et 9999 mais lorsque j'&#233 Multiplication signée [ par WiebeN ] Bonjour,Je commence tout juste l'assembleur en cours. Je programme avec EMU8086 (émulateur pour processeur 8086) via Windows XP.Mon problème est le su correct ???? [ par w4kfu ] Bonsoir , je suis en train d'écrire un programme assembleur ou à l'intérieur il y'a une routine de conversion de chaine (hexa) en decimale(chaine) , p


Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Mars 2010
LMMJVSD
1234567
891011121314
15161718192021
22232425262728
293031    

Consulter la suite du CalendriCode

Photothèque

 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,562 sec (4)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales