Megoldások a teljes online számítástechnikai adatbázis és internetes karriertanfolyam 4. fejezetének problémáira a kezdetektől

Megoldasok A Teljes Online Szamitastechnikai Adatbazis Es Internetes Karriertanfolyam 4 Fejezetenek Problemaira A Kezdetektol



Problémák és megoldásaik

1) Írjon egy assembly nyelvű programot, amely 0200 dollártól kezdődik a 6502 µP esetén, és hozzáadja a 2A94 előjel nélküli számait H (hozzáadás) 2ABF-hez H (augend). A bemenetek és a kimenetek legyenek a memóriában. Készítse elő kézzel az összeállított programdokumentumot is.







Megoldás:



CLC
LDA 0213 USD
ADC 0215 dollár
STA 0217 USD
LDA 0214 USD
ADC 0216 dollár
STA 0218 USD



Összeállított program:





2) Írjon egy assembly nyelvű programot, amely 0200 dollárral kezdődik 6502 µP esetén, és kivonja az előjel nélküli számokat, 1569 H (részrész) 2ABF-ből H (kisebbítendő). A bemenetek és a kimenetek legyenek a memóriában. Készítse elő kézzel az összeállított programdokumentumot is.



Megoldás:

SEC
LDA 0213 USD
SBC 0215 USD
STA 0217 USD
LDA 0214 USD
SBC 0216 USD
STA 0218 USD

Összeállított program:

3) Írjon egy assembly nyelvű programot a 6502 µP-hez, amely egy ciklus segítségével 00 dollárról 09 dollárra számol. A programnak 0200 dollárról kell indulnia. Készítse elő kézzel az összeállított programdokumentumot is.

Megoldás:

LDA #$09
STA 0220 USD; X és 09 dollár összehasonlításához
LDX #$00
hurok INX
CPX 0220 USD
BNE hurok

Összeállított program:

4) Írjon egy assembly nyelvű programot, amely 0200 dollártól indul a 6502 µP-hez. A programnak két szubrutinja van. Az első szubrutin hozzáadja a 0203 előjel nélküli számait H (augend) és 0102 H (hozzáad). A második szubrutin összeadja az első szubrutin összegét, amely 0305 H 0006-ra H (augend). A végeredmény a memóriában tárolódik. Hívja meg az első alprogramot, amely az FSTSUB, és a második alprogramot, amely a SECSUB. A be- és kimenetek legyenek a memóriában. Ezenkívül kézzel készítse elő az összeállított programdokumentumot a teljes programhoz.

Megoldás:

SECSUB CLC
LDA 021A USD
ADC 0234 dollár
STA 0236 USD
LDA 021 milliárd dollár
ADC 0235 dollár
STA 0237 USD
RTS

FSTSUB CLC
LDA 0216 USD
ADC 0218 dollár
STA $021A
LDA 0217 USD
ADC 0219 dollár
STA 021 milliárd dollár
RTS

JSR FSTSUB

Összeállított program:

5) Tekintettel arra, hogy an ¯IRQ A kezelő hozzáadja a 02 dollárt a 01 dollárhoz az akkumulátornál, mint alapkezelés, miközben ¯NMI ki van adva, és az alapkezelés a ¯NMI 05-04 dollárt ad hozzá az akkumulátornál, írjon egy assembly nyelvet mindkét kezelő számára, beleértve a hívásokat is. A hívás a ¯IRQ a kezelőnek a $0200 címen kell lennie. A ¯IRQ A kezelõnek a 0300 USD címen kell kezdõdnie. A ¯NMI a kezelőnek a 0400 dolláros címről kell kezdődnie. Az eredmény a ¯IRQ kezelőt a 0500 $ címre kell helyezni, és az eredményt a ¯NMI kezelőt a $0501 címre kell elhelyezni.

Megoldás:

NMISR PHA; Az NMI rutin itt kezdődik a 0400 dolláros címen
PHX
PHY
;
LDA #$04
ADC #$05
STA 0501 USD
;
PLY
PLX
PLA
RTI

ISR PHA ; ez az utasítás a 0300 dolláros címen található
PHX
PHY
;
LDA #$01
ADC #$02
; JMP NMISR: azért kommentálta, mert nem része a rutinnak
STA 0500 USD; verembe megy
;
PLY
PLX
PLA
RTI
;
JMP ISR ; ez az utasítás a 0200 dolláros címen található

6) Röviden magyarázza el, hogyan használják a BRK utasítást a szoftvermegszakítás létrehozására egy 65C02 számítógépen.

Megoldás:

