Introduction à l'assembleur | ||
---|---|---|
Instructions | Questionnaire | Support au questionnaire |
La syntaxe de l'instruction "mov" est:
mov destination, source |
Par exemple:
mov eax, 3 ; équivalent approximatif C++ : "eax = 3;" |
Donc, l'opération suivante:
mov word ptr [ebp-8],offset main+23h (00401033) |
signifie déposer à l'endroit en mémoire équivalent au contenu du registre "ebp" - 8 [1] la valeur se trouvant à l'adresse[2] "00401033".
Question piège: |
pourquoi, selon vous, y a-t-il une différence au niveau assembleur entre le code requis pour l'affectation à la ligne (1) et celles à la ligne (2)? |
Le code généré pour l'instruction
sSomme1+= iCompteur++; |
peut se diviser comme suit (remarquez la démarcation; remarquez aussi que les numéros qu'on voit à gauche dans le dévermineur sont les adresses des opérations, et n'ont pas d'incidence sur le code lui-même dans ce cas, et c'est pourquoi elles ont été omises):
mov ax,word ptr [ebp-8] add ax,word ptr [ebp-4] mov word ptr [ebp-8],ax |
mov ecx,dword ptr [ebp-4] add ecx,1 mov dword ptr [ebp-4],ecx |
Le code généré pour l'instruction
sSomme2= sSomme2 + sSomme1; |
se présente comme suit si on le prend par étapes:
mov edx,dword ptr [ebp-0Ch] and edx,0FFFFh |
mov eax,dword ptr [ebp-8] and eax,0FFFFh |
add edx,eax |
mov word ptr [ebp-0Ch],dx |
Les deux premières copient les valeur des variables à additionner dans des registres. À chaque fois, un et bit à bit est fait sur le registre.
L'idée à laquelle il faut réfléchir est: si le registre a une taille de 32 bits et la variable une taille de 16 bits, que retrouvera-t-on dans la partie haute du registre après le "mov"?
Et pourquoi utilise-t-on deux (2) registres 32 bits pour additionner des valeurs sur 16 bits? Il doit bien y avoir une raison, mais laquelle?
Celle-ci est laissée à attention... :)
Celle-ci est laissée à attention... :)
Notez que l'instruction "cmp a, b" compare les valeurs de "a" et de "b", et doit être suivie par une instruction de branchement ou de saut. Par exemple
while (iCompteur < MAX_COMPTEUR) |
cmp dword ptr [ebp-4],0Ah jge main+5Fh (0040106f) |
signifie "comparer (cmp) la valeur à l'adresse dword ptr [ebp-4] avec la valeur 0Ah[3], puis sauter à l'instruction se trouvant à l'adresse 0040106f si la première valeur est plus grande ou égale (jge, pour jump if greater than or equal) à la seconde.
Note: |
en plus de jge,on trouve aussi "jg" (jump if greater than), "jle" (jump if lower than or equal), "jl" (jump if lower than). |
Note: |
Un saut inconditionnel s'écrit "jmp", comme dans jmp main+2Bh (0040103b) ce qui signifie "quoiqu'il arrive, poursuit l'exécution à partir de celle se trouvant à l'adresse 0040103b" |
Discutez de vos trouvailles avec votre professeur...
[1] Avec la fenêtre "memory", allez voir l'endroit que cela représente: laquelle des deux variables de type "short" est-ce?
[2] Une adresse, pour nous, sera la manière de désigner un endroit en mémoire
[3] 0Ah en assembleur signifie 0x0a--ou 10--en C++.