Introduction à l'assembleur | ||
---|---|---|
Instructions | Questionnaire | Support au questionnaire |
1. Examinez le code assembleur généré pour les lignes (1) et (2). Selon vous, que signifient les mots clés "word" et "dword"?
2. Notez que le code généré pour la ligne (4) peut se séparer en deux blocs de trois (3) opérations assembleur. Remarquez aussi que "sSomme1" et "iCompteur" sont représentés par "[ebp-8]" et "[ebp-4]" respectivement. Est-ce que l'incrémentation de "iCompteur" se fait avant ou après son ajout à "sSomme1"?
3. Le code généré pour manipuler "sSomme1" et "sSomme2" à la ligne (5) inclut des opérations "and" (et bit à bit). Selon vous, pourquoi? Remarquez aussi que les deux dernières lignes assembleur correspondantes sont "add edx, eax" (addition sur 32 bits) puis "mov word ptr [ebp-0Ch], dx" (copie de 16 bits). Pourquoi?
Note: |
pour vous aider, sachez que les registres dont le nom commence par un "e" comme "eax" sont des registres 32 bits; ceux ne commençant pas par un "e" mais finissant par un "x" (comme "ax") sont des registres 16 bits. |
4. Comment le compilateur semble-t-il gérer le code généré pour les opérations d'affectation à la ligne (6) du code source? Est-ce que cela suit correctement l'ordre des opérations attendu dans le programme C++?
5. Quelles différences remarquez-vous dans la gestion de l'opération d'auto décrément aux lignes (8) et (9)?
6. Grosse question: quelles différences (et quelles similitudes) distinguez-vous pour ce qui est du code généré pour les boucles "while", "do ... while" et "for" aux lignes (3), (7) et (10), et (11) et (12)? Selon vous, y en a-t-il une des trois qui semble plus performante que les autres, et si oui: en quoi?
7. Remplacez la ligne suivante:
for (iCompteur= 0; iCompteur<MAX_COMPTEUR; iCompteur++) // (11) { sSomme1 = sSomme1 + iCompteur; } // (12) |
par
iCompteur= 0; for (;iCompteur<MAX_COMPTEUR;) // (11) { sSomme1 = sSomme1 + iCompteur; iCompteur++; } // (12) |
dans le programme. À vos yeux, est-ce que cela simplifie ou complexifie la boucle?
Note: |
dans chaque cas, portez une attention particulière à l'endroit où le compilateur positionne l'opération d'incrémentation relatif à la répétitive, et à l'effet que ce choix a sur le reste du code généré. |