a quoi sert l'alignement ? - ASM - Programmation
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).
Marsh Posté le 31-03-2003 à 14:12:03
merci de ta réponse
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 !
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.
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
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.
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) :
|
Les données sont évidemment des exemples.
Donc, mettons que tu veuilles lire dans EAX la donnée située à l'adresse 00000005h :
|
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 ?
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
Marsh Posté le 31-03-2003 à 16:57:04
Tout à fait
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é !
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 ?
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 : |
RDTSC
Marsh Posté le 01-04-2003 à 16:20:27
chrisbk a écrit : harko, tu m'as repondu sur blabla |
done
Marsh Posté le 02-04-2003 à 13:39:27
Harkonnen a écrit : RDTSC |
ça veut dire quoi
Marsh Posté le 02-04-2003 à 13:42:04
ReplyMarsh Posté le 02-04-2003 à 13:45:34
chrisbk a écrit : |
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
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?
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
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)
---------------
Bougredane et bougre d'andouille ne font qu'un !