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 ! ;-)
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.