Pb JMP et fonctions

Pour discuter de l'assembleur
lionel_om
Messages : 1500
Inscription : jeu. 25/mars/2004 11:23
Localisation : Sophia Antipolis (Nice)
Contact :

Pb JMP et fonctions

Message par lionel_om »

Bonjour tout le monde.
J'ai des petits pb en ASM avec PB.

1 )
D'abord, j'arrive pas à faire des sauts : JMP, JNE, etc.
Je sais pas comment faire des labels.

2 )
Comment faire une fonction et la compiler (faut utiliser quel logiciel) ?
Si vous avez des petits exemples...

J'aurais sans doute d'autres questions à vous poser. Actuellement je fais des fonctions (avec Turbo Debuger de Borland) pour convertir des images BMP couleurs 24bits en images noi/blancs.
Puis avec un algo je fais des repérages des contours des images (pour créer des masques).
C'ets un TP en plusieurs scéances.
Je posterai les codes une fois finis pour ceux qui seraient intéressés

Merci d'avance
Webmestre de Basic-univers
Participez à son extension: ajouter vos programmes et partagez vos codes !
Anonyme2
Messages : 3518
Inscription : jeu. 22/janv./2004 14:31
Localisation : Sourans

Re: Pb JMP et fonctions

Message par Anonyme2 »

lionel_om a écrit :Bonjour tout le monde.
J'ai des petits pb en ASM avec PB.

1 )
D'abord, j'arrive pas à faire des sauts : JMP, JNE, etc.
Je sais pas comment faire des labels.
Tu devrais lire mon tutoriel n° 7 et plus particulièrement le chapitre - Le corps d'un programme FASM pour les librairies PureBasic - ou tu devrais trouver pas mal de réponses à tes questions

Pour le label ou étiquette, tu mets le nom suivi par deux points, par exemple

Retour:

Evite de mettre des labels qui commencent par PB_ pour éviter d'éventuels conflits avec PB

Les labels sont sensibles à la casse dans FASM, alors fais attention
2 )
Comment faire une fonction et la compiler (faut utiliser quel logiciel) ?
Si vous avez des petits exemples...
Pour compiler, tu dois créer ton ton fichier asm (1 par commande), tu dois aussi créer un fichier descripteur (PureasmTools qui fait partie de Pureasm peut créer un fichier desc pour 1 commande), recherche Pureasm sur le forum

Sur mon site tu trouveras mon outil PureLibCreation

Son fonctionnement est simple.

Tu mets dans le même dossier les fichiers asm et le fichier descripteur et tu cliques sur créer une librairie et tu sélectionne ton fichier descripteur (fonctionne aussi avec un glissser/déposer du fichier desc)

Il ne faut pas d'autres fichiers asm que ceux de ta librairie dans le dossier

S'il y a des erreurs retournées par FASM, elles seront dans le presse papier


Si tu as des problèmes pour créer ta lib, je t'aiderais au fur et à mesure

Je suis interessé par les codes :D
lionel_om
Messages : 1500
Inscription : jeu. 25/mars/2004 11:23
Localisation : Sophia Antipolis (Nice)
Contact :

Message par lionel_om »

Merci pour tes réponses Denis. Dès que j'aurai du temps (encore qq médians en vue :? ) j'irai regarder le tuto7 et ton site :D

