Introduction à l'assembleur
Instructions Questionnaire Support au questionnaire

Laboratoire d'introduction à l'assembleur--support

Support à la question 1

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)?

Support à la question 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

Support à la question 3

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?

Support à la question 4

Celle-ci est laissée à attention... :)

Support à la question 5

Celle-ci est laissée à attention... :)

Support à la question 6

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"

Support à la question 7

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++.