Table of Contents

Tema 3 - POLI Cat Invasion

Enunț

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.

Task-ul 1 - Noduri (25p)

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

Precizări:

Exemplu

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

Pentru implementarea sortării vă puteți inspira din Selection Sort

Sursee va saluta :))

Task-ul 2 - Mașina cu Stivă (25p)

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ă:

CMMMC

Prima funcție este int cmmmc(int a, int b), care calculează cel mai mic multiplu comun a 2 numere, date ca parametru.

Se garantează că rezultatul înmulțirii lui a și b încape pe 4 bytes

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.

Paranteze

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

Exemplu

Nu aveti voie sa folositi intructiunile din familia mov (mov, cmov, stos, lods, etc), leave si enter. Toate operatiile de transfer din si in memorie / registre trebuie realizate folosind push si pop

Lui Mushu nu ii plac temele

Task-ul 3 - Sortare de cuvinte (25p)

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.

Scopul task-ului acesta este să folosiți funcții din biblioteca standard C. Dacă există ceva în libc ce va poate ajuta, folosiți cu incredere!

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!

Precizări

Exemplu

  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"]

Pentru mai multe informatii despre qsort puteti accesa linkul: qsort

Luna va felicita ca ati ajuns pana aici

Task-ul 4 - CPUID (15p)

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

Precizări

Task-uri bonus

Ca task-uri bonus, aveți de ales din următoarele:

Tunetele s-au oprit, au fost inlocuite de lene

Cerințele task-urilor bonus și punctarea lor se pot găsi în fișierele task_*.md, din cadrul folderului fiecarui task.

Trimitere și notare

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.

Faceti branch-ul pe forkul facut din repository-ul temei. Fork-ul trebuie sa fie privat

In cazul realizarii temei pe Gitlab, fiecare commit va duce la verificarea automata a temei.

Puteti cere review pe cod pana la inceputul ultimei saptamani

Review-ul nu va include si detalii depsre cum trebuie sa implementati cerintele. Va viza, in principal, coding style-ul

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.

Din folderul temei (tema3/), executand comanda 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

Puteti gasi procesul de rezolvare si incarcare al temelor aici

Punctajul final acordat pe o temă este compus din:

Punctajul maxim este 150p

Rezultatul rularii checker-ului se poate vedea pe Moodle. Tot acolo va aparea si corectarea facuta de catre asistenti.

Fisierul README.md este optional. Va incurajam sa detaliati implementarile folosind comentarii punctuale in cod (nu comentati fiecare linie, ci blocuri de cod). Scrieti in README daca considerati necesar sa detaliati mai mult implementarea sau daca aveti feedback legat de tema

Coding style-ul constă în:

  • prezența comentariilor în cod
  • scrierea unui cod lizibil
  • indentarea consecventă
  • utilizarea unor nume sugestive pentru label-uri
  • scrierea unor linii de cod/README de maxim 80-100 de caractere

Pentru detalii despre coding style parcurgeți acest document: coding style

Temele care nu trec de procesul de asamblare (build) nu vor fi luate în considerare.

Vă reamintim să parcurgeți atât secțiunea de depunctări cât și regulamentul de realizare a temelor.

Precizări suplimentare

Toate task-urile vor fi realizate in limbajul de asamblare x86 (32 de biti), in afara de cazurile cand se specifica explicit alt limbaj.

FAQ

Resurse