HORLOGES DIVERSES

Messages postés
1466
Date d'inscription
vendredi 2 janvier 2004
Statut
Modérateur
Dernière intervention
14 février 2014
- - Dernière réponse : jejamar
Messages postés
2
Date d'inscription
samedi 30 octobre 2004
Statut
Membre
Dernière intervention
23 juin 2010
- 23 juin 2010 à 12:24
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/51936-horloges-diverses

Afficher la suite 
cs_patatalo
Messages postés
1466
Date d'inscription
vendredi 2 janvier 2004
Statut
Modérateur
Dernière intervention
14 février 2014
1 -
ça faisait longtemps qu'on avait pas vu un code aussi interessant sur asmfr.

Juste une petite remarque:
394. invoke MoveToEx,hdc,106,39,0
395. invoke LineTo,hdc,106,40

pourrait être:
lea esi,[coordonnees]
push 0
push 0
push 0
push hdc
lp1:
mov eax,[esi]
mov edx,[esi+1*4]
mov [esp+1*4],eax
mov [esp+2*4],edx
call MoveToEx
inc dword ptr [esp+2*4]
call LineTo
cmp dword ptr [esi+2*4],-1
lea esi,[esi+2*4]
jne lp1
lea esp,[esp+4*4]
...

@++
jejamar
Messages postés
2
Date d'inscription
samedi 30 octobre 2004
Statut
Membre
Dernière intervention
23 juin 2010
-
Merci patatalo pour cette remarque justifiée.
Je n'avais pas utilisé cette forme plus courte et beaucoup plus élégante pour la raison suivante:
Je n'y avais même pas pensé!!!!mea culpa.
J'ai donc tenté de suivre ce précieux conseil mais je me suis heuté à quelques petits problèmes:
1) Mes tableaux xTab et yTab étant des tableaux de bytes,il m'a fallu adapter un peu le décalage dans ces 2 tableaux.
2) la valeur de esp n'était pas correcte au retour des call.
J'ai résolu cela par une sauvegarde au départ et une restitution après chaque appel.
3) la fin de boucle à été résolue par un compteur décrémenté à chaque tour,mais curieusement les instructions suivantes n'ont pas fonctinné :

dec Cpt2
cmp Cpt2,0
inc esi
inc edi
jne lpt1
Pour m'en sortir j'ai dû utiliser 2 instructions de saut.
Voici la nouvelle procédure Minutes :
;*****************************************
Minute proc
mov Cpt2,60
lea esi,xTab
lea edi,yTab
push 0
push 0
push 0
push hdc
mov Retour,esp
lp1:
movzx eax,byte ptr[esi]
movzx edx,byte ptr[edi]
mov [esp+1*4],eax
mov [esp+2*4],edx
call MoveToEx
mov esp,Retour
inc dword ptr[esp+2*4]
call LineTo
mov esp,Retour
dec Cpt2
cmp Cpt2,0
je lp2
inc esi
inc edi
jmp lp1
lp2:
lea esp,[esp+4*4]
ret
Minute endp
;*******************************
dans .data? :
Retour dd ?
Cpt2 dd ?
@++
cs_patatalo
Messages postés
1466
Date d'inscription
vendredi 2 janvier 2004
Statut
Modérateur
Dernière intervention
14 février 2014
1 -
re,


l'instruction inc modifie le zero du registre des flags, le jne lpt1 n'est donc pas correct.
lea edi,[edi+1] ira car l'instruction lea ne modifie pas le registre des flags:

xTab db 100,106,113,119,125,131,136,141,145,150,154,156,158,160,161,161,161,159,158,156,154,149,145,140,136,131,125,119,113,107,100,94,87,81,76,69,64,59,54,51,47,44,42,41,39,38,39,40,41,44,45,50,54,59,64,69,75,81,87,94
yTab db 39,39,40,42,44,47,51,55,59,65,69,75,81,88,94,100,107,113,119,125,131,136,141,145,150,154,156,158,160,161,162,161,160,158,156,153,149,146,141,136,131,125,119,113,106,100,93,87,81,75,68,64,59,54,51,46,44,42,40,39,39
endTab db -1


Minute proc
lea esi,xTab
push 0
push 0
push 0
push hdc
lp1:
movzx eax,byte ptr[esi]
movzx edx,byte ptr[esi+(yTab-xTab)]
mov [esp+1*4],eax
mov [esp+2*4],edx
call MoveToEx
inc dword ptr[esp+2*4]
call LineTo
cmp byte ptr [esi+(yTab-xTab)+1],-1
lea esi,[esi+1]
jne lp1
lea esp,[esp+4*4]
ret
Minute endp
cs_patatalo
Messages postés
1466
Date d'inscription
vendredi 2 janvier 2004
Statut
Modérateur
Dernière intervention
14 février 2014
1 -
ceux de cette forme devront êtres prévus autrement: (mis après la première boucle)
400. invoke MoveToEx,hdc,125,44,0
401. invoke LineTo,hdc,125,46
cs_patatalo
Messages postés
1466
Date d'inscription
vendredi 2 janvier 2004
Statut
Modérateur
Dernière intervention
14 février 2014
1 -
xTab db 125,-1,100,106,113,119,125,131,136,141,94
yTab db 44,-1,39,39,40,42,47,51,55,59
endTab db -1

Minute proc
mov edi,2
lea esi,xTab
push 0
push 0
push 0
push hdc
lp1:
movzx eax,byte ptr[esi]
movzx edx,byte ptr[esi+(yTab-xTab)]
mov [esp+1*4],eax
mov [esp+2*4],edx
call MoveToEx
add [esp+2*4],edi
call LineTo
cmp byte ptr [esi+(xTab-xTab)+1],-1
lea esi,[esi+1]
jne lp1
inc esi
dec edi
jne lp1
lea esp,[esp+4*4]
ret
Minute endp

dans ce cas, tu traites d'abord les coordonnées avec 2 en ajout. au premier -1 rencontré on decremente edi qui traitera les coordonnées avec 1 en ajout des que edi devient 0, on quitte.