Jelikož už jste základy strojového kódu celkem pochopili, tak dnes těch instrukcí proberem více. Tentokrát to bude ADD, SUB , CMP, Bcc, tj. sečítání, odčítání, porovnávání, relativní odskoky.
ADD, sečti data
Syntaxe asembleru:
ADD.s <ea>, Dn; Dn=Dn+<ea>
ADD.s Dn, <ea>; <Ea>=<ea>+Dn
délka operandu: byte, word, long word
Zdrojový operand je přičten k cílovému operadnu.
ADDA, sečti adresu
Syntaxe asembleru:
ADDA.s <ea>, An; An=An+<ea>
délka operandu: word, long word
Zdrojový operand je přičten k cílovému operandu a uložen do adresového registru.
ADDI, sečti bezprostředně
Syntaxe asembleru:
ADDI.s
<data>, <ea>; <ea>=<data>+<ea>
délka operandu: byte, word, long word
Data jsou přičtena k operandu.
ADDQ, sečti rychle
Syntaxe asembleru:
ADDQ.s
<data>, <ea>; <ea>=<data>+<ea>
délka operandu: byte, word, long word
Data jsou přičtena k cílovému operandu. Datové číslo může být velké od 1-8.
ADDX, sečti s rozšiřujícím bitem
Syntaxe asembleru:
ADDX.s Dy, Dx; Dx=Dy+Dx
ADDX.s -(ay), -(ax); -(ax)=-(ay)+(-(ax))
délka operandu: byte, word, long word
Zdrojový operand je sečten s rozšiřujícím bitem a cílovým operandem, do kterého se výsledek uloží.
Chápete variantu -(ay),-(ax)? Ano, je to zcela logické. Nejdříve se od obou adresových registrů odečte délka operandu a následovně jsou jednotlivé hodnoty sečteny.
Příkaz SUB má absolutně stejné možnosti jako ADD, a proto nepovažuji za důležité to nějak rozebírat, kdyby byly nějaké pochybnosti, můžete mi napsat, nebo se zeptat v konferenci 68000 na FIDU na jméno Karel Rous, Subjekt Narsil_ASM.
Dalším příkazem je tedy CMP, tj. Compare (srovnej).
CMP, porovnej
Syntaxe Asembleru:
CMP <ea>, Dn
délka operandu: byte, word, long word
Zdrojový operand se odečte od cílového a podle výsledků jsou nastaveny podmínkové kódy. Registry i adresy zůstávájí nezměněny.
Ostatní instrukce CMP mají opět stejnou syntaxi jako již dříve zmiňované ADD a SUB. Jedinou vyjímku tvoří syntaxe CMPM, porovnávej pamět:
CMPM.s (Ay)+,(Ax)+
Délka operandu: byte, word, long word
Co to teda dělá? Odečte se nedestruktivně (prostě to nic nezmění) zdrojový operand od cílového a podle výsledku se nastaví podmínkové bity. Potom se ke každému registru přičte délka operandu.
Bcc Jeden z dalších důležitých příkazů (ve strojovém kódu naštěstí nejsou nedůležité).
Syntaxe Asembleru:
Bcc <návěstí>
Délka operandu: byte, word
Jestli je zadaná podmínka splněna, pokračuje program na adrese PC+relativní odskok (-32767 až 32767). Pozor jako PC se bere adresa za koncem tohoto příkazu a až za ní je příčítán posuv, stejně tak je to i při odskoku dozadu. Ve skutečnosti vás to nemusí ale znervózňovat, jelikož při kompilaci si celý problém vyřeší asembler sám.
Ještě je tady jedna drobnost. Délka odskoku může být dvojí, buď byte nebo word. Identifikace probíhá vždy v prvním word instrukce. Jestliže je roven druhý byte word 0, tak se jedná o word odskok, má-li číslo různé od nuly, jedná se o byte odskok.
Jaké jsou tedy možnosti oskoku?
CC - přenos nenastaven, Carry=0. Kdy k tomu dojde? Např. když sečtete dvě čísla a jejich součet není větší než délka, s kterou operuje (byte, word, long word).
CS - přenos nastaven, Carry=1. Totéž co CC, ale číslo je větší.
EQ - rovno, Z=1. Jsou-li si dvě čísla rovna.
GE - je-li cílový operand větší než zdrojový. Definici podmínkových bitů raději neuvádíme.
GT - cíl větší než start.
HI - více, tj. cíl větší než zdroj. Nebere se ohled na znaménkový bit.
LE - cíl menší nebo roven zdroji.
LS - méně nebo stejně. Opět bez znaménkového bitu.
LT - Cíl je menší než zdroj.
MI - záporné, N=1.
NE - nerovno, Z=0.
PL - kladné, N=0.
VC - není přetečení, V=0.
VS - je přetečení, V=1.
RA - Odskoč vždy. Toto v podstatě není podmínkový kód, ale jelikož se jedná o relativní odskok, tak jsem ho sem zařadil.
Na závěr tedy několik příkladů použití:
MOVE.B
255,D3 ;zapiš 255 do D3
ADDQ.B
1,D3 ;přidat 1 k d3, dochází k nastavení Carry
BCC.END ;odskoč na end
MOVE.B
0,D3 ;zapsat 0 do D3. Nastaví se Zero na nulu
BEQ.S END ;je rovno 0, tak odskočí na END
MOVE.B
100,D5 ;100 do D5
MOVE.B
200,D4 ;200 do D4
CMP.B D4,D5 ;POROVNEJ D4,D5
BHI.S END ;.S označuje 1 byte operand. D5 není větší než D4, tak nedojde k odskoku.
U všech příkazů, které používáte spolu s adresovými registry, samozřejmě můžete používat různé postinkrementy, offsety atd.
Takže to by bylo asi všechno, teď už jen programovat.
HEAD