a quoi sert l'alignement ?

a quoi sert l'alignement ? - ASM - Programmation

Marsh Posté le 31-03-2003 à 13:43:20    

bonjour
 
ceci est un topic sérieux. je sais que j'ai déconné, mais ce n'est pas le cas ici, et ça ne se reproduira plus
 
suite à mon topic sur les démos, j'ai décidé de me mettre à l'assembleur. inutile de vous dire que je galère, mais je veux y arriver.
 
j'entends souvent parler de données qui doivent être alignées sur des adresses multiples de 2, 4, 8, etc...  
 
à quoi sert il d'aligner des données de cette manière ?
 
merci de vos réponses, et encore une fois je m'excuse pour mes précédents topics (celui sur les modos était vraiment immonde)
 
:jap:


---------------
Bougredane et bougre d'andouille ne font qu'un !
Reply

Marsh Posté le 31-03-2003 à 13:43:20   

Reply

Marsh Posté le 31-03-2003 à 13:55:14    

Soit z l'adresse d'un tableau
soit i l'index qui permet d'adresser un élément du tableau
soit s la taille d'un élément du tableau.
 
Sachant que tous les éléments du tableau DOIVENT avoir la même taille (cela fait partie du concept même de tableau ou vecteur en informatique), l'adresse calculée sera z + (i*s).


---------------
Whichever format the fan may want to listen is fine with us – vinyl, wax cylinders, shellac, 8-track, iPod, cloud storage, cranial implants – just as long as it’s loud and rockin' (Billy Gibbons, ZZ Top)
Reply

Marsh Posté le 31-03-2003 à 14:12:03    

merci de ta réponse :jap:
 
mais ce que je ne comprends pas, c'est pourquoi je dois déclarer le début de ce tableau sur une adresse paire ?
 
si je déclare le tableau suivant :
 
db 10,20,30,40,50
 
quelle différence ça fait si je le déclare sur une adresse impaire ou si je le force sur une adresse paire avec ALIGN ? le tableau est déclaré quand meme, et tous ses éléments ont la meme taille !
 
:??:


---------------
Bougredane et bougre d'andouille ne font qu'un !
Reply

Marsh Posté le 31-03-2003 à 14:13:33    

le CPU prefere, dis toi juste ca ;) Me semble que certaines instructions SSE marchent bpc mieux si c aligne que si pas.
 
 

Reply

Marsh Posté le 31-03-2003 à 14:29:11    

chrisbk a écrit :

le CPU prefere, dis toi juste ca ;) Me semble que certaines instructions SSE marchent bpc mieux si c aligne que si pas.


ok, mais suite au topic des démos, j'ai eu l'occasion de regarder des sources de vieilles démos PC et amiga, et je vois partout des directives d'alignement, alors que le SSE n'existait pas à l'époque.
 
pourquoi le CPU préfère ? je sais, je suis chiant, mais j'ai vraiment envie d'apprendre :(


---------------
Bougredane et bougre d'andouille ne font qu'un !
Reply

Marsh Posté le 31-03-2003 à 14:30:04    

le SSE c t un exemple ;)

Reply

Marsh Posté le 31-03-2003 à 14:36:24    

parce que les CPU ont un point commun: ils ne comprennent que le binaire, c'est à dire la base 2.  Donc tout fonctionne par puissance de 2.  Les tailles des types de données usuelles sont toutes des multiples de 2.  Dans le moins usuel, il y a un format décimal qui tient sur 10 bytes au lieu de 8.


Message édité par drasche le 31-03-2003 à 14:36:54

---------------
Whichever format the fan may want to listen is fine with us – vinyl, wax cylinders, shellac, 8-track, iPod, cloud storage, cranial implants – just as long as it’s loud and rockin' (Billy Gibbons, ZZ Top)
Reply

Marsh Posté le 31-03-2003 à 15:28:02    

Les CPU actuels sont des CPU avec un bus de données de 32 bits, ce qui signifie qu'ils peuvent lire 4 octets en une passe. Les CPU 16 bits de l'Amiga et du ST étaient des 16 bits (2 octets en une passe)
 
On a donc le shéma mémoire suivant (en 32 bits) :


Addresse                 Donnée
00000000h                12345678h
00000004h                45678912h
00000008h                3698452Fh
0000000Ch                DFE45658h
etc...


Les données sont évidemment des exemples.
 
Donc, mettons que tu veuilles lire dans EAX la donnée située à l'adresse  00000005h :
 


