====== 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}}.