Viso internetinio kompiuterių mokslo duomenų bazės ir internetinės karjeros kurso 4 skyriaus problemų sprendimai nuo pat pradžių

Viso Internetinio Kompiuteriu Mokslo Duomenu Bazes Ir Internetines Karjeros Kurso 4 Skyriaus Problemu Sprendimai Nuo Pat Pradziu



Problemos ir jų sprendimai

1) Parašykite asamblėjos kalbos programą, kuri prasideda nuo 0200 USD už 6502 µP ir prideda nepaženklintus 2A94 skaičius H (pridėti) prie 2ABF H (augend). Tegul įėjimai ir išvestis būna atmintyje. Taip pat rankomis pagaminkite surinktą programos dokumentą.







Sprendimas:



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



Surinkta programa:





2) Parašykite asamblėjos kalbos programą, kuri prasideda nuo 0200 USD, 6502 µP, ir atima beženklius skaičius, 1569 H (subtrahend) iš 2ABF H (minuendas). Tegul įėjimai ir išvestis yra atmintyje. Taip pat ranka pateikite surinktą programos dokumentą.



Sprendimas:

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

Surinkta programa:

3) Parašykite asamblėjos kalbos programą 6502 µP, kuri skaičiuojama nuo 00 USD iki 09 USD naudojant kilpą. Programa turėtų prasidėti nuo 0200 USD. Taip pat rankomis pagaminkite surinktą programos dokumentą.

Sprendimas:

LDA # 09 USD
STA 0220 USD; X ir 09 USD palyginimui
LDX # 00 USD
kilpa INX
CPX 0220 USD
BNE kilpa

Surinkta programa:

4) Parašykite asamblėjos kalbos programą, kurios kaina prasideda nuo 0200 USD už 6502 µP. Programa turi dvi paprogrames. Pirmoji paprogramė prideda nepaženklintus numerius 0203 H (augend) ir 0102 H (pridėti). Antroji paprogramė prideda sumą iš pirmosios paprogramės, kuri yra 0305 H iki 0006 H (augend). Galutinis rezultatas išsaugomas atmintyje. Iškvieskite pirmąją paprogramę, kuri yra FSTSUB, ir antrąją paprogramę, kuri yra SECSUB. Tegul įėjimai ir išėjimai būna atmintyje. Taip pat ranka pagaminkite visos programos surinktą programos dokumentą.

Sprendimas:

SECSUB CLC
LDA 021A
ADC 0234 USD
STA 0236 USD
LDA 021 mlrd
ADC 0235 USD
STA 0237 USD
RTS

FSTSUB CLC
LDA 0216 USD
ADC 0218 USD
STA $021A
LDA 0217 USD
ADC 0219 USD
STA 021 mlrd
RTS

JSR FSTSUB

Surinkta programa:

5) Atsižvelgiant į tai, kad an ¯IRQ tvarkytojas prideda nuo $02 iki $01 prie akumuliatoriaus kaip pagrindinio tvarkymo ¯NMI yra išduotas, o pagrindinis tvarkymas už ¯NMI prideda nuo 05 USD iki 04 USD prie akumuliatoriaus, parašykite surinkimo kalbą abiem tvarkytojams, įskaitant jų skambučius. Skambutis į ¯IRQ tvarkytojas turėtų būti 0200 USD adresu. The ¯IRQ tvarkytojas turėtų prasidėti adresu 0300 USD. The ¯NMI tvarkytojas turėtų prasidėti adresu 0400 USD. Rezultatas iš ¯IRQ tvarkytojas turėtų būti pateiktas 0500 USD adresu, o rezultatas ¯NMI tvarkytojas turėtų būti nurodytas 0501 USD adresu.

Sprendimas:

NMISR PHA ; NMI rutina prasideda čia, 0400 USD adresu
PHX
PHY
;
LDA # 04 USD
ADC # 05 USD
STA 0501 USD
;
PLY
PLX
PLA
RTI

ISR PHA ; ši instrukcija yra adresu $0300
PHX
PHY
;
LDA #$01
ADC # $ 02
; JMP NMISR: pakomentavo, nes tai nėra kasdienybės dalis
STA 0500 USD; eis sukrauti
;
PLY
PLX
PLA
RTI
;
JMP ISR ; ši instrukcija yra 0200 USD adresu

6) Trumpai paaiškinkite, kaip BRK instrukcija naudojama programinės įrangos pertraukimui sukurti 65C02 kompiuteryje.

Sprendimas:

