Laborator 1 - Suport teoretic

Conversii şi operaţii în diferite baze de numeraţie

Se va studia:

  • conversia numerelor întregi şi zecimale din baza 10 într-o bază oarecare, în special baza 16 și 2
  • conversia inversă, dintr-o bază oarecare în baza 10, mai ales din baza 16 şi 2 în baza 10.
  • conversia din baza 16 direct în baza 2 şi invers.

Consideraţii teoretice

Un sistem de numeraţie este constituit din totalitatea regulilor de reprezentare a numerelor cu ajutorul anumitor simboluri denumite cifre. Pentru orice sistem de numeraţie , numărul semnelor distincte pentru cifrele sistemului este egal cu baza (b). Deci pentru baza b=2 (numere scrise în binar) semnele vor fi cifrele 0 şi 1. Pentru baza b=16 (hexazecimal) semnele vor fi 0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F. Se observă că pentru numerele scrise într-o bază mai mare decât baza 10 (zecimal) se folosesc şi alte simboluri (litere) pe lângă cifrele obişnuite din baza 10. Astfel, în cazul numerelor scrise în hexazecimal, literele A,B,C,D,E,F au ca şi valori asociate 10,11,12,13,14,15. Moduri de notare: scrierea la sfârşitul numărului în paranteză a bazei, de exemplu: 100101001(2), sau 17A6B(16).

Conversia numerelor din baza 10 într-o bază oarecare

Algoritmul cel mai simplu constă în împărţirea succesivă a numărului scris în baza 10 la baza spre care se doreşte conversia (se împarte numărul la bază, iar în continuare se împarte câtul obţinut la bază ş.a.m.d. până când câtul devine 0), după care se iau resturile obţinute în ordine inversă, care constituie valoarea numărului în baza cerută.

Exemple:

  1. Să se convertească 347 din baza 10 în baza 16(H) Mai întâi se converteşte în baza 16 pentru că aceasta se realizează prin mai puţine împărţiri decât conversia în baza 2.
    Astfel, luând resturile în ordine inversă obţinem 15B(H).
    347(D) = 15B(H)
  2. Să se convertească 57 din baza 10 în baza 2(B).
    57(D) = 111001(B)
Există şi o metodă mai rapidă de conversie a numerelor între bazele 2 şi 16 ţinând cont că pentru fiecare cifră hexa există 4 cifre binare corespondente:

Valoarea în zecimal Valoarea în hexazecimal Numărul binar coresp. cifrei hexa
0 0 0000
1 1 0001
2 2 0010
3 3 0011
4 4 0100
5 5 0101
6 6 0110
7 7 0111
8 8 1000
9 9 1001
10 A 1010
11 B 1011
12 C 1100
13 D 1101
14 E 1110
15 F 1111


Mai trebuie ţinut cont la trecerea unui număr prin bazele 2 și 16 că gruparea cifrelor din baza 2 se face de la dreapta la stânga (prin completare cu zerouri la stânga numărului dacă este cazul, deci în partea care nu-i afectează valoarea.

Exemple:

  1. Să se convertească 347 din baza 10 în bazele 2 și 16.
    347(D) = 15B(H) = 0001 0101 1011(B)

Alte exemple:

2 = 2(10) =10(2) 62(10) = 111110(2) 1995(10) = 11111001011(2) 1024(10) = 10000000000(2)

Conversia unui număr dintr-o bază oarecare în baza 10

Pentru a converti un număr dintr-o bază oarecare în baza 10 se poate folosi formula definită în prima parte a lucrării şi anume:
Nr(b) = Cn Cn-1 Cn-2 … C2C1 C0
atunci valoarea sa în baza 10 va fi:
Nr(10) = Cn * bn + Cn-1 * bn-1 + … + C2 * b2 +  C1 * b1+ C 0

Exemple:

  1. Se dă numărul întreg în hexazecimal 3A8(H) şi se cere valoarea sa în zecimal:
    N = 3*162 + 10*16 1 + 8 = 3*256 + 160 + 8 = 936(10)
  2. Se dă numărul întreg în hexazecimal 86C(H) şi se cere valoarea sa în zecimal:
    86C(16) = 8 * 162 + 6 * 16 + 12 = 2156(10)
  3. Se dă numărul întreg în binar 1101101(2) și se cere valoarea sa în zecimal
    1101101(2) = 1*26+1*25+0*24+1*23+1*22+0*2+1=109(10)

Alte exemple:

1010011(2) = 83(10)  11100011(2) = 227(10) 1000000000(2) = 512(10)   11001(2) =25(10)

Instrumente de lucru pentru laborator

Instrumentele de lucru pentru laborator sunt următoarele:

  • Editor: Notepad++
  • Asamblor: NASM
  • Linker: ALINK
  • Debugger: Olly DBG
Setul de instrumente poate fi descarcat de aici: 🔗 ASM tools. Studenții care folosesc alte sisteme de operare decât Windows pot utiliza fie un emulator (tool-urile au fost testate cu succes cu Wine), fie pot rula tool-urile într-o mașină virtuală de Windows. Pentru a ușura redactarea programelor ASM, setul de instrumente include un editor vizual (Notepad++) care are integrat un plugin ce permite efectuarea majorității operațiilor din câteva combinații de taste.

Instructiuni de utilizare:

  • Descarcati setul de instrumente si extrageti continutul arhivei
  • Porniti editorul Notepad++ din directorul npp (nu utilizati versiunea proprie a editorului)
  • Procedati la redactarea programelor ce rezolva problemele care va vor fi comunicate. Puteti utiliza urmatoarele combinatiile de taste ce se regasesc in meniul Plugins -> ASM Plugin:
      ASM Code TemplateCtrl+Shift+NCompleteaza in editor un program minimal in ASM
      Build ASMCtrl+F7Asambleaza programul curent
      Run programCtrl+F6Ruleaza programul curent
      Debug programF6Depaneaza programul curent, folosind Olly Debugger (documentatia pentru debugger se regaseste in directorul ollydbg din arhiva

Un exemplu minimal de program în limbaj de asamblare

Exemplu:

bits 32 ;asamblare și compilare pentru arhitectura de 32 biți
; definim punctul de intrare in programul principal
global start

; declaram functiile externe necesare programului nostru 
extern exit ; indicam asamblorului ca exit exista, chiar daca noi nu o vom defini
import exit msvcrt.dll  ; exit este o functie care incheie procesul, este definita in msvcrt.dll
        ; msvcrt.dll contine exit, printf si toate celelalte functii C-runtime importante

; segmentul de date in care se vor defini variabilele 
segment data use32 class=data
; ... 

; segmentul de cod
segment code use32 class=code
start:
; ... 

    ; exit(0)
    push dword 0 ; se pune pe stiva parametrul functiei exit
    call [exit] ; apelul functiei exit pentru terminarea executiei programului