Riešenia problémov kapitoly 4 Úplnej online databázy informatiky a internetového kariérneho kurzu od začiatku

Riesenia Problemov Kapitoly 4 Uplnej Online Databazy Informatiky A Internetoveho Karierneho Kurzu Od Zaciatku



Problémy a ich riešenia

1) Napíšte program v assembleri, ktorý začína na 0200 $ za 6502 µP a pridá čísla bez znamienka 2A94 H (pridať) k 2ABF H (augend). Nech sú vstupy a výstupy v pamäti. Zostavený programový dokument tiež vytvorte ručne.







Riešenie:



CLC
LDA 0213 dolárov
ADC 0215 dolárov
STA 0217 dolárov
LDA 0214 dolárov
ADC 0216 dolárov
STA 0218 dolárov



Zostavený program:





2) Napíšte program v assembleri, ktorý začína na 0200 $ pre 6502 µP a odčíta čísla bez znamienka, 1569 H (subtrahend) od 2ABF H (na konci). Nech sú vstupy a výstupy v pamäti. Vyrobte tiež zostavený programový dokument ručne.



Riešenie:

SEC
LDA 0213 dolárov
SBC 0215 dolárov
STA 0217 dolárov
LDA 0214 dolárov
0216 SBC
STA 0218 dolárov

Zostavený program:

3) Napíšte program v assembleri pre 6502 µP, ktorý počíta od 00 do 09 USD pomocou slučky. Program by mal začínať na 0200 dolároch. Zostavený programový dokument tiež vytvorte ručne.

Riešenie:

LDA # 09 USD
STA $ 0220 ; na porovnanie X a 09 USD
LDX # 00 USD
slučka INX
CPX 0220 USD
BNE slučka

Zostavený program:

4) Napíšte program v assembleri, ktorý začína na 0200 $ za 6502 µP. Program má dva podprogramy. Prvý podprogram pridáva čísla 0203 bez znamienka H (augend) a 0102 H (pridať). Druhý podprogram pridáva súčet z prvého podprogramu, ktorý je 0305 H do 0006 H (augend). Konečný výsledok sa uloží do pamäte. Zavolajte prvý podprogram, ktorý je FSTSUB a druhý podprogram, ktorý je SECSUB. Nech sú vstupy a výstupy v pamäti. Tiež vytvorte zostavený programový dokument pre celý program ručne.

Riešenie:

SECSUB CLC
LDA 021 USD
ADC 0234 dolárov
STA 0236 dolárov
LDA 021 miliárd USD
ADC 0235 dolárov
STA 0237 dolárov
RTS

FSTSUB CLC
LDA 0216 dolárov
ADC 0218 dolárov
STA $ 021A
LDA 0217 dolárov
ADC 0219 dolárov
STA 021 miliárd dolárov
RTS

JSR FSTSUB

Zostavený program:

5) Vzhľadom na to, že an ¯IRQ handler pridá 02 až 01 $ na akumulátore ako základnú manipuláciu ¯NMI je vydaný, a jadro manipulácie pre ¯NMI pridá 05 až 04 USD na akumulátor, napíšte jazyk symbolov pre oboch manipulátorov vrátane ich hovorov. Výzva k ¯IRQ handler by mal byť na adrese $0200. The ¯IRQ handler by mal začínať na adrese $0300. The ¯NMI handler by mal začínať na adrese $0400. Výsledok ¯IRQ handler by mal byť umiestnený na adrese $0500 a výsledok ¯NMI handler by mal byť umiestnený na adrese $0501.

Riešenie:

NMISR PHA; Rutina NMI začína tu na adrese 0400 USD
PHX
PHY
;
LDA # 04 USD
ADC # 05 USD
STA 0501 dolárov
;
PLY
PLX
CHKO
RTI

ISR PHA; tento pokyn je na adrese 0300 USD
PHX
PHY
;
LDA # 01 USD
ADC # 02 USD
; JMP NMISR : komentované, pretože to nie je súčasťou rutiny
STA 0500 dolárov; pôjde do zásobníka
;
PLY
PLX
CHKO
RTI
;
ŽMP ISR ; tento pokyn je na adrese 0200 USD

6) Stručne vysvetlite, ako sa inštrukcia BRK používa na vytvorenie softvérového prerušenia v počítači 65C02.

Riešenie:

Hlavným spôsobom softvérového prerušenia pre 65C02 µP je použitie implicitnej adresy inštrukcie BRK. Predpokladajme, že hlavný program beží a narazí na inštrukciu BRK. Od tohto bodu by mala byť adresa ďalšej inštrukcie v PC odoslaná do zásobníka po dokončení aktuálnej inštrukcie. Ďalej by sa mal zavolať podprogram na spracovanie softvérovej inštrukcie. Tento podprogram prerušenia by mal presunúť obsah registrov A, X a Y do zásobníka. Po vykonaní jadra podprogramu by sa obsah registrov A, X a Y mal stiahnuť späť zo zásobníka do ich registrov dokončením podprogramu. Posledný príkaz v rutine je RTI. Obsah PC sa tiež automaticky stiahne späť zo zásobníka do počítača kvôli RTI.

