JB
Je déclare mon buffer
si je veux lire le buffer; le len c'est 1000 ou 4000Code:buffer dd 1000 dub (0h)
merciCode:
1
2
3
4
5
6
7
8 mov ecx,1000 "ou 4000" boff: mov eax,[buffer+ecx] dec ecx dec ecx dec ecx dec ecx jnz boff
papi
Version imprimable
JB
Je déclare mon buffer
si je veux lire le buffer; le len c'est 1000 ou 4000Code:buffer dd 1000 dub (0h)
merciCode:
1
2
3
4
5
6
7
8 mov ecx,1000 "ou 4000" boff: mov eax,[buffer+ecx] dec ecx dec ecx dec ecx dec ecx jnz boff
papi
La syntaxe de Masm étant ce qu'elle est (ce que je déplore) elle apporte un nombre de confusions hélas inutiles par manque de clarté et ceci en est un des nombreux exemples. La taille n'étant pas indiquée clairement tu hésites sur sa référence et c'est bien naturel (hélas...)
Byte, Word, DWord, QWord...
Tu sembles hésiter seulement entre Byte et DWord...
Il me semble qu'un -> mov ecx 1000 | L0: mov eax D$buffer*ecx*4 | dec ecx | jns L0< <-- si tu es base 0, serait plus lisible et maintenable. Ceci dit, je pense que c'est un exemple illustratif vu que le contenu DWord d'eax n'est pas utilisé ni testé...
@Plouchh papiX
merci plouchh
j'hésite entre le byte et le dword , paque le buffer est déclaré en dword "buffer dd"
mais le nombre après "dd" c'est 1000 ; ce 1000 c'est le nombre de dd ou le nombre de byte ?.
la syntaxe "ecx * 4 ", elle fait quoi ? est-elle plus rapide que 4 dec ?
tu es sûr de ton "jns" (saut ,si positif) , paque ecx = 0 ; il le considére comme positif ou pas
si oui il fait un tour de plus !? non ?
papi
Je ne répond pas aux question sur le compilateur Masm habituellement... c'est par pur égard à nos âges canoniques que je le fais et parce qu'aucun Masmeur de service ne semble te secourir...
C'est exactement le noeud du problème: Un syntaxe porteuse de confusions comme tous les compilateurs. Là, les spécialistes de cette cochonnerie, te donnerons toutes les explications nécessaires...Citation:
j'hésite entre le byte et le dword , paque le buffer est déclaré en dword "buffer dd"
mais le nombre après "dd" c'est 1000 ; ce 1000 c'est le nombre de dd ou le nombre de byte ?.
En fait LpAdresseDeBase+Registre*TailleDéplacement+OffsetCitation:
la syntaxe "ecx * 4 ", elle fait quoi ? est-elle plus rapide que 4 dec ?
Donc: eax*4 = Id dans eax * taille DWord
Cela t'évite aussi les 4 inc du même registre qui sont pénalisants et interdisent toute optimisation par un microprocesseur (surtout multicore).
La diversification de registre permet le traitement simultané, ce qu'un seul registre ne permet pas: La mise en paralèlle des traitements n'est possible (et intéressante) que si tu ne dois pas les resynchroniser ensuite...
Oui, évidement: Je précise base 0.Citation:
tu es sûr de ton "jns" (saut ,si positif) , paque ecx = 0 ; il le considére comme positif ou pas
si oui il fait un tour de plus !? non ?
Jnz fait que tu traites un buffer ou une table jusqu'à 1 et si tu es en base 0 tu manques un élément.
Le fait de traiter si ton registre est égale à FFFF_FFFF en fin de boucle te permet de régler le problème.
Etant un MASMatique comme dirait l'autre expert, je peux répondre à ça :
Ici, le 1000 correspond au nombre d'éléments dupliqués par l'opérateur DUP (pas dub), donc si ta variable est de type DWORD, tu auras... 1000 Dwords mis à 0h en mémoire.Citation:
buffer dd 1000 dup (0h)