push [00000005h]
pop eax


 
EAX sera chargé avec la valeur 67891236h (j'ai simplifié, normalement ce devrait être 36128967h, because big/little endian, mais ça simplifie).  
 
Ce qui veut dire que :  
- Le CPU a d'abord lu la valeur située en 00000004h (45678912h)
- A isolé l'octet de poids fort pour récupérer les 3 octets démarrant en 00000005h (678912h)
- A lu la valeur située en 00000008h (3698452Fh)
- A isolé l'octet de poids fort pour le conserver (36h)
- Enfin, a fait un OU logique pour "coller" les 4 octets, ce qui donne 36128967h
 
Ca nous fait donc au bas mot : un MOV, un AND, un MOV, un AND et un OR réalisés de façon interne par le CPU, tout ça pour lire une valeur. Si cette valeur avait été située sur une adresse multiple de 4, un simple MOV aurait suffi pour tout lire.
 
Meme topo si tu veux récupérer 2 octets dans AX (alignement sur une adresse multiple de 2), etc...
 
Comprendo ?
 


---------------
J'ai un string dans l'array (Paris Hilton)
Reply

Marsh Posté le 31-03-2003 à 16:24:18    

dans le meme genre d'idee, ne pas mixer les tailles de donnes demandees :
 
genre :
 
 
movq mm0, QWORD PTR[eax];  
movd DWORD PTR [eax],mm1;
 
 
pas bon :O

Reply

Marsh Posté le 31-03-2003 à 16:57:04    

Tout à fait :jap:
 
Et ne pas oublier à propos de l'alignement : ça consomme de la mémoire. Pourquoi ? Pour la simple raison que tu "sautes" des octets quand tu alignes.  
Par exemple, si la précédente donnée n'utilise que 3 octets, la précédente donnée démarrera 2 octets plus loin, laissant ainsi le 4ème octet libre et donc inutilisé !
Mais ceci n'est rien en comparaison du gain de performance procuré !


---------------
J'ai un string dans l'array (Paris Hilton)
Reply

Marsh Posté le 31-03-2003 à 16:57:04   

Reply

Marsh Posté le 01-04-2003 à 13:44:29    

merci harkonnen pour ta réponse. je t'avais décidément bien mal jugé !
 
j'ai une autre question : comment faire pour mesurer le temps d'execution d'une fonction en assembleur ?


---------------
Bougredane et bougre d'andouille ne font qu'un !
Reply

Marsh Posté le 01-04-2003 à 13:51:57    

vic le viking a écrit :

merci harkonnen pour ta réponse. je t'avais décidément bien mal jugé !


de rien de rien ! évite juste de respirer le même air que moi...
 

vic le viking a écrit :


j'ai une autre question : comment faire pour mesurer le temps d'execution d'une fonction en assembleur ?


RDTSC


---------------
J'ai un string dans l'array (Paris Hilton)
Reply

Marsh Posté le 01-04-2003 à 14:27:34    

harko, tu m'as repondu sur blabla :O

Reply

Marsh Posté le 01-04-2003 à 16:20:27    

chrisbk a écrit :

harko, tu m'as repondu sur blabla :O

done


---------------
J'ai un string dans l'array (Paris Hilton)
Reply

Marsh Posté le 02-04-2003 à 13:39:27    


ça veut dire quoi :??:


---------------
Bougredane et bougre d'andouille ne font qu'un !
Reply

Marsh Posté le 02-04-2003 à 13:42:04    

vic le viking a écrit :


ça veut dire quoi :??:


 
c le nom de l'instruction, patate :O

Reply

Marsh Posté le 02-04-2003 à 13:45:34    

chrisbk a écrit :


 
c le nom de l'instruction, patate :O  


[:ddr555]
 
RDTSC retourne le nombre de cycles écoulés depuis le démarrage du processeur. EAX contient la partie basse et EDX la partie haute de ce nombre de cycles


---------------
J'ai un string dans l'array (Paris Hilton)
Reply

Marsh Posté le 06-07-2005 à 17:50:05    

Et est ce que cela ne vaut que pour les nombres ou est-ce valable auyssi pour les caractères?

Reply

Marsh Posté le 06-07-2005 à 17:55:56    

c'est pareil. une chaine de caractères, c'est un ensemble d'octets stockés en mémoire


---------------
J'ai un string dans l'array (Paris Hilton)
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed