Dll - fonctions produit scalaire et produit vectoriel [masm]

Description

Ceci est un exemple de DLL permetant d'effectuer un produit scalaire ou un produit vectoriel en assembleur. Elle renvoi meme le resulat sous forme d'objet vecteur pour le produit vectoriel. Simple, efficace, rapide, elle peut etre utilisée simplement avec n'importe quelle autre application. Ci-joint dans le zip un exemple d'utilisation avec Visual Basic.

A oui, cependant, elle ne gere que les entiers LONG (4octets), donc pas de nombre a virgule pour le moment.

Source / Exemple :


.386
.model		flat,stdcall

.code
;#############################################
DLLMain	proc	p1,p2,p3
		mov	      eax,1
		ret
DLLMain	endp
;#############################################
CreerVecteur     proc export Vecteur:ptr,X,Y,Z
;Rentre trois composantes dans un vecteur
;On met les entiers LONG (4octets) aux emplacements memoire
;du type 'Vecteur' (défini sous VB)
            push	esi
            mov	esi,Vecteur	
            mov	eax,X           
            mov	[esi],eax   
            mov	eax,Y
            mov	[esi+4],eax
            mov	eax,Z
            mov	[esi+8],eax
            pop     	esi
            ret
CreerVecteur	endp
;#############################################
ProdScalaire	proc	export Vecteur1,Vecteur2
;Calcule le produit scalaire de deux vecteurs
;Vecteur est une variable de 12 octets, ou chacune des
;coordonnés x, puis y, puis z, occupe 4 octets
            push esi
            ;-------------------
            mov     esi,Vecteur1
            mov     eax,[esi]         ; eax <-- Vecteur1.x
            mov     esi,Vecteur2
            mov     ebx,[esi]         ; ebx <-- Vecteur2.x
            imul     ebx                ; eax <-- eax * ebx
            mov     ecx,eax
            ;-------------------
            mov     esi,Vecteur1
            mov     eax,[esi+4]     ; eax <-- Vecteur1.y
            mov     esi,Vecteur2
            mov     ebx,[esi+4]     ; eax <-- Vecteur2.y
            imul     ebx
            add      ecx,eax
            ;-------------------
            mov     esi,Vecteur1
            mov     eax,[esi+8]     ; eax <-- Vecteur1.z
            mov     esi,Vecteur2
            mov     ebx,[esi+8]     ; ebx <-- Vecteur2.z
            imul     ebx
            add      eax,ecx
            ;-------------------
            pop esi
            ret
ProdScalaire		endp
;#############################################
ProdVectoriel	proc	export Vecteur1,Vecteur2,VecteurFin:ptr
;Calcule le produit vectoriel de deux vecteurs
;Vecteur est une variable de 12 octets, ou chacune des
;coordonnés x, puis y, puis z, occupe 4 octets
            push esi
            ;-------------------
            mov     esi,Vecteur1
            mov     eax,[esi+4]     ; eax <-- Vecteur1.y
            mov     esi,Vecteur2
            mov     ebx,[esi+8]     ; ebx <-- Vecteur2.z
            imul     ebx                ; eax <-- eax * ebx
            mov     ecx,eax
            mov     esi,Vecteur1
            mov     eax,[esi+8]     ; eax <-- Vecteur1.z
            mov     esi,Vecteur2
            mov     ebx,[esi+4]     ; ebx <-- Vecteur2.y
            imul     ebx                ; eax <-- eax * ebx
            sub      ecx,eax           ; ecx <-- ecx - eax
            mov     esi,VecteurFin
            mov     [esi],ecx          ; VecteurFin.x <-- ecx
            ;-------------------
            mov     esi,Vecteur1
            mov     eax,[esi+8]     ; eax <-- Vecteur1.z
            mov     esi,Vecteur2
            mov     ebx,[esi]         ; ebx <-- Vecteur2.x
            imul     ebx                ; eax <-- eax * ebx
            mov     ecx,eax
            mov     esi,Vecteur1
            mov     eax,[esi]         ; eax <-- Vecteur1.x
            mov     esi,Vecteur2
            mov     ebx,[esi+8]     ; ebx <-- Vecteur2.z
            imul     ebx                ; eax <-- eax * ebx
            sub      ecx,eax           ; ecx <-- ecx - eax
            mov     esi,VecteurFin
            mov     [esi+4],ecx     ; VecteurFin.y	<-- ecx
            ;-------------------
            mov     esi,Vecteur1
            mov     eax,[esi]         ; eax <-- Vecteur1.x
            mov     esi,Vecteur2 
            mov     ebx,[esi+4]     ; ebx <-- Vecteur2.y
            imul     ebx                ; eax <-- eax * ebx
            mov     ecx,eax
            mov     esi,Vecteur1
            mov     eax,[esi+4]    ; eax <-- Vecteur1.y
            mov     esi,Vecteur2
            mov     ebx,[esi]        ; ebx <-- Vecteur2.x
            imul     ebx                ; eax <-- eax * ebx
            sub      ecx,eax          ; ecx <-- ecx - eax
            mov     esi,VecteurFin
            mov     [esi+8],ecx      ; VecteurFin.z <-- ecx
            ;-------------------
            pop esi
            ret
ProdVectoriel		endp
;#############################################
.data
    
end		DLLMain

Conclusion :


Ceci est ma premiere source en assembleur, j'espere qu'elle vous sera utile, sinon bah ... tampis lol
Je tiens à remercier l'auteur de la source : http://www.asmfr.com/code.aspx?ID=18833 sans qui j'aurais été dans l'impossibilité d'écrire la mienne ! ;-)

Codes Sources

A voir également

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.