BruNews
Messages postés21040Date d'inscriptionjeudi 23 janvier 2003StatutModérateurDernière intervention21 août 2019
-
4 mai 2006 à 14:31
BruNews
Messages postés21040Date d'inscriptionjeudi 23 janvier 2003StatutModérateurDernière intervention21 août 2019
-
5 mai 2006 à 10:38
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.
BruNews
Messages postés21040Date d'inscriptionjeudi 23 janvier 2003StatutModérateurDernière intervention21 août 2019 5 mai 2006 à 10:38
push ebx
met sa valeur sur la pile pour restituer en sortie de fonction.
Aller dur forum asmfr pour le reste, ça évitera de flooder cette source avec des questions sans rapport au sujet principal.
cs_Joky
Messages postés1787Date d'inscriptionlundi 22 novembre 2004StatutMembreDernière intervention31 janvier 20092 5 mai 2006 à 00:28
Lol je veux bien mais bon je voulais juste savoir pourquoi ces registres et les réponses aux questions que j'ai posé dans les commentaires sur ta fonction lol :)
J'suis chiant je sais ;)
BruNews
Messages postés21040Date d'inscriptionjeudi 23 janvier 2003StatutModérateurDernière intervention21 août 2019 4 mai 2006 à 17:37
Allez, pour Joky (quelques cycles en moins):
__declspec(naked) int __fastcall bnatoi(char *szsrc)
{ // ECX = szsrc
__asm {
xor edx, edx
mov [esp-4], ebx
mov dl, [ecx]
xor eax, eax
xor ebx, ebx
cmp dl, '-'
jb short nbrEXIT
jne short noPOINT
inc ecx
dec ebx
nbrLOOP:
mov dl, [ecx]
noPOINT:
cmp dl, '0'
jb short nbrSTOP
cmp dl, '9'
ja short nbrSTOP
lea eax, [eax+eax*4]
sub dl, '0'
add eax, eax
inc ecx
add eax, edx
jmp short nbrLOOP
nbrSTOP:
add eax, ebx
xor eax, ebx
nbrEXIT:
mov ebx, [esp-4]
ret 0
}
}
lea peut faire addition, soustraction et multiplication en 1 passe.
donc: lea eax, [eax+eax*4]
fait: eax = eax * 5;
vecchio56
Messages postés6535Date d'inscriptionlundi 16 décembre 2002StatutMembreDernière intervention22 août 201014 4 mai 2006 à 17:26
WM_MOUSEMOVE et les autres messages de la souris sont effectivement recus automatiquement car la Listbox à la capture de la souris (je fais un SetCapture).
WM_KEYDOWN & WM_MOUSEWHEEL sont deux messages utiles qui ne sont pas envoyés à la ListBox car elle n'a pas le focus, et on ne peut pas le lui donner
vecchio56
Messages postés6535Date d'inscriptionlundi 16 décembre 2002StatutMembreDernière intervention22 août 201014 4 mai 2006 à 17:22
Mon dieu, voila ce qui arrive quand on commente de l'assembleur!
Je me doute que ecx contient le param, qu'est ce que ca pourrait être d'autre...
Je précise que c'est BruNews qui a écrit cette fonction, pas moi
Maintenant que tu sais ce que contient ecx, tu va peut être mieux comprendre
Taron31
Messages postés199Date d'inscriptionvendredi 16 avril 2004StatutMembreDernière intervention28 février 2008 4 mai 2006 à 17:21
OK merci, autre chose : en réalité tu fait passer les messages WM_KEYDOWN & WM_MOUSEWHEEL à la ListboxProc et les autres y sont capturés directement sans passer par la WndProc principale ?
cs_Joky
Messages postés1787Date d'inscriptionlundi 22 novembre 2004StatutMembreDernière intervention31 janvier 20092 4 mai 2006 à 17:17
Bon allez dites moi si j'me trompe
xor eax, eax //Mettre eax à 0, pourquoi pas mov eax, 0 ???
push ebx //Placer ebx sur la pile. à quoi correspond ebx ?
xor edx, edx //Mettre edx et ebx à 0
xor ebx, ebx //...
cmp byte ptr[ecx], '-' //On compare le ??? de ecx avec '-'
jne short L1 //On va à L1 si ce n'est pas égal
inc ecx //On incrément ecx qui correspond au compteur je crois ?
mov edx, 0xFFFFFFFF //On place 0xFFFFFFFF dans edx ? pourquoi ?
L1: //étiquette L1
mov bl, byte ptr[ecx] //On place le premier bit de ecx ? dans bl
cmp bl, '0' //On le compare à '0'
jb short L2 //On saute à L2 si en dessous de '0'
cmp bl, '9' //On le compare à '9'
ja short L2 //On saute à L2 si au dessus de '0'
lea eax, dword ptr[eax + 4 * eax] //???
sub bl, '0' //On soustrait '0' à bl
add eax, eax //On ajoute eax dans eax
inc ecx //Incrémente le compteur ?
add eax, ebx //ajouter eax et ebx dans eax, pk ? que contient ebx
jmp short L1 //On fait en boucle
L2:
add eax, edx //ajouter eax et edx placé dans eax
pop ebx //On enlève de la pile et on met dan ebx
xor eax, edx //???
vecchio56
Messages postés6535Date d'inscriptionlundi 16 décembre 2002StatutMembreDernière intervention22 août 201014 4 mai 2006 à 16:42
Si on ne le fait pas, ca pose des problèmes quand on a des fenêtres filles que se chevauchent (ici ca ne se voit pas car il n'y a pas déja de fenêtre fille à l'endroit ou on crée la listbox).
En gros si tu crée deux fenêtres filles au même endroit, elles vont se bagarrer pour être au premier plan et en général, on a des résultats étonnants
Taron31
Messages postés199Date d'inscriptionvendredi 16 avril 2004StatutMembreDernière intervention28 février 2008 4 mai 2006 à 16:38
Vecchio56 : pourquoi doit-on placer le bureau comme Parent (HWND_DESKTOP) à la ListBox ?
vecchio56
Messages postés6535Date d'inscriptionlundi 16 décembre 2002StatutMembreDernière intervention22 août 201014 4 mai 2006 à 14:50
Effectivement, c'est corrigé
Coup de bol (?), il se déchargeait quand même
BruNews
Messages postés21040Date d'inscriptionjeudi 23 janvier 2003StatutModérateurDernière intervention21 août 2019 4 mai 2006 à 14:31
Gaffe si tu es en entrypoint perso, entoure le return final dans un #ifdef pour y mettre un ExitProcess() au lieu du return sinon deans de nombreuses situations ton exe ne déchargera pas.
5 mai 2006 à 10:38
met sa valeur sur la pile pour restituer en sortie de fonction.
Aller dur forum asmfr pour le reste, ça évitera de flooder cette source avec des questions sans rapport au sujet principal.
5 mai 2006 à 00:28
J'suis chiant je sais ;)
4 mai 2006 à 17:37
__declspec(naked) int __fastcall bnatoi(char *szsrc)
{ // ECX = szsrc
__asm {
xor edx, edx
mov [esp-4], ebx
mov dl, [ecx]
xor eax, eax
xor ebx, ebx
cmp dl, '-'
jb short nbrEXIT
jne short noPOINT
inc ecx
dec ebx
nbrLOOP:
mov dl, [ecx]
noPOINT:
cmp dl, '0'
jb short nbrSTOP
cmp dl, '9'
ja short nbrSTOP
lea eax, [eax+eax*4]
sub dl, '0'
add eax, eax
inc ecx
add eax, edx
jmp short nbrLOOP
nbrSTOP:
add eax, ebx
xor eax, ebx
nbrEXIT:
mov ebx, [esp-4]
ret 0
}
}
lea peut faire addition, soustraction et multiplication en 1 passe.
donc: lea eax, [eax+eax*4]
fait: eax = eax * 5;
4 mai 2006 à 17:26
WM_KEYDOWN & WM_MOUSEWHEEL sont deux messages utiles qui ne sont pas envoyés à la ListBox car elle n'a pas le focus, et on ne peut pas le lui donner
4 mai 2006 à 17:22
Je me doute que ecx contient le param, qu'est ce que ca pourrait être d'autre...
Je précise que c'est BruNews qui a écrit cette fonction, pas moi
Maintenant que tu sais ce que contient ecx, tu va peut être mieux comprendre
4 mai 2006 à 17:21
4 mai 2006 à 17:17
xor eax, eax //Mettre eax à 0, pourquoi pas mov eax, 0 ???
push ebx //Placer ebx sur la pile. à quoi correspond ebx ?
xor edx, edx //Mettre edx et ebx à 0
xor ebx, ebx //...
cmp byte ptr[ecx], '-' //On compare le ??? de ecx avec '-'
jne short L1 //On va à L1 si ce n'est pas égal
inc ecx //On incrément ecx qui correspond au compteur je crois ?
mov edx, 0xFFFFFFFF //On place 0xFFFFFFFF dans edx ? pourquoi ?
L1: //étiquette L1
mov bl, byte ptr[ecx] //On place le premier bit de ecx ? dans bl
cmp bl, '0' //On le compare à '0'
jb short L2 //On saute à L2 si en dessous de '0'
cmp bl, '9' //On le compare à '9'
ja short L2 //On saute à L2 si au dessus de '0'
lea eax, dword ptr[eax + 4 * eax] //???
sub bl, '0' //On soustrait '0' à bl
add eax, eax //On ajoute eax dans eax
inc ecx //Incrémente le compteur ?
add eax, ebx //ajouter eax et ebx dans eax, pk ? que contient ebx
jmp short L1 //On fait en boucle
L2:
add eax, edx //ajouter eax et edx placé dans eax
pop ebx //On enlève de la pile et on met dan ebx
xor eax, edx //???
4 mai 2006 à 16:42
En gros si tu crée deux fenêtres filles au même endroit, elles vont se bagarrer pour être au premier plan et en général, on a des résultats étonnants
4 mai 2006 à 16:38
4 mai 2006 à 14:50
Coup de bol (?), il se déchargeait quand même
4 mai 2006 à 14:31