VÁLTOZATOK:
Fgv21(VAL a:dword; VAL b:dword); @returns("EAX");
(x és y bitsorozatok, melyeket csak
ideiglenesen kell létrehozni ill. tárolni.
Neptun kód 6. betűje (Részeredmények - x és y - meghatározása):
- x=(a#3_11 : b#0_4 : a#13_7 :
b#(a#N_1)_8)#-32 y=(b#2_7 : a#7_13 : a#23_9)#+32
- x=(b#13_8 : a#10_9 : a#(b#N_0)_3 :
b#3_5)#+32
y=(a#23_15 : b#17_5 : a#2_10)#-32
- x=(a#23_9 : b#(a#N_0)_6
: b#11_5 : a#18_9)#-32 y=(b#12_5 : b#13_11 : a#18_7)#+32
- x=(b#(b#N_1)_5 : a#31_7
: b#9_8 : a#3_7)#+32
y=(a#18_13 : a#15_7 : b#21_8)#-32
- x=(a#11_17 : b#3_3 : a#19_4 :
b#(a#N_0)_5)#-32 y=(b#12_17 : a#7_6 : b#17_4)#+32
- x=(b#15_13 : a#17_3 : a#(b#N_1)_13 :
b#13_1)#+32
y=(a#2_3 : b#17_15 : a#23_9)#-32
- x=(a#18_7 : b#(a#N_1)_8
: b#21_9 : a#15_3)#-32 y=(b#17_11 : a#13_13 : b#18_5)#+32
- x=(b#(b#N_0)_15 : a#21_3
: b#19_5 : a#23_2)#+32 y=(a#8_7
: b#9_9 : b#16_11)#-32
- x=(a#23_8 : b#3_14 : a#13_7 :
b#(a#N_1)_8)#-32 y=(b#2_7 : a#7_13 : a#23_9)#+32
- x=(b#17_3 : a#21_12 : a#(b#N_0)_3 :
b#3_5)#+32
y=(a#23_15 : b#17_5 : a#2_10)#-32
- x=(a#14_19 : b#(a#N_0)_2
: b#11_5 : a#18_9)#-32 y=(b#12_5 : b#13_11 : a#18_7)#+32
- x=(b#(b#N_1)_3 : a#23_13
: b#19_4 : a#3_7)#+32
y=(a#18_13 : a#15_7 : b#21_8)#-32
- x=(a#1_5 : b#26_11 : a#9_12 :
b#(a#N_0)_5)#-32 y=(b#12_17 : a#7_6 : b#17_4)#+32
- x=(b#5_3 : a#1_13 : a#(b#N_1)_3 :
b#13_1)#+32
y=(a#2_3 : b#17_15 : a#23_9)#-32
- x=(a#8_8 : b#(a#N_1)_4
: b#1_10 : a#15_3)#-32 y=(b#17_11 : a#13_13 : b#18_5)#+32
- x=(b#(b#N_0)_15 : a#29_7
: b#19_3 : a#23_2)#+32 y=(a#8_7
: b#9_9 : b#16_11)#-32
- x=(a#12_1 : b#13_14 : a#3_11 :
b#(a#N_1)_5)#-32 y=(b#2_7 : a#7_13 : a#23_9)#+32
- x=(b#17_6 : a#1_19 : a#(b#N_0)_4 :
b#23_1)#+32
y=(a#23_15 : b#17_5 : a#2_10)#-32
- x=(a#25_3 : b#(a#N_0)_16
: b#19_3 : a#3_7)#-32 y=(b#12_5 : b#13_11 : a#18_7)#+32
- x=(b#(b#N_1)_7 : a#1_17
: b#19_3 : a#9_4)#+32
y=(a#18_13 : a#15_7 : b#21_8)#-32
- x=(a#17_14 : b#13_7 : a#9_8 :
b#(a#N_0)_2)#-32 y=(b#12_17 : a#7_6 : b#17_4)#+32
- x=(b#25_3 : a#11_2 : a#(b#N_1)_11 :
b#17_13)#+32
y=(a#2_3 : b#17_15 : a#23_9)#-32
- x=(a#8_11 : b#(a#N_1)_3
: b#13_7 : a#15_3)#-32 y=(b#17_11 : a#13_13 : b#18_5)#+32
- x=(b#(b#N_0)_8 : a#29_13
: b#9_9 : a#2_1)#+32 y=(a#8_7
: b#9_9 : b#16_11)#-32
- x=(a#19_1 : b#8_14 : a#17_3 :
b#(a#N_1)_11)#-32 y=(b#2_7 : a#7_13 : a#23_9)#+32
- x=(b#3_18 : a#1_3 : a#(b#N_0)_7 :
b#3_2)#+32
y=(a#23_15 : b#17_5 : a#2_10)#-32
- x=(a#23_9 : b#(a#N_0)_6
: b#11_5 : a#18_9)#-32 y=(b#12_5 : b#13_11 : a#18_7)#+32
- x=(b#(b#N_1)_5 : a#31_7
: b#9_8 : a#3_7)#+32
y=(a#18_13 : a#15_7 : b#21_8)#-32
- x=(a#11_17 : b#3_3 : a#19_4 :
b#(a#N_0)_5)#-32 y=(b#12_17 : a#7_6 : b#17_4)#+32
- x=(b#15_13 : a#17_3 : a#(b#N_1)_13 :
b#13_1)#+32
y=(a#2_3 : b#17_15 : a#23_9)#-32
- x=(a#3_19 : b#(a#N_0)_1
: b#15_5 : a#18_3)#-32 y=(b#18_5 : b#3_11 : a#8_7)#+32
- x=(a#18_7 : b#(a#N_1)_8
: b#21_9 : a#15_3)#-32 y=(b#17_11 : a#13_13 : b#18_5)#+32
- x=(b#(b#N_0)_15 : a#21_3
: b#19_5 : a#23_2)#+32 y=(a#8_7
: b#9_9 : b#16_11)#-32
- x=(b#15_13 : a#17_3 : a#(b#N_1)_13 :
b#13_1)#+32
y=(a#2_3 : b#17_15 : a#23_9)#-32
- x=(a#18_7 : b#(a#N_1)_8
: b#21_9 : a#15_3)#-32 y=(b#7_11 : a#3_13 : b#18_5)#+32
- x=(b#(b#N_0)_15 : a#21_3
: b#19_5 : a#23_2)#+32 y=(a#18_7
: b#19_9 : b#6_11)#-32
Neptun kód 5. betűje (EAX-ben visszaadandó
függvényérték):
- Fgv21= (x ^ y) - ( b#3_11 :(a#28_12)#T )#+32
- Fgv21= (x & a)#T + ( b#(a#N_1)_7 :
(y#23_23)#>9> )#-32
- Fgv21= (a | y) - ( x#13_21 :(b#8_10)#T )#+32
- Fgv21= (b & a) + (( x#(a#N_1)_7 :
(y#17_13)#<7< )#-32)#T
- Fgv21= (b ^ y) - ( a#23_13 :(x#18_15)#T
)#+32
- Fgv21= (x | b)#T + ( y#(a#N_1)_7 :
(a#19_19)#<5 )#-32
- Fgv21= (x & y) - ( b#13_17 :(a#13_18)#T
)#+32
- Fgv21= ((x#T) | a) + ( b#(a#N_1)_17 :
(y#23_23)#>9> )#-32
- Fgv21= (a ^ y) - ( x#30_15 :(b#27_13)#T
)#+32
- Fgv21= (b ^ (a#T)) + ( x#(a#N_1)_13 :
(y#17_13)#<7< )#-32
- Fgv21= (b | y) - ( a#29_3 :(x#11_18)#T )#+32
- Fgv21= (x & b)#T + ( y#(a#N_1)_9 :
(a#19_19)#<5
)#-32
- Fgv21= (x | y) - ( b#3_15 :(a#13_19)#T )#+32
- Fgv21= (x & a)#T + ( b#(a#N_1)_17 :
(y#3_13)#>9> )#-32
- Fgv21= (a ^ y) - ( x#21_14 :(b#8_13)#T )#+32
- Fgv21= (b | a) + (( x#(a#N_1)_8 :
(y#11_17)#<7<
)#-32)#T
- Fgv21= (b & y) - ( a#27_23 :(x#11_11)#T
)#+32
- Fgv21= (x ^ b)#T + ( y#(a#N_1)_3 :
(a#29_19)#>>5
)#-32
- Fgv21= (x & y) - ( b#13_17 :(a#13_18)#T
)#+32
- Fgv21= ((x#T) | a) + ( b#(a#N_1)_17 :
(y#23_23)#>9> )#-32
- Fgv21= (a ^ y) - ( x#30_15 :(b#27_13)#T
)#+32
- Fgv21= (b & (a#T)) + ( x#(a#N_1)_13 :
(y#17_13)#<7< )#-32
- Fgv21= (b ^ y) - ( a#29_3 :(x#11_18)#T )#+32
- Fgv21= (x | b)#T + ( y#(a#N_1)_9 :
(a#19_19)#<5 )#-32
- Fgv21= (a ^ y) - ( x#13_21 :(b#8_10)#T )#+32
- Fgv21= (b | a) + (( x#(a#N_1)_7 :
(y#17_13)#<7<
)#-32)#T
- Fgv21= (b ^ (a#T)) + ( x#(a#N_1)_13 :
(y#17_13)#<7< )#-32
- Fgv21= (b | y) - ( a#29_3 :(x#11_18)#T )#+32
- Fgv21= (x & b)#T + ( y#(a#N_1)_9 :
(a#19_19)#<5
)#-32
- Fgv21= (x | y) - ( b#3_11 :(a#28_12)#T )#+32
- Fgv21= (x & a)#T + ( b#(a#N_1)_7 :
(y#23_23)#>9> )#-32
- Fgv21= (a ^ y) - ( x#13_21 :(b#8_10)#T )#+32
- Fgv21= (b | a) + (( x#(a#N_1)_7 :
(y#17_13)#<7<
)#-32)#T
- Fgv21= (b & y) - ( a#23_13 :(x#18_15)#T
)#+32
- Fgv21= (x ^ b)#T + ( y#(a#N_1)_7 :
(a#19_19)#<5 )#-32
- Fgv21= (x & y) - ( b#13_17 :(a#13_18)#T
)#+32
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
- %1001_1010:%011_1001 ==> %10011010_0111001=%100_1101_0011_1001
- %1011_1110:%101:%10_1101
==> %10111110_101_101101=%1_0111_1101_0110_1101
- 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)
- 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
- 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
- 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)
- %101#-7 + %101#+7 ==> %111_1101 + %000_0101 ==>
%000_0010
- %101#-7 - %101#+7 ==> %111_1101 - %000_0101 ==>
%111_1000
- 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
- %101#<1
==> %010
; %1001_0110#<3
==> %1011_0000
- %101#>1
==>
%010 ;
%1001_0110#>3
==> %0001_0010
- %101#>>1
==> %110 ;
%1001_0110#>>3
==> %1111_0010 ;
%0001_0110#>>3
==> %0000_0010
- 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
- %10_1001#T
==> %10_0101
- 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