Prehľad inštrukcií procesora M8C
Inštrukcia procesoru je základný prvok činnosti, ktorú vykonáva procesor v našom prípade procesor M8C. V závislosti od výsledku inštrukcie môžu byť nastavované príznakové bity registra F:
- CF - Carry Flag
- ZF - Zero Flag
Inštrukcie procesora môžeme rozdeliť do niekoľkých základných skupín :
- Aritmetické inštrukcie
- Logické inštrukcie
- Inštrukcie presunu dát
- Inštrukcie skoku
- Inštrukcie rotácie
- Inštrukcie práce so zásobníkom
- Ďalšie inštrukcie
Aritmetické inštrukcie
- ADD
Syntax: ADD <argument1>,<argument2>
Inštrukcia sčíta argumenty a výsledok uloží do argumentu1, ak sú väčšie čísla ako 8 bitov inštrukcia sa reťazí.
- ADC
Syntax: ADC <argument1>,<argument2>
Inštrukcia sčíta argumenty inštrukcie a pridá príznakový bit Carry (CF). Prevedie sa táto operácia <argument1> := <argument1> + <argument2> + CF.
- SUB
Syntax: SUB <argument1>,<argument2>
To isté ako ADD ale argumenty sa odčitujú.
- SBB
Syntax: SBB <argument1>,<argument2>
To isté ako ADC, ale taktiež sa argumenty odčitujú, takže sa prevedie operácia <argument1> := <argument1> - <argument2> - Borrow
- INC
Syntax: INC <argument>
Táto inštrukcia zvýši 8 bitové číslo o jednotku (+1). Táto funkcia sa využíva, pretože je rýchlejšia ako ADD <argument>, 1.
- DEC
Syntax: DEC <argument>
Táto inštrukcia je rovnaká ako INC, ale ide o zníženie čísla o jednotka (-1).
Pre INC a DEC inštrukcie sa hodnoty príznakov CF, ZF sa nastavujú pri pretečení resp. pri
dosiahnutí nuly argumentu
Používajú sa hlavne pri inkrementovaní počítadiel cyklov.
Logické inštrukcie
- AND
Syntax: AND <argument1>,<argument2>
Inštrukcia urobí logické násobenie, t.j. <argument1> := <argument1> AND <argument2>.
<argument1>:= | <argument1> | <argument2> |
---|---|---|
1 | 1 | 1 |
0 | 0 | 1 |
0 | 1 | 0 |
0 | 0 | 0 |
Používa sa k nulovaniu vybraných bitov. Napr. ak chcem vynulovať tretí bit akumulátora A, tak potom
AND A, CPL 8
- OR
Syntax: OR <argument1>,<argument2>
Inštrukcia urobí logické sčítanie, t.j. <argument1> := <argument1> OR <argument2>
<argument1>:= | <argument1> | <argument2> |
---|---|---|
1 | 1 | 1 |
1 | 0 | 1 |
1 | 1 | 0 |
0 | 0 | 0 |
Používa sa na nastavenie požadovaných bitov, napr. chcem nastaviť tretí bit akumulátora A, potom
OR A, 3
- XOR
Syntax: XOR <argument1>,<argument2>
Inštrukcia urobí logické funkciu, t.j. <argument1> := <argument1> XOR <argument2>
<argument1>:= | <argument1> | <argument2> |
---|---|---|
0 | 1 | 1 |
1 | 0 | 1 |
1 | 1 | 0 |
0 | 0 | 0 |
Pokiaľ dáme Xoru rovnaké číslo tak vždy vyjde 0. Je vhodný pre nulovanie. Napr. ak potrebujem dať do akumulátora A nulu potom
XOR A,A
- TST
Synatax: TST <argument1>, <argumen2>
Inštrukcia vykoná logický súčin operandov, podľa výsledku operácie nastaví príznakový bit ZF, ale výsledok neuloží
TST A,%01000000 ;ak bit 6 je 1 potom ZF =0 TST A, %01111000 ;ak bity 6,5,4 alebo 3 sú 0 potom ZF=1
- CPL
Syntax: CPL <argument>
Inštrukcia neguje obsah argumentu, t.j. vymení všetky 0 za 1 a naopak. Pri Hodnote 0x00 nastavuje príznak ZF.
Príklad:
MOV A,%10010110 CPL A ;A:=%01101001
Inštrukcie presunu dát
- MOV
Syntax: MOV <argument1>, <argument2>
Táto inštrukcia jednoducho presunie argument2 do argument1
Príklad:
MOV A,k MOV X,expr
Inštrukcia nastavuje príznačný bit ZF, ak je hodnota cieľu nolová 0x00.
MOV A, 0x01 ;hodnota akumulátora je 0x01, potom ZF=0. MOV A, 0x00 ;hodnota akumulátora je 0x00, teda nulová. Potom ZF=1.
- SWAP
Syntax: SWAP <argument>
Inštrukcia vymieňa obsah zdroja s cieľa. Výhodné pri dočasnom odložení registrov A,X do pamäte
- MVI
Syntax: MVI <argument1>, <argument2>
Inštrukcia načíta 8-bitovú konštantu do registra pomocou smerníka.Smerník je inkremenovaný po prevedení operácie. Príklad:
MOV [table],1 MOV [table+1],2 MOV [ptr], table MVI A,[ptr] MVI A,[ptr]
Inštrukcie skoku
- JMP
Syntax: JMP <návetie>
Inštrukcia nepodmieneného skoku. Dlžka inštrukcie je 2 byty. Používa 12 bitovú adresu, kód inštrukcie sa nachádza v prvých 4 bitoch. Príklad:
MOV A, 4 JMP návestie ; skok na návestie
- LJMP
Syntax: LJMP <návestie>
Inštrukcia absolútneho skoku, používa sa 16 bitová adresa. Táto inštrukcia zabezpečí.
Keďže inštrukcie sa vykonávajú postupne, po vykonaní inštrukcie na adrese 20h pokračuje vykonávaním inštrukcie na adrese 21h, potom 22h atď.
Najpoužívanejšie je JMP, pri chybe kompilátora sa inštrukcia zmení na LJMP
- Jx
Syntax: Jx <návestie>
Inštrukcie podmieneného skoku sa navzájom odlišujú rozhodovacou podmienkov, ktorá riadi prevedenie skoku. Po vyhodnotení podmienky skoku sa program bude vykonávať ďalej alebo sa vykonávanie programu presunie na iné miesto. Rozhodujúcou podmienkou sú stavy príznačných bitov.
- JC <návestie> ; skok na návestie ak CF =1
- JNC <návestie> ; skok na návestie ak CF=0
- JZ <návestie> ; skok na návestie ak JZ=1
- JNZ <návestie> ; skok na návestie ak JZ=0
- CMP
Syntax: CMP <argument1>, <argument2>
Porovná argumenty, ale neuloží výsledok. Podľa zmeny príznačných bitov CF a ZF sa určuje, aký z argumentov je >, <, =, >=, <=.
ZF=1 ak A == B ZF=0 ak A<>B CF=1 ak A-B<0 (A<B) CF=0 ak A-B>=0 (A>=B)
Príklady podmienených skokov:
CMP A,4 ;A==4 JZ navestie CMP A,4 ;A<>4 JNZ navestie CMP A,4 ;A<4 JC navestie CMP A,4 ;A>=4 JNC navestie CMP A,4 ;A<=4 JZ navestie JC navestie
- CALL
Syntax: CALL <návestie>
Inštrukcia zavolá podpogram. Volanie podprogramu v rozsahu 2 byty, používa sa 12-bitová adresa.
- LCALL
Je podobná inštrukcii CALL, používa sa 16-bitová adresa a rozsah je 3 byty.
Inštrukcie CALL a LCALL odkladajú pri volaní do zásobníka návratovú adresu (byte adrH, adrL)
- RET
Syntax: RET <argument> (nemusí byť)
Inštrukcia zabezpečuje návrat z posledného skoku, za posledný CALL čím sa dostaneme na miesto v odkiaľ bol volaný podprogram, čím sa pokračuje v ďalšom vykonávaní programu.
Inštrukcie rotácie
- RRC
Syntax: RRC <argument>,<n>
Posunie všetky bity v argumente doprava o n miest. Pri každom posune uloží do siedmeho bitu obsah nultého bitu a do príznačného bitu Carry sa uloží nultý bit.
C=0 00001111 ––> 00000111 C=1 C=1 10100010 –-> 11010001 C=0
- RLC
Syntax: RLC <argument>, <n>
Posunie všetky bity v argumente doľava o n miest. Pri každom posune uloží do nultého bitu obsah siedmeho bitu. Siedmy bit sa pri každom posune ukladá do príznačného bitu Carry.
C=0 10001111 ––> 00011110 C=1 C=1 00100010 –-> 01000101 C=0
- ASR
Syntax:ASR <argument>, <n>
Posunie všetky bity registra doprava. Do siedmeho bitu uloží siedmi bit. A posunie bity doprava .
00001111 ––> 00000111 C=1 10100011 –-> 11010001 C=1
- ASL
Syntax:ASL <argument>, <n>
Posunie všetky bity registra doľava. Do spodného bitu uloží nulu. Ukladáa najvyšší bit t.j. siedmi, do príznačného bitu Carry.
00001111 ––> 00011110 C=0
Inštrukcie práce so zásobníkom
- PUSH
Syntax: PUSH <argument>
Inštrukcia vloží hodnoty registra na miesto dočasného odloženia hodnôt, ktoré nazývame zásobník. Príklad:
PUSH A ;do vrcholu zásobníka uložia dáta z akumulátora A
- POP
Syntax: POP <argument>
Inštrukcia vráti hodnoty zo zásobníka do registra. Príklad:
POP A – z vrcholu zásobníka sú dáta presunuté späť do akumulátora A
Ďalšie inštrukcie
- ROMX
Kopíruje dáta z pamäťe ROM do zásobníka.
- HALT
Uvedie procesor do stavu halt. Čo má za následok uvoľnenie zberníc a prerušenie behu program.
- INDEX
Načitanie hodnoty s tabuľky hodnôt v pamäti ROM pomocou indexu akumulátora.
- SSC
Volanie špeciálnych subrutín z pamäte ROM.
- NOT
Prázdne 4 hodinové cykly