A 65C02 µP szoftveres megszakításának fő módja a BRK implikált címutasítás használata. Tegyük fel, hogy a fő program fut, és találkozik a BRK utasítással. Ettől kezdve a PC következő utasításának címét el kell küldeni a verembe, amint az aktuális utasítás befejeződik. Ezután egy szubrutint kell meghívni a szoftveres utasítások kezelésére. Ennek a megszakítási szubrutinnak az A, X és Y regiszter tartalmát a verembe kell tolnia. Az alprogram magjának végrehajtása után az A, X és Y regiszterek tartalmát a befejező szubrutinnak vissza kell húznia a veremből a regisztereikbe. A rutin utolsó utasítása az RTI. Az RTI miatt a PC tartalma is automatikusan visszakerül a veremből a PC-be.

7) Készítsen táblázatot, amely összehasonlítja és szembeállítja a normál szubrutint egy megszakítási szolgáltatási rutinnal.

Megoldás:

8) Magyarázza el röviden a 65C02 µP fő címzési módjait az assembly nyelvi utasítások példái alapján.

Megoldás:

A 6502-hez tartozó minden utasítás egy bájtos, amit nulla vagy több operandus követ.

Azonnali címzési mód
Az azonnali címzési módnál az operandus után az érték és nem a memóriacím. Az érték előtt #-nek kell lennie. Ha az érték hexadecimális, akkor a „#”-t „$”-nak kell követnie. A 65C02 azonnali címzési utasításai a következők: ADC, AND, BIT, CMP, CPX, CPY, EOR, LDA, LDX, LDY, ORA, SBC. Az olvasónak tanulmányoznia kell a 65C02 µP dokumentációját, hogy megtudja, hogyan kell használni az itt felsorolt, ebben a fejezetben nem magyarázott utasításokat. Egy példa utasítás a következő:

LDA #77 $

Abszolút címzési mód
Az abszolút címzési módnál egy operandus van. Ez az operandus a memóriában lévő érték címe (általában hexadecimális formában vagy címkében). A 6502 µP-hez 64K10 = 65,53610 memóriacím tartozik. Az egybájtos érték általában ezen címek egyikén található. A 65C02 abszolút címzési utasításai a következők: 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. Az olvasónak tanulmányoznia kell a 65C02 µP dokumentációját, hogy megismerje az itt felsorolt ​​utasítások használatát, valamint a többi címzési módot, amelyeket ebben a fejezetben nem magyaráztunk meg. Egy példa utasítás a következő:

1234 dollárba kerülnek

Implicit Címzési mód
Az implikált címzési módban nincs operandus. Az utasítás minden érintett µP regiszterre utal. A 65C02 hallgatólagos címzési utasításai a következők: BRK, CLC, CLD, CLI, CLV, DEX, DEY, INX, INY, NOP, PHA, PHP, PHX, PHY, PLA, PLP, PLX, PLY, RTI, RTS, SEC , SED, SEI, ADÓ, TAY, TSX, TXA, TXS, TYA. Egy példa utasítás a következő:

DEX: Csökkentse az X regisztert egy egységgel.

Relatív címzési mód
A relatív címzési mód csak az elágazási utasításokkal foglalkozik. Relatív címzési mód esetén csak egy operandus létezik. Ez egy -12810 és +12710 közötti érték. Ezt az értéket eltolásnak nevezzük. Az előjel alapján ezt az értéket hozzáadjuk vagy kivonjuk a Programszámláló következő utasításából a kívánt következő utasítás címében lévő eredményhez. A relatív címmód utasításai a következők: BCC, BCS, BEQ, BMI, BNE, BPL, BRA, BVC, BVS. Az utasítás példái a következők:

BNE $7F : (ág, ha Z = 0 az állapotregiszterben, P)

amely 127-et ad az aktuális programszámlálóhoz (végrehajtandó cím), és ezen a címen kezdi el végrehajtani az utasítást. Hasonlóképpen:

BEQ $F9 : (elágazás, ha Z = : állapotregiszterben, P)

amely egy -7-et ad az aktuális programszámlálóhoz és a végrehajtást az új programszámláló címén indítja el. Az operandus egy kettős komplementer szám.

Abszolút indexcímzés
Abszolút index-címzéssel az X vagy Y regiszter tartalma hozzáadódik az adott abszolút címhez (0000 $ és $FFFF között, azaz 010 és 6553 610 között), hogy megkapja a valódi címet. Ezt az abszolút címet alapcímnek nevezzük. Ha az X regisztert használjuk, az összeállítási utasítás a következő:

LDA $ C453,X

Ha az Y regisztert használjuk, akkor valami ilyesmi lenne:

LDA $ C453,Y

Az X vagy Y regiszter értékét számláló- vagy indexértéknek nevezik, és 00 (010) $ és 25010 $ FF között lehet. Nem eltolásnak hívják.