Pagrindinis 65C02 µP programinės įrangos pertraukimo būdas yra BRK numanomo adreso nurodymo naudojimas. Tarkime, kad pagrindinė programa veikia ir susiduria su BRK instrukcija. Nuo to momento kitos instrukcijos adresas kompiuteryje turėtų būti siunčiamas į krūvą, kai dabartinė instrukcija bus baigta. Toliau turėtų būti iškviesta programinės įrangos nurodymų tvarkymo paprogramė. Ši pertraukimo paprogramė turėtų perkelti A, X ir Y registrų turinį į krūvą. Įvykdžius paprogramės šerdį, A, X ir Y registrų turinį užbaigiančioji paprogramė turėtų ištraukti iš krūvos į jų registrus. Paskutinis teiginys rutinoje yra RTI. Kompiuterio turinys taip pat automatiškai ištraukiamas iš kamino į kompiuterį dėl RTI.

7) Sukurkite lentelę, kurioje palyginama ir kontrastuojama įprasta paprogramė su pertraukimo paslaugų tvarka.

Sprendimas:

8) Trumpai paaiškinkite pagrindinius 65C02 µP adresavimo būdus, pateiktus surinkimo kalbos instrukcijų pavyzdžiuose.

Sprendimas:

Kiekviena 6502 instrukcija yra vieno baito, po kurio seka nulis ar daugiau operandų.

Greito adresavimo režimas
Naudojant tiesioginio adresavimo režimą, po operando yra reikšmė, o ne atminties adresas. Prieš reikšmę turi būti #. Jei reikšmė yra šešioliktainė, tada „#“ turi sekti „$“. Tiesioginės 65C02 adresų instrukcijos yra šios: ADC, AND, BIT, CMP, CPX, CPY, EOR, LDA, LDX, LDY, ORA, SBC. Skaitytojas turėtų susipažinti su 65C02 µP dokumentacija, kad žinotų, kaip naudoti čia pateiktas instrukcijas, kurios nebuvo paaiškintos šiame skyriuje. Instrukcijos pavyzdys yra:

LDA # 77 USD

Absoliutus adresavimo režimas
Naudojant absoliutų adresavimo režimą, yra vienas operandas. Šis operandas yra atmintyje esančios reikšmės adresas (dažniausiai šešioliktaine arba etikete). 6502 µP yra 64K10 = 65 53610 atminties adresų. Paprastai vieno baito reikšmė yra viename iš šių adresų. Absoliučios 65C02 adresavimo instrukcijos yra: 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. Skaitytojas turėtų žiūrėti 65C02 µP dokumentaciją, kad žinotų, kaip naudotis čia pateiktomis instrukcijomis, taip pat apie kitus adresavimo režimus, kurie nebuvo paaiškinti šiame skyriuje. Instrukcijos pavyzdys yra:

JIE KAINA 1234 USD

Numanomas adresavimo režimas
Naudojant numanomą adresavimo režimą, operando nėra. Bet koks įtrauktas µP registras yra nurodytas instrukcijose. Numanomos adresavimo instrukcijos, skirtos 65C02: 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. Instrukcijos pavyzdys yra:

DEX: sumažinkite X registrą vienu vienetu.

Santykinio adresavimo režimas
Santykinis adresavimo režimas susijęs tik su šakų instrukcijomis. Naudojant santykinį adresavimo režimą, yra tik vienas operandas. Tai vertė nuo -12810 iki +12710. Ši vertė vadinama poslinkiu. Remiantis ženklu, ši reikšmė pridedama arba atimama iš kitos programos skaitiklio komandos prie rezultato, esančio numatytos kitos komandos adresu. Santykinės adreso režimo instrukcijos yra šios: BCC, BCS, BEQ, KMI, BNE, BPL, BRA, BVC, BVS. Instrukcijų pavyzdžiai yra šie:

BNE $7F : (filialas, jei būsenos registre Z = 0, P)

kuri prideda 127 prie dabartinės programos skaitiklio (vykdymo adreso) ir tuo adresu pradeda vykdyti komandą. Panašiai:

BEQ $F9 : (filialas, jei Z = : būsenos registre, P)

kuris prideda -7 prie dabartinės programos skaitiklio ir pradeda vykdyti naujuoju programos skaitiklio adresu. Operandas yra dviejų komplemento skaičius.

Absoliutus indeksinis adresavimas
Naudojant absoliutų indekso adresą, X arba Y registro turinys pridedamas prie nurodyto absoliutaus adreso (bet kur nuo 0000 USD iki USD FFFF, t. y. nuo 010 iki 6553610), kad būtų tikrasis adresas. Šis absoliutus adresas vadinamas baziniu adresu. Jei naudojamas X registras, surinkimo instrukcija yra maždaug tokia:

LDA $ C453,X

Jei naudojamas Y registras, tai būtų maždaug taip:

LDA $ C453,Y

X arba Y registro reikšmė vadinama skaičiavimo arba indekso reikšme ir gali būti nuo 00 USD (010) iki USD FF (25010). Tai nevadinama kompensacija.

