Prehľad inštrukcií procesora M8C: Rozdiel medzi revíziami

Z Kiwiki
Skočit na navigaci Skočit na vyhledávání
Riadok 207: Riadok 207:
  
 
* '''JMP'''  
 
* '''JMP'''  
  Syntax: JMP<návetie>
+
  Syntax: JMP <návetie>
Inštrukcia nepodmieneného skoku prinúti procesor spracovávať inštrkcie z iného miesta v pamäti.
+
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:
 
Príklad:
MOV A,4
+
  MOV A, 4
  Skok: ; návestie s názvom „Skok“
+
  JMP návestie ; skok na návestie  
MOV X, A
 
JMP Skok ; skok na návestie „Skok“
 
  
 
* '''LJMP'''
 
* '''LJMP'''
 
  Syntax: LJMP <návestie>
 
  Syntax: LJMP <návestie>
Inštrukcia vykoná skok na adresu v rozsahu 64 kB, čiže celého adresovateľného priestoru, používa sa 16-bitová adresa. Táto inštrukcia zabezpečí, že program z miesta tejto inštrukcie priamo odskočí na uvedenú adresu.
+
Inštrukcia absolútneho skoku, používa sa 16 bitová adresa. Táto inštrukcia zabezpečí.  
  
 
[[Súbor:LJMP.jpg|center|framed|Obr 1.Skok na adresu 20h]]
 
[[Súbor:LJMP.jpg|center|framed|Obr 1.Skok na adresu 20h]]
  
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ď.  
+
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'''
 
* '''Jx'''
Riadok 231: Riadok 231:
 
# '''JNZ''' <návestie> ; skok na návestie ak JZ=0
 
# '''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'''
 
* '''CALL'''
 
  Syntax: CALL <návestie>
 
  Syntax: CALL <návestie>
Inštrukcia zavolá návestie, ale najskôr uloží adresu následujúcej inštrukcie, aby sa program vrátiť späť. Volanie podprogramu v rozsahu 2 kB, používa sa 11-bitová adresa.
+
Inštrukcia zavolá podpogram. Volanie podprogramu v rozsahu 2 byty, používa sa 12-bitová adresa.
  
 
* '''LCALL'''
 
* '''LCALL'''
Je podobná ištrukcii CALL, volanie podprogramu v rozsahu 64 kB, používa sa 16-bitová adresa.
+
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'''  
 
* '''RET'''  

Verzia zo dňa a času 09:09, 25. jún 2010


Imbox draft.png
Toto je projekt, na ktorom sa ešte stále pracuje!!

Aj keď sú v tomto dokumente použiteľné informácie, ešte nie je dokončený. Svoje návrhy môžete vyjadriť v diskusii o tejto stránke.

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),taktiež pre 8 bitové sčítanie. 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>.

Pravdivostná tabuľka logickej funkcie AND
<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>

Pravdivostná tabuľka logickej funkcie OR
<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>

Pravdivostná tabuľka logickej funkcie XOR
<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:=01101001b

Inštrukcie presunu dát


  • MOV
Syntax: MOV <argument1>, <argument2>

Táto inštrukcia jednoducho presunie argument2 do argument1

Musí sa dodržať niekoľko pravidiel:

  1. Veľkosť (počet bitov), argument1 musí byť rovnako veľký ako argument2
  2. Do segmentových registrov nie je možné uložiť priamo číslo
MOV A, 1234
MOV X,A
  1. Nie je možné priamo presúvať s pamäti do pamäti
  2. Žiadna inštrukcia nesmie mať ako argument viac ako jednu adresu.

Príklad:

MOV A,5 ; A:=5
MOV X,SP ; X:=SP
  • SWAP
Syntax: SWAP <argument>

Inštrukcia navzájom prehodí obsah horného a dolného polbajtu uložených v argumente,t.j. Vymení horné 4 bity a dolné 4 bity v argumente, výsledok je uložený v argumente.

Príklad:

A:=11000011b 
SWAP A
A:=00111100b


  • MVI
Syntax: MVI <argument1>, <argument2>

Inštrukcia načíta 8-bitovú konštantu do registra. Pamäťový prístup je indexovaný. Index je sám o sebe v pamäti. Index je inkremenovaný po prevedení operácie. Príklad:

MOV [table],1		; prvá hodnota je v tabulke s indexom 1
MOV [table+1],2 	; druhá hodnota dostala index 2
MOV [ptr], table 	; pointer na prvý prvok v tabuľke
MVI A,[ptr] 		; A <-1, ptr <- table+1
MVI A,[ptr]		; A<-2, ptr <- table +2

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čí.

Obr 1.Skok na adresu 20h

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.

  1. JC <návestie> ; skok na návestie ak CF =1
  2. JNC <návestie> ; skok na návestie ak CF=0
  3. JZ <návestie> ; skok na návestie ak JZ=1
  4. 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.

Obr 2. Skok s podprogramu

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.

Obr 3. Rotácia do prava
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.

Obr 4. Rotácia do ľava
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 .

Obr 5. Aritmetické posunutie do prava
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.

Obr 6. Aritmetické posunutie doľava
00001111 ––> 00011110
                     C=0

Inštrukcie práce so zásobníkom

  • PUSH
Syntax: PUSH <argument>

Inštrukcia uloží 16 alebo 32 bitové hodnoty do zásobníku. K ukazateľu zásobníka SP sa pričíta jednotka a dáta na uvedenej adrese s inštrukciou sú uložené na vrchol zásobníka. Príklad:

PUSH 120 ;do vrcholu zásobníka uloží dáta z adresy 120
  • POP
Syntax: POP <argument>

Inštrukcia je opakom PUSH, načíta 16 alebo 32 bitové číslo zo zásobníka. od ukazateľa zásobníka je odčítaná jednotka, z vrcholu zásobníka sú vyzdvihnuté dáta uložené na adresu uvedenú pri inštrukcii. Príklad:

POP 120 – z vrcholu zásobníka sú dáta presunuté na adresu 120

Ď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


Odkazy a literatúra

  1. http://egr.spu.edu/bolding/EE3280/PSoC/05-M8C-Instructions.ppt
  2. http://www.kemt.fei.tuke.sk/Predmety/KEMT411_ESM/_web/wwwfiles/kapitola%2004.htm
  3. http://mikroprocesory.sk/8051_instrukcny_subor_sk
  4. http://www.spseke.sk/tutor/prednasky/I8051b.htm
  5. http://ap.urpi.fei.stuba.sk/ap/texty/assembler.pdf