7) Vytvorte tabuľku, ktorá porovnáva a porovnáva normálny podprogram s rutinou služby prerušenia.

Riešenie:

8) Stručne vysvetlite hlavné režimy adresovania 65C02 µP pomocou príkladov inštrukcií v jazyku symbolických inštrukcií.

Riešenie:

Každá inštrukcia pre 6502 je jeden bajt, za ktorým nasleduje nula alebo viac operandov.

Režim okamžitého adresovania
V režime okamžitého adresovania je za operandom hodnota a nie adresa pamäte. Pred hodnotou musí byť #. Ak je hodnota v šestnástkovej sústave, potom za „#“ musí nasledovať „$“. Okamžité adresovacie inštrukcie pre 65C02 sú: ADC, AND, BIT, CMP, CPX, CPY, EOR, LDA, LDX, LDY, ORA, SBC. Čitateľ by si mal prečítať dokumentáciu k 65C02 µP, aby vedel, ako používať tu uvedené pokyny, ktoré neboli vysvetlené v tejto kapitole. Príklad pokynu je:

LDA # 77 USD

Režim absolútneho adresovania
Pri režime absolútneho adresovania existuje jeden operand. Tento operand je adresa hodnoty v pamäti (zvyčajne v šestnástkovej sústave alebo návesti). Existuje 64K10 = 65 53610 pamäťových adries pre 6502 µP. Typicky je jednobajtová hodnota na jednej z týchto adries. Absolútne adresovacie inštrukcie pre 65C02 sú: ADC, AND, ASL, BIT, CMP, CPX, CPY, DEC, EOR, INC, JMP, JSR, LDA, LDX, LDY, LSR, ORA, ROL, ROR, SBC, STA , STX, STY, STZ, TRB, TSB. Čitateľ by si mal prečítať dokumentáciu pre 65C02 µP, aby vedel, ako používať pokyny, ktoré sú tu uvedené, ako aj pre ostatné režimy adresovania, ktoré neboli vysvetlené v tejto kapitole. Príklad pokynu je:

SÚ 1234 USD

Implicitný režim adresovania
Pri implicitnom režime adresovania neexistuje žiadny operand. Akýkoľvek zahrnutý µP register je zahrnutý inštrukciou. Implicitné adresné inštrukcie pre 65C02 sú: BRK, CLC, CLD, CLI, CLV, DEX, DEY, INX, INY, NOP, PHA, PHP, PHX, PHY, PLA, PLP, PLX, PLY, RTI, RTS, SEC , SED, SEI, TAX, TAY, TSX, TXA, TXS, TYA. Príklad pokynu je:

DEX: Zníženie registra X o jednu jednotku.

Režim relatívneho adresovania
Režim relatívneho adresovania sa zaoberá iba inštrukciami vetvenia. V režime relatívneho adresovania existuje iba jeden operand. Je to hodnota od -12810 do +12710. Táto hodnota sa nazýva offset. Na základe znamienka sa táto hodnota pripočíta alebo odčíta od ďalšej inštrukcie programového čítača k výsledku v adrese zamýšľanej ďalšej inštrukcie. Inštrukcie režimu relatívnej adresy sú: BCC, BCS, BEQ, BMI, BNE, BPL, BRA, BVC, BVS. Príklady pokynov sú:

BNE $7F : (vetva, ak Z = 0 v stavovom registri, P)

ktorý pridá 127 k aktuálnemu počítadlu programu (adresa, ktorá sa má vykonať) a spustí sa vykonávanie inštrukcie na tejto adrese. Podobne:

BEQ $F9 : (vetva, ak Z = : v registri stavu, P)

ktorý k aktuálnemu programovému počítadlu pridá -7 a spustí vykonávanie na novej adrese programového počítadla. Operand je číslo dvojkového doplnku.

Absolútne indexové adresovanie
Pri absolútnom indexovom adresovaní sa obsah registra X alebo Y pridáva k danej absolútnej adrese (kdekoľvek od $ 0000 do $ FFFF, t. j. od 010 do 6553610), aby mal skutočnú adresu. Táto daná absolútna adresa sa nazýva základná adresa. Ak sa použije register X, inštrukcia na zostavenie je približne takáto:

LDA 453 USD, X

Ak sa použije register Y, bude to niečo takéto:

LDA 453 USD, Y

