Rješenja za probleme poglavlja 4 potpune internetske baze podataka o računalnim znanostima i tečaja internetske karijere od početka

Rjesenja Za Probleme Poglavlja 4 Potpune Internetske Baze Podataka O Racunalnim Znanostima I Tecaja Internetske Karijere Od Pocetka



Problemi i njihova rješenja

1) Napišite program na asemblerskom jeziku koji počinje od $0200 za 6502 µP i dodaje nepredpisane brojeve 2A94 H (dodaj) na 2ABF H (augend). Neka ulazi i izlaz budu u memoriji. Također, izradite ručno sastavljeni programski dokument.







Riješenje:



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



Sastavljeni program:





2) Napišite program na asemblerskom jeziku koji počinje od $0200, za 6502 µP, i oduzima nepredpisane brojeve, 1569 H (oduzeti) iz 2ABF H (minuend). Neka ulazi i izlaz budu u memoriji. Također ručno izradite sastavljeni programski dokument.



Riješenje:

SEK
LDA 0213 dolara
SBC 0215 dolara
STA 0217 dolara
LDA 0214 dolara
SBC $0216
STA 0218 USD

Sastavljeni program:

3) Napišite program na asemblerskom jeziku za 6502 µP koji broji od $00 do $09 koristeći petlju. Program bi trebao početi od 0200 dolara. Također, izradite ručno sastavljeni programski dokument.

Riješenje:

LDA #$09
STA 0220 $ ; za usporedbu X i $09
LDX #$00
petlja INX
CPX 0220 dolara
BNE petlja

Sastavljeni program:

4) Napišite program na asemblerskom jeziku koji počinje od $0200 za 6502 µP. Program ima dvije potprograme. Prva potprograma dodaje nepredpisane brojeve 0203 H (augend) i 0102 H (dodati). Drugi potprogram dodaje zbroj iz prvog potprograma koji je 0305 H do 0006 H (augend). Konačni rezultat pohranjuje se u memoriju. Pozovite prvi potprogram koji je FSTSUB i drugi potprogram koji je SECSUB. Neka ulazi i izlazi budu u memoriji. Također, izradite ručno sastavljeni programski dokument za cijeli program.

Riješenje:

SECSUB CLC
LDA $021A
ADC 0234 dolara
STA 0236 dolara
LDA 021 milijarda USD
ADC 0235 dolara
STA 0237 dolara
RTS

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

JSR FSTSUB

Sastavljeni program:

5) S obzirom da an ¯IRQ rukovatelj dodaje $02 do $01 na akumulator kao rukovanje jezgrom dok ¯NMI se izdaje, a rukovanje jezgrom za ¯NMI dodaje $05 do $04 na akumulatoru, napišite asemblerski jezik za oba rukovatelja uključujući njihove pozive. Poziv na ¯IRQ rukovatelj bi trebao biti na adresi $0200. The ¯IRQ rukovatelj bi trebao početi na adresi $0300. The ¯NMI rukovatelj bi trebao početi na adresi od $0400. Rezultat ¯IRQ rukovatelj treba staviti na adresu $0500, a rezultat ¯NMI rukovatelj treba staviti na adresu $0501.

Riješenje:

NMISR PHA ; NMI rutina počinje ovdje na adresi $0400
PHX
PHY
;
LDA #$04
ADC #$05
STA 0501 dolara
;
PROMETOVATI
PLX
PLA
RTI

ISR PHA ; ova uputa je na adresi $0300
PHX
PHY
;
LDA #$01
ADC #$02
; JMP NMISR: komentirano jer nije dio rutine
STA 0500 dolara; će ići na stog
;
PROMETOVATI
PLX
PLA
RTI
;
JMP ISR ; ova uputa je na adresi $0200

6) Ukratko objasnite kako se BRK instrukcija koristi za proizvodnju softverskog prekida u računalu 65C02.

Riješenje:

Glavni način za softverski prekid za 65C02 µP je korištenje BRK implicirane adresne instrukcije. Pretpostavimo da se glavni program izvodi i nailazi na BRK instrukciju. Od tog trenutka, adresa sljedeće instrukcije u PC-u treba biti poslana na stog kada trenutna instrukcija završi. Sljedeća bi se trebala pozvati podrutina za rukovanje softverskim uputama. Ovaj prekidni potprogram trebao bi gurnuti sadržaj registra A, X i Y na stog. Nakon što se izvrši jezgra potprograma, sadržaj registara A, X i Y trebao bi se povući natrag sa stoga u njihove registre dovršetkom potprograma. Posljednja izjava u rutini je RTI. PC sadržaj se također povlači natrag sa stoga na PC, automatski, zbog RTI-ja.

