Løsninger på problemene i kapittel 4 av den fullstendige online informatikkdatabasen og Internett-karrierekurset fra begynnelsen

Losninger Pa Problemene I Kapittel 4 Av Den Fullstendige Online Informatikkdatabasen Og Internett Karrierekurset Fra Begynnelsen



Problemer og deres løsninger

1) Skriv et assemblerspråkprogram som starter på $0200 for 6502 µP og legger til de usignerte tallene til 2A94 H (legg til) til 2ABF H (augend). La inngangene og utgangene være i minnet. Produser også det sammensatte programdokumentet for hånd.







Løsning:



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



Sammensatt program:





2) Skriv et assemblerspråkprogram som starter på $0200, for 6502 µP, og trekker fra tallene uten fortegn, 1569 H (subtrahend) fra 2ABF H (minend). La inngangene og utgangene være i minnet. Produser også det sammensatte programdokumentet, for hånd.



Løsning:

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

Sammensatt program:

3) Skriv et assemblerspråkprogram for 6502 µP som teller opp fra $00 til $09 ved å bruke en løkke. Programmet bør starte på $0200. Produser også det sammensatte programdokumentet for hånd.

Løsning:

LDA #$09
STA $0220 ; for å sammenligne X og $09
LDX #$00
løkke INX
CPX $0220
BNE-løkke

Sammensatt program:

4) Skriv et assemblerspråkprogram som starter på $0200 for 6502 µP. Programmet har to subrutiner. Den første subrutinen legger til de usignerte tallene til 0203 H (augend) og 0102 H (legg til). Den andre subrutinen legger til summen fra den første subrutinen som er 0305 H til 0006 H (augend). Det endelige resultatet lagres i minnet. Ring den første subrutinen som er FSTSUB og den andre subrutinen som er SECSUB. La inngangene og utgangene være i minnet. Lag også det sammensatte programdokumentet for hele programmet for hånd.

Løsning:

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

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

JSR FSTSUB

Sammensatt program:

5) Gitt at en ¯IRQ handler legger til $02 til $01 ved akkumulatoren som kjernehåndtering mens ¯NMI er utstedt, og kjernehåndteringen for ¯NMI legger til $05 til $04 ved akkumulatoren, skriv et assemblerspråk for begge behandlerne inkludert samtalene deres. Oppfordringen til ¯IRQ handler skal være på adressen $0200. De ¯IRQ handler skal starte på adressen $0300. De ¯NMI handler skal starte på adressen $0400. Resultatet av ¯IRQ handler skal settes på adressen $0500, og resultatet av ¯NMI handler skal plasseres på adressen $0501.

Løsning:

NMISR PHA ; NMI-rutinen begynner her på $0400-adressen
PHX
PHY
;
LDA #$04
ADC #$05
STA $0501
;
PLY
PLX
PLA
RTI

ISR PHA ; denne instruksjonen er på $0300-adressen
PHX
PHY
;
LDA #$01
ADC #$02
; JMP NMISR : kommentert fordi det ikke er en del av rutinen
STA $0500 ; vil gå til stabelen
;
PLY
PLX
PLA
RTI
;
JMP ISR ; denne instruksjonen er på $0200-adressen

6) Forklar kort hvordan BRK-instruksjonen brukes til å produsere programvareavbruddet i en 65C02 datamaskin.

Løsning:

Den viktigste måten å få et programvareavbrudd for 65C02 µP på er å bruke BRK underforstått adresseinstruksjon. Anta at hovedprogrammet kjører, og det møter BRK-instruksjonen. Fra det tidspunktet skal adressen til neste instruksjon i PC-en sendes til stabelen etter hvert som den gjeldende instruksjonen fullføres. En subrutine for å håndtere programvareinstruksjonen bør kalles neste. Denne avbruddssubrutinen skal presse A-, X- og Y-registerinnholdet til stabelen. Etter at kjernen i subrutinen er utført, bør innholdet i A-, X- og Y-registrene trekkes tilbake fra stabelen til deres register ved den fullførte subrutinen. Den siste uttalelsen i rutinen er RTI. PC-innholdet trekkes også automatisk tilbake fra stabelen til PC-en på grunn av RTI.

