| FORTH | |
|||||
| Úvod | Výukové lekce | 02 03 04 | ||||
|
Lekce 3 - Logické a binární operace
Logické operace pracují s dvouhodnotovými
parametry podle Booleovy algebry, logickou jedničkou, TRUE a logickou
nulou, FALSE.
TRUE je nenulová hodnota, do zásobníku se ukládá jako číslo 1 nebo -1 (FFFF). FALSE se ukládá jako 0. Binární operace pracují s bity celého slova, posouvají je, provádí logické operace s jednotlivými bity. Příklad 4:
Na
následujícím Obr. 4 jsou
prakticky
vyzkoušeny některé
logické a binární operace v F-PC
.
![]() Obr. 4 |
|||
|
FALSE
|
(
-- false) |
false | logická hodnota false na TOS se uloží 0 Např. FALSE . zobrazí 0 ![]() |
| TRUE | ( -- true) | true | logická hodnota true na TOS se uloží FFFF Např. TRUE . zobrazí -1 ![]() |
| = | (x1
x2 -- fl) x-libovolné 16b číslo fl-logický příznak |
equals | x1=x2, pak true
porovná x1 a x2, pokud se rovnají, výsledek je TRUE. x1 a x2 se vyčtou ze zásobníku, na TOS se uloží logická hodnota. Např. 5 3 = . porovná 5 a 3, nerovnají se, zobrazí 0, (FALSE). Např. 5 5 = . porovná 5 a 5, rovnají se, zobrazí -1, (TRUE). ![]() |
| <> | (x1 x2 -- fl) | not equals | x1<>x2, pak true
porovná x1 a x2, pokud se nerovnají, výsledek je TRUE. x1 a x2 se vyčtou ze zásobníku, na TOS se uloží logická hodnota. Např. 5 3 <> . porovná 5 a 3, nerovnají se, zobrazí -1, (TRUE). Např. 5 5 <> . porovná 5 a 5, rovnají se, zobrazí 0, (FALSE). ![]() |
| < | (n1
n2 -- fl) n-16b se znaménkem |
less-than | n1<n2, pak true
porovná n1 a n2, pokud hodnota NOS<TOS, výsledek je TRUE. n1 a n2 se vyčtou ze zásobníku, na TOS se uloží logická hodnota. Např. 5 3 < . porovná 5 a 3, 5<3, zobrazí 0, (FALSE). Např. 5 5 < . porovná 5 a 5, 5<5, zobrazí 0, (FALSE). ![]() |
| > | (n1 n2 -- fl) | greater-than | n1>n2, pak true
porovná n1 a n2, pokud hodnota NOS>TOS, výsledek je TRUE. n1 a n2 se vyčtou ze zásobníku, na TOS se uloží logická hodnota. Např. 5 3 > . porovná 5 a 3, 5>3, zobrazí -1, (TRUE). Např. 5 5 > . porovná 5 a 5, 5>5, zobrazí 0, (FALSE). ![]() |
| 0= | (x -- fl) | zero-equals | x=0, pak true
pokud je x nulové, výsledek je TRUE. x se vyčte ze zásobníku, na TOS se uloží logická hodnota. 0= neukládá 0 do zásobníku, je rychlejší než 0 = Např. 3 0= . porovná 3 a 0, nerovnají se, zobrazí 0, (FALSE). Např. 0 0= . porovná 0 a 0, rovnají se, zobrazí -1, (TRUE). |
| 0<> | (x -- fl) | zero-not-equals | x<>0, pak true
pokud je x nenulové, výsledek je TRUE. x se vyčte ze zásobníku, na TOS se uloží logická hodnota. Např. 3 0<> . porovná 3 a 0, nerovnají se, zobrazí -1, (TRUE). Např. 0 0<> . porovná 0 a 0, rovnají se, zobrazí 0, (FALSE). ![]() |
| 0< | (n -- fl) | zero-less | x<0, pak true
pokud je x menší než nula, výsledek je TRUE. x se vyčte ze zásobníku, na TOS se uloží logická hodnota. Např. 3 0< . porovná 3 a 0, 3<0, zobrazí 0, (FALSE). Např. 0 0< . porovná 0 a 0, 0<0, zobrazí 0, (FALSE). ![]() |
| 0> | (n -- fl) | zero-greater | x>0, pak true
pokud je x větší než nula, výsledek je TRUE. x se vyčte ze zásobníku, na TOS se uloží logická hodnota. Např. 3 0> . porovná 3 a 0, 3>0 se, zobrazí -1, (TRUE). Např. 0 0> . porovná 0 a 0, 0>0, zobrazí 0, (FALSE). ![]() |
| U< | (u1
u2 -- fl) u-16b bez znaménka |
u-less-than | u1<u2, pak true
porovná u1 a u2, pokud hodnota NOS<TOS, výsledek je TRUE. u1 a u2 se vyčtou ze zásobníku, na TOS se uloží logická hodnota. Např. 50000 30000 U< . porovná, 50000<30000, zobrazí 0, (FALSE). Např. 50000 30000 < . přeteče 50000 do záporných čísel, zobrazí -1, (TRUE). ![]() |
| U> | (u1
u2 -- fl) |
u-greater-than | u1>u2, pak true
porovná u1 a u2, pokud hodnota NOS>TOS, výsledek je TRUE. u1 a u2 se vyčtou ze zásobníku, na TOS se uloží logická hodnota. Např. 50000 30000 U> . porovná, 50000>30000, zobrazí -1, (TRUE). Např. 50000 30000 > . přeteče 50000 do záporných čísel, zobrazí 0, (FALSE). ![]() |
| D= | (d1
d2 -- fl) d-32b se znaménkem |
d-equals | d1=d2, pak true
porovná d1 a d2, pokud hodnota d1=d2, výsledek je TRUE. d1 a d2 se vyčtou ze zásobníku, na TOS se uloží logická hodnota. Např. 5 1 3 1 D= . porovná, 65541=65539, zobrazí 0, (FALSE). Např. -5 -1 -5 -1 D= . porovná, -5=-5, zobrazí -1, (TRUE).
|
| D< | (d1 d2 -- fl) | d-less-than | d1<d2, pak true
porovná d1 a d2, pokud hodnota d1<d2, výsledek je TRUE. d1 a d2 se vyčtou ze zásobníku, na TOS se uloží logická hodnota. Např. 5 1 3 1 D< . porovná, 65541<65539, zobrazí 0, (FALSE). Např. -5 -1 -3 -1 D< . porovná, -5<-3, zobrazí -1, (TRUE).
|
| D0= | (d -- fl) | d-zero-equals | d=0, pak true
pokud je d nulové, výsledek je TRUE. d se vyčte ze zásobníku, na TOS se uloží logická hodnota. Např. 3 1 0= . porovná 65539 a 0, 65539<>0, zobrazí 0, (FALSE). ![]() |
| D0< | (d -- fl) | d-zero-less | d<0, pak true
pokud je d menší než nula, výsledek je TRUE. d se vyčte ze zásobníku, na TOS se uloží logická hodnota. Např. 3 1 0< . porovná 65539 a 0, 65539<0, zobrazí 0, (FALSE). Např. -3 -1 0< . porovná, -3 a 0, -3<0, zobrazí -1, (TRUE).
|
| DU< | (ud1
ud2 -- fl) ud-32b bez znaménka |
d-u-less | ud1<ud2, pak true
porovná ud1 a ud2, pokud hodnota ud1<ud2, výsledek je TRUE. ud1 a ud2 se vyčtou ze zásobníku, na TOS se uloží logická hodnota. Např. 5 1 3 1 DU< . porovná, 65541<65539, zobrazí 0, (FALSE). ![]() |
| AND | (x1
x2 -- x3) x-libovolné 16b číslo |
and | x3=x1 and x2 logický součin dvou 16-bitových
čísel, výsledek
je 16-bitové číslo. x1 a x2 se vyčtou ze zásobníku, na TOS se uloží x3. Např. hex 13 05 AND . provede 13 and 05, zobrazí výsledek 1. ![]() |
| OR | (x1 x2 -- x3) | or | x3=x1 or x2 logický součet dvou 16-bitových
čísel, výsledek
je 16-bitové číslo. x1 a x2 se vyčtou ze zásobníku, na TOS se uloží x3. Např. hex 13 05 OR . provede 13 or 05, zobrazí výsledek 17. ![]() |
| XOR | (x1 x2 -- x3) | xor | x3=x1 xor x2 exclusive or dvou 16-bitových
čísel, výsledek
je 16-bitové číslo. x1 a x2 se vyčtou ze zásobníku, na TOS se uloží x3. Např. hex 13 05 XOR . provede 13 xor 05, zobrazí výsledek 16. ![]() |
| INVERT | (x1 -- x2) | invert | x2=not x1
zinvertuje bity 16-b
čísla, 0 na 1, 1 na 0, výsledek
je 16-bitové číslo. x1 se vyčte ze zásobníku, na TOS se uloží x2. Např. hex 13 INVERT . zinvertuje 13, zobrazí výsledek EC. ![]() |
| WITHIN | (n1 n2
n3 -- fl) n1-16b se znaménkem |
within | n2<=n1<n3
porovná n1 s n2, n3, pokud n1 leží mezi n2, n3 výsledek je TRUE. n1, n2, n3 se vyčtou ze zásobníku, na TOS se uloží logická hodnota. Např. 5 3 6 WITHIN . porovná, 3<=5 a 5<6, 5 leží mezi 3 a 6, zobrazí -1, (TRUE). Např. 1 3 6 WITHIN . porovná, 3<=1 a 1<6, 1 neleží mezi 3 a 6, zobrazí 0, (FALSE). ![]() |
| MIN | (n1 n2 -- n3) | min | n3=menší z n1, n2
porovná n1 a n2, menší uloží na TOS. n1, n2 se vyčtou ze zásobníku, na TOS se uloží n3. Např. 5 3 MIN . porovná, 3 je menší než 5, zobrazí výsledek 3. ![]() |
| MAX | (n1 n2 -- n3) | max | n3=větší z n1, n2 porovná n1 a n2, větší uloží na TOS. n1, n2 se vyčtou ze zásobníku, na TOS se uloží n3. Např. 5 3 MAX . porovná, 5 je větší než 3, zobrazí výsledek 5. ![]() |
| DMIN | (d1 d2 -- d3) | d-min | d3=menší z d1, d2
porovná d1 a d2, menší uloží na TOS. d1, d2 se vyčtou ze zásobníku, na TOS se uloží d3. Např. 5 1 3 1 DMIN D. porovná, 65539 je menší než 65541, zobrazí výsledek 65539. ![]() |
| DMAX | (d1 d2
-- d3) |
d-max | d3=větší z d1, d2
porovná d1 a d2, větší uloží na TOS. d1, d2 se vyčtou ze zásobníku, na TOS se uloží d3. Např. 5 1 3 1 DMAX D. porovná, 65541 je větší než 65539, zobrazí výsledek 65541. ![]() |
| LSHIFT | (x1
u -- x2) x-libovolné 16b číslo u-16b bez znaménka |
l-shift | Logický posun vlevo posune číslo x1 o u-bitů vlevo, nejnižší bit doplní nulou. x1, u se vyčtou ze zásobníku, na TOS se uloží x2. Např. hex 13 2 LSHIFT . dvakrát posune vlevo, 13, 26, 4C, zobrazí výsledek 4C. ![]() |
| RSHIFT | (x1 u -- x2) | r-shift | Logický posun vpravo posune číslo x1 o u-bitů vpravo, nejvyšší bit doplní nulou. x1, u se vyčtou ze zásobníku, na TOS se uloží x2. Např. hex 13 2 RSHIFT . dvakrát posune vpravo, 13, 9, 4, zobrazí výsledek 4. ![]() |
| ____________________________________________________________________________________________________________________ 21.01.2008 -
Luboš Pěkný, čerpáno z
X3J14 dpANS-6. Podléhá
autorskému zákonu,
šíření povoleno jen s
uvedením autora.
|
|||