Sunteți pe pagina 1din 3

Model pentru test de laborator

Fie următorul program (incomplet!) scris în limbaj de asamblare x86-32:

1 ELEM Struct
next [A] NULL
2 prev [A] NULL
3 text [A] NULL
4 ELEM EndS
5 LIST Struct
6
7 first dd NULL
8 last dd NULL
9 current dd NULL
10 LIST EndS
11 .data
12
13 List LIST {}
14 Add_LastNode Proc
15 mov ebx, halloc( [B] )
16 mov eax, List. [F]
[C] eax == NULL
17 mov [ebx].ELEM.prev, NULL
18 mov [ebx].ELEM.next, NULL
19 mov List.first, ebx
20 mov List.last, ebx
21 mov List.current, ebx
22 [D]
23 mov [ebx].ELEM.prev, eax
24 mov [ebx].ELEM.next, NULL
25 mov [eax].ELEM. [G] , ebx
mov List.last, ebx
26 [E]
27 mov esi, input("Last element: ")
28 mov ecx, len(esi)
29 inc ecx
30 push ecx
31 mov edi, halloc(ecx)
32 pop ecx
33 mov [ebx].ELEM.text, edi
34 rep movsb
35 ret
36 Add_LastNode EndP
37
38
39
40
1. Completați în codul de mai sus locul/locurile marcat/marcate cu [A] astfel încât
o variabilă de tip ELEM să ocupe 96 de octeți.
DD/DWORD

2. Completați în codul de mai sus locul/locurile marcat/marcate cu [B] astfel încât să


se aloce spațiu de memorie pentru o structură de tip ELEM?
SIZE ELEM

3. Completați în codul de mai sus locul/locurile marcat/marcate cu [C], [D], [E] astfel
încât blocul de instrucțiuni următor să se execute o singură dată atunci când condiția
evaluată este adevărată.
C : .if | D : .else | E : .endif

4. Completați în codul de mai sus locul/locurile marcat/marcate cu [C], [D], [E] astfel
încât blocul de instrucțiuni următor să se execute atât timp cât condiția evaluată este
adevărată.
C : .while | E : .endw | D : .break. if EAX ! = NULL

5. Completați în codul de mai sus locul/locurile marcat/marcate cu [F] astfel


încât registrul EAX să conțină adresa ultimului element al listei.
.last

6. Completați în codul de mai sus locul/locurile marcat/marcate cu [F] astfel


încât registrul EAX să conțină adresa primului element al listei.
.first

7. Completați în codul de mai sus locul/locurile marcat/marcate cu [G] astfel


încât operatia efectuata de functie sa fie cea sugerata de numele functiei.
.next

8. În urma executării instrucțiunii de pe linia 17, registrul EBX primește valoarea


0x00002AC0. Care este adresa de memorie generată/utilizată în instrucțiunea de
pe linia 20?
EBX + 4 : 00002AC4

9. Sirul de caractere citit dupa executarea instructiunii de pe linia 31 este: “AABBCC”.


Care este valoarea regisrtului ECX dupa executarea instructiunii de pe linia 33?
7
10. Sirul de caractere citit dupa executarea instructiunii de pe linia 31 este: “AABBCC”.
Dupa executarea instructiunii de pe linia 35, valoarea registrului EDI este
0x00001480. Care este valoarea stocata la locatia cu adresa 0x00001484 dupa
executarea instructiunii de pe linia 38?
C

11. Explicati efectul (rostul) instructiunii de pe linia 27. Exlicati de ce face ceea ce face,
nu doar ce face!
Pentru a se pune in evidenta ultimul element din lista, pentru care nu va exista informatie de
inlantuire inainte,ci doar inapoi.
12. Cat spatiu de memorie ocupa o lista cu trei elemente, daca structurile de date care
definesc lista si elemenele listei au toti membrii de tip double word?
1 Element : 12 octeti => 3 Elemente : 36 octeti

13. Fie urmatoarele valori pentru o lista: List.first = 0x00006820, List.last =


0x00008750, List.current = 0x00004800. Care dintre valorile de mai sus se modifica
si cum (care este noua valoare) in urma apelului functiei din enunt, daca
instructiunea de pe linia 17 pune valoarea 0x00002BA0 in registrul EBX?
List.Last = EBX =0x 00008750

14. In ce conditii functia din enunt nu modifica valoarea List.current?


EAX != NULL

S-ar putea să vă placă și