Absoliutaus indekso adresavimo instrukcijos yra šios: ADC, AND, ASL (tik X), BIT (su akumuliatoriumi ir atmintimi, tik su X), CMP, DEC (tik atmintis ir X), EOR, INC (tik atmintis ir X), LDA , LDX, LDY, LSR (tik X), ORA, ROL (tik X), ROR (tik X), SBC, STA, STZ (tik X).

Absoliutus netiesioginis adresavimas
Tai naudojama tik su šuolio instrukcija. Šiuo atveju nurodytas absoliutus adresas turi žymeklio adresą. Rodyklės adresas susideda iš dviejų baitų. Dviejų baitų žymeklis nurodo (yra adresas) paskirties baito reikšmę atmintyje. Taigi surinkimo kalbos instrukcija yra tokia:

JMP (3456 USD)

Su skliaustais ir $13 $3456 adresu, o $EB yra $3457 (= $3456 + 1), paskirties adresas yra $13EB, o $13EB yra žymeklis. Instrukcijoje skliausteliuose yra absoliutus 3456 USD.

9) a) Parašykite 6502 mašinų kalbos programą, kad įrašytumėte 'Aš tave myliu!' ASCII kodų eilutę atmintyje, pradedant nuo $0300 adreso su eilutės ilgiu. Programa turėtų prasidėti 0200 USD adresu. Gaukite kiekvieną simbolį iš kaupiklio, darydami prielaidą, kad juos po vieną ten siunčia kokia nors paprogramė. Be to, surinkite programą rankomis. (Jei reikia žinoti „Aš tave myliu!“ ASCII kodus, čia jie yra: 'I':4916, tarpas : 2016, 'l': 6C16, 'o':6F16, 'v':7616, ' e':65, 'y':7916, 'u':7516 ir '!':2116. Pastaba: kiekvienas kodas užima 1 baitą).

b) Parašykite 6502 mašinų kalbos programą, kad įdėtumėte 'Aš tave myliu!' ASCII kodų eilutę atmintyje, pradedant nuo $0300 adreso be eilutės ilgio, bet baigiant 0016. Programa turėtų prasidėti nuo $0200 adreso. Gaukite kiekvieną simbolį iš kaupiklio, darydami prielaidą, kad juos po vieną ten siunčia kokia nors paprogramė. Taip pat programą surinkite rankomis.

Sprendimas:

a) Strategija: eilutei yra 12 baitų: 1 baitų eilutės ilgiui ir 11 baitų eilutės literalui. Taigi, turi būti 12 iteracijų (kilpų), skaičiuojant nuo 0. Tai yra: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11. Tai 12 skaičių.

Sveikasis skaičius 0 įrašomas į X registrą, o skaičius 1110 = 1210 – 110 = B16 = $0B įrašomas į adreso vietą atmintyje, tarkime, adresą $0250. Kiekvienai iteracijai reikšmė X registre padidinama, o rezultatas lyginamas su $0B $0250 adreso vietoje. Iškart po to, kai X reikšmė yra lygi 0B $ vertei, iteracija sustoja. Šiuo metu eilutės ilgis (baitų skaičius) ir eilutės raidė užima 0300–030 mlrd. USD (imtinai) adresų vietas. Norint padidinti atminties adresus nuo 0300 USD, naudojamas Y registras. Kodas yra:

LDA #$0B
JIE KAINA 0250 USD
LDX # 00 USD
LDY#00 USD
STA 0300 USD; 11 ilgis kažkokia paprogramė įdedamas į A ir eina į 0300 USD
kilpa INX
TEN
CPY 0250 USD
BEQ kilpa

b) Strategija: eilutei yra 12 baitų: 1 baitas 00 $ Null terminatoriui ir 11 baitų eilutės literalui. Taigi, turi būti 12 iteracijų (kilpų), skaičiuojant nuo 0. Tai yra: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11. Tai 12 skaičių.

Sveikasis skaičius 0 įrašomas į X registrą, o skaičius 1110 = 1210 – 110 = B16 = $0B įrašomas į adreso vietą atmintyje, tarkime, adresą $0250. Kiekvienai iteracijai reikšmė X registre padidinama, o rezultatas lyginamas su $0B $0250 adreso vietoje. Iškart po to, kai X reikšmė yra lygi 0B $ vertei, iteracija sustoja. Šiuo metu eilutės raidės baitų skaičius ir simbolis Null užima 0300–030 mlrd. USD (imtinai) adresų vietas. Norint padidinti atminties adresus nuo 0300 USD, naudojamas Y registras. Kodas yra:

LDA #$0B
JIE KAINA 0250 USD
LDX # 00 USD
LDY # 00 USD
STA 0300 USD; Kažkokia paprogramė „I“ įdeda į A ir gauna 0300 USD
kilpa INX
TEN
CPY 0250 USD
BEQ kilpa