begin process at 2010 03 18 13:31:07
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Applications Windows

 > BOITE DE DIALOGUE WIN32 - AFFICHAGE DU CONTENU DU PROGRAMME EN COURS

BOITE DE DIALOGUE WIN32 - AFFICHAGE DU CONTENU DU PROGRAMME EN COURS


 Information sur la source

Note :
Aucune note
Catégorie :Applications Windows Classé sous :dialogbox, dialog, box, boîte, dialogue Niveau :Débutant Date de création :29/07/2005 Vu / téléchargé :4 404 / 229

Auteur : Nasman

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

 Description

Bonjour, pour commencer je vous prie d'être indulgents car c'est ma première source asm sur le site. J'ai voulu faire un petit programme utilisant les boites de dialogue pour reconnaitre un texte saisi (une adresse memoire entre 00400000 et 00405F00), d'afficher 256 octets à partir de l'adresse et les caractères ascii correspondant.



Source

  • ;programme à compiler avec Nasm et alink
  • ;
  • ;nasmw -fobj memoire.asm compile le programme (donne memoire.obj)
  • ;alink -oPE memoire.obj memoire.res link avec memoire.res (fichier ressource)
  • extern GetModuleHandleA
  • import GetModuleHandleA Kernel32.dll
  • extern ExitProcess
  • import ExitProcess Kernel32.dll
  • extern MessageBoxA
  • import MessageBoxA user32.dll
  • extern DialogBoxParamA
  • import DialogBoxParamA user32.dll
  • extern LoadIconA
  • import LoadIconA user32.dll
  • extern SetClassLongA
  • import SetClassLongA user32.dll
  • extern GetDlgItem
  • import GetDlgItem user32.dll
  • extern GetWindowTextA
  • import GetWindowTextA user32.dll
  • extern EndDialog
  • import EndDialog user32.dll
  • extern SendMessageA
  • import SendMessageA user32.dll
  • extern SetDlgItemTextA
  • import SetDlgItemTextA user32.dll
  • segment code public use32 class=CODE
  • ..start:
  • push dword 0
  • call [GetModuleHandleA]
  • push dword 0 ;valeur d'initialisation pour WM_INITDIALOG
  • push dword AppDlgProc ;adresse de la procédure de traitement
  • push dword 0 ;hWndParent
  • push dword 101 ;identifiant DialogBox
  • push eax ;hInstance, // handle of application instance
  • call [DialogBoxParamA]
  • push dword 0
  • call [ExitProcess]
  • AppDlgProc:
  • mov eax,[esp+8] ; EAX = message
  • mov edx,[esp+12] ; EDX = wParam
  • mov ecx,[esp+4] ; ECX = hdlg
  • mov [hdlg],ecx
  • cmp eax,0x111 ;WM_COMMAND
  • je short onCOMMAND
  • cmp eax, 0x110 ;WM_INITDIALOG
  • je short onINITDIALOG
  • xor eax,eax
  • ret 16
  • onINITDIALOG:
  • lea eax,[esp-44]
  • xor edx,edx
  • mov dword [eax+4],32512 ;IDI_APPLICATION
  • mov dword [eax+12],-14 ;GCL_HICON
  • mov [eax+8],ecx
  • mov [eax],edx
  • mov [eax+20],ecx
  • mov dword [eax+24],1000 ;ID_TXT
  • mov [eax+40],edx
  • mov esp,eax
  • mov dword [eax+36],8 ;nb maxi de caractères (sans zéro terminal)
  • mov dword [eax+32],0xC5 ;EM_SETLIMITTEXT
  • call [LoadIconA]
  • mov [esp+8],eax
  • call [SetClassLongA]
  • call [GetDlgItem]
  • mov [esp],eax
  • mov [htxt],eax
  • call [SendMessageA]
  • ret 16
  • onCOMMAND: ; EDX = wParam
  • cmp edx,1 ;IDOK
  • je short onOK
  • cmp edx,2 ;IDCANCEL
  • je short onCANCEL
  • ret 16
  • onCANCEL:
  • push dword 0
  • push ecx
  • call [EndDialog]
  • ret 16
  • onOK:
  • sub esp, 32 ; szbuff[20]+GetWindowText(12)
  • mov ecx,[htxt]
  • lea eax, [esp+12] ; adr szbuff(ma chaine)
  • mov dword [esp+8],20 ; nb maxi de caractères
  • mov [esp],ecx ; handle du contrôle
  • mov [esp+4],eax ; adresse chaine
  • call [GetWindowTextA] ; copie la chaine dans le buffer, la valeur de retour est le nb de caractères
  • ; esp pointe sur la chaine
  • ;xxxxxx Procédure de traitement xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
  • ; convertit la chaine de caractère en une adresse placée dans depart
  • push ebx ;sauvegarde les registres utilisés par W32
  • push edi ; " " " " "
  • xor edi,edi
  • mov ecx,4 ;4x2 octets à traduire
  • boucle mov ah,[esp+2*edi+8] ;esp+8 pointe sur la chaine de caractères
  • call asciihexa ;convertit un caractère en sa valeur numérique
  • mov al,ah
  • shl al,4
  • mov ah,[esp+2*edi+9]
  • call asciihexa ;est effectué 2 fois par octet
  • add al,ah ;digit de poids fort et digit de poids faible
  • mov [depart+ecx-1],al
  • inc edi
  • loop boucle
  • mov eax,[depart]
  • mov [memcour],eax
  • mov edx,Adresse ;adresse de la chaine qui devra être affichée
  • ; convertit l'adresse en une chaine ascii (fait l'opération inverse de précédemment) caractères 0123456789ABCDEF
  • cchaine mov ebx,memcour ;pointe sur memcour (emplacement de l'adresse de la ligne courante)
  • xor edi,edi
  • mov ecx,4 ;met 0 dans edi et 4 dans ecx
  • boucle1 mov al,[ebx+edi] ;lit les octets, du plus faible au plus élevé
  • call hexascii ;et le convertit en 2 caractères ascii
  • mov [edx+2*ecx-2],ax ;met l'octet de poids le plus faible à droite et celui le plus fort à gauche
  • inc edi ;passe à l'octet suivant
  • loop boucle1 ;terminé ?
  • ; lit 16 octets à partir de la ligne courante, affiche les valeurs et le caractère ascii correspondant (si imprimable)
  • mov ebx,[memcour]
  • xor edi,edi ;met pointeur à zéro
  • mov ecx,16 ;par tranche de 16 octets
  • boucle2 mov al,[ebx+edi] ;lit la valeur pointée à adresse+pointeur
  • ; vérifie si imprimable
  • cmp al,31
  • jna nimp ;caractère non imprimable
  • mov [edx+edi+80],al
  • jmp suite
  • nimp mov [edx+edi+80],byte 46 ;remplacé par .
  • suite ;convertit la valeur en chaine ascii
  • call hexascii ;convertit en caractères ascii
  • mov [edx+4*edi+12],ax ;affiche deux digits par octet
  • mov [edx+4*edi+14],word " " ;2 espaces
  • mov al,[ebx+edi] ;caractère ascii correspondant
  • inc edi
  • loop boucle2 ;les 16 octets sont ils terminés ?
  • mov [edx+8],dword " | " ;séparateur adresse - valeurs
  • mov [edx+76],dword " | " ;séparateur valeur - ascii
  • mov [edx+96],dword 0x0A0D2020 ;espace,espace,13,10 fin de la ligne
  • add [memcour],dword 16 ;16 caractères suivants
  • add edx,100 ;100 caractères par ligne
  • lea eax,[Adresse+1600] ;16 lignes x 100 caractères par ligne
  • cmp eax,edx
  • jbe affiche ;a-t-on tout affiché ?
  • jmp cchaine
  • affiche mov [edx],byte 0 ;fin de la chaine
  • push dword Adresse ;chaine à afficher
  • push dword 1001 ;id contrôle
  • mov eax,[hdlg] ;handle dialogbox
  • push eax
  • call [SetDlgItemTextA] ;envoie dans le contrôle
  • ; restaure les registres et retourne à la DialogBox
  • pop edi
  • pop ebx
  • add esp,20
  • ret 16
  • asciihexa: ;convertit le caractère mis dans ah en une valeur hexa clc
  • sub ah,0x30
  • and ah,ah
  • jb erreur ;<30h (avant 0)
  • cmp ah,0x9
  • jbe fin ;numérique
  • sub ah,0x7
  • cmp ah,0xA
  • jb erreur ;39h<<41h (entre 9 et A)
  • cmp ah,0xF
  • jbe fin ;alpha (A-F)
  • sub ah,0x20
  • cmp ah,0xA
  • jb erreur ;<61h (entre G et <a)
  • cmp ah,0xF
  • ja erreur ;>f
  • fin ret ;retourne à la procédure de traitement
  • erreur push dword 0
  • push dword error
  • push dword messerr
  • push dword 0
  • call [MessageBoxA]
  • mov edi,[esp+4] ;restaure les registres et retourne à la DialogBox
  • mov ebx,[esp+8]
  • add esp,32
  • ret 16
  • hexascii: ;convertit la valeur mise dans al en 2 octets al et ah (al=poids fort, ah=poids faible)
  • mov ah,al
  • shr al,4 ;lit les 4 bits de poids fort
  • cmp al,0x9 ;vérifie si numérique
  • jna num1 ;si <=9
  • add al,"A"-"0"-10 ;sinon ajoute 7
  • num1 and ah,0xf ;lit les 4 bits de poids faible
  • cmp ah,0x9
  • jna num2
  • add ah,"A"-"0"-10
  • num2 add ax,"00" ;rajoute "0"-0 à chacun des octets
  • ret
  • segment data public use32 class=DATA
  • htxt dd 0
  • hdlg resd 1
  • error db "Erreur",0
  • messerr db "Adresse Hexa de 8 caractères requise",0
  • Titre db "Examen de la mémoire",0
  • depart resd 1 ;adresse de base
  • memcour resd 1 ;adresse de la ligne courante (bloc de 16 caractères)
  • Adresse resb 1601
;programme à compiler avec Nasm et alink
;
;nasmw -fobj memoire.asm			compile le programme (donne memoire.obj)
;alink -oPE memoire.obj memoire.res		link avec memoire.res (fichier ressource)



extern GetModuleHandleA
import GetModuleHandleA Kernel32.dll
extern ExitProcess
import ExitProcess Kernel32.dll
extern MessageBoxA
import MessageBoxA user32.dll
extern DialogBoxParamA
import DialogBoxParamA user32.dll
extern LoadIconA
import LoadIconA user32.dll
extern SetClassLongA
import SetClassLongA user32.dll
extern GetDlgItem
import GetDlgItem user32.dll
extern GetWindowTextA
import GetWindowTextA user32.dll
extern EndDialog
import EndDialog user32.dll
extern SendMessageA
import SendMessageA user32.dll
extern SetDlgItemTextA
import SetDlgItemTextA user32.dll


segment code public use32 class=CODE

..start:
   	push dword 0
	call [GetModuleHandleA]
	push dword 0			;valeur d'initialisation pour WM_INITDIALOG
	push dword AppDlgProc		;adresse de la procédure de traitement
	push dword 0			;hWndParent
	push dword 101			;identifiant DialogBox
	push eax			;hInstance,	// handle of application instance
	call [DialogBoxParamA]

	push dword 0
	call [ExitProcess]

AppDlgProc:
	mov eax,[esp+8]   		; EAX = message
	mov edx,[esp+12]  		; EDX = wParam
	mov ecx,[esp+4]   		; ECX = hdlg
	mov [hdlg],ecx
	cmp eax,0x111			;WM_COMMAND
	je  short onCOMMAND
	cmp eax, 0x110			;WM_INITDIALOG
	je  short onINITDIALOG
	xor eax,eax
	ret 16

onINITDIALOG:
	lea eax,[esp-44]
	xor edx,edx
	mov dword [eax+4],32512		;IDI_APPLICATION
	mov dword [eax+12],-14 		;GCL_HICON
	mov [eax+8],ecx
	mov [eax],edx
	mov [eax+20],ecx
	mov dword [eax+24],1000		;ID_TXT
	mov [eax+40],edx
	mov esp,eax
	mov dword [eax+36],8		;nb maxi de caractères (sans zéro terminal)
	mov dword [eax+32],0xC5		;EM_SETLIMITTEXT
	call [LoadIconA]
	mov [esp+8],eax
	call [SetClassLongA]
	call [GetDlgItem]
	mov [esp],eax
	mov [htxt],eax
	call [SendMessageA]
	ret 16

onCOMMAND:     ; EDX = wParam
	cmp edx,1			;IDOK
	je  short onOK
	cmp edx,2			;IDCANCEL
	je  short onCANCEL
	ret 16

onCANCEL:
   	push dword 0
	push ecx
	call [EndDialog]
	ret 16

onOK:
	sub esp, 32  			; szbuff[20]+GetWindowText(12)
	mov ecx,[htxt]
	lea eax, [esp+12]  		; adr szbuff(ma chaine)
	mov dword [esp+8],20		; nb maxi de caractères
	mov [esp],ecx			; handle du contrôle
	mov [esp+4],eax			; adresse chaine
	call [GetWindowTextA]		; copie la chaine dans le buffer, la valeur de retour est le nb de caractères
					; esp pointe sur la chaine



;xxxxxx	Procédure de traitement xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

;	convertit la chaine de caractère en une adresse placée dans depart

   	push ebx			;sauvegarde les registres utilisés par W32
	push edi			;	"	"	"	"	"
	xor edi,edi
	mov ecx,4			;4x2 octets à traduire
boucle	mov ah,[esp+2*edi+8]		;esp+8 pointe sur la chaine de caractères
	call asciihexa			;convertit un caractère en sa valeur numérique
	mov al,ah
	shl al,4
	mov ah,[esp+2*edi+9]
	call asciihexa			;est effectué 2 fois par octet
	add al,ah			;digit de poids fort et digit de poids faible
	mov [depart+ecx-1],al
	inc edi
	loop boucle


	mov eax,[depart]
	mov [memcour],eax
	mov edx,Adresse			;adresse de la chaine qui devra être affichée

;	convertit l'adresse en une chaine ascii (fait l'opération inverse de précédemment) caractères 0123456789ABCDEF

