Prehľad inštrukcií procesora M8C: Rozdiel medzi revíziami
(Vytvorená stránka „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ť nastavova…“) |
|||
Riadok 1: | Riadok 1: | ||
+ | ===Inštrukcia=== | ||
+ | ---- | ||
+ | |||
Inštrukcia procesoru je základný prvok činnosti, ktorú vykonáva procesor v našom prípade procesor 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 | V závislosti od výsledku inštrukcie môžu byť nastavované príznakové bity | ||
Riadok 6: | Riadok 9: | ||
Inštrukcie procesora môžeme rozdeliť do niekoľkých základných skupín : | 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 skokov a rozvetvení | ||
+ | * Inštrukcie posuvov a rotácií | ||
+ | * Ďalšie inštrukcie | ||
+ | |||
===Aritmetické inštrukcie=== | ===Aritmetické inštrukcie=== | ||
+ | ---- | ||
+ | |||
*''' ADD''' | *''' ADD''' | ||
Syntax: ADD <argument1>,<argument2> | Syntax: ADD <argument1>,<argument2> | ||
Riadok 157: | Riadok 169: | ||
===Inštrukcie presunu dát=== | ===Inštrukcie presunu dát=== | ||
+ | ---- | ||
* '''MOV''' | * '''MOV''' | ||
Riadok 209: | Riadok 222: | ||
===Inštrukcie skokov a rozvetvení=== | ===Inštrukcie skokov a rozvetvení=== | ||
+ | ---- | ||
* '''JMP''' | * '''JMP''' | ||
Riadok 250: | Riadok 264: | ||
===Inštrukcie posuvov a rotácií=== | ===Inštrukcie posuvov a rotácií=== | ||
+ | ---- | ||
* '''RRC''' | * '''RRC''' | ||
Riadok 299: | Riadok 314: | ||
===Ďalšie inštrukcie=== | ===Ďalšie inštrukcie=== | ||
+ | ---- | ||
* '''ROMX''' | * '''ROMX''' | ||
Kopíruje dáta z pamäťe ROM do zásobníka. | Kopíruje dáta z pamäťe ROM do zásobníka. | ||
Riadok 309: | Riadok 325: | ||
* '''NOT''' | * '''NOT''' | ||
Prázdne 4 hodinové cykly | Prázdne 4 hodinové cykly | ||
+ | |||
+ | ---- | ||
+ | ===Odkazy a literatúra=== | ||
+ | # http://egr.spu.edu/bolding/EE3280/PSoC/05-M8C-Instructions.ppt | ||
+ | # http://www.kemt.fei.tuke.sk/Predmety/KEMT411_ESM/_web/wwwfiles/kapitola%2004.htm | ||
+ | # http://mikroprocesory.sk/8051_instrukcny_subor_sk | ||
+ | # http://www.spseke.sk/tutor/prednasky/I8051b.htm | ||
+ | # http://ap.urpi.fei.stuba.sk/ap/texty/assembler.pdf |
Verzia zo dňa a času 15:53, 22. jún 2010
Obsah
Inštrukcia
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 skokov a rozvetvení
- Inštrukcie posuvov a rotácií
- Ďalšie inštrukcie
Aritmetické inštrukcie
- ADD
Syntax: ADD <argument1>,<argument2>
Inštrukcia sčíta argumenty a výsledok uloží do argumentu1, argument2 môže byť register, konštanta alebo miesto v pamäti, ale argument1 nemôže byť konštanta. Taktiež platí, ako aj u ostatných inštrukcií, že obidva argumenty nemôžu byť odkazom do pamäti.
Ak by výsledok sčítania pomocou inštrukcie ADD bol väčší ako je možné uložiť, nastaví sa príznakový bit Carry (CF) na 1. Toto sa využíva v nasledovnej inštrukcii.
- 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. Väčšinou sa vykonáva hneď po inštrukcii ADD. Napr. pre sčítanie dvoch 64 bitových čísiel.
- 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> - CF
- INC
Syntax: INC <argument>
Táto inštrukcia pridá k <argument> jednotku. 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 odrátavanie jednotky.
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 registru AL, tak potom
AND AL, NOT 8
- OR
Syntax: OR <argument1>,<argument2>
Inštrukcia urobí logické násobenie, 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 registru AL, potom
OR AL, 3
- XOR
Syntax: XOR <argument1>,<argument2>
Inštrukcia urobí logické násobenie, 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 AX nulu potom
XOR AX,AX
- 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ží. Používa sa vtedy, keď chceme zistiť, akú hodnotu má zvolený bit ľavého operandu. Napr. otestujeme 3. bit registra AL:
TST AL,%01000000 ;ak bit 6 je 1 potom ZF =0 JNZ cieľ ;ak bit 6 je 1, skoč na cieľ TST AL, %01111000 ; ak bity 6,5,4 alebo 3 sú jedna ZF=1 JZ cieľ ;ak ZF=1, skoč na cieľ
- CPL
Syntax: CPL <argument>
inštrukcia neguje obsah argumentu, vykoná invertovanie každého bitu.
Príklad:
MOV A,10010110b CPL A A:=01101001b
- CMP
Syntax: CMP <argument1>, <argument2>
Inštrukcia porovnáva argumenty nedeštruktívnym spôsobom, t.j. že do žiadneho neuloží výsledok. Pomocou zmeny príznakových bitov ZERO a CARRY a podmienených skokov sa určuje ktorý z argumentov je >, <, =, >=, <=. Inštrukcia ako prvé zhodnotí vlajky a podľa výsledku buď skočí alebo neskočí.
Príklad:
CMP A, B FZ=0 if A<>B ZF=1 if A==B CF=0 if A-B>=0 ; (A>=B) CF=1 if A-B<0 ; (A<B)
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:
- Veľkosť (počet bitov), argument1 musí byť rovnako veľký ako argument2
- Do segmentových registrov nie je možné uložiť priamo číslo
MOV AX, 1234 MOV ES,AX
- Nie je možné priamo presúvať s pamäti do pamäti
- Žiadna inštrukcia nesmie mať ako argument viac ako jednu adresu.
Príklad:
MOV AX,5 ; AX:=5 MOV AH,BL ; AH:=BL
- 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
- 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
- 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 skokov a rozvetvení
- JMP
Syntax: JMP<návetie>
Inštrukcia nepodmieneného skoku prinúti procesor spracovávať inštrkcie z iného miesta v pamäti. Príklad:
MOV AX,4 Skok: ; návestie s názvom „Skok“ MOV BX, AX JMP Skok ; skok na návestie „Skok“
- LJMP
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.
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ď.
- 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
- CALL
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.
- LCALL
Je podobná ištrukcii CALL, volanie podprogramu v rozsahu 64 kB, používa sa 16-bitová adresa.
- 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 posuvov a rotácií
- 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 o daný n miest doprava. Do n horných bitov uloží nulu. Nultý bit sa pri každom posune uloží do príznačného bitu Carry.
00001111 ––> 00000111 C=1 10100011 –-> 11010001 C=1
* ASL Syntax:ASL <argument>, <n>
Posunie všetky bity registra o daný počet miest doľava. Do n spodných bitov uloží nulu. Zanecháva najvyšší bit t.j. siedmi, ako znamienko.
00001111 ––> 00011110 C=0
Ď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