====== Tema 1 ======
* Deadline: Luni, 30.11.2015 23:55
* Data publicării: 16.11.2015, 18:56
* Data ultimei modificări: 30.11.2015, 01:50
* Responsabili:
* [[valighita92@gmail.com|Vali Ghiță]]
* [[vladimir.diaconescu@cs.pub.ro|Vladimir Diaconescu]]
===== Enunț =====
Să se implementeze un program în limbaj de asamblare care efectuează conversia unui număr într-o bază dată și afișează rezultatul.
Numărul ce trebuie convertit este un număr întreg pozitiv pe 32 de biți, iar baza poate să fie între 2 și 16.
===== Implementare =====
Programul va include în momentul asamblării un fișier ce conține inputul format din două variabile:
* numărul ce trebuie convertit: variabila **numar**
* baza în care se va face conversia: variabila **baza**.
Exemplu de fișier de input:
numar dd 621
baza dd 16
Acest fișier se va numi **input.inc** și trebuie să fie inclus în fișierul sursă ce conține implementarea temei, în secțiunea de date (imediat după section .data). Găsiți în [[tema-1#resurse|arhiva cu resursele temei]] un fișier de la care puteți începe implementarea.
Programul trebuie să afișeze pe o singură linie numărul obținut sub forma unui șir de caractere. În cazul în care baza nu este una validă, se va afișa mesajul “Baza incorecta”.
===== Testare =====
Tema poate fi testată pe platforma vmchecker sau local folosind checker-ul din [[tema-1#resurse|arhiva cu resursele temei]].
Arhiva conține o serie de fișiere de intrare în directorul **inputs** și fișiere ce conțin rezultatele așteptate pentru fiecare test, în directorul **outputs**. Verificarea acestor teste este făcută automat de către checker.
Fișierul **README** din arhivă conține instrucțiuni despre folosirea checker-ului.
===== Trimitere și notare =====
Temele vor trebui încărcate pe platforma [[https://vmchecker.cs.pub.ro/ui/#IOCLA|vmchecker]] (în secțiunea IOCLA) și vor fi testate automat. Arhiva încărcată va fi o arhivă ''.zip'' care trebuie să conțină:
* fișierul sursă ce conține implementarea temei, denumit ''tema1.asm''
* fișier ''README'' ce conține descrierea implementării
Punctajul final acordat pe o temă este compus din:
* punctajul obținut prin testarea automată de pe vmchecker - 80%
* coding style - 10%. Se va ține cont de:
* claritatea codului
* indentare coerentă
* comentarii
* nume sugestive pentru label-uri
* fișier README - 10%
Temele care nu trec de procesul de asamblare (//build//) nu vor fi luate în considerare.
Mașina virtuală folosită pentru testarea temelor de casă pe vmchecker este descrisă în secțiunea [[:utile#masini-virtuale|Mașini virtuale]] din pagina de resurse.
===== Precizări suplimentare =====
* Dacă folosiți SASM pe Windows, pentru a putea testa va trebui să puneți fișierul ce conține inputul, input.inc, în directorul include care se află în directorul în care este instalat SASM (de exemplu C:\Program Files (x86)\SASM\include).
* Metodele de conversie din baza 10 în altă bază sunt prezentate în laboratorul 1.
* Pentru afișarea unui caracter din rezultat trebuie să folosiți funcția ''putchar'' din biblioteca standard C sau macro-ul PRINT_CHAR din SASM (găsiți [[https://dman95.github.io/SASM/english.html|aici]] mai multe detalii).
* Puteți folosi funcții precum ''printf'' sau ''puts'' pentru afișarea oricăror alte informații (mai puțin caracterele ce compun un număr convertit).
* Împărțirea cu rest se poate efectua folosind instrucțiunea div, care funcționează astfel conform tabelului de mai jos:
^ Deîmpărțit ^ Împărțitor ^ Cât ^ Rest ^
| AX | Registru pe 8 biți | AL | AH |
| DX:AX | Registru pe 16 biți | AX | DX |
| EDX:EAX | Registru pe 32 de biți | EAX | EDX |
Cu alte cuvinte, în funcție de dimensiunea deîmpărțitului și a împărțitorului, trebuie să plasăm numărul pe care dorim să îl împărțim în:
* AX - dacă dormi să împărțim la un număr pe 8 biți
* DX:AX (primii cei mai semnificativi 16 biți în DX, ultimii 16 în AX) - dacă dorim să împărțim un număr pe 32 biți la unul pe 16 biți
* EAX:EDX (primii 32 biți în EDX, ultimii în EAX) - dacă dorim să împărțim un număr pe 64 de biți la unul pe 32 de biți.
Registrul cu care dorim să împărțim este dat ca argument instrucțiunii div.
Exemple:
* **div BX** împarte valoarea din DX:AX la valoarea din BX și stochează câtul în AX și restul în DX.
* **div BH** împarte valoarea din AL:AH (AX) la valoarea din BH și stochează câtul în AL și restul în AH.
===== Resurse =====
Arhiva ce conține checker-ul, testele și fișierul de la care puteți începe implementarea este {{http://elf.cs.pub.ro/asm/res/teme/iocla-tema1-resurse.zip|aici}}.