This is an old revision of the document!
====== Tema 1 ====== ===== 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: <code> numar dd 621 baza dd 16 </code> 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 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 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 vmchecker (în secțiunea IOCLA) și vor fi testate automat. Arhiva încărcată 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. ===== 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 trebuie să folosiți funcția putchar din biblioteca standard C sau macro-ul PRINT_CHAR din SASM (găsiți aici mai multe detalii). * Î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: {{:teme:resurse-tema1.zip|}}