Základy mikroprocesorové techniky 11. Týden – Instrukční sada ‘51 Garant:Prof. Zdeněk Bohuslávek, CSc. Přednášející:Ing. Jiří Nesládek Podklady:
Typy operandů A – střadač C – příznak přenosu ve stavovém slově (PSW) DPTR – SFR registr používaný pro nepřímé adresování Rx – registr R0 – nepřímá adresa v R0 resp. R1 – obsah registru určuje adresu místa, s jehož obsahem se bude pracovat a8, a11, a16 – přímá adresa (8, 11 resp. 16-ti bitová) #d8, #d16 – přímá data (8 resp. 16-ti bitová) r8 – relativní adresa b8 – bitová adresa /b8 – negovaná hodnota bitu b8
Instrukce přesunů MOV – Move Memory MOVC – Move Code Memory MOVX – Move Extended Memory PUSH – Push Value Onto Stack POP – Pop Value From Stack XCH – Exchange bytes XCHD – Exchange digits
Instrukce přesunů MOV –Přesune bajt ze zdrojového umístění (src) do cílového umístění (dst) –Syntaxe:MOVdst, src A Rx DPTR C b8
Instrukce přesunů MOVC –Přesune bajt z programové paměti do střadače. Adresa místa, jehož obsah se přesouvá, získáme jako 16-ti bitový součet obsahu střadače (8 bitů) a ukazatele dat DPTR nebo čítače instrukcí PC. V případě čítače instrukcí do výpočtu vstupuje již adresa odpovídající následující instrukci. MOVX –Přesune byte z/do střadače do/z vnější paměti dat. Instrukce mohou využívat 16-ti nebo 8-mi bitovou nepřímou adresu. V prvním případě se vysílá adresa uložená v DPTR na bránu P2 (DPH) a bránu P0 (DPL). V druhém případě se vysílá na bránu P0 adresa uložená v registru R0 nebo R1 a na bráně P2 zůstává hodnota naposledy zapsaná. A A
Instrukce přesunů PUSH –Přičte jedničku k ukazateli zásobníku a potom uloží obsah adresovaného místa na vrcholu zásobníku (zásobník je vždy ve vnitřní datové paměti). –Syntaxe:PUSHa8 POP –Vyzvedne obsah vrcholu zásobníku a uloží jej na adresované paměťové místo. Pak odečte od ukazatele zásobníku jedničku. –Syntaxe:POPa8 XCH –Vymění (navzájem prohodí) obsah střadače a určeného registru nebo adresovaného paměťového místa. –Syntaxe:XCHA, Rx XCHA, a8 XCHD –Vymění (navzájem prohodí) obsah nižšího „půlbajtu“ střadače s nepřímo adresovaným paměťovým místem vnitřní paměti RAM.
Aritmetické operace INC – Increment Register DEC – Decrement Register ADD (ADDC) – Add Accumulator (With Carry) SUBB – Subtract From Accumulator With Borrow MUL – Multiply Accumulator by B DIV – Divide Accumulator by B DA – Decimal Adjust
Aritmetické operace INC –Přičte k obsahu adresovaného paměťového místa jedničku. –Syntaxe:INCA INCRx INCa8 INCDPTR DEC –Odečte jedničku od obsahu adresovaného paměťového místa. –Syntaxe:DECA DECRx DECa8
Aritmetické operace ADD, ADDC –Přičte ke střadači obsah adresovaného bytu. ADDC navíc přičítá ještě příznak přetečení (Carry). –Syntaxe:ADDA, RxADDCA, ADDA, a8ADDCA, a8 ADDA, #d8ADDCA, #d8 SUBB –Odečte od střadače obsah adresovaného bytu včetně příznaku přenosu (Borrow = Carry). –Syntaxe:SUBBA, Rx SUBBA, a8 SUBBA, #d8
Aritmetické operace MUL –Vynásobí dvě osmibitová čísla bez znaménka uložená ve střadači a registru B. Po operaci se do A uloží nižší byte výsledku, do B vyšší byte výsledku. –Syntaxe:MULAB DIV –Celočíselně vydělí obsah střadače obsahem registru B. Celá část podílu se uloží do střadači, zbytek (nikoliv desetinná část) zůstává v registru B. –Syntaxe:DIVAB DA –Koriguje obsah střadače po binárním sčítání dvou dekadických čísel vyjádřených v BCD kódu tak, aby výsledek opět tvořil dvě čtyřbitová BCD čísla. Je-li hodnota na nižších čtyřech bytech >9 nebo AC=1, potom se ke střadači přičte hodnota 6. Je-li hodnota na vyšších čtyřech bitech >9 nebo AC=1, potom se ke střadači přičte hodnota 60H. –Syntaxe:DAA
Logické operace ANL – Bitwise AND ORL – Bitwise OR XRL – Bitwise Exclusive OR CLR – Clear Register CPL – Complement Register
Logické operace ANL/ORL/XRL –Provede logický součin/součet/výlučný součet mezi odpovídajícími bity z cílového a zdrojového umístění a výsledek uloží do cílového umístění. –Syntaxe:ANLdst, src ORLdst, src XRLdst, src A a8 C
Logické operace CLR –Vynuluje obsah střadače resp. adresovaný bit. –Syntaxe:CLRA CLRC CLRb8 CPL –Neguje každý bit střadače resp. adresovaný bit. –Syntaxe:CPLA CPLC CPLb8
Instrukce posunů RL – Rotate Accumulator LeftSyntaxe: RL A RLC – Rotate Accumulator Left Throuht CarrySyntaxe: RLC A RR – Rotate Accumulator RightSyntaxe: RR A RRC – Rotate Accumulator Right Throuht CarrySyntaxe: RRC A SWAP – Swap Accumulator NibblesSyntaxe: SWAP A b7b6b5b4b3b2b1b0 b7b6b5b4b3b2b1b0C b7b6b5b4b3b2b1b0 b7b6b5b4b3b2b1b0C b7 b4b3 b0
Výhradně bitové operace SETB – Set Bit –Nastaví přímo adresovaný bit na log.1. –Syntaxe:SETBC SETBb8
Instrukce podmíněných skoků JC – Jump if Carry Set JNC – Jump if Carry Not Set JB – Jump if Bit Set JNB – Jump if Bit NotSet JBC – Jump if Bit Set And Clear Bit JZ – Jump if Accumulator Zero JNZ – Jump if Accumulator Not Zero CJNE – Compare and Jump if Not Equal DJNZ – Decrement Register and Jump if Not Zero
Instrukce podmíněných skoků JC/JNC –Testuje příznak přenosu (C) a v případě jeho nastavení (log. 1) resp. nulovosti (log. 0) provede skok na adresu, kterou vypočte jako součet čítače instrukcí a relativní adresy. –Syntaxe:JCr8JNCr8 JB/JNB –Testuje adresovaný bit a v případě jeho nastavení (log.1) resp. nulovosti (log. 0) provede skok na adresu, kterou vypočte jako součet čítače instrukcí a relativní adresy. –Syntaxe:JBr8JNBr8 JZ/JNZ –Testuje obsah střadače a v případě je nulovosti resp. nenulovosti provede skok na adresu, kterou vypočte jako součet hodnoty čítače instrukcí a relativní adresy. –Syntaxe:JZr8JNZr8
Instrukce podmíněných skoků CJNE –Porovná dva bajty z umístění daného prvními dvěma operandy. V případě jejich nerovnosti provede relativní skok. Adresa skoku se vypočte přičtením relativního posunu k čítači instrukcí. Pokud se cílový a zdrojový byte rovnají, program pokračuje vykonáváním další instrukce následující po instrukci CJNE. –Syntaxe:CJNEA, a8, r8 CJNEA, #d8, r8 CJNERx, #d8, r8 #d8, r8 DJNZ –Odečte od adresovaného paměťového místa jedničku a zjistí, zda je výsledek nulový. Je-li výsledek nenulový, provede skok na definovanou adresu. Je-li výsledek nulový, program pokračuje vykonáváním další instrukce následující po instrukci DJNZ. –Syntaxe:DJNZRx, r8 DJNZa8, r8
Instrukce skoků ACALL – Absolute CallSyntaxe:ACALLa11 LCALL – Long CallSyntaxe:LCALLa16 RET – Return From SubroutineSyntaxe:RET RETI – Return From InterruptSyntaxe:RETI AJMP – Absolute JumpSyntaxe:AJMPa11 LJMP – Long JumpSyntaxe:LJMPa16 SJMP – Short JumpSyntaxe:SJMPr8 JMP – Jump to
Příklad: blikání LEDkou $MOD52; use 8052 predefined symbols LEDEQUP3.4; P3.4 is red LED on eval board CSEG; MAIN PROGRAM ORG0000h ;============================================================================== BLINK:CPLLED; flash (complement) the red LED CALLDELAY; call software delay JMPBLINK; repeat indefinately ;============================================================================== DELAY:; delay 100ms MOVR7, #200; 200 * 500us = 100ms DLY1:MOVR6, #229; 229 * 2.17us = 500us DJNZR6, $; sit here for 500us DJNZ R7, DLY1; repeat 200 times (100ms delay) RET ;============================================================================== END