Løsninger på problemerne i kapitel 4 i den fulde online datalogidatabase og internetkarrierekursus fra begyndelsen

Losninger Pa Problemerne I Kapitel 4 I Den Fulde Online Datalogidatabase Og Internetkarrierekursus Fra Begyndelsen



Problemer og deres løsninger

1) Skriv et assemblersprogsprogram, der starter ved $0200 for 6502 µP og tilføjer de usignerede numre af 2A94 H (tilføj) til 2ABF H (augend). Lad input og output være i hukommelsen. Fremstil også det samlede programdokument i hånden.







Løsning:



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



Samlet program:





2) Skriv et assemblersprogsprogram, der starter ved $0200, for 6502 µP, og fratræk de usignerede tal, 1569 H (subtrahend) fra 2ABF H (minend). Lad input og output være i hukommelsen. Fremstil også det samlede programdokument i hånden.



Løsning:

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

Samlet program:

3) Skriv et assemblersprogsprogram for 6502 µP, der tæller op fra $00 til $09 ved hjælp af en loop. Programmet skulle starte ved $0200. Fremstil også det samlede programdokument i hånden.

Løsning:

LDA #$09
STA $0220 ; for at sammenligne X og $09
LDX #$00
sløjfe INX
CPX $0220
BNE sløjfe

Samlet program:

4) Skriv et assemblersprogsprogram, som starter ved $0200 for 6502 µP. Programmet har to underrutiner. Den første underrutine tilføjer de usignerede numre af 0203 H (augend) og 0102 H (tilføj). Den anden subrutine tilføjer summen fra den første subrutine, som er 0305 H til 0006 H (augend). Det endelige resultat gemmes i hukommelsen. Kald den første underrutine, som er FSTSUB, og den anden underrutine, som er SECSUB. Lad input og output være i hukommelsen. Fremstil også det samlede programdokument for hele programmet i hånden.

Løsning:

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

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

JSR FSTSUB

Samlet program:

5) Da en ¯IRQ handler tilføjer $02 til $01 ved akkumulatoren som kernehåndtering mens ¯NMI er udstedt, og kernehåndteringen vedr ¯NMI tilføjer $05 til $04 ved akkumulatoren, skriv et assemblersprog for begge handlere inklusive deres opkald. Opkaldet til ¯IRQ handler skal være på adressen $0200. Det ¯IRQ handler skal starte på adressen $0300. Det ¯NMI handler skal starte på adressen $0400. Resultatet af ¯IRQ handler skal placeres på adressen $0500, og resultatet af ¯NMI handler skal placeres på adressen $0501.

Løsning:

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

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

6) Forklar kort, hvordan BRK-instruktionen bruges til at producere softwareafbrydelsen i en 65C02-computer.

Løsning:

Den vigtigste måde at få en softwareafbrydelse til 65C02 µP på er ved brug af BRK underforstået adresseinstruktion. Antag, at hovedprogrammet kører, og det støder på BRK-instruktionen. Fra det tidspunkt skal adressen på den næste instruktion i pc'en sendes til stakken, efterhånden som den aktuelle instruktion afsluttes. En subrutine til at håndtere softwareinstruktionen skal kaldes næste gang. Denne afbrydelsesunderrutine skal skubbe A-, X- og Y-registerindholdet til stakken. Efter at kernen af ​​subrutinen er udført, bør indholdet af A-, X- og Y-registrene trækkes tilbage fra stakken til deres registre af den fuldende subrutine. Det sidste udsagn i rutinen er RTI. Pc-indholdet trækkes også automatisk tilbage fra stakken til pc'en på grund af RTI.

7) Lav en tabel, der sammenligner og kontrasterer en normal underrutine med en afbrydelsesservicerutine.

Løsning:

8) Forklar kort de vigtigste adresseringstilstande for 65C02 µP givet eksemplerne på assemblersprogsinstruktionerne.

Løsning:

Hver instruktion for 6502 er én byte efterfulgt af nul eller flere operander.

Øjeblikkelig adresseringstilstand
Med den umiddelbare adresseringstilstand, efter operanden, er værdien og ikke en hukommelsesadresse. Værdien skal have # foran. Hvis værdien er i hexadecimal, så skal '#' efterfølges af '$'. De umiddelbare adresseringsinstruktioner for 65C02 er: ADC, AND, BIT, CMP, CPX, CPY, EOR, LDA, LDX, LDY, ORA, SBC. Læseren bør konsultere dokumentationen for 65C02 µP for at vide, hvordan man bruger instruktionerne, der er angivet her, og som ikke er blevet forklaret i dette kapitel. En eksempelinstruktion er:

LDA #$77

Absolut adresseringstilstand
Med den absolutte adresseringstilstand er der én operand. Denne operand er adressen på værdien i hukommelsen (normalt i hexadecimal eller en etiket). Der er 64K10 = 65,53610 hukommelsesadresser for 6502 µP. Typisk er én-byte værdien på en af ​​disse adresser. De absolutte adresseringsinstruktioner 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. Læseren bør konsultere dokumentationen for 65C02 µP for at vide, hvordan man bruger instruktionerne, der er angivet her, såvel som for resten af ​​adresseringstilstandene, der ikke er blevet forklaret i dette kapitel. En eksempelinstruktion er:

DE ER 1234 $

Underforstået adresseringstilstand
Med den underforståede adresseringstilstand er der ingen operand. Ethvert involveret µP-register er underforstået af instruktionen. De underforståede adresseanvisninger 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 eksempelinstruktion er:

