Sursee și prietenii ei au reușit, cu ajutorul vostru, să cucerească Facultatea de Automatică și Calculatoare. Noua lor misiune este să conducă tot campusul și să traverseze Dambovița ca să ajungă în Regie. Noii membrii ai echiei, Luna și Mushu, vor să apeleze la cunoștintele voastre în limbaj de asamblare.
Sursee dorește să găseasca drumul până în Rectorat ca să vadă si ea vestitul OZN. Ea știe prin ce clădiri trebuie să treacă dar lista a fost amestecată. Ajutați-o să ordoneze lista prin conectarea elementelor care inițial erau alăturate.
Trebuie să implementați funcția cu semnătura struct node* sort(int n, struct node* node);
din fișierul task1.asm, care “leagă” nodurile din listă în ordine crescătoare.
Funcția primește numărul de noduri și adresa vectorului și întoarce adresa primului nod din lista rezultată.
Structura unui nod este:
struct node { int val; struct node* next; };
și, inițial, câmpul next este setat la NULL.
Antetul funcției este:
struct node* sort(int n, struct node* node);
Semnificația argumentelor este:
Funcția returneaza adresa primului nod din lista ordonată.
Inițial:
Adresă | Valoare | Next |
---|---|---|
0x32 | 2 | NULL |
0x3A | 1 | NULL |
0x42 | 3 | NULL |
Apelul funcției sort întoarce 0x3A (adresa nodului cu valoarea 1) și vectorul va arăta astfel:
Adresă | Valoare | Next |
---|---|---|
0x32 | 2 | 0x42 |
0x3A | 1 | 0x32 |
0x42 | 3 | NULL |
Mushu trebuie să ajungă la Leu, dar este împiedicat de portarul cel rău de la Precis. Acesta îi pune în față o Mașină cu stivă , adică o mașina care știe să folosească doar stiva, prin instrucțiuni de tip push și pop, pentru a lucra cu memoria. Provocarea lui Mushu este să implementeze 2 funcții pe această mașină:
Prima funcție este int cmmmc(int a, int b)
, care calculează cel mai mic multiplu comun a 2 numere, date ca parametru.
Antetul funcției este:
int cmmmc(int a, int b);
Cele două argumente sunt numerele cărora trebuie să le aflăm cel mai mic multiplu comun.
Funcția returneaza cel mai mic multiplu comun al celor două numere.
A doua funcție este int par(int str_length, char *str)
, care verifică daca o secvență de paranteze este corectă. Aceasta primește un șir care contine doar paranteze rotunde si lungimea șirului, și intoarce 1, dacă secvența e corectă, sau 0, dacă secvența e greșită.
Antetul funcției este:
int par(int str_length, char *str);
Semnificația argumentelor este:
Funcția returneaza 0 daca parantezarea nu este corectă și 1 daca parantezarea e corectă.
Luna a mers împreună cu Sursee până în Rectorat dar acum trebuie sa ajungă în Regie. Luna are de completat un rebus folosind cuvintele unui text și vă roagă să o ajutați prin a sorta cuvintele în funcție de lungime ca să îi fie mai ușor.
Pentru acest task veți avea de separat un text în cuvinte dupa niște delimitatori și, după aceea, să sortați aceste cuvinte folosind funcția qsort. Sortarea se va face întâi după lungimea cuvintelor și în cazul egalitații se va sorta lexicografic.
Va trebui să implementați 2 funcții cu semnăturile void get_words(char *s, char **words, int number_of_words);
și void sort(char **words, int number_of_words, int size);
din fișierul task3.asm.
Antetul primei funcții este:
void get_words(char *s, char **words, int number_of_words);
Semnificația argumentelor este:
Atenție, funcția nu returnează nimic, cuvintele se salveaza in vectorul words!
Antetul celei de-a doua funcții este:
void sort(char **words, int number_of_words, int size);
Semnificația argumentelor este:
Atenție, funcția nu returnează nimic, sortarea se face in-place!
number_of_words: 9 s: "Ana are 27 de mere, si 32 de pere." dupa apelul get_words: words = ["Ana", "are", "27", "de", "mere", "si", "32", "de", "pere"] dupa apelul sort: words = ["27", "32", "de", "de", "si", "Ana", "are", "mere", "pere"]
Acum că pisicile au cucerit toată Universitatea Politehnică, vor să se relaxeze aflând câteva detalii despre procesoare.
cpuid
este o instrucțiune specială a procesoarelor care folosesc arhitectura x86, sau derivate, care permite aflarea unor informații despre procesorul pe care se execută această instrucțiune.
Instrucțiunea cpuid nu primește parametri, ci se execută în funcție de conținutul registrului eax și, în anumite situații, a registrului ecx. Informațiile date ca răspuns sunt stocate în registrele eax, ebx, ecx, edx. Semnificația rezultatelor este documentată în specificația producătorilor de procesoare x86, Intel si AMD.
Vi se cere sa aflați, folosind cpuid, următoarele informații despre procesorul vostru:
Implementarea se va realiza în fișierul `task4.asm`.
qemu-i386
.Ca task-uri bonus, aveți de ales din următoarele:
Tunetele s-au oprit, au fost inlocuite de lene
Temele vor fi incarcate pe platforma de Gitlab a facultatii sau pe platforma Moodle experimentala.
Pentru incarcarea pe Gitlab, va trebui sa faceti un fork al repository-ului temei, pe care veti lucra. Puteti lucra direct pe branch-ul master al fork-ului, sau puteti face un nou branch pe fork, apoi sa creati un Pull Request spre master. In cazul variantei cu Pull Request, puteti cere review unuia dintre responsabilii temei, pentru a se uita pe cod si a va spune daca exista probleme.
In cazul realizarii temei pe Gitlab, fiecare commit va duce la verificarea automata a temei.
A doua optiune este sa folositi checker-ul local, folosind comanda sudo ./local.sh
. Asta va va reproduce mediul de testare de pe Gitlab pe masina voastra, si va verifica tema. Apoi, puteti incarca tema pe Moodle, sub forma de arhiva .zip. Tema va fi apoi verificata.
make zip
, se va crea arhiva cu structura asteptata de checker. Fisierul README, daca este adaugat, trebuie sa fie scris in Markdown si sa aiba extensia .md
Punctajul final acordat pe o temă este compus din:
Rezultatul rularii checker-ului se poate vedea pe Moodle. Tot acolo va aparea si corectarea facuta de catre asistenti.