7) Lag en tabell som sammenligner og kontrasterer en normal subrutine med en avbruddsrutine.

Løsning:

8) Forklar kort hovedadresseringsmodusene til 65C02 µP gitt eksemplene på assembly-språkinstruksjon.

Løsning:

Hver instruksjon for 6502 er én byte, etterfulgt av null eller flere operander.

Umiddelbar adresseringsmodus
Med den umiddelbare adresseringsmodusen, etter operanden, er verdien og ikke en minneadresse. Verdien må innledes med #. Hvis verdien er i heksadesimal, må '#' følges av '$'. De umiddelbare adresseinstruksjonene for 65C02 er: ADC, AND, BIT, CMP, CPX, CPY, EOR, LDA, LDX, LDY, ORA, SBC. Leseren bør konsultere dokumentasjonen for 65C02 µP for å vite hvordan man bruker instruksjonene som er oppført her som ikke er forklart i dette kapittelet. En eksempelinstruksjon er:

LDA #$77

Absolutt adresseringsmodus
Med den absolutte adresseringsmodusen er det én operand. Denne operanden er adressen til verdien i minnet (vanligvis i heksadesimal eller en etikett). Det er 64K10 = 65,53610 minneadresser for 6502 µP. Vanligvis er én-byte-verdien på en av disse adressene. De absolutte adresseringsinstruksjonene for 65C02 er: 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. Leseren bør konsultere dokumentasjonen for 65C02 µP for å vite hvordan man bruker instruksjonene som er oppført her, samt for resten av adresseringsmodusene som ikke er forklart i dette kapittelet. En eksempelinstruksjon er:

DE ER 1234 dollar

Implisitt adresseringsmodus
Med den underforståtte adresseringsmodusen er det ingen operand. Ethvert µP-register som er involvert, antydes av instruksjonen. De underforståtte adresseinstruksjonene for 65C02 er: 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. En eksempelinstruksjon er:

DEX: Reduser X-registeret med én enhet.

Relativ adresseringsmodus
Den relative adresseringsmodusen omhandler bare greninstruksjoner. Med relativ adresseringsmodus er det bare én operand. Det er en verdi fra -12810 til +12710. Denne verdien kalles en offset. Basert på tegnet legges denne verdien til eller trekkes fra den neste instruksjonen til Programtelleren til resultatet i adressen til den tiltenkte neste instruksjonen. De relative adressemodusinstruksjonene er: BCC, BCS, BEQ, BMI, BNE, BPL, BRA, BVC, BVS. Instruksjonseksemplene er:

BNE $7F : (gren hvis Z = 0 i statusregisteret, P)

som legger til 127 til gjeldende programteller (adresse som skal utføres) og begynner å utføre instruksjonen på den adressen. På samme måte:

BEQ $F9 : (gren hvis Z = : i statusregister, P)

som legger til en -7 til gjeldende programteller og starter utførelsen på den nye programtelleradressen. Operanden er et to-komplementnummer.

Absolutt indeksadressering
Med absolutt indeksadressering blir innholdet i X- eller Y-registeret lagt til den gitte absolutte adressen (alt fra $0000 til $FFFF, dvs. fra 010 til 6553610) for å ha den virkelige adressen. Denne gitte absolutte adressen kalles basisadressen. Hvis X-registeret brukes, er monteringsinstruksjonen omtrent slik:

LDA $C453,X

Hvis Y-registeret brukes, vil det være noe slikt:

LDA $C453,Y

Verdien for X- eller Y-registeret kalles telle- eller indeksverdien, og den kan være alt fra $00 (010) til $FF (25010). Det kalles ikke offset.

