Täieliku Interneti-arvutiteaduse andmebaasi ja Interneti-karjäärikursuse 4. peatüki probleemide lahendused algusest peale

Taieliku Interneti Arvutiteaduse Andmebaasi Ja Interneti Karjaarikursuse 4 Peatuki Probleemide Lahendused Algusest Peale



Probleemid ja nende lahendused

1) Kirjutage montaažikeele programm, mis algab 6502 µP puhul 0200 dollarist ja lisab 2A94 märgita numbrid H (lisa) 2ABF-ile H (augend). Olgu sisendid ja väljundid mälus. Samuti koostage käsitsi kokkupandud programmidokument.







Lahendus:



CLC
LDA 0213 dollarit
ADC 0215 dollarit
STA 0217 dollarit
LDA 0214 dollarit
ADC 0216 dollarit
STA 0218 dollarit



Kokkupandud programm:





2) Kirjutage montaažikeele programm, mis algab 0200 dollarist 6502 µP jaoks ja lahutab märgita arvud, 1569 H (alamosa) 2ABF-ist H (minuend). Olgu sisendid ja väljundid mälus. Valmistage käsitsi ka kokkupandud programmidokument.



Lahendus:

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

Kokkupandud programm:

3) Kirjutage 6502 µP jaoks montaažikeele programm, mis arvestab tsüklit kasutades 00 dollarilt 09 dollarini. Programm peaks algama 0200 dollarist. Samuti koostage käsitsi kokkupandud programmidokument.

Lahendus:

LDA #$09
STA $ 0220 ; X ja 09 $ võrdlemiseks
LDX #$00
silmus INX
CPX 0220 dollarit
BNE silmus

Kokkupandud programm:

4) Kirjutage montaažikeele programm, mis algab 0200 dollarist 6502 µP puhul. Programmil on kaks alamprogrammi. Esimene alamprogramm lisab 0203 märgita numbrid H (augend) ja 0102 H (lisa). Teine alamprogramm liidab summa esimesest alamprogrammist, mis on 0305 H numbrile 0006 H (augend). Lõpptulemus salvestatakse mällu. Kutsuge esimene alamprogramm, mis on FSTSUB, ja teine ​​alamprogramm, mis on SECSUB. Olgu sisendid ja väljundid mälus. Samuti koostage käsitsi kogu programmi jaoks kokkupandud programmidokument.

Lahendus:

SECSUB CLC
LDA $021A
ADC 0234 dollarit
STA 0236 dollarit
LDA 021 miljardit dollarit
ADC 0235 dollarit
STA 0237 dollarit
RTS

FSTSUB CLC
LDA 0216 dollarit
ADC 0218 dollarit
STA $021A
LDA 0217 dollarit
ADC 0219 dollarit
STA 021 miljardit dollarit
RTS

JSR FSTSUB

Kokkupandud programm:

5) Arvestades, et an ¯IRQ Handler lisab $02 kuni $01 akumulaatoris kui põhikäitlemise ajal ¯NMI on välja antud ja põhikäsitlus ¯NMI lisab akumulaatoris $05 kuni $04, kirjutage mõlema töötleja jaoks koostekeel, sealhulgas nende kõned. Kõne aadressile ¯IRQ käitleja peaks olema aadressil $0200. The ¯IRQ käitleja peaks algama aadressilt 0300 $. The ¯NMI käitleja peaks algama aadressilt 0400 $. Tulemuseks ¯IRQ käitleja tuleks panna aadressile 0500 $ ja tulemus ¯NMI käitleja tuleks panna aadressile $0501.

Lahendus:

NMISR PHA ; NMI rutiin algab siin $0400 aadressil
PHX
PHY
;
LDA #$04
ADC # $ 05
STA 0501 dollarit
;
PLY
PLX
PLA
RTI

ISR PHA ; see juhend on $0300 aadressil
PHX
PHY
;
LDA #$01
ADC #$02
; JMP NMISR : kommenteeris, kuna see ei kuulu rutiini
STA $ 0500 ; läheb virna
;
PLY
PLX
PLA
RTI
;
JMP ISR ; see juhend on $0200 aadressil

6) Selgitage lühidalt, kuidas BRK käsku kasutatakse tarkvarakatkestuse tekitamiseks 65C02 arvutis.

Lahendus:

