Programovanie v assembleri na Atari Falcon – 1. časť – Vetvenie

Toto bude prvý článok z možno rozsiahlejšej série – uvidíme podľa ohlasov 🙂

Nebudem tu riešiť úplne základy, skôr také praktické veci čo sa ma ľudia občas pýtajú, resp. ktoré si často pri programovaní kladiem aj ja sám keďže sa k tomu dostávam len raz za uhorský rok, a následne pri tom zbytočne strácam čas.

Väčšina vecí bude platiť univerzálne pre všetky procesory Motorola 680×0, čiže to bude využiteľné aj pre ST/STE/TT ale aj pre Atari Falcon s CT60 a teda procesor 68060. Ale hlavné zameranie bude na Atari Falcon s procesorom Motorola 68030.

Vetvenie a podmienky vetvenia

Vetvenie sa štandardne realizuje inštrukciou Bcc, kde namiesto ‚cc‘ dosadíme kód podmienky (napr. NE pre Not Equal a teda ištrukcia bude BNE).

Klasická situácia nastáva ak porovnávam dve čísla a potrebujem vedieť ktorá konkrétna podmienka mi zabezpečí vetvenie a teda odskok a ktorá zabezpečí pokračovanie programu bez vetvenia. Čiže väčšinou použijem niečo ako:

cmp   d0,d1

a hneď za tým chcem dať niečo ako:

bne   odskok

a pod. (platí aj pre DBcc alebo Scc). A kedže stavový register (SR) a teda hlavne jeho časť označovaná CCR (Condition Code Register) nám ponúka kopec možností tak tu sú najčastejšie možnosti čo ma zaujímajú:

cmp d0,d1so znamienkombez znamienka
d0 >  d1BLTBCS
d0 >= d1BLEBLS
d0 =  d1BEQBEQ
d0 <> d1BNEBNE
d0 <  d1BGTBHI
d0 <= d1BGEBCC

 

Alebo iný ešte praktickejší pohľad podľa hodnôt (bez znamienka) pre cmp d0,d1:

d0d1OdskočíNeodskočí
54BCS, BMI, BNE, BLT, BLS, BLEBCC, BPL, BEQ, BGT, BHI, BGE
55BCC, BPL, BEQ, BLS, BLE, BGEBCS, BMI, BNE, BLT, BGT, BHI
56BCC, BPL, BNE, BGT, BHI, BGEBCS, BMI, BEQ, BLT, BLS, BLE

 

Kompletný zoznam podmienok:

Kódovanie v inštrukciiKódPodmienkaPlatí ak:Poznámka
0000FFALSEZ = 1
0001TTRUEZ = 0(BT alebo BRA)
0010HIHighC + Z = 0
0011LSLow or SameC + Z = 1
0100CCCarry ClearC = 0
0101CSCarry SetC = 1
0110NENot EqualZ = 0
0111EQEqualZ = 1
1000VCoVerflow ClearV = 0
1001VSoVerflow SetV = 1
1010PLPlusN = 0
1011MIMinusN = 1
1100GEGreater or EqualN (+) V = 0
1101LTLess ThanN (+) V = 1
1110GTGreater ThanZ + (N (+) V) = 0
1111LELess or EqualZ + (N (+) V) = 1

 

Testovať konkrétny register oproti nule je možné inštrukciou TST, napr:

tst   d1

čo zodpovedá inštrukcii:

cmp   #0, d1

Samozrejme jednotlivé príznaky (flagy) v CCR nám nastavujú aj iné inštrukcie a tak vetvenie dáva zmysel aj po vykonaní väčšiny inštrukcií a špeciálne aritmetických a logických 🙂

 

Optimalizácia:

Nakoľko inštrukcia Bcc obsahuje adresu kam má skočiť (po splnení podmienky) vo formáte priameho operandu ktorý tvorí ofset (posunutie) oproti aktuálnemu PC (Program Counter). Je dobré vždy zadefinovať aj veľkosť tohto operandu (ofsetu). Veľkosť môže byť Byte, Word alebo Long* (* Long iba pre 68020 a vyšší).

Rozdielna dĺžka inštrukcie v pamäti:

bne.s     skok     ; 2b v pamäti

bne.w   skok     ; 4b

bne.    skok     ; 6b

Register CCR (Condition Code Register)

CCR sa skladá z najnižších ôsmich bitov SR a teda sa skladá z príznakov:

– – – X N Z V C

Jeho najvyššie tri bity (7., 6. a 5. bit) sú nevyužité a teda označené pomĺčkou ‚-‚.

X – eXtend – prenos pri viacnásobnej aritmetike – ako Carry, ale nastavený len pri viacnásobnej aritmetike (pozn. ak je nastavený eXtend, tak je určite zároveň nastavený aj Carry, naopak to vždy neplatí!)

N – Negative – znamienko výsledku – nastavený ak je výsledok záporný

Z – Zero – nulový výsledok – nastavený ak je výsledok rovný nula

V – oVerflow – pretečenie – nastavený ak došlo k pretečeniu pri znamienkovej aritmetike (napr. ak pri sčítaní dvoch kladných čísiel vzniklo v doplnkovej notácii číslo záporné)

C – Carry – prenos – obsahuje bit, ktorý bol pri operácií vytlačený z najvyššieho bitu výsledku.

 

Nultá časť: Devpac 3.10 – krátky komentovaný manuál

Môže sa Vám ešte páčiť...

5 komentárov

  1. mikro píše:

    K dlzke tych skokov len dodam, ze vasm umoznuje ich dlzku generovat/optimalizovat automaticky. Takze nie je potrebne sa dopredu zamyslat, ci pojde o kratky alebo dlhy skok, proste sa pouzije ten, ktory tam pasuje.

  2. whiskey píše:

    zrovna tento tyzden mi mikro poradil pouzit jsr namiesto bsr, ked devpac pri bsr tvrdil, ze operand too large 🙂

  3. Sedma píše:

    K tej optimalizacii dodam, teda aspon na ST to tak plati:

    – kod je rychlejsi ak podmienka nie je splnena a netreba skakat, cize optimalizovat kod vetvenia v loope tak, aby vacsina flow sla bez odskoku (ak viem ze 90% flow pojde cez jednu vetvu, pouzit na to vetvu bez skoku)

    – ak sa riesia skutocne kriticke sekcie kodu (vnutro loopu a podobne), pouzivat len .s (alebo to iste .b) natvrdo a optimalizovat kod tak aby sa tam odskok zmestil a nespoliehat sa na kompiler ktory zvoli vhodnu dlzku odskoku – vzdy sa to nejako da popresuvat

Pridaj komentár

Vaša e-mailová adresa nebude zverejnená. Vyžadované polia sú označené *