User Tools

Site Tools


laboratoare:laborator-01

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revision Previous revision
Next revision
Previous revision
laboratoare:laborator-01 [2015/09/23 23:00]
ionel.ghita [Exerciții]
laboratoare:laborator-01 [2015/10/21 00:34] (current)
razvan.deaconescu
Line 1: Line 1:
-====== Laborator 01 ======+====== Laborator 01: Introducere ​======
  
 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). 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).
Line 19: Line 19:
 Î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. Î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** (**byte**). Un grup de 4 biți poatră denumirea de **nybble**, sau **half-byte**.+Î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** (**byte**). Un grup de 4 biți poartă denumirea de **nibble**, sau **half-byte**.
  
-Î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 (un nybble).+Î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 (un nibble).
  
 === Conversia din zecimal în binar/​hexazecimal === === Conversia din zecimal în binar/​hexazecimal ===
Line 34: Line 34:
   * Pas 2: 7 / 16 = 0, rest **7**   * 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**   * Câtul este 0, deci putem obține numărul în hexazecimal scriind resturile în ordine inversă: **0x71**
- 
-=== Exercițiu === 
- 
-Convertiți în binar/​hexazecimal următoarele valori: 
- 
-* 58 
-* 121 
-* 18446 
  
 === Conversia din binar/​hexazecimal în zecimal === === Conversia din binar/​hexazecimal în zecimal ===
Line 50: Line 42:
  
 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 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
- 
-=== Exercițiu === 
- 
-Convertiți în zecimal următoarele numere: 
-* 0b11000 
-* 0b1011 
-* 0b1100010111010010 
-* 0xD8 
-* 0x7A 
-* 0xBB29 
  
 === Conversia intre binar și hexazecimal === === 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 (un nybble). 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.+După cum am precizat anterior, o cifră din cadrul unui număr în hexazecimal corespunde unui grup de 4 biți (un nibble). 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 == == Exemplu: Conversia numărului 0xD9B1 în binar ==
Line 75: Line 57:
  
 Operația inversă, conversia din binar în hexazecimal se poate face convertind fiecare grup de 4 biți în cifra corespunzătoare în hexazecimal. Operația inversă, conversia din binar în hexazecimal se poate face convertind fiecare grup de 4 biți în cifra corespunzătoare în hexazecimal.
- 
-=== Exerciții === 
- 
-1. Convertiți din hexazecimal în binar următoarele numere: 
-* 0x5e 
-* 0x4A01 
-* 0x0941D583 
- 
-2. Convertiți din binar în hexazecimal următoarele numere: 
-* 0b01111101 
-* 0b1000110000011111 
-* 0b1111101011101011 
  
 ===== Reprezentarea numerelor ===== ===== Reprezentarea numerelor =====
Line 96: Line 66:
 În tabelul de mai jos sunt prezentate dimensiunile tipurilor de date pe un procesor cu dimensiunea cuvântului arhitecturii de 32 de biți, în cazul în care programul este compilat folosind gcc, sub Linux. În tabelul de mai jos sunt prezentate dimensiunile tipurilor de date pe un procesor cu dimensiunea cuvântului arhitecturii de 32 de biți, în cazul în care programul este compilat folosind gcc, sub Linux.
  
-^ Tip de date ^ Denumire ​   ​^ Număr biți      ^ Număr octeți ​         ^ +^ Tip de date ^ Număr biți      ^ Număr octeți ​         ^ 
-| char        | byte        | 8               | 1                     | +| char        | 8               | 1                     | 
-| short       | double byte | 16              | 2                     | +| short       | 16              | 2                     | 
-| int         | word        ​| 32              | 4                     | +| int         | 32              | 4                     | 
-| long        | word        | 32              | 4                     | +| long        | 32              | 4                     | 
-| long long   | double word | 64              | 8                     | +| long long   | 64              | 8                     | 
-| pointer ​    | word        ​| 32              | 4                     |+| pointer ​    | 32              | 4                     |
  