Az abszolút indexcímzési utasítások: ADC, AND, ASL (csak X), BIT (akkumulátorral és memóriával, csak X esetén), CMP, DEC (csak memória és X), EOR, INC (csak memória és X), LDA , LDX, LDY, LSR (csak X), ORA, ROL (csak X), ROR (csak X), SBC, STA, STZ (csak X).

Abszolút közvetett címzés
Ez csak az ugrási utasítással használható. Ezzel a megadott abszolút címnek van mutató címe. A mutató címe két bájtból áll. A kétbájtos mutató a cél byte értékre mutat (a címe) a memóriában. Tehát az assembly nyelvi utasítás a következő:

JMP (3456 USD)

A zárójelek és a 13 $ a 3456 $ címben, míg a $ EB a $ 3457 (= $ 3456 + 1) cím, a cél címe $ 13 EB és a $ 13 EB a mutató. Az utasításban zárójelben az abszolút 3456 dollár szerepel.

9) a) Írjon egy 6502-es gépi nyelvű programot, amely beírja a „Szeretlek!” ASCII-kódok sorozata a memóriában, a 0300 dolláros címtől kezdve a karakterlánc hosszával. A programnak a 0200 dolláros címen kell kezdődnie. Szerezzen be minden karaktert az akkumulátorból, feltételezve, hogy egy-egy szubrutin küldi oda őket. Ezenkívül kézzel állítsa össze a programot. (Ha tudnia kell a „Szeretlek!” ASCII-kódokat, itt vannak: 'I':4916, szóköz : 2016, 'l': 6C16, 'o':6F16, 'v':7616, ' e':65, 'y':7916, 'u':7516 és '!':2116. Megjegyzés: minden kód 1 bájtot foglal el).

b) Írjon egy 6502-es gépi nyelvű programot a „Szeretlek!” kifejezésre. A 0300 $ címtől kezdődően a sztring hossza nélkül, de 0016-ra végződik. A programnak a 0200 $ címen kell kezdődnie. Szerezzen be minden karaktert az akkumulátorból, feltételezve, hogy egy-egy szubrutin küldi oda őket. Ezenkívül kézzel állítsa össze a programot.

Megoldás:

a) Stratégia: A karakterláncnak 12 bájtja van: 1 bájt a karakterlánc hosszára és 11 bájt a string literálra. Tehát 12 iterációnak (huroknak) kell lennie a 0-tól számítva. Azaz: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11. Ez 12 szám.

A 0 egész szám bekerül az X regiszterbe, és az 1110 = 1210 – 110 = B16 = $0B szám kerül a memória egy címhelyére, mondjuk a $0250 címre. Minden iterációnál az X regiszterben lévő érték növekszik, és az eredményt összehasonlítja a $0B értékkel a $0250 cím helyén. Közvetlenül azután, hogy az X-beli érték megegyezik a 0B $ értékével, az iteráció leáll. Ezen a ponton a karakterlánc hossza (byte-ok száma) és a karakterlánc-literál a 0300 és 030 milliárd dollár közötti (beleértve) címhelyeket foglalja el. A memóriacímek 0300 dollárról való növeléséhez az Y regisztert használjuk. A kód:

LDA #$0B
0250 dollárba kerülnek
LDX #$00
LDY#00$
STA 0300 USD; a 11 hosszát valamilyen szubrutin A-ba teszi, és 0300 dollárra megy
hurok INX
OTT
0250 CPY
BEQ hurok

b) Stratégia: A karakterlánchoz 12 bájt tartozik: 1 bájt a 00 dolláros nulla lezáróhoz és 11 bájt a string literálhoz. Tehát 12 iterációnak (huroknak) kell lennie a 0-tól számítva. Azaz: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11. Ez 12 szám.

A 0 egész szám bekerül az X regiszterbe, és az 1110 = 1210 – 110 = B16 = $0B szám kerül a memória egy címhelyére, mondjuk a $0250 címre. Minden iterációnál az X regiszterben lévő érték növekszik, és az eredményt összehasonlítja a $0B értékkel a $0250 cím helyén. Közvetlenül azután, hogy az X-beli érték megegyezik a 0B $ értékével, az iteráció leáll. Ezen a ponton a karakterlánc-literál bájtjainak száma plusz a Null karakter a 0300 és 030 milliárd dollár közötti (beleértve) címhelyeket foglalja el. A memóriacímek $0300-ról való növeléséhez az Y regisztert használjuk. A kód:

LDA #$0B
0250 dollárba kerülnek
LDX #$00
LDY#00$
STA 0300 USD; Az „I”-t valamilyen szubrutin A-ba helyezi, és 0300 dollárba kerül
hurok INX
OTT
0250 CPY
BEQ hurok