Hodnota pre register X alebo Y sa nazýva počet alebo hodnota indexu a môže byť kdekoľvek od $ 00 (010) do $ FF (25010). Nenazýva sa ofset.

Inštrukcie na adresovanie absolútneho indexu sú: ADC, AND, ASL (len X), BIT (s akumulátorom a pamäťou, iba s X), CMP, DEC (len pamäť a X), EOR, INC (len pamäť a X), LDA , LDX, LDY, LSR (iba X), ORA, ROL (iba X), ROR (iba X), SBC, STA, STZ (iba X).

Absolútne nepriame adresovanie
Používa sa len s inštrukciou skoku. Vďaka tomu má daná absolútna adresa adresu ukazovateľa. Adresa ukazovateľa pozostáva z dvoch bajtov. Dvojbajtový ukazovateľ ukazuje na cieľovú hodnotu bajtu v pamäti (je to adresa). Inštrukcia v jazyku assembleru je teda nasledovná:

JMP (3 456 dolárov)

So zátvorkami a $13 v $3456 adrese, kým $EB je v $3457 (= $3456 + 1) adrese, cieľová adresa je $13EB a $13EB je ukazovateľ. Absolútnych 3456 USD je v inštrukcii v zátvorkách.

9) a) Napíšte program strojového jazyka 6502, do ktorého vložíte „Milujem ťa!“ reťazec ASCII kódov v pamäti, začínajúci od adresy $0300 s dĺžkou reťazca. Program by mal začínať na adrese 0200 USD. Získajte každý znak z akumulátora za predpokladu, že ho tam jeden po druhom posiela nejaký podprogram. Program tiež zostavte ručne. (Ak potrebujete poznať ASCII kódy pre „Milujem ťa!“, tu sú: 'I':4916, medzera: 2016, 'l': 6C16, 'o':6F16, 'v':7616, ' e':65, 'y':7916, 'u':7516 a '!':2116. Poznámka: každý kód zaberá 1 bajt).

b) Napíšte program strojového jazyka 6502, do ktorého vložíte „Milujem ťa!“ reťazec ASCII kódov v pamäti, začínajúci od adresy $0300 bez dĺžky reťazca, ale končiaci na 0016. Program by mal začínať na adrese $0200. Získajte každý znak z akumulátora za predpokladu, že ho tam jeden po druhom posiela nejaký podprogram. Program tiež zostavte ručne.

Riešenie:

a) Stratégia: Reťazec má 12 bajtov: 1 bajt pre dĺžku reťazca a 11 bajtov pre reťazcový literál. Takže musí existovať 12 iterácií (slučiek) počítajúcich od 0. To znamená: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11. Toto je 12 čísel.

Celé číslo 0 sa vloží do registra X a číslo 1110 = 1210 – 110 = B16 = $0B sa vloží na miesto adresy v pamäti, povedzme na adresu $0250. Pre každú iteráciu sa hodnota v registri X zvýši a výsledok sa porovná s $0B v umiestnení adresy $0250. Hneď potom, čo sa hodnota v X rovná hodnote 0B $, iterácia sa zastaví. V tomto bode dĺžka (počet bajtov) reťazca a reťazcový literál zaberajú miesta adresy $0300 až $030B (vrátane). Na zvýšenie adresy pamäte od 0300 $ sa používa register Y. Kód je:

LDA # 0 miliárd USD
SÚ 0250 USD
LDX # 00 USD
LDY # 00 $
STA 0300 dolárov; dĺžka 11 je vložená do A nejakým podprogramom a ide na $0300
slučka INX
TAM
CPY 0250 USD
BEQ slučka

b) Stratégia: Reťazec má 12 bajtov: 1 bajt pre nulový terminátor $00 a 11 bajtov pre reťazcový literál. Takže musí existovať 12 iterácií (slučiek) počítajúcich od 0. To znamená: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11. Toto je 12 čísel.

Celé číslo 0 sa vloží do registra X a číslo 1110 = 1210 – 110 = B16 = $0B sa vloží na miesto adresy v pamäti, povedzme na adresu $0250. Pre každú iteráciu sa hodnota v registri X zvýši a výsledok sa porovná s $0B v umiestnení adresy $0250. Hneď potom, čo sa hodnota v X rovná hodnote 0B $, iterácia sa zastaví. V tomto bode zaberá počet bajtov reťazcového literálu plus znak Null adresy $0300 až $030B (vrátane). Na zvýšenie adresy pamäte z 0300 $ sa používa register Y. Kód je:

LDA # 0 miliárd USD
SÚ 0250 USD
LDX # 00 USD
LDY # 00 USD
STA 0300 dolárov; 'I' je vložené do A pomocou nejakého podprogramu a ide na $ 0300
slučka INX
TAM
CPY 0250 USD
BEQ slučka