7) Napravite tablicu koja uspoređuje i suprotstavlja normalnu potprogramu s rutinom usluge prekida.

Riješenje:

8) Ukratko objasnite glavne načine adresiranja 65C02 µP s obzirom na primjere instrukcija asemblerskog jezika.

Riješenje:

Svaka instrukcija za 6502 je jedan bajt, iza kojeg slijedi nula ili više operanda.

Način trenutnog adresiranja
Kod trenutnog načina adresiranja, nakon operanda je vrijednost, a ne memorijska adresa. Ispred vrijednosti mora biti #. Ako je vrijednost u heksadecimalnom obliku, nakon '#' mora slijediti '$'. Upute za neposredno adresiranje za 65C02 su: ADC, AND, BIT, CMP, CPX, CPY, EOR, LDA, LDX, LDY, ORA, SBC. Čitatelj bi trebao pogledati dokumentaciju za 65C02 µP kako bi znao kako koristiti upute koje su ovdje navedene, a koje nisu objašnjene u ovom poglavlju. Primjer upute je:

LDA #$77

Način apsolutnog adresiranja
Kod apsolutnog načina adresiranja postoji jedan operand. Ovaj operand je adresa vrijednosti u memoriji (obično u heksadecimalnom obliku ili oznaka). Postoji 64K10 = 65,53610 memorijskih adresa za 6502 µP. Obično je jednobajtna vrijednost na jednoj od ovih adresa. Apsolutne upute za adresiranje za 65C02 su: 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. Čitatelj bi trebao pogledati dokumentaciju za 65C02 µP kako bi znao kako koristiti upute koje su ovdje navedene kao i za ostale načine adresiranja koji nisu objašnjeni u ovom poglavlju. Primjer upute je:

KOSTAJU 1234 dolara

Implicitni način adresiranja
Kod impliciranog načina adresiranja nema operanda. Svaki uključeni µP registar implicira se u instrukciji. Implicitne upute za adresiranje za 65C02 su: 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. Primjer upute je:

DEX: Smanjite X registar za jednu jedinicu.

Način relativnog adresiranja
Način relativnog adresiranja bavi se samo uputama grananja. Kod relativnog načina adresiranja, postoji samo jedan operand. To je vrijednost od -12810 do +12710. Ova se vrijednost naziva pomak. Na temelju predznaka ta se vrijednost dodaje ili oduzima od sljedeće instrukcije programskog brojača rezultatu u adresi namjeravane sljedeće instrukcije. Relativne upute za način rada adrese su: BCC, BCS, BEQ, BMI, BNE, BPL, BRA, BVC, BVS. Primjeri uputa su:

BNE $7F : (grananje ako je Z = 0 u statusnom registru, P)

koji dodaje 127 trenutnom programskom brojaču (adresi za izvršenje) i započinju izvršavanje instrukcije na toj adresi. Slično:

BEQ $F9 : (grananje ako je Z = : u statusnom registru, P)

koji dodaje -7 trenutnom brojaču programa i započinje izvršenje na novoj adresi brojača programa. Operand je komplement broja dvojke.

Apsolutno indeksno adresiranje
Kod apsolutnog indeksnog adresiranja, sadržaj registra X ili Y dodaje se danoj apsolutnoj adresi (bilo gdje od $0000 do $FFFF, tj. od 010 do 6553610) kako bi se dobila prava adresa. Ova dana apsolutna adresa naziva se bazna adresa. Ako se koristi X registar, instrukcija asemblera je otprilike ovakva:

LDA C453,X

Ako se koristi Y registar, to bi bilo nešto ovako:

LDA $C453, Y

Vrijednost za registar X ili Y naziva se broj ili vrijednost indeksa i može biti bilo gdje od $00 (010) do $FF (25010). Ne zove se ofset.