Pour les label, en fait j'essayé de créer un label "label" et ça passait pas, qd j'ai fais mis "coucou" ca a marché (j'suis un boulet, ok...)

Pour les codes je vais mettere ce que j'ai sous la main. J'ai preske fini le code des contours...

Code1 : conversion n/b (pas de moi, dc vachement optimisé

Code : Tout sélectionner

; IMAGE.ASM ************************************************************
;
; MI01 - TP Assembleur 2 à 5
;
; Traitement d'une image 32 bits. 
; **********************************************************************

LOCALS
JUMPS

.686
.MODEL FLAT, STDCALL

.DATA
	
.CODE

PUBLIC		_process_image_asm

; **********************************************************************
; Sous-programme _process_image_asm 
; 
; Réalise le traitement d'une image 32 bits.
;
; Entrées sur la pile : Largeur de l'image (entier 32 bits)
;			Hauteur de l'image (entier 32 bits)
;			Pointeur sur l'image source (dépl. 32 bits)
;			Pointeur sur l'image tampon 1 (dépl. 32 bits)
;			Pointeur sur l'image tampon 2 (dépl. 32 bits)
;			Pointeur sur l'image finale (dépl. 32 bits)
; **********************************************************************

_process_image_asm	PROC NEAR	; Point d'entrée du programme
		

		PUSH	EBP
		MOV	EBP, ESP
		
		PUSH	ESI
		PUSH	EDI
		PUSHF

		PUSH	EAX
		PUSH	EBX
		PUSH	ECX
		PUSH	EDX

		MOV	ESI, [EBP + 16]
		MOV	EDI, [EBP + 20]
		MOV	ECX, [EBP + 12]
		IMUL	ECX, [EBP + 8]

	boucle:	DEC	ECX
		MOV	EDX, [ESI + ECX * 4]

		MOV	EBX, EDX
		AND	EBX, 00FF0000h
		SHR	EBX, 010h
		IMUL	EBX, 04Dh
		
		MOV	EAX, EDX
		AND	EAX, 0000FF00h
		IMUL	EAX, 096h
		SHR	EAX, 08h
		ADD	EBX, EAX

		MOV	EAX, EDX
		AND	EAX, 000000FFh
		IMUL	EAX, 01Dh
		ADD	EBX, EAX
		
		SHR	EBX, 08h
		
		MOV	EAX, EBX
		SHL	EBX, 08h
		ADD	EAX, EBX
		SHL	EBX, 08h
		ADD	EAX, EBX

		MOV	[EDI + ECX * 4], EAX
		
		OR	ECX, ECX
		JNE	boucle

		POP	EDX
		POP	ECX
		POP	EBX
		POP	EAX
		
		POPF
		POP	EDI
		POP	ESI
		POP	EBP

          	RET			; Retour à la fonction main

_process_image_asm	ENDP

	        END

Code 2 : ca c'est le mien, bcp plus long (et oué, je suis encore un newbee ... :lol: )

Code : Tout sélectionner

; IMAGE.ASM ************************************************************
;
; MI01 - TP Assembleur 2 à 5
;
; Traitement d'une image 32 bits. 
; **********************************************************************

LOCALS
JUMPS

.686
.MODEL FLAT, STDCALL

.DATA
	
.CODE

PUBLIC		_process_image_asm

; **********************************************************************
; Sous-programme _process_image_asm 
; 	Réalise le traitement d'une image 32 bits.
;
; Entrées sur la pile (32 bits) :
;	Largeur , Hauteur de l'image
;	Ptr image source, tampon1, tampon2, finale
; **********************************************************************

_process_image_asm	PROC NEAR	; Point d'entrée du programme

  ; On sauvegarde ESI et EDI
  PUSH  ESI	
  PUSH  EDI

  
  ; Représentation du registre A
  ; ********************
  ; *       EAX        *  
  ; ********************
  ; *        *    AX   *
  ; ********************
  ; *    *   * AH * AL *
  ; ********************
  
  
  ; Calcul du nb d'itération (nb de pixel de l'image)
  MOV  ESI, [ESP + 12] ; on met la largeur
  MOV  EAX, [ESP + 16] ; on met la hauteur
  MUL  ESI
  MOV  ESI, EAX

; Registres et valeurs associées
  ; ESI => nb de pixels de l'image
  ; EDI => compteur de boucle
  ; EDX => adresse du pixel
  
  
  

  MOV  EDI, 0

;boucle:
@@boucle:
  
  ; On stoque dans EBX l'adresse du pixel
  MOV EBX, [ESP + 20]	; adresse de l'image source
  MOV EAX, 4
  MUL EDI
  ADD EBX, EAX
  
  ; On recopie l'adresse du pixel dans EDX
  MOV EDX, EBX
  
; Calcul de la couleur "moyenne" d'un pixel
  DEC EDX
  ; Calcul de R
  MOV  AH, 4Ch
  MOV  AL, byte[EDX+2]
  MUL  AH ;=> AX
  MOV  BX, AX
  ; Calcul de G
  MOV  AH, 96h
  MOV  AL, byte[EDX+1]
  MUL  AH ;=> AX
  ADD  BX, AX
  ; Calcul de B
  MOV  AH, 1Dh
  MOV  AL, byte[EDX+0]
  MUL  AH ;=> AX
  ADD  BX, AX


  ; On décale les bits de BX de 8 vers la droite
  SHR BX, 8
  AND EBX, 0FFh ; On nettoie le reste du registre EBX pour plus de sécurité
  
  
  PUSH EBX
    ; Chargement de l'adresse du pixel de tampon1
    MOV EBX, [ESP + 28]
    MOV EAX, EDI
    SHL EAX, 2 ; Multiplication par 4
    ADD EBX, EAX
  POP ECX
  
  ; Modification des pixels
  DEC EBX	; C'est bizarre, on doit faire un décalage ?!!! :S
  MOV byte[EBX],   0	; niveau de luminosité
  MOV byte[EBX+1], CL	; pixel bleu
  MOV byte[EBX+2], CL	; pixel vert
  MOV byte[EBX+3], CL	; pixel rouge


  ; Incrémentation du compteur de boucle
  INC  EDI
  
  ; Test de rebouclage...
  CMP  ESI, EDI
  JNE @@boucle



  ; On dépile et réaffecte les 2 registres sauvegardés
  POP  EDI
  POP  ESI
  RET		; Retour à la fonction main

_process_image_asm	ENDP

  END
L'autre code je vais le posté durant le week-end (je l'ai pas sur ma clé USB là)
Je retravaillerai les codes (qd j'aurai le temps) pour en faire des fonctions PB.

@++
Webmestre de Basic-univers
Participez à son extension: ajouter vos programmes et partagez vos codes !
Anonyme2
Messages : 3518
Inscription : jeu. 22/janv./2004 14:31
Localisation : Sourans

Message par Anonyme2 »

J'ai un doute,

ton code c'est pour travailler en turbo ou pour faire une librairie pour PureBasic ?

Moi j'ai répondu pour une lib Purebasic en asm
lionel_om
Messages : 1500
Inscription : jeu. 25/mars/2004 11:23
Localisation : Sophia Antipolis (Nice)
Contact :

Message par lionel_om »

Non c'est du turbo C
Mais ds qq jours (ou semaines) je retravaillerai ce fichier (l'optimisé) pour le faire marcher sous PB.
Webmestre de Basic-univers
Participez à son extension: ajouter vos programmes et partagez vos codes !
Anonyme2
Messages : 3518
Inscription : jeu. 22/janv./2004 14:31
Localisation : Sourans

Message par Anonyme2 »

Pour PureBasic , Pour les registres eax et edx peuvent être utilisés sans restriction, mais les autres doivent êtres sauvegardés et restitués à la fin s'ils sont utilisés (si tu utilises des API, il faut sauvegarder ebx et ecx)
Dr. Dri
Messages : 2527
Inscription : ven. 23/janv./2004 18:10

Message par Dr. Dri »

Denis a écrit :si tu utilises des API, il faut sauvegarder ebx et ecx
bon à savoir ^^
d'où viens l'info ???

Dri
Anonyme2
Messages : 3518
Inscription : jeu. 22/janv./2004 14:31
Localisation : Sourans

Message par Anonyme2 »

J'avais posé la question sur le forum anglais il y a pas mal de temps et El_Choni m'a répondu ça et c'est vrai, j'ai fais des essais et parfois ces registres étaient modifiés au retour d'un API
lionel_om
Messages : 1500
Inscription : jeu. 25/mars/2004 11:23
Localisation : Sophia Antipolis (Nice)
Contact :

Message par lionel_om »

Effectivement, c'est bon à savoir.
Merci pour l'info Denis :D

Sinon c'est vrai que j'ai programmé ces fonctions juste pour la nécessité du TP. Mais si je les recodes pour PB, je sauvegarderai les autres registres et je créerai un cadre de pile.
Là j'ai un peu fais ça à la bourrin, mais bon c'est mon premier prog ASM ! :D
Webmestre de Basic-univers
Participez à son extension: ajouter vos programmes et partagez vos codes !
Répondre