Instrukce procesorů 680xx
Hned na úvod uvedu na správnou míru některý skutečnosti. Tak zaprvý,
nejsem žádnej koder, takže neručim zato, že všechno dále uvedený je na 100%
správně. Všechy informace, který jsou obsaženy v tomto článku jsou převzatý
především z dokumentace od skvělýho assembleru PhxAss v4.0 (doporučuju si ho
pořídit - je FREEWARE a umí toho opravdu horně) a místama i ze skvělý knížky
"Assembler 68000" od Vlastimila Krále (vydal AMIGA Info v r. 1994) - to
kvůli přesnýmu překladu některých výrazů obsažených v textu.
Tož si to teda vyčvachtejte do umdlení a případný chybičky mi laskavě
odpusťte (a nebo ještě líp - napište mi a já sepíšu nějakej ten "upgrade").
PS. Tu a tam jsem zanechal nějakej tan anglickej výraz. Proč? Why? Uhm, I'm
not sure - I'm in lazy times & crazy evil's school hard work ussage...
(Dobrej blábol, co?)
Bye, children!
E.N.I.F.
Základní formát zápisu programů v assembleru:
[<návěští>] | <operační kód> | <operandy> |
Příklad: |
| ADDQ.B | #23,D0 |
semskoc: | MOVE.L | D0, D4 |
| TST.L | D4 |
Standardní adresovací mody MC68000:
V této části jsou použity následující konvence:
EA | - Effective address = "místo, kam se skočí" |
An | - libovolný adresový registr (např. A3) |
Dn | - jakýkoli datový registr (např. D0) |
Xn.SIZE | - udává index registr n (datový nebo adresový) a
velikost indexu (W pro Word nebo L pro Longword) |
PC | - čítač instrukcí (Program counter) |
dn | - hodnota posunutí, n bitů široká |
( ) | - označení nepřímého (indirect) adresování registrem |
Přímé adresování datových registrů
Zápis: Dn
Provede se jako: EA = Dn
Doplňkové wordy: 0 (Extension Words - ten překlad nic moc, sorry!)
Přímé adresování adresových registerů
Zápis: An
Provede se jako: EA = An
Doplňkové wordy: 0
Nepřímé adresování adresovým registrem (ARI)
Zápis: (An)
Provede se jako: EA = (An)
Doplňkové wordy: 0
ARI s postinkrementací
Zápis: (An)+
Provede se jako: EA = (An), An = An + SIZE
Doplňkové wordy: 0
ARI s predekrementací
Zápis: -(An)
Provede se jako: An = An - SIZE, EA = (An)
Doplňkové wordy: 0
ARI s posunutím (16-Bitů)
Zápis: (d16,An) nebo d16(An)
Provede se jako: EA = (An) + d16
Doplňkové wordy: 1
ARI s posunutím a indexem (posun 8-Bitový)
Zápis: (d8,An,Xn.SIZE) nebo d8(An,Xn.SIZE)
Provede se jako: EA = (An) + (Xn) + d8
Doplňkové wordy: 1
PC nepřímé (relativní) adresování s posunutím (16-Bitový posun)
Zápis: (d16,PC) nebo d16(PC)
Provede se jako: EA = (PC) + d16
Doplňkové wordy: 1
PC nepřímé (relativní) s indexem (8-Bitový posun)
Zápis: (d8,PC,Xn.SIZE) nebo d8(PC,Xn.SIZE)
Provede se jako: EA = (PC) + (Xn) + d8
Doplňkové wordy: 1
Absolutní krátké adresování
Zápis: (xxx)[.W] nebo xxx[.W]
Provede se jako: zadaná adresa (EA)
Doplňkové wordy: 1
Absolutní dlouhé adresování
Zápis: (xxx)[.L] nebo xxx[.L]
Provede se jako: zadaná adresa (EA)
Doplňkové wordy: 2
Přímé adresování dat (konstant)
Zápis: #xxx
Provede se jako: zadaný operand
Doplňkové wordy: 1 nebo 2
Rozšířené adresovací módy MC68000 a vejš
V této části jsou použity následující konvence:
EA | - Effective address |
An | - adresový registr n |
Dn | - datový registr n |
Xn.SIZE*SCALE | - označuje index registr n(datový nebo adresový), velikost
indexu (W nebo L), a měřítko (scale factor)
(1, 2, 4 nebo 8) |
PC | - čítač instrukcí (Program counter) |
dn | - hodnota posunutí, n bitů široká |
bd | - bázové posunutí (Base displacement) |
od | - Outer displacement |
( ) | - označuje nepřímé adresování registrem |
[ ] | - označuje napřímou adresu v paměti |
ARI s indexem (rozšíření standardního formátu)
Zápis: (d8,An,Xn.SIZE*SCALE)
Provede se jako: EA = (An) + (Xn)*SCALE + d8
Doplňkové wordy: 1
ARI s indexem a bázovým posunutím
Zápis: (bd,An,Xn.SIZE*SCALE)
Provede se jako: EA = (An) + (Xn)*SCALE + bd
Doplňkové wordy: 1, 2 nebo 3
Nepřímé adresování paměti s postidexem (Memory Indirect Postindexed) (?#!)
Zápis: ([bd,An],Xn.SIZE*SCALE,od)
Provede se jako: EA = (bd + An) + Xn.SIZE*SCALE + od
Doplňkové wordy: 1, 2, 3, 4 nebo 5
Nepřímé adresování paměti s preindexem (Memory Indirect Preindexed)
Zápis: ([bd,An,Xn.SIZE*SCALE],od)
Provede se jako: EA = (bd + An + Xn.SIZE*SCALE) + od
Doplňkové wordy: 1, 2, 3, 4 nebo 5
PC nepřímé (relativní) s indexem (rozšíření standardního formátu)
Zápis: (d8,PC,Xn.SIZE*SCALE)
Provede se jako: EA = (PC) + (Xn)*SCALE + d8
Doplňkové wordy: 1
PC relativní s indexem a bázovým posunutím
Zápis: (bd,PC,Xn.SIZE*SCALE)
Provede se jako: EA = (PC) + (Xn)*SCALE + bd
Doplňkové wordy: 1, 2 nebo 3
PC relativní adresování paměti s postindexem (PC Mem. Indirect Postindexed)
Zápis: ([bd,PC],Xn.SIZE*SCALE,od)
Provede se jako: EA = (bd + PC) + Xn.SIZE*SCALE + od
Doplňkové wordy: 1, 2, 3, 4 nebo 5
PC relativní adres. paměti s preindexem (PC Mem. Indirect Preindexed)
Zápis: ([bd,PC,Xn.SIZE*SCALE],od)
Provede se jako: EA = (bd + An + Xn.SIZE*SCALE) + od
Doplňkové wordy: 1, 2, 3, 4 nebo 5
68020 Suppressed Registers
Nepřímé adresování paměti s post/preindexedem umožňuje programátorovi
*suppress* opravdu cokoli. To znamená, že můžete například změnit standardní
formát ([bd,An,Xn.SIZE*SCALE],od) do následujících formátů:
- ([bd,An,Xn.SIZE*SCALE])
- ([An,Xn.SIZE*SCALE],od)
- ([bd],od)
- ([An])
- ([Xn.SIZE*SCALE])
- ([An],od)
atd...
Instrukce MC 68000 (podporované PhxAssemblerem)
Celočíselné instrukce pro všechny procesory
Celočíselné instrukce jen pro 010,020,030,040,060
Celočíselné instrukce jen pro 020,030,040,060
Celočíselné instrukce jen pro 040,060
Celočíselné instrukce pouze pro 68060
Řídící registry MOVEC
FPU instrukce 881,882,040,060
FPU instrukce jen pro 040,060
Instrukce 68851 PMMU
Instrukce 68030 PMMU
Instrukce 68040/060 PMMU
Celočíselné instrukce (68000,68010,68020,68030,68040,68060)
ABCD Dy,Dx sčítání BCD čísel
ABCD -(Ay),-(Ax)
ADD.x <ea>,Dn sčítání
ADD.x Dn,<ea>
ADDA.x <ea>,An sčítání adres
ADDI.x #<data>,<ea> přičítání konstanty
ADDQ.x #<data>,<ea> rychlé přičítání konstanty
ADDX.x Dy,Dx sčítání s přenosovým bitem
ADDX.x -(Ay),-(Ax)
AND.x <ea>,Dn Logické AND
AND.x Dn,<ea>
ANDI.x #<data>,<ea> AND s konstantou
ANDI.x #<data>,CCR AND s konstantou a CC (Condition
Codes Register)
ANDI.x #<data>,SR AND s konstantou a status registrem
ASL/ASR.x Dx,Dy aritmetický posun vlevo/vpravu
ASL/ASR.x #<data>,Dy
ASL/ASR <ea>
B<cc>.x <label> podmíněný skok
BCHG Dn,<ea> test bitu a jeho změna (překlopení)
BCHG #<data>,<ea>
BCLR Dn,<ea> test bitu a jeho vynulování
BCLR #<data>,<ea>
BRA.x <label> skok vždy
BSET Dn,<ea> test bitu a jeho nastavení (-> 1)
BSET #<data>,<ea>
BSR.x <label> skok na podprogram
BTST.x Dn,<ea> test hodnoty bitu
BTST.x #<data>,<ea>
CHK.x <ea>,Dn test registru vůči hranici 0 a druhé
hranici
CLR.x <ea> vynulování operandu
CMP.x <ea>,Dn porovnání
CMPA.x <ea>,An porovnání adresy
CMPI.x #<data>,<ea> porovnání s konstantou
CMPM.x (Ay)+,(Ax)+ porovnání dvou dat v paměti
DB<cc> Dn,<label> porovnání, dekrementace, a skok
DIVS <ea>,Dn dělení se znaménkem
DIVU <ea>,Dn dělení bez znaménka
EOR.x Dn,<ea> logický EOR
EORI.x #<data>,<ea> EOR s konstantou
EORI.x #<data>,CCR EOR skonstantou a Cond. Codes
EORI.x #<data>,SR EOR skonstantou a status registrem
EXG Rn,Rm prohození obsahů registrů
EXT.x Dn znaménkové rozšíření
ILLEGAL vyvolá výjimku Illegal Instruction
JMP <ea> skok
JSR <ea> skok do podprogramu
LEA <ea>,An nahrání adresy
LINK An,#<displacement> vytvoří lokální zásobník
LSL/LSR.x Dx,Dy logický posun vlevo/vpravo
LSL/LSR.x #<data>,Dy
LSL/LSR <ea>
MOVE.x <ea>,<ea> zkopírování dat
MOVEA.x <ea>,An kopie do adresového registru
MOVE <ea>,CCR kopie do Condition Codes
MOVE <ea>,SR kopie do status registru
MOVE SR,<ea> zkopírování status registru
MOVE USP,An zkopírování User Stack Pointeru
MOVE An,USP
MOVEM.x <register list>,<ea> zkopírování skupiny registrů
MOVEM.x <ea>,<register list>
MOVEP.x Dx,(d,Ay) zkopírování dat na periférie (ne 68060!)
MOVEP.x (d,Ay),Dx
MOVEQ #<data>,Dn rychlé zkopírování
MULS <ea>,Dn násobení se znaménkem
MULU <ea>,Dn násobení bez znaménka
NBCD <ea> negace BCD čísla
NEG.x <ea> negace
NEGX.x <ea> negace s bitem X
NOP žádná operace
NOT.x <ea> logická negace
OR.x <ea>,Dn logické OR
OR.x Dn,<ea>
ORI.x #<data>,<ea> OR s konstantou
ORI.x #<data>,CCR OR s konstantou a CC
PEA <ea> uložení adresy
RESET reset periférií
ROL/ROR.x Dx,Dy rotace vlevo/vpravo
ROL/ROR.x #<data>,Dy
ROL/ROR <ea>
ROXL/ROXR.x Dx,Dy rotace vlevo/vpravo s bitem X
ROXL/ROXR.x #<data>,Dy
ROXL/ROXR <ea>
RTE návrat z výjimky
RTR návrat z podprogramu (+ obnovení CC)
RTS návrat z podprogramu
SBCD Dx,Dy odčítání BCD čísel
SBCD -(Ax),-(Ay)
S<cc> <ea> podmíněné nastavení bytu
STOP #<data> nahrání Status Registru a zastavení
SUB.x <ea>,Dn odčítání
SUB.x Dn,<ea>
SUBA.x <ea>,An odčítání adres
SUBI.x #<data>,<ea> odečtení konstanty
SUBQ.x #<data>,<ea> rychlé odečtení konstanty
SUBX.x Dx,Dy odečtení se znaménkem
SWAP Dn prohození slov v registru
TAS <ea> test a nastavení operandu (bit 7)
TRAP #<vector> vyvolání výjimky
TRAPV výjimka při nastaveném příznaku V
TST.x <ea> test operandu na nulu
UNLK An zruší lokální zásobník
Integer Condition Codes <cc>
CC (HS) carry clear (higher or same) CS (LO) carry set (lower)
EQ equal F never true
GE greater or equal GT greater than
HI higher LE less or equal
LS less or same LT less than
MI negative NE not equal
PL positive T always true
VC overflow clear VS overflow set
Integer Instructions (68010,68020,68030,68040,68060)
BKPT #<data> Breakpoint
MOVE CCR,<ea> Zkopírování Condition Code registru
MOVEC Rc,Rn Zkopírování Control registrů
MOVEC Rn,Rc
MOVES Rn,<ea> Kopie adresového prostoru
MOVES <ea>,Rn
RTD #<displacement> Návrat a dealokace
Integer Instructions (68020,68030,68040,68060)
BFCHG <ea>{offset:width} Test bit. pole a překlopení
BFCLR <ea>{offset:width} Test bit. pole a vynulování
BFEXTS <ea>{offset:width},Dn Extract bit. pole signed
BFEXTU <ea>{offset:width},Dn Extract bit. pole unsigned
BFFFO <ea>{offset:width},Dn Najdi první nast. v bit. poli
BFINS Dn,<ea>{offset:width} Vlož bitové pole
BFSET <ea>{offset:width} Test bit. pole a nastav
BFTST <ea>{offset:width} Test bitového pole
CALLM #<data>,<ea> Call Module (pouze 68020!)
CAS.x Dc,Du,<ea> Porovnej a prohoď s operandem
CAS2.x Dc1:Dc2,Du1:Du2,(Rn1):(Rn2) (pouze 020-040!)
CHK2.x <ea>,Rn (pouze 020-040!) Test registru, zda vyhovuje hranicím
CMP2.x <ea>,Rn (pouze 020-040!) Porovnání registru s hranicemi
DIVS.L <ea>,Dq Znaménkové dělení
DIVS.L <ea>,Dr:Dq
DIVSL.L <ea>,Dr:Dq (pouze 020-040!)
DIVU.L <ea>,Dq Bezznaménkové dělení
DIVU.L <ea>,Dr:Dq
DIVUL.L <ea>,Dr:Dq (pouze 020-040!)
EXTB.L Dn Rozšíření o znaménko
LINK.L An,#<displacement> Link and Allocate - lokální zásobník
MULS.L <ea>,Dl Znaménkové násobení
MULS.L <ea>,Dh:Dl
MULU.L <ea>,Dl Bezznaménkové násobení
MULU.L <ea>,Dh:Dl
PACK -(Ax),-(Ay),#<adjustment> Pack BCD
PACK Dx,Dy,#<adjustment>
RTM Rn Návrat z modulu (jen 68020!) (CALLM)
TRAP<cc> Podmíněná výjimka
TRAP<cc>.x #<data>
UNPK -(Ax),-(Ay),#<adjustment> Unpack BCD
UNPK Dx,Dy,#<adjustment>
>> To be continued...(later!) <<
Další ve frontě:
|
|
|
|
|
|
|
|
Vokecávky |
Hardware | Warez | WBoviny | Dema |
Gfx&Muz | Pařby | Vokecávky 2 |