30 0 80KB
DUT Informatique
Architecture des ordinateurs
Ann´ee 2012/2013
TD 9 - Assembleur x86 -
´ Exercice 1. Etat de la m´ emoire Tracer l’´etat de la m´emoire lorsque les instructions suivantes sont ex´ecut´ees. instruction
eax 0x0
ebx 0x0
edx 0x0
esp 0xbfffee80
[esp] 0x0
ZF CF OF SF
mov eax, 255 mov ebx, 0xff push eax add eax, ebx mov eax, [esp] add al, bl mov eax, 127 mov ebx, 127 add al, bl mov eax, esp mov ebx, [esp] push 1 push 2 mov ebx, [esp+4] pop ebx mov eax, 0xffffffff mul ebx imul ebx mov eax, 0xffffffff mul eax mov eax, 0xffffffff imul eax
0 # # #
0 # # #
0 # # #
0 # # #
#
#
#
#
# #
# #
# #
# #
# # # # # # # # # # # # #
# # # # # # # # # # # # #
# # # # # # # # # # # # #
# # # # # # # # # # # # #
Exercice 2. Op´ erations bit ` a bit et masques 1. Placer les 8 bits de poids faible de eax dans ebx en utilisant un masque. 2. Peut-on proc´eder autrement ? 3. Placer le 2`eme octet (en partant du poids fort) de eax dans bl en utilisant un masque. 4. Proposer une solution sans masque. 5. Remplacer le 2`eme octet (en partant du poids fort) de eax par bl en fabriquant un masque. 6. Compter le nombre de 1 dans al en utilisant des masques (r´esultat dans bl). 7. Proposer une solution sans masque. 8. Echanger les contenus de eax et ebx sans utiliser de registre interm´ediaire. Exercice 3. Sauts et boucles 1. Calculer le maximum de eax et ebx. 2. Calculer le minimum de eax, ebx et ecx.
3. Traduire les bouts de code suivants en Assembleur : a.
j = 1; for (i = 10 ; i != 0 ; i--) j=j*2;
c.
j = 1; for (i = 1 ; i < 10 ; i++) j=j*i;
b.
i = 10; j = 0; do{ j=j+i*i; i--; } while (i>0);
d.
i = 10; j = 0; while (i>0){ j=j+i*i; i--; }
Instruction mov dst xchg ds1 push src pop dst add dst adc dst sub dst sbb dst mul src imul src div src idiv src inc dst dec dst neg dst not dst and dst or dst xor dst sal dst sar dst shl dst shr dst rol dst ror dst rcl dst rcr dst cmp sr1 jmp adr jxx adr loop adr loopx adr nop
src ds2
src src src src
src src src nb nb nb nb nb nb nb nb sr2
Description d´eplace src dans dst ´echange ds1 et ds2 place src au sommet de la pile supprime le sommet de la pile et le place dans dst ajoute src `a dst ajoute src `a dst avec retenue soustrait src `a dst soustrait src `a dst avec retenue multiplie eax par src (r´esultat dans edx|eax) multiplie eax par src (cplt `a 2) divise edx|eax par src (eax=quotient, edx=reste) divise edx|eax par src (cplt `a 2) 1 + dst dst − 1 −dst place (not dst) dans dst place (src AND dst) dans dst place (src OR dst) dans dst place (src XOR dst) dans dst d´ecalage arithm´etique `a gauche de nb bits de dst d´ecalage arithm´etique `a droite de nb bits de dst d´ecalage logique `a gauche de nb bits de dst d´ecalage logique `a droite de nb bits de dst rotation `a gauche de nb bits de dst rotation `a droite de nb bits de dst rotation `a gauche de nb bits de dst avec retenue rotation `a droite de nb bits de dst avec retenue compare sr1 et sr2 saut vers l’adresse adr saut conditionn´e par xx vers l’adresse adr r´ep´etition de la boucle nb de fois (nb dans ecx) r´ep´etition de la boucle conditionn´ee par x ne rien faire