cchaine	mov ebx,memcour			;pointe sur memcour (emplacement de l'adresse de la ligne courante)
	xor edi,edi
	mov ecx,4			;met 0 dans edi et 4 dans ecx 
boucle1	mov al,[ebx+edi]		;lit les octets, du plus faible au plus élevé
	call hexascii			;et le convertit en 2 caractères ascii
	mov [edx+2*ecx-2],ax		;met l'octet de poids le plus faible à droite et celui le plus fort à gauche
	inc edi				;passe à l'octet suivant
	loop boucle1			;terminé ?


;	lit 16 octets à partir de la ligne courante, affiche les valeurs et le caractère ascii correspondant (si imprimable)
	mov ebx,[memcour]
	xor edi,edi			;met pointeur à zéro
	mov ecx,16			;par tranche de 16 octets
boucle2	mov al,[ebx+edi]		;lit la valeur pointée à adresse+pointeur

;	vérifie si imprimable
	cmp al,31
	jna nimp			;caractère non imprimable
	mov [edx+edi+80],al
	jmp suite
nimp	mov [edx+edi+80],byte 46	;remplacé par .


suite	;convertit la valeur en chaine ascii
	call hexascii			;convertit en caractères ascii
	mov [edx+4*edi+12],ax		;affiche deux digits par octet
	mov [edx+4*edi+14],word "  "	;2 espaces
	mov al,[ebx+edi]		;caractère ascii correspondant
	inc edi
	loop boucle2			;les 16 octets sont ils terminés ?
	
	mov [edx+8],dword " |  "	;séparateur adresse - valeurs
	mov [edx+76],dword " |  "	;séparateur valeur - ascii
	mov [edx+96],dword 0x0A0D2020	;espace,espace,13,10		fin de la ligne

	add [memcour],dword 16		;16 caractères suivants
	add edx,100			;100 caractères par ligne
	lea eax,[Adresse+1600]		;16 lignes x 100 caractères par ligne
	cmp eax,edx
	jbe affiche			;a-t-on tout affiché ?
	jmp cchaine

affiche	mov [edx],byte 0		;fin de la chaine
	push dword Adresse		;chaine à afficher
	push dword 1001			;id contrôle
	mov eax,[hdlg]			;handle dialogbox
	push eax
	call [SetDlgItemTextA]		;envoie dans le contrôle
	


;	restaure les registres et retourne à la DialogBox

	pop edi
	pop ebx
	add esp,20
	ret 16


asciihexa: 			;convertit le caractère mis dans ah en une valeur hexa   						clc
	sub ah,0x30
	and ah,ah
	jb erreur		;<30h (avant 0)
	cmp ah,0x9
	jbe fin			;numérique
	sub ah,0x7
	cmp ah,0xA
	jb erreur		;39h<<41h (entre 9 et A)
	cmp ah,0xF
	jbe fin			;alpha	(A-F)
	sub ah,0x20
	cmp ah,0xA
	jb erreur		;<61h (entre G et <a)
	cmp ah,0xF
	ja erreur		;>f
fin	ret			;retourne à la procédure de traitement

erreur	push dword 0
	push dword error
	push dword messerr
	push dword 0
	call [MessageBoxA]
	mov edi,[esp+4]		;restaure les registres et retourne à la DialogBox
	mov ebx,[esp+8]
	add esp,32
	ret 16

hexascii:			;convertit la valeur mise dans al en 2 octets al et ah (al=poids fort, ah=poids faible)
	mov ah,al
	shr al,4		;lit les 4 bits de poids fort
	cmp al,0x9		;vérifie si numérique
	jna num1		;si <=9
	add al,"A"-"0"-10	;sinon ajoute 7
num1	and ah,0xf		;lit les 4 bits de poids faible
	cmp ah,0x9
	jna num2
	add ah,"A"-"0"-10
num2	add ax,"00"		;rajoute "0"-0 à chacun des octets
	ret





segment data public use32 class=DATA

htxt    dd 0
hdlg	resd 1
error	db "Erreur",0
messerr	db "Adresse Hexa de 8 caractères requise",0
Titre	db "Examen de la mémoire",0
depart	resd 1	;adresse de base
memcour resd 1	;adresse de la ligne courante (bloc de 16 caractères)
Adresse resb 1601

 Conclusion

Plusieurs routines pourront être récupérées:
conversion ascii/hexa et vice versa
lecture des données saisies
envoi d'un texte dans une EditBox

nb si vous reconnaissez des morceaux de code, je les ai peut-être récupérés ailleurs (il faut parfois procéder ainsi pour voir comment celà marche). J'ai également effectué des transcriptions MASM/NASM

Le code est commenté pour permettre d'aider (peut-être) de plus Newbie que moi

 Fichier Zip

Les Membres Club peuvent télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !
  • memoire.asmTélécharger ce fichier [Réservé aux membres club]Voir ce fichier6 727 octets
  • memoire.exeTélécharger ce fichier [Réservé aux membres club]3 904 octets
  • memoire.rcTélécharger ce fichier [Réservé aux membres club]Voir ce fichier577 octets
  • memoire.resTélécharger ce fichier [Réservé aux membres club]296 octets
  • memoire1.objTélécharger ce fichier [Réservé aux membres club]1 431 octets

Télécharger le zip


 Sources du même auteur

Source avec Zip REPRÉSENTATION D'UNE SPHÈRE EN 3D (FLAT SHADING)
Source avec Zip CRÉATION DE DIFFÉRENTS EXÉCUTABLES AVEC NASM ET ALINK
Source avec Zip Source avec une capture PROGRAMME DE VISUALISATION ET D'ANALYSE SPECTRALE DE FICHIER...
Source avec Zip CRÉATION DE GRAPHIQUES AVEC LES API WINDOWS
Source avec Zip EXEMPLES SIMPLES DE FICHIERS ÉCRITS AVEC NASM

 Sources de la même categorie

Source avec Zip Source avec une capture BASE DE REGISTRE ET TRANSFERE DE BMP DANS SYSTEM32 par vincent2795
Source avec Zip RÉSOUDRE LES PROBLÈMES DE VERSIONS DU SYSTÈME OU DE DLL par ToutEnMasm
Source avec Zip DEXPLORE INTERFACE HELP2 MICROSOFT DOCUMENT EXPLORER par ToutEnMasm
Source avec Zip DEXPLORE INTERFACE HELP2 MICROSOFT DOCUMENT EXPLORER par ToutEnMasm
Source avec Zip Source avec une capture ANALYSEUR DE TRAFIC (WINPCAP) par ORdream

Commentaires et avis

Aucun commentaire pour le moment.

 Ajouter un commentaire


Discussions en rapport avec ce code source dans le forum

edit box et kinescopage [ par gcab ] je possede une edit box, et j'envisage l'achat d'un imageur pour reporter sur pellicule nos productions. existe-til un moyen pour connecter directemen musique et compression [ par vincentcarbonie ] Etant en Terminale S option SI, je dois réaliser pour la fin de l'année un projet, appelé sympathiquement par l'Education Nationale "PPE" (Projet Pers Dialog [ par RM50Man ] Comment on appelle(je voudrais le code en asm)&nbsp;une fenetre windows ??RM50man Création de boite de dialogue [ par Nasman ] Bonjour, J'aimerais savoir comment cr&#233;er une boite de dialogue standard Win32 pour saisir un texte. Les exemples que j'ai pu trouver sur le Web help Boites de dialogue + ressources sous fasm [ par cyrus458 ] Salut. J'aimerais me mettre definitivement a l'assembleur et pour commencer j'aimerais faire un programme qui afiche une boite de dialogue le probleme Dialogue entre un PIC16F84A et un CPC6128 [ par vara956 ] SAlut à vous tous,Je voudrai dialoguer entre mon CPC 6128 et mon pic16F84A ou 876A pour une central de commandeQulq'un aurait une idee du comment dois smdr d'un pabx (o.box) [ par pabx123 ] bonjour je viens de finir une application de taxation d'un pabx , mais jai un petit problème! donc si quelqu'un a une ou des idées sur la manière d'ob


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,796 sec (3)

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