User Tools

Site Tools


laboratoare:laborator-01

This is an old revision of the document!


A PCRE internal error occured. This might be caused by a faulty plugin

====== Laborator 01 ====== Pentru reprezentarea informațiilor (instrucțiuni și date), calculatoarele folosesc sistemul binar (baza 2). În cazul scrierii programelor în limbaj de asamblare este preferat sistemul hexazecimal (baza 16), pentru că scutește programatorul de scrierea șirurilor lungi de 1 și 0, iar conversia din/în binar se poate face mult mai ușor decât în cazul sistemului zecimal (baza 10). <note tip> Pentru reprezentarea numerelor în binar vom folosi prefixul **0b**, iar pentru cele în hexazecimal vom folosi **0x**. </note> Să presupunem următoarea instrucțiune în limbajul C: <code c> char a = 113; </code> Această instrucțiune are ca efect stocarea în memorie a unui octet cu valoarea 113, care va fi reprezentat în forma binară: **0b01110001**. Aceeași valoare poate fi scrisă în hexazecimal ca **0x71**. ===== Sistemele binar și hexazecimal ===== Înainte de a începe lucrul cu limbajul de asamblare, este necesar să ne familiarizăm cu sistemele binar și hexazecimal și cu modalitățile de conversie între ele. În **sistemul binar** (baza 2), valorile sunt reprezentate ca un șir de 0 și 1. Fiecare cifră din șir reprezintă un bit, iar un grup de 8 biți formează un octet. În **sistemul hexazecimal** (baza 16), valorile sunt reprezentate sub forma unui șir de caractere din intervalul '0'-'9' sau 'a'-'f'. Un octet este format din două astfel de caractere, deci fiecare caracter corespunde unui grup de 4 biți. === Conversia din zecimal în binar/hexazecimal === * Se împarte succesiv numărul la numărul bazei (2 sau 16) și se rețin resturile * Când câtul împărțirii devine 0, se scriu resturile în ordine inversă. * În cazul bazei 16, atunci când restul este mai mare decât 9 se folosesc literele a-f (10=a, 15=f) == Exemplu: conversia numărului 113 în hexazecimal == * Pas 1: 113/16 = 7, rest **1** * Pas 2: 7 / 16 = 0, rest **7** * Câtul este 0, deci putem obține numărul în hexazecimal scriind resturile în ordine inversă: **0x71** === Conversia din binar/hexazecimal în zecimal === Un număr convertit din baza X în baza 10 are valoarea egală cu suma produselor dintre fiecare cifră din numărul în baza X și X la puterea egală cu poziția cifrei în numărul respectiv (numărarea se face de la dreapta la stânga, începând cu 0). == Exemplu: conversia numărului 0xD9B1 în hexazecimal == 0xD9B1 <nowiki>=</nowiki> 1*16<sup>0</sup> + 11*16<sup>1</sup> + 9*16<sup>2</sup> + 13*16<sup>3</sup> <nowiki>=</nowiki> 55729 === Conversia intre binar și hexazecimal === După cum am precizat anterior, o cifră din cadrul unui număr în hexazecimal corespunde unui grup de 4 biți. Astfel, pentru a converti un număr din hexazecimal în binar este suficient să transformăm fiecare cifră în grupul de 4 biți echivalent. == Exemplu: Conversia numărului 0xD9B1 în binar == * 0x1 <nowiki>=</nowiki> 0b0001 * 0xB <nowiki>=</nowiki> 0b1011 * 0x9 <nowiki>=</nowiki> 0b1001 * 0xD <nowiki>=</nowiki> 0b1101 Astfel, numărul obținut în binar este **0b1101100110110001**. Operația inversă, conversia din binar în hexazecimal se poate face convertind fiecare grup de 4 biți în cifra corespunzătoare în hexazecimal. ===== Reprezentarea numerelor ===== În memoria unui calculator o valoare este memorată pe un număr fix de biți. Dimensiunea cuvântului (**word size**) arhitecturii unui procesor reprezintă numărul maxim de biți cu care procesorul îi poate accesa printr-o singură operație. În tabelul de mai jos sunt prezentate dimensiunile tipurilor de date uzuale folosite în C pe un procesor cu dimensiunea cuvântului arhitecturii de 32 de biți. ^ Tip de date ^ Denumire ^ Număr biți ^ Număr octeți ^ | char | byte | 8 | 1 | | short | double byte | 16 | 2 | | int | word | 32 | 4 | | long | word | 32 | 4 | | long long | double word | 64 | 8 | În cazul în care un număr trebuie reprezentat în binar pe un număr de biți mai mare decât numărul maxim alocat, atunci vor fi păstrați doar ultimii biți care încap, iar restul sunt ignorați. Această situație poartă denumirea de **overflow**. Un overflow poate să apară și în cazul în care se efectuează o operație (de exemplu adunare), iar rezultatul se dorește să fie reprezentat pe același număr de biți ca și operanzii. În acest caz este posibil ca rezultatul să nu încapă pe numărul respectiv de biți, iar primul bit (din stânga) să fie ignorat. == Exemplu de overflow la adunare == Să presupunem că dorim să adunăm două valori stocate pe un octet, iar rezultatul să fie memorat tot pe un octet. <code> O1 = 171 = 0b10101011 O2 = 113 = 0b01110001 Rezultatul așteptat: 171+113 = 0b100011100 Rezultatul memorat pe 8 biți: 0b00011100 </code> === Numere cu semn și fără semn === Folosind N biți putem memora 2<sup>N</sup> valori, de exemplu între 0 și 2<sup>N</sup>-1. Aceste valori sunt fără semn (toate sunt pozitive), pentru că nu putem face deosebirea între cele pozitive și negative. Dacă dorim și reprezentarea valorilor negative, trebuie să alocăm o parte din combinațiile binare posibile pe N biți pentru aceste valori. În practică se împart combinațiile posibile astfel: * prima jumătate este folosită pentru numere pozitive între 0 și 2<sup>N-1</sup>-1. * a doua jumătate este alocată numerelor negative, între -2<sup>N-1</sup> și -1. De exemplu, pentru valori reprezentate pe 8 biți, împărțirea se face astfel: * combinațiile binare între 0b00000000 și 0b011111111 corespund valorilor între 0 și 127. * combinațiile între 0b10000000 și 0b11111111 corespund valorilor între -128 și -1 (0b10000000=-128, 0b11111111=-1). Această reprezentare a fost aleasă pentru că prezintă o serie de avantaje: * Putem determina foarte ușor dacă un număr este negativ sau pozitiv, după valoarea primului bit (1=negativ, 0=pozitiv) * Pentru numere pozitive avem aceeași reprezentare ca în cazul numerelor fără semn. * Operațiile aritmetice se fac exact ca în cazul numerelor fără semn Pentru negarea unui număr (transformarea în complement față de 2) se procedează astfel: - Se neagă toți biții din reprezentarea numărului în baza 2 - Se adună valoarea 1. == Exemplu: Reprezentarea valorii -29 în binar == * 29 = 0b00011101. * Valoarea negată: 0b11100010. * -29 = 0b11100010 + 1 = 0b11100011 <note important> Aceeași valoare în binar are semnificații diferite în zecimal dacă reprezentarea se consideră cu semn sau fără. De exemplu, valoarea 0b11100011 este inerpretată ca 227 în reprezentarea fără semn și ca -29 în reprezentarea cu semn. </note> ==== Ordinea de reprezentare a numerelor mai mari de un octet (Little-Endian vs Big-Endian) ==== Pentru reprezentarea valorilor mai mari de un octet există două metode posibile, ambele folosite în practică: * Little-Endian: cel mai semnificativ octet este memorat primul (octeții sunt memorații în ordine inversă). Acest model este folosit de familia de procesoare Intel x86. * Big-Endian: cel mai puțin semnificativ octet este memorat primul. **Exemplu:** Dorim să stocăm valoarea 0x4a912480 în memorie pe 32 de biți (4 octeți), începând cu adresa 0x100, folosind cele două metode: ^ Metoda ^ Adresa 0x100 ^ Adresa 0x101 ^ Adresa 0x102 ^ Adresa 0x103 ^ | Little-Endian | 0x80 | 0x24 | 0x91 | 0x4a | | Big-Endian | 0x4a | 0x91 | 0x24 | 0x80 | ===== Operații cu numere în binar =====

laboratoare/laborator-01.1441557089.txt.gz · Last modified: 2015/09/06 19:31 by ionel.ghita