DEX: Formindsk X-registret med én enhed.

Relativ adresseringstilstand
Den relative adresseringstilstand omhandler kun greninstruktioner. Med relativ adresseringstilstand er der kun én operand. Det er en værdi fra -12810 til +12710. Denne værdi kaldes en offset. Baseret på tegnet tilføjes eller trækkes denne værdi fra den næste instruktion af programtælleren til resultatet i adressen på den tilsigtede næste instruktion. De relative adressetilstandsinstruktioner er: BCC, BCS, BEQ, BMI, BNE, BPL, BRA, BVC, BVS. Instruktionseksemplerne er:

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

som tilføjer 127 til den aktuelle programtæller (adresse, der skal udføres) og begynder at udføre instruktionen på den adresse. Tilsvarende:

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

som tilføjer en -7 til den aktuelle programtæller og starter udførelsen på den nye programtælleradresse. Operanden er et to-komplementnummer.

Absolut indeksadressering
Med absolut indeksadressering tilføjes indholdet af X- eller Y-registret til den givne absolutte adresse (alt fra $0000 til $FFFF, dvs. fra 010 til 6553610) for at have den rigtige adresse. Denne givne absolutte adresse kaldes basisadressen. Hvis X-registret bruges, er monteringsinstruktionen sådan her:

LDA $C453,X

Hvis Y-registret bruges, ville det være sådan her:

LDA $C453,Y

Værdien for X- eller Y-registret kaldes tælle- eller indeksværdien, og den kan være alt fra $00 (010) til $FF (25010). Det kaldes ikke offset.

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

Absolut indirekte adressering
Dette bruges kun sammen med springinstruktionen. Hermed har den givne absolutte adresse en pointeradresse. Pointeradressen består af to bytes. To-byte-markøren peger på (er adressen på) destinationsbyteværdien i hukommelsen. Så assemblersprogsinstruktionen er som følger:

JMP ($3456)

Med parenteser og $13 i $3456 adresse, mens $EB er i $3457 (= $3456 + 1) adresse, er destinationsadressen $13EB og $13EB er markøren. Absolutte $3456 står i parentes i instruktionen.

9) a) Skriv et 6502 maskinsprogsprogram for at sætte 'Jeg elsker dig!' streng af ASCII-koder i hukommelsen, begyndende fra $0300-adressen med længden af ​​strengen. Programmet skal starte på $0200-adressen. Få hver karakter fra akkumulatoren, forudsat at de sendes dertil én efter én af en eller anden underrutine. Saml også programmet i hånden. (Hvis du har brug for at kende ASCII-koderne for 'Jeg elsker dig!', her er de: 'I':4916, space: 2016, 'l': 6C16, 'o':6F16, 'v':7616, ' e':65, 'y':7916, 'u':7516 og '!':2116. Bemærk: hver kode optager 1 byte).

b) Skriv et 6502 maskinsprogsprogram for at sætte 'Jeg elsker dig!' streng af ASCII-koder i hukommelsen, begyndende fra $0300-adressen uden længden af ​​strengen, men slutter i 0016. Programmet bør starte ved $0200-adressen. Få hver karakter fra akkumulatoren, forudsat at de sendes dertil én efter én af en eller anden underrutine. Saml også programmet i hånden.

Løsning:

a) Strategi: Der er 12 bytes for strengen: 1 byte for strenglængden og 11 bytes for strengen. Så der skal være 12 iterationer (loopinger), der tæller fra 0. Det vil sige: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11. Det er 12 tal.

Heltallet 0 sættes i X-registret, og tallet 1110 = 1210 – 110 = B16 = $0B sættes på en adresseplacering i hukommelsen, f.eks. adresse $0250. For hver iteration øges værdien i X-registret, og resultatet sammenlignes med $0B i $0250-adresseplaceringen. Lige efter værdien i X er lig med værdien af ​​$0B, stopper iterationen. På dette tidspunkt optager længden (antal bytes) af strengen og strengen literal adresseplaceringerne $0300 til $030B (inklusive). For at øge hukommelsesadresserne fra $0300, bruges Y-registret. Koden er:

LDA #$0B
DE ER 0250 $
LDX #$00
LDY #$00
STA $0300 ; længden af ​​11 sættes i A af en eller anden underrutine og går til $0300
sløjfe INX
DER
CPY $0250
BEQ sløjfe

b) Strategi: Der er 12 bytes til strengen: 1 byte for $00 Null-terminatoren og 11 bytes for strengen literal. Så der skal være 12 iterationer (loopinger), der tæller fra 0. Det vil sige: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11. Det er 12 tal.

Heltallet 0 sættes i X-registret, og tallet 1110 = 1210 – 110 = B16 = $0B sættes på en adresseplacering i hukommelsen, f.eks. adresse $0250. For hver iteration øges værdien i X-registret, og resultatet sammenlignes med $0B i $0250-adresseplaceringen. Lige efter værdien i X er lig med værdien af ​​$0B, stopper iterationen. På dette tidspunkt optager antallet af bytes af strengen literal plus nul-tegnet $0300 til $030B (inklusive) adresseplaceringer. For at øge hukommelsesadresserne fra $0300, bruges Y-registret. Koden er:

LDA #$0B
DE ER 0250 $
LDX #$00
LDY #$00
STA $0300 ; 'I' sættes ind i A af en eller anden underrutine og går til $0300
sløjfe INX
DER
CPY $0250
BEQ sløjfe