200 likes | 342 Views
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: http ://www.rabaka.net/ ZMT. Typy operandů. A – střadač C – příznak přenosu ve stavovém slově (PSW)
E N D
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: http://www.rabaka.net/ZMT
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 R0R7 • @Rr – 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
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. • Syntaxe:MOVC A, @A+DPTR MOVC A, @A+PC • 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á. • Syntaxe:MOVX A, @Rr MOVX A, @DPTR MOVX @Rr, A MOVX @DPTR, 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: PUSH a8 • 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: XCH A, Rx XCH A, a8 XCH A, @Rr • 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. • Syntaxe:XCHDA, @Rr
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: INC A INC Rx INC a8 INC @Rr INC DPTR • DEC • Odečte jedničku od obsahu adresovaného paměťového místa. • Syntaxe: DEC A DEC Rx DEC a8 DEC @Rr
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: ADD A, RxADDC A, Rx ADD A, @RrADDC A, @Rr ADD A, a8ADDC A, a8 ADD A, #d8 ADDC A, #d8 • SUBB • Odečte od střadače obsah adresovaného bytu včetně příznaku přenosu (Borrow = Carry). • Syntaxe: SUBB A, RxSUBB A, @RrSUBB A, a8SUBB A, #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: MUL AB • 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: ANL dst, src ORL dst, src XRL dst, src
Logické operace • CLR • Vynuluje obsah střadače resp. adresovaný bit. • Syntaxe: CLR A CLR C CLR b8 • CPL • Neguje každý bit střadače resp. adresovaný bit. • Syntaxe: CPL A CPL C CPL b8
Instrukce posunů • RL – Rotate Accumulator Left Syntaxe: RL A • RLC – Rotate Accumulator Left Throuht Carry Syntaxe: RLC A • RR – Rotate Accumulator Right Syntaxe: RR A • RRC – Rotate Accumulator Right Throuht Carry Syntaxe: RRC A • SWAP – Swap Accumulator Nibbles Syntaxe: SWAP A b7 b6 b5 b4 b3 b2 b1 b0 b7 b6 b5 b4 b3 b2 b1 b0 C b7 b6 b5 b4 b3 b2 b1 b0 b7 b6 b5 b4 b3 b2 b1 b0 C b7 b4 b3 b0
Výhradně bitové operace • SETB – Set Bit • Nastaví přímo adresovaný bit na log.1. • Syntaxe: SETB C SETB b8
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: JC r8 JNC r8 • 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: JB r8 JNB r8 • 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: JZ r8 JNZ r8
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: CJNE A, a8, r8 CJNE A, #d8, r8 CJNE Rx, #d8, r8 CJNE @Rr, #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: DJNZ Rx, r8 DJNZ a8, r8
Instrukce skoků • ACALL – Absolute Call Syntaxe: ACALL a11 • LCALL – Long Call Syntaxe: LCALL a16 • RET – Return From Subroutine Syntaxe: RET • RETI – Return From Interrupt Syntaxe: RETI • AJMP – Absolute Jump Syntaxe: AJMP a11 • LJMP – Long Jump Syntaxe: LJMP a16 • SJMP – Short Jump Syntaxe: SJMP r8 • JMP – Jump to Address Syntaxe: JMP @A+DPTR
Příklad: blikání LEDkou $MOD52 ; use 8052 predefined symbols LED EQU P3.4 ; P3.4 is red LED on eval board CSEG ; MAIN PROGRAM ORG 0000h ;============================================================================== BLINK: CPL LED ; flash (complement) the red LED CALL DELAY ; call software delay JMP BLINK ; repeat indefinately ;============================================================================== DELAY: ; delay 100ms MOV R7, #200 ; 200 * 500us = 100ms DLY1: MOV R6, #229 ; 229 * 2.17us = 500us DJNZ R6, $ ; sit here for 500us DJNZ R7, DLY1 ; repeat 200 times (100ms delay) RET ;============================================================================== END