Operatii pe biti

Uneori avem nevoie sa testam sau sa modificam doar valoarea unui singur bit din cadrul unui octet, sau in general sa efectuam anumite operatii doar asupra unora dintre bitii unui octet.

In acest scop avem urmatoarele operatii:

Exemple

  1. Se cere obtinerea aceluiasi efect ca cel al operatiei cbw.

    Rezolvare

      test al, 10000000b ; rezultatul va fi 0 daca bitul de semn este 0
      jz pozitiv
     ; daca ajungem aici, numarul este negativ
      mov ah, 0FFh
      jmp final
    pozitiv:
      mov ah,0
    final:
    
  2. Se da o variabila, a, de tip word. Se cere sa se numere bitii de 1.

    Rezolvare 1

    Vom scoate unul cate unul bitii din ax

      mov ax, a
      mov dx, 0 ; in dx vom numara bitii
      mov cx, 0 ; nr. de iteratii efectuate
    bucla:
      shr ax, 1 ; CF=bitul cel mai putin semnificativ din ax
      adc dx, 0 ; dx:=dx+CF
      add cx, 1
      cmp cx, 16
      jb bucla
    

    Rezolvare 2

    Vom izola de fiecare data cate un bit din a

      mov ax, 1 ; ax va avea un singur bit 1 care va parcurge toate cele 16
                ; pozitii
      mov cx, 0 ; nr. de iteratii
      mov dx, 0 ; nr. de biti 1
    bucla:
      test a, ax
      jz zero
      add dx, 1
    zero:
      add cx, 1
      cmp cx, 16
      jb bucla
    
  3. Reprezentarea BCD a unui numar se face plecand de la reprezentarea numarului in baza 10 si alocand cate 4 biti pentru fecare cifra zecimala (in acest fel, un octet va contine cate doua cifre zecimale.

    De exemplu, numarul 291 se poate reprezenta in format BCD pe 2 octeti in modul urmator:

      00000010 10010001
    
    Se cere un program care sa efectueze conversia intre reprezentarea ca sir de cifre zecimale si reprezentarea BCD

    Rezolvare

    Date:

    sir_cifre db '16234'
    bcd db (bcd-sir_cifre+1)/2 dup (?)
    
    Codul:
      mov ax, bcd-sir_cifre
      mov dx, 0
      mov bx, 2
      div bx
      mov cx, ax ; cx=nr. de perechi de cifre
      mov si, offset sir_cifre ; si = adresa cifrei curente
      mov di, offset bcd ; di=adresa perechii curente
      cmp dx, 0
      je par
    ; daca nr. de cifre zecimale este impar, prima o tratam special
      mov al, byte ptr [si]
      sub al, '0'
      mov byte ptr [di], al
      inc si
      inc di
    par:
      cmp cx, 0
      je final
      mov ah, byte ptr [si]
      inc si
      mov al, byte ptr [si]
      inc si
      sub ah, '0'
      sub al, '0'
    ; avem acum cifrele in ah si al. Trebuie aduse ambele in al, cea din
    ; ah va ocupa primii 4 biti din al
      shl ah, 4
      or al, ah
      mov byte ptr [di], al
      inc di
      dec cx
      jmp par
    final:
    

Observatii

  1. O metoda de a pune valoarea 0 intr-un registru este sa se faca xor cu el insusi (exemplu xor ax, ax pune 0 in ax).
  2. shl si shr pot fi folosite pentru inmultirea, repspectiv impartirea la 2. De exemplu, shl ax, 1 inmulteste cu 2 valoarea din ax. Cum se imparte la 2 un numar reprezentat cu semn?
  3. Spunem ca izolam anumiti bitii dintr-un operand daca punem o vaoare fixata (de obicei 0) in toti ceilalti biti. Aceasta se face prin and intre operand si o vaoare, numita masca, ce are 1 pe pozitiile de izoat si 0 in rest.

Exercitii

  1. Sa se verifice daca un numar reprezenat pe 16 biti cu semn poate fi reprezentat pe 8 biti cu semn
  2. Fie doua variabile, a si b, de tip word. Sa se inlocuiasca bitii 2..5 din a cu bitii 0..3 din b
  3. Se da un numar in eprezentare BCD, Sa se calculeze reprezentarea binara (obsnuita)


Arhitectura Calculatoarelor

Actualizat: 29 Nov 2001
Intretinut de: Radu-Lucian LUPSA