MOTOROLA 68000 (5. část)
------------------------
Nevím, zda-li někdo už pochopil, alespoň kousek z programování Motoroly, ale jelikož už se pomalu přehupujeme do druhé poloviny celého seriálu, tak ho každopádně dokončím.
Takže o čem si budeme psát dnes, vše se bude týkat posunu a testování, nastavování jednotlivých bitů, tedy instrukce, bez kterých se téměř při jakémkoliv přesunu dat na obrazovce, při různém násobení násobků dvou apod. vůbec neobejdeme.
ASL; ASR, aritmetický posun vlevo či vpravo
Syntaxe asembleru:
ASL.s Dx, Dy, ASR.s Dx, Dy
ASL.s <data>, Dy, ASR.s <data>, Dy
ASL.s <ea>, ASR.s <ea>
Délka operandu: byte, word, long word
Teď si asi říkáte, co to vlastně znamená. Takže od začátku. ŕekněmě, že máte v registu D1 binární číslo:
00000011, decimálně jsou to 3
teď na něj uplatníme příkaz: ASL.w D2,D1 přičemž D2=2, tj. budeme posunovat o dva bity. Zde by mohlo být pochopitelně použít i přímé syntaxe, která by zněla ASL.w 2,D1, jenomže to by před tou 2 použit znak čtverečku, který je jedním z editačních znaků samotného Narsilu, a proto ho nemůžeme používat. Nezapomínejte na to prosím!
Co se stane s číslem tři?
Vpodstatě je to stejné, jako bychom ho vynásobili číslem 4, takže dostaneme číslo 12 decimálně, nebo 0000110000 binárně. Kdybychom se chtěli opět dostat na původní hodnotu, stačí napsat ASR.W D2, D1 a číslo v D1 je opět 3.
Další možností je použití přímého posunu v paměti, tzn. že místo datového registru napíšete přímo adresu v paměti, pochopitelně jsou povoleny všechny metody nepřímého adresování, a místo počtu míst o které chcete posunout nenapíšete nic.
Výsledek bude vypadat např. takhle:
ASL.W (A5), tzn. že v A5 je adresa kterou v podstatě vynásobíme 2x, nebo také bitově posuneme o jedno místo doleva.
Existují také příkazy LSL a LSR, kde se jedná o logický bitový posun. Jejich syntaxe je až na název příkazu úplně stejná. Rozdíl je pouze v nastavování příznakových bitů, ale o těch se budeme zmiňovat až po vysvětlení všech příkazů procesoru.
ROL; ROR, logická rotace bitů
Syntaxe asembleru:
ROL.s Dx, Dy, ROR.s Dx, Dy
ROL.s <data>, Dy, ROR.s <data>, Dy
ROL.s <ea>, ROR.s <ea>
Totožné s logickým, potažmo aritmetickým posuvem. Jediným rozdílem je, že nedochází k destrukci posunovaného operandu. Proč? Při normálních posuvech (ASR, ASL, LSL, LSR) je vždy horní či spodní bit (to záleží na směru) doplňen nulou. Zatímco u instrukce ROL a ROR je vysunutý bit přesunut na právě uvolněné místo.
Ja to pracuje? ŕekněmě, že máme opět číslo 3 a chceme ho RORovat o 2. D1=2; D2=3
ROR.W D1,D2 - kdyby se jednalo o instrukce ASR či LSR, měli bychom v registru D2 číslo 0, ale jelikož se jedná o ROL bude vše vypadat takhle:
0000000000000011 - šesnáctibitové binární číslo, decimálně 3
po RORu
1100000000000000 - decimálně 49152
ROXL, ROXR, logická rotace bitů s rozšiřujícím X bitem.
Syntaxe asembleru je opět shodná s příkazem ROL či ROR, avšak tento příkaz navíc umožňuje posun vždy jednoho bitu mezi jednotlivými registry, či registrem a pamětí, nebo pamětí a pamětí. Jak to pracuje? Tentokrát je sice obsah posledního rotovaného bitu znehodnocen, ale tak, že se do bitu, který by byl příkazy LSL a LSR (pochopitelně i ostatními posuvy) doplněn nulou, nyní doplní obsah X bitu. Příklad:
D2=16384; D1=1 (počet posouvaných bitů); D3=1
D2=0100000000000000
D3=0000000000000001
LSR.W D1,D3 - Ano, i tyto příkazy ovlivňují X bit. Teď se přenese do X - bitu 1
ROXR.W D1,D2 - Teď je nastaven v D2 nejvyšší bit a zbytek registru posunut.
D2=1010000000000000
Další příkazy se týkají ovládání a testovaní jednotlivých bitů.
BCLR (Testuj bit a vynuluj)
Syntaxe asembleru:
BCLR Dn,<ea>
BCLR <data>,ea
Délka operandu: byte, dlouhé slovo
Takže tato instrukce otestuje určitý bit v bajtu v paměti, nebo jeden z bitů registru (0-31) a ten potom smaže. Příklad:
D1=2;D2=4; D2=00000100; BCLR D1,D2 BEQ.S BYLO_JEDNA ;jestliže byl bit při testování roven 1, tak odskočí na toto navěstí. Kdybychom chtěli, aby odskakoval při 0, tak bychom museli použít příkaz BNE
po použití příkazu je registr následující:
D2=00000000
BCHG, testuj bit a změň ho
Syntaxe je totožná s předcházejícím příkazem, to znamená, že v paměti můžete ovládat pouze jeden byte a v registru vždy všech 32 bitů. Prosím, uvědomte si, že čísla bitů jsou číslována naopak, než např. počítání bodů. Takže 31 bit je úplně vlevo.
BSET, Testuj bit a nadstav ho
Opět stejná syntaxe, prostě po otestování nastaví vybraný bit.
BTST, Testuj bit
Jediný příkaz pro spolupráci s bity, který nijak neovlivňuje operand, ale pouze ho testuje. Odskok po otestování je opět při jedné BEQ a při nule BNE.
Posuvy a ovládání bitů máme za sebou, takže se těším opět u dalšího dílu. Pozor! Rád bych vás upozornil, že jak bude tento seriál pokračovat, budeme se dostávat k čím dál tím složitějším formulacím. Proto vám teď nevnucuji, co který příkaz jak ovlivňuje, jelikož by toho bylo na první setkání s asemblerem příliš mnoho.
HEAD