-=== Exercițiu === 
- 
-Aflați dimensiunile tipurilor de date din tabelul de mai sus pe sistemele din laborator. Hint: [[http://​www.c4learn.com/​c-programming/​sizeof-operator/​|sizeof]]. 
  
 ==== Integer overflow ==== ==== Integer overflow ====
Line 168: Line 135:
 | Big-Endian ​          | 0x4a   | 0x91   | 0x24    | 0x80 | | Big-Endian ​          | 0x4a   | 0x91   | 0x24    | 0x80 |
  
 +
 +===Avantaje Little-Endian===
 +
 +**1.** Valorile mici (pe un octet) sunt stocate mereu la aceeași adresă, indiferent de dimensiunea tipului de date folosit.\\
 +**Exemplu**:​ Dorim stocarea valorii 0x49 la adresa 0x2000 cu tipurile char, short și int:
 +
 +^ Tip de date   ^ 0x2000 ​  ^ 0x2001 ​  ^ 0x2002 ​  ^ 0x2003 ​   ^
 +| char        | 0x49   | -      | -      | -      |
 +| short       | 0x49   | 0x00   | -      | -      |
 +| int         | 0x49   | 0x00   | 0x00   | 0x00   |
 +
 +**2.** Oferă ușurință în efectuarea operațiilor aritmetice. Majoritatea operațiilor se efectuează începând cu cel mai puțin semnificativ octet, iar acesta este stocat primul în cadrul acestui mod de reprezentare,​ deci putem efectua operațiile pe mai mulți octeți parcurgând operanzii de la adresa cea mai mică adresă la cea mai mare.
 +
 +===Avantaje Big-Endian===
 +**1.** Valorile nu necesită transformări în momentul în care se transmit pe rețea. Pentru a se putea realiza comunicația între două calculatoare care folosesc metode diferite de reprezentare,​ toate valorile transmise sunt reprezentate în formatul **Network byte order**, care este echivalent cu Big-Endian.
 +
 +**2.** Valorile pe mai mulți octeți sunt mai ușor de citit în momentul examinării unei zone de memorie.
  
 ===== Operații cu valori reprezentate în binar ===== ===== Operații cu valori reprezentate în binar =====
Line 223: Line 207:
 ===== Exerciții ===== ===== Exerciții =====
  
-1. [[http://​linux.die.net/​man/​1/​xxd|xxd]] este un utilitar Linux ce permite afișarea fișierelor binare în diferite formate. Puteți găsi o versiune pentru Windows aici: {{:​laboratoare:​xxd.zip|}}.+1. (4p) Efectuați următoarele conversii între sisteme de numerație:​ 
 + 
 +a. Din decimal în binar și hexazecimal:​ 
 +* 58 
 +* 121 
 +* 18446 
 + 
 +b. Convertiți în zecimal: 
 +* 0b11000 
 +* 0b1011 
 +* 0b1100010111010010 
 +* 0xD8 
 +* 0x7A 
 +* 0xBB29 
 + 
 +c. Din hexazecimal în binar: 
 +* 0x5e 
 +* 0x4A01 
 +* 0x0941D583 
 + 
 +d. Din binar în hexazecimal:​ 
 +* 0b01111101 
 +* 0b1000110000011111 
 +* 0b1111101011101011 
 + 
 +2. (1p) Aflați dimensiunile principalelor tipuri de date din C pe sistemele din laborator. (char, short, int, unsigned int, long, long long, pointer). Hint: [[http://​www.c4learn.com/​c-programming/​sizeof-operator/​|sizeof]]. 
 + 
 +3. (1p) [[http://​linux.die.net/​man/​1/​xxd|xxd]] este un utilitar Linux ce permite afișarea fișierelor binare în diferite formate. Puteți găsi o versiune pentru Windows aici: {{:​laboratoare:​xxd.zip|}}.
  
 Se dă fișierul binar din arhiva următoare: {{:​laboratoare:​binary_file.zip|}}. Se dă fișierul binar din arhiva următoare: {{:​laboratoare:​binary_file.zip|}}.
Line 231: Line 242:
 * hexazecimal * hexazecimal
  
-2. Scrieți un program C cu ajutorul căruia să afișați următorul șir hexazecimal ca text: 48455820526f636b73210a.+4(1p) Scrieți un program C cu ajutorul căruia să afișați următorul șir hexazecimal ca text: 48455820526f636b73210a.
  
 <​note>​ <​note>​
-**Hint**: Fiecare caracter ASCII are echivalent un cod numeric pe un octet. ​Toți octeții ​din șirul dat corespund ​unui caracter ASCII.+**Hint**: Fiecare caracter ASCII are echivalent un cod numeric pe un octet. ​Fiecare octet din șirul dat corespunde ​unui caracter ASCII.
  
-**Hint 2**: În Cputeți folosi codurile în format hexazecimal în locul caracterelor ASCII în șiruri de caractere cu ajutorul prefixului \x.  +**Hint 2**: În C puteți folosi codurile în format hexazecimal în locul caracterelor ASCII în șiruri de caractere cu ajutorul prefixului \x.  
-Exemplu: char a[] = "\x40\x41\x42";​ este echivalent cu char a[] = "​ABC";​+Exemplu: char a[] = "​\x41\x42\x43"; este echivalent cu char a[] = "​ABC"; ​(puteți vedea [[http://​www.asciitable.com/​|aici]] un tabel cu codurile caracterelor ASCII)
 </​note>​ </​note>​
 +
 +5. (1p) Se dau următoarele declarații de variabile în C:
 +
 +<code c>
 +#include <​stdio.h>​
 +
 +void main()
 +{
 +    unsigned int a = 4127;
 +    int b = -27714;
 +    unsigned long c = 0x12345678;
 +    char d[] = {'​I',​ '​O',​ '​C',​ '​L',​ '​A'​};​
 +
 +    // TODO
 +}
 +
 +</​code>​
 +
 +Observați cum sunt memorate aceste variabile în memorie.
 +
 +<​note>​
 +Hint: Puteți parcurge memoria octet cu octet începând de la o anumită adresă folosind un pointer de tipul unsigned char* (pentru că tipul char este reprezentat pe un octet).
 +</​note>​
 +
 +6. (1p) Afișați valorile variabilelor c, d și e din programul de mai jos și explicați rezultatele (puteți converti valorile în binar pentru a observa mai ușor cauzele):
 +
 +<code c>
 +#include <​stdio.h>​
 +
 +void main()
 +{
 +    short a = 20000;
 +    short b = 14000;
 +
 +    short c = a + b;
 +    unsigned short d = 3 * a + b;
 +    short e = a << 1;
 +
 +    // TODO
 +}
 +</​code>​
 +
 +7. (1p) Scrieți un program C cu ajutorul căruia să efectuați operația XOR între următoarele șiruri haxazecimale (octet cu octet) și afișați rezultatul ca text (hint: operatorul ^):
 +* 4c26e3b44c86c21ef8908970c7af7475c17e834c7c01aa702e77
 +* 004382c622a6b671d8e5fa15e7c7110de107ec395c6cdf035a56
laboratoare/laborator-01.1443038455.txt.gz · Last modified: 2015/09/23 23:00 by ionel.ghita