Peamine viis tarkvarakatkestuse saamiseks 65C02 µP jaoks on BRK kaudse aadressijuhise kasutamine. Oletame, et põhiprogramm töötab ja see puutub kokku BRK käsuga. Sellest hetkest alates tuleks arvuti järgmise käsu aadress virna saata, kui praegune käsk on lõpule viidud. Järgmisena tuleks välja kutsuda alamprogramm tarkvarajuhiste käsitlemiseks. See katkestuse alamprogramm peaks lükkama A-, X- ja Y-registri sisu virna. Pärast alamprogrammi tuuma käivitamist peaks lõpetav alamprogramm tõmbama A-, X- ja Y-registrite sisu virust tagasi nende registritesse. Rutiini viimane lause on RTI. RTI tõttu tõmmatakse arvuti sisu ka virust arvutisse automaatselt tagasi.

7) Koostage tabel, mis võrdleb ja vastandab tavalist alamprogrammi katkestusteenuse rutiiniga.

Lahendus:

8) Selgitage lühidalt 65C02 µP peamisi adresseerimisrežiime, võttes arvesse montaažikeele juhiste näiteid.

Lahendus:

Iga käsk 6502 jaoks on üks bait, millele järgneb null või enam operandit.

Vahetu adresseerimise režiim
Vahetu adresseerimisrežiimi korral on pärast operandi väärtus, mitte mäluaadress. Väärtuse ette peab eelnema #. Kui väärtus on kuueteistkümnendsüsteemis, peab “#” järgnema “$”. 65C02 kohesed adresseerimisjuhised on järgmised: ADC, AND, BIT, CMP, CPX, CPY, EOR, LDA, LDX, LDY, ORA, SBC. Lugeja peaks tutvuma 65C02 µP dokumentatsiooniga, et teada saada, kuidas kasutada siin loetletud juhiseid, mida selles peatükis ei ole selgitatud. Näidisjuhis on järgmine:

LDA #77 dollarit

Absoluutne adresseerimisrežiim
Absoluutse adresseerimisrežiimi korral on üks operaand. See operand on mälus oleva väärtuse aadress (tavaliselt kuueteistkümnendsüsteemis või sildis). 6502 µP jaoks on 64K10 = 65 53610 mäluaadressi. Tavaliselt on ühebaidine väärtus ühel neist aadressidest. 65C02 absoluutsed adresseerimisjuhised on järgmised: 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. Lugeja peaks tutvuma 65C02 µP dokumentatsiooniga, et teada saada, kuidas kasutada siin loetletud juhiseid ja ka ülejäänud adresseerimisrežiime, mida selles peatükis pole selgitatud. Näidisjuhis on järgmine:

Need on 1234 dollarit

Kaudne adresseerimisrežiim
Kaudse adresseerimisrežiimi puhul pole operandit. Kõik kaasatud µP-register on juhisega hõlmatud. Kaudsed adresseerimisjuhised 65C02 jaoks on järgmised: BRK, CLC, CLD, CLI, CLV, DEX, DEY, INX, INY, NOP, PHA, PHP, PHX, PHY, PLA, PLP, PLX, PLY, RTI, RTS, SEC , SED, SEI, MAKSU, TAY, TSX, TXA, TXS, TYA. Näidisjuhis on järgmine:

DEX: vähendage X-registrit ühe ühiku võrra.

Suhteline adresseerimisrežiim
Suhteline adresseerimisrežiim käsitleb ainult haru käske. Suhtelise adresseerimisrežiimi korral on ainult üks operaand. See on väärtus vahemikus -12810 kuni +12710. Seda väärtust nimetatakse nihkeks. Märgi alusel lisatakse või lahutatakse see väärtus programmiloenduri järgmisest käsust soovitud järgmise käsu aadressis olevale tulemusele. Suhtelise aadressirežiimi juhised on järgmised: BCC, BCS, BEQ, BMI, BNE, BPL, BRA, BVC, BVS. Juhendi näited on järgmised:

BNE $7F : (filiaal, kui Z = 0 olekuregistris, P)

mis lisab praegusele programmiloendurile (täitmisaadressile) 127 ja alustab käsu täitmist sellel aadressil. Sarnaselt:

BEQ $F9 : (haru, kui Z = : olekuregistris, P)

mis lisab praegusele programmiloendurile -7 ja alustab täitmist uuel programmiloenduri aadressil. Operand on kahe täiendiga arv.

Absoluutne indeksaadress
Absoluutse indeksaadressi korral lisatakse X- või Y-registri sisu antud absoluutaadressile (mis tahes vahemikus $ 0000 kuni $ FFFF, st vahemikus 010 kuni 6553610), et saada tegelik aadress. Seda antud absoluutset aadressi nimetatakse baasaadressiks. Kui kasutatakse X-registrit, on montaažijuhis umbes selline:

LDA $ C453,X

Kui kasutatakse Y-registrit, oleks see umbes selline:

LDA $ C453,Y

X- või Y-registri väärtust nimetatakse loenduse või indeksi väärtuseks ja see võib olla vahemikus $ 00 (010) kuni $ FF (25010). Seda ei nimetata nihkeks.

