Egy a bitek közvetlen elérésén alapuló függvény
implementálása. A
feladat megoldásához a unitban
lévő
eljárás megírása szükséges.
A feladat értékelése:
Fgv4
p1=(5*helyes_eredmény)/összes_próbálkozás
p2=2, Ha a megoldás nem használ
magas
szintű elemeket
Az egyéni feladatok megoldása során a
különböző
változók "részeivel", azaz csak
néhány bitjével kapcsolatos
tevékenységeket kell elvégezni. A "bitsorozatok"
megadására, a feladatok leírására a
következő jelöléseket használtuk:
Bitek sorszámozása mindig a 0. bittel kezdődik,
amely a legalacsonyabb helyiértékű (LSB) bitet
jelöli.
hivatkozás egy "normál változóra",
regiszterre, konstansra
EAX ==> az EAX regiszter összes bitje
valtozo ==> a valtozo
nevű változó összes bitje
Bitsorozatok összefűzése BS1:BS2 :
az a bitsorozat, amely az BS1
és BS2 bitsorozatok
egymás
mögé írásával jön létre
Egy bitsorozat szomszédos bitjeinek kiemelése BS#x_y:
A BS
bitsorozatnak az x
sorszámúval kezdődő szomszédos y
db bitje (BS x. bitje a
kiemelés 0. bitje lesz, BS (x+1). bitje a kiemelés 1. bitje lesz, stb...) // Ha
a kiválasztandó bitek valamelyikének
sorszáma
nagyobb, mint a BS bitsorozat
MSB bitjének sorszáma, akkor a BS
bitsorozat bitjeit
szükség szerint megtöbbszörözzük, azaz
összefűzzük sajátmagával:
BS#x_y == . . . :BS:BS:BS:BS#x_y.
%100_1011_0101#2_5
==> %0_1101
%100_1011_0101#6_3
==>%010
%1011_1111#5_5 ==> %11_101
// A legmagasabb helyiértéken
"túlnyúló" bitek a legalacsonyabb
helyiértékűek lesznek. <== A
többszörözési szabály miatt
%1#0_5 ==> %1_1111
// Előző sor szabályának többszöri
alkalmazásával.
%10#0_10 ==> %10_1010_1010
%10#1_10 ==> %01_0101_0101
AL#12_3 ==>
AL#4_3 // <== A többszörözési
szabály miatt
A példákban, itt és a következőkben -
az érthetőség javítása
érdekében, többnyire - csak konstansokra hivatkozunk.
Egyetlen bit kiemelése BS#x:
A BS
bitsorozatnak az x
sorszámú bitje. (BS#x==BS#x_1)
%100_1011_0101#6
==>%0
Bitek megszámlálása BS#N_x: Az x értékű bitek
száma a BS
bitsorozatban. (x
legális értékei: 0, 1) BS#N:
A BS bitsorozat
bitjeinek száma (BS#N==(BS#N_0)+(BS#N_1))
%10_0010#N ==> 6
EAX#N ==> 32
DH#N ==> 8
%10_0010#N_0 ==> 4
%10_0010#N_1 ==> 2
Legmagasabb helyiértékű bit (MSB) kiemelése BS#^ ==
BS#((BS#N)-1) == BS#((BS#N)-1)_1
%10_0101#^ ==> %1
Zérus kiterjesztés ill. magas
helyiértékű bitek kiemelése BS#+x:
a BS bitsorozat
kibővítése x bit
méretre a magas
helyiértékeken elhelyezett 0 bitekkel
%101#+7 ==> %000_0101
%1101#+2 ==>
%11 // ha x kisebb, mint a
bővítendő
bitsorozat mérete, akkor a magas helyiértékű x bit
%1101#+4 ==>
%1101 //
ha x megegyezik a
bitsorozat méretével, akkor maga a bitsorozat
Megj: BS#+x ==
((%0#0_x):BS)#0_x - kivéve, ha x<BS#N (ekkor a
magas helyiértékű bitek lesznekl kiemelve,nem az alacsonyak)
Előjel kiterjesztés ill. alacsony
helyiértékű bitek kiemelése BS#-x:
a BS bitsorozat
kibővítése x bit
méretre, a legmagasabb
helyiértékű bit megfelelő számú
ismétlésével
%101#-7 ==> %111_1101
%1101#-2 ==>
%01
// ha x kisebb, mint a
bővítendő
bitsorozat mérete, akkor az alacsony helyiértékű x bit
%0101#-7 ==> %000_0101
%1101#-4 ==>
%1101 //
ha x megegyezik a
bitsorozat méretével, akkor maga a bitsorozat
Megj: BS#-x ==
(((BS#^)#0_x):BS)#0_x
Aritmetikai alapműveletek (túlcsordulás
esetén sem változik a bitsorozat mérete)
Eltolások - jobbra és balra / Ezen műveletek nem
változtatják meg a bitsorozat hosszát! BS#<x:
A BS bitsorozat
balra tolása x bittel.
Az alacsony helyiértékeken új 0 bitek jelennek meg BS#>x:
A BS bitsorozat
jobbra tolása x bittel.
A magas helyiértékeken új 0 bitek jelennek
meg BS#>>x:
A BS bitsorozat
jobbra tolása x bittel.
A magas helyiértékeken az MSB (előjel-) bit
ismétlődik
Forgatások - jobbra és balra BS#<x<:
A BS bitsorozat
balra forgatása x
bittel.
Az alacsony helyiértékeken a magas
helyiértékről kiforgatott bitek jelennek meg. BS#>x>:
A BS bitsorozat jobbra
forgatása x bittel.
A magas helyiértékeken az alacsony
helyiértékről kiforgatott bitek jelennek meg.
%101#<1<
==> %011
; %1001_0110#<3<
==> %1011_0100
%101#>1> ==> %110
; %1001_0110#>3> ==> %1101_0010
Bitsorrend megfordítása (Tükrözése)
%1010#T ==> %0101
%101001#T
==> %100101
Bitenkénti logikai műveletek
BS1 & BS2
: Bitenkénti logikai és
művelet a BS1 és BS2 bitsorozatok között BS1 | BS2
: Bitenkénti logikai vagy
művelet a BS1 és BS2 bitsorozatok
között BS1 ^ BS2
: Bitenkénti logikai kizáró
vagy művelet a BS1 és BS2 bitsorozatok
között
%1010 & %1100 ==> %1000 // Az eredmény valamely bitje akkor 1,ha midkét bitsorozatban 1 található az adott
sorszámú helyen
%1010 | %1100 ==> %1110 // Az eredmény valamely bitje akkor 1,ha legalább az egyik bitsorozatban 1 található az adott
sorszámú helyen
%1010 ^ %1100 ==> %0110 // Az eredmény valamely bitje akkor 1,ha a két bitsorozatban eltérő bitek
találhatóak az adott sorszámú helyen