De absolutte indeksadresseringsinstruksjonene er: ADC, AND, ASL (kun X), BIT (med akkumulator og minne, kun med X), CMP, DEC (kun minne og X), EOR, INC (kun minne og X), LDA , LDX, LDY, LSR (kun X), ORA, ROL (kun X), ROR (kun X), SBC, STA, STZ (kun X).

Absolutt indirekte adressering
Denne brukes kun med hoppinstruksjonen. Med dette har den gitte absolutte adressen en pekeradresse. Pekeradressen består av to byte. To-byte-pekeren peker på (er adressen til) destinasjonsbyteverdien i minnet. Så instruksjonen for monteringsspråk er som følger:

JMP ($3456)

Med parentesene og $13 i $3456-adresse mens $EB er i $3457 (= $3456 + 1)-adresse, er destinasjonsadressen $13EB og $13EB er pekeren. Absolutt $3456 står i parentes i instruksjonen.

9) a) Skriv et 6502 maskinspråkprogram for å sette 'Jeg elsker deg!' streng med ASCII-koder i minnet, fra $0300-adressen med lengden på strengen. Programmet skal starte på $0200-adressen. Få hver karakter fra akkumulatoren, forutsatt at de sendes dit én etter én av en eller annen underrutine. Sett også sammen programmet for hånd. (Hvis du trenger å kjenne ASCII-kodene for 'Jeg elsker deg!', her er de: 'I':4916, space: 2016, 'l': 6C16, 'o':6F16, 'v':7616, ' e':65, 'y':7916, 'u':7516 og '!':2116. Merk: hver kode opptar 1 byte).

b) Skriv et 6502 maskinspråkprogram for å sette 'Jeg elsker deg!' streng med ASCII-koder i minnet, som starter fra $0300-adressen uten lengden på strengen, men slutter i 0016. Programmet skal starte på $0200-adressen. Få hver karakter fra akkumulatoren, forutsatt at de sendes dit én etter én av en eller annen subrutine. Sett også sammen programmet for hånd.

Løsning:

a) Strategi: Det er 12 byte for strengen: 1 byte for strenglengden og 11 byte for strengen. Så det må være 12 iterasjoner (loopings) som telles fra 0. Det vil si: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11. Dette er 12 tall.

Heltallet 0 settes i X-registeret og tallet 1110 = 1210 – 110 = B16 = $0B settes på en adresseplassering i minnet, si adresse $0250. For hver iterasjon økes verdien i X-registeret, og resultatet sammenlignes med $0B i $0250-adresseplasseringen. Like etter at verdien i X er lik verdien av $0B, stopper iterasjonen. På dette tidspunktet opptar lengden (antall byte) på strengen og strengen literal $0300 til $030B (inklusive) adresseplasseringer. For å øke minneadressene fra $0300, brukes Y-registeret. Koden er:

LDA #$0B
DE ER $0250
LDX #$00
LDY #$00
STA $0300 ; lengden på 11 legges inn i A av en eller annen subrutine og går til $0300
løkke INX
DER
CPY $0250
BEQ-løkke

b) Strategi: Det er 12 byte for strengen: 1 byte for $00 Null-terminator og 11 byte for strengen. Så det må være 12 iterasjoner (loopings) som telles fra 0. Det vil si: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11. Dette er 12 tall.

Heltallet 0 settes i X-registeret og tallet 1110 = 1210 – 110 = B16 = $0B settes på en adresseplassering i minnet, si adresse $0250. For hver iterasjon økes verdien i X-registeret, og resultatet sammenlignes med $0B i $0250-adresseplasseringen. Like etter at verdien i X er lik verdien av $0B, stopper iterasjonen. På dette tidspunktet opptar antall byte av strengen literal pluss null-tegnet $0300 til $030B (inklusive) adresseplasseringer. For å øke minneadressene fra $0300, brukes Y-registeret. Koden er:

LDA #$0B
DE ER $0250
LDX #$00
LDY#$00
STA $0300 ; 'I' settes inn i A av en eller annen subrutine og går til $0300
løkke INX
DER
CPY $0250
BEQ-løkke