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
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:
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
De exemplu, numarul 291 se poate reprezenta in format BCD pe 2 octeti in modul urmator:
00000010 10010001Se 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
Exercitii