Absoluutse indeksi adresseerimise juhised on järgmised: ADC, AND, ASL (ainult X), BIT (aku ja mäluga, ainult X-ga), CMP, DEC (ainult mälu ja X), EOR, INC (ainult mälu ja X), LDA , LDX, LDY, LSR (ainult X), ORA, ROL (ainult X), ROR (ainult X), SBC, STA, STZ (ainult X).

Absoluutne kaudne adresseerimine
Seda kasutatakse ainult hüppejuhisega. Sellega on antud absoluutaadressil pointer aadress. Kursori aadress koosneb kahest baidist. Kahebaidine kursor osutab (on selle aadress) sihtkoha baidi väärtusele mälus. Niisiis, montaažikeele juhend on järgmine:

JMP (3456 dollarit)

Sulgudes ja $13 $3456 aadressis, samas kui $EB on $3457 (= $3456 + 1) aadressis, on sihtkoha aadress $13EB ja $13EB on kursor. Absoluutne 3456 dollarit on juhendis sulgudes.

9) a) Kirjutage 6502 masinkeeles programm, et lisada 'Ma armastan sind!' ASCII-koodide jada mällu, alustades $0300 aadressist ja stringi pikkusega. Programm peaks algama aadressilt 0200 $. Hankige akumulaatorist iga märk, eeldades, et mõni alamprogramm saadab need sinna ükshaaval. Samuti koostage programm käsitsi. (Kui teil on vaja teada 'Ma armastan sind!' ASCII koode, siis siin on need: 'I':4916, tühik : 2016, 'l': 6C16, 'o':6F16, 'v':7616,' e':65, 'y':7916, 'u':7516 ja '!':2116. Märkus: iga kood võtab enda alla 1 baidi).

b) Kirjutage 6502 masinkeelne programm, et lisada 'Ma armastan sind!' ASCII-koodide jada mällu, alustades aadressist $0300 ilma stringi pikkuseta, kuid lõppedes numbriga 0016. Programm peaks algama aadressilt $0200. Hankige akumulaatorist iga märk, eeldades, et mõni alamprogramm saadab need sinna ükshaaval. Samuti koostage programm käsitsi.

Lahendus:

a) Strateegia: stringi jaoks on 12 baiti: 1 bait stringi pikkuse jaoks ja 11 baiti stringi literaali jaoks. Seega peab olema 12 iteratsiooni (silmust) alates nullist. See tähendab: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11. Need on 12 numbrit.

0 täisarv pannakse X-registrisse ja arv 1110 = 1210 – 110 = B16 = $0B pannakse mällu aadressi asukohta, öelge aadress $0250. Iga iteratsiooni puhul suurendatakse väärtust X-registris ja tulemust võrreldakse $0B-ga aadressi asukohas $0250. Vahetult pärast seda, kui X väärtus on võrdne väärtusega $ 0B, iteratsioon peatub. Sel hetkel hõivavad stringi pikkus (baitide arv) ja stringi literaal 0300–030 miljardi dollari (kaasa arvatud) aadressi asukohad. Mälu aadresside suurendamiseks alates 0300 dollarist kasutatakse Y-registrit. Kood on:

LDA #$0B
NEED on 0250 $
LDX #$00
LDY#00 $
STA $ 0300 ; pikkus 11 pannakse mõne alamprogrammiga A-sse ja see läheb 0300 dollarile
silmus INX
SIIN
CPY $ 0250
BEQ silmus

b) Strateegia: stringi jaoks on 12 baiti: 1 bait $00 nullterminaatori jaoks ja 11 baiti stringi literaali jaoks. Seega peab olema 12 iteratsiooni (silmust) alates nullist. See tähendab: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11. Need on 12 numbrit.

0 täisarv pannakse X-registrisse ja arv 1110 = 1210 – 110 = B16 = $0B pannakse mällu aadressi asukohta, öelge aadress $0250. Iga iteratsiooni puhul suurendatakse väärtust X-registris ja tulemust võrreldakse $0B-ga aadressi asukohas $0250. Vahetult pärast seda, kui X väärtus on võrdne väärtusega $ 0B, iteratsioon peatub. Sel hetkel hõivab stringi literaali baitide arv pluss Null-märk aadressi asukohad vahemikus $ 0300 kuni $ 030 miljardit (kaasa arvatud). Mälu aadresside suurendamiseks alates $ 0300 kasutatakse Y-registrit. Kood on:

LDA #$0B
NEED on 0250 $
LDX #$00
LDY#00 $
STA $ 0300 ; Mõni alamprogramm paneb 'I' A-sse ja see läheb 0300 dollarile
silmus INX
SIIN
CPY $ 0250
BEQ silmus