Upute za adresiranje apsolutnog indeksa su: ADC, AND, ASL (samo X), BIT (s akumulatorom i memorijom, samo s X), CMP, DEC (samo memorija i X), EOR, INC (samo memorija i X), LDA , LDX, LDY, LSR (samo X), ORA, ROL (samo X), ROR (samo X), SBC, STA, STZ (samo X).

Apsolutno neizravno adresiranje
Ovo se koristi samo s uputama za skok. S tim, data apsolutna adresa ima adresu pokazivača. Adresa pokazivača sastoji se od dva bajta. Pokazivač od dva bajta pokazuje (adresa je) odredišne ​​vrijednosti bajta u memoriji. Dakle, upute za asemblerski jezik su sljedeće:

JMP (3456 USD)

Sa zagradama i $13 u $3456 adresi dok je $EB u $3457 (= $3456 + 1) adresi, odredišna adresa je $13EB i $13EB je pokazivač. Apsolutnih 3456 dolara nalazi se u zagradama u uputama.

9) a) Napišite program na strojnom jeziku 6502 da stavite 'Volim te!' niz ASCII kodova u memoriji, počevši od $0300 adrese s duljinom niza. Program bi trebao početi na adresi $0200. Uzmite svaki znak iz akumulatora, pod pretpostavkom da su tamo poslani jedan po jedan pomoću neke podrutine. Također, ručno sastavite program. (Ako trebate znati ASCII kodove za 'Volim te!', evo ih: 'I':4916, razmak: 2016, 'l': 6C16, 'o':6F16, 'v':7616, ' e':65, 'y':7916, 'u':7516 i '!':2116. Napomena: svaki kod zauzima 1 bajt).

b) Napišite program na strojnom jeziku 6502 da stavite 'Volim te!' niz ASCII kodova u memoriji, počevši od adrese $0300 bez duljine niza, ali završavajući na 0016. Program bi trebao početi na adresi $0200. Dobijte svaki znak iz akumulatora, pod pretpostavkom da su tamo poslani jedan po jedan pomoću neke podrutine. Također, sastavite program ručno.

Riješenje:

a) Strategija: Postoji 12 bajtova za niz: 1 bajt za duljinu niza i 11 bajtova za literal niza. Dakle, mora biti 12 ponavljanja (petlji) računajući od 0. To je: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11. Ovo je 12 brojeva.

Cijeli broj 0 stavlja se u registar X, a broj 1110 = 1210 – 110 = B16 = $0B stavlja se na mjesto adrese u memoriji, recimo adresa $0250. Za svaku iteraciju, vrijednost u registru X se povećava, a rezultat se uspoređuje s $0B na lokaciji adrese $0250. Odmah nakon što je vrijednost u X jednaka vrijednosti $0B, iteracija se zaustavlja. U ovom trenutku, duljina (broj bajtova) niza i literal niza zauzimaju adresne lokacije od $0300 do $030B (uključujući). Kako bi se memorijske adrese povećavale od $0300, koristi se Y registar. Šifra je:

LDA #$0B
KOSTAJU 0250 dolara
LDX #$00
LDY #00 USD
STA 0300 dolara; duljina od 11 je stavljena u A pomoću neke podrutine i ide na $0300
petlja INX
TAMO
CPY 0250 USD
BEQ petlja

b) Strategija: Postoji 12 bajtova za niz: 1 bajt za $00 Null terminator i 11 bajtova za literal niza. Dakle, mora biti 12 ponavljanja (petlji) računajući od 0. To je: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11. Ovo je 12 brojeva.

Cijeli broj 0 stavlja se u registar X, a broj 1110 = 1210 – 110 = B16 = $0B stavlja se na mjesto adrese u memoriji, recimo adresa $0250. Za svaku iteraciju, vrijednost u registru X se povećava, a rezultat se uspoređuje s $0B na lokaciji adrese $0250. Odmah nakon što je vrijednost u X jednaka vrijednosti $0B, iteracija se zaustavlja. U ovom trenutku, broj bajtova literalnog niza plus znak Null zauzima adresne lokacije od $0300 do $030B (uključujući). Kako bi se povećale memorijske adrese od $0300, koristi se Y registar. Šifra je:

LDA #$0B
KOSTAJU 0250 dolara
LDX #$00
LDY #00 USD
STA 0300 dolara; Neki potprogram 'I' stavlja u A i ide na 0300 USD
petlja INX
TAMO
CPY 0250 USD
BEQ petlja