Oplossingen voor de problemen van hoofdstuk 4 van de volledige online computerwetenschappelijke database en internetcarrièrecursus vanaf het begin

Oplossingen Voor De Problemen Van Hoofdstuk 4 Van De Volledige Online Computerwetenschappelijke Database En Internetcarrierecursus Vanaf Het Begin



Problemen en hun oplossingen

1) Schrijf een assembleertaalprogramma dat begint bij $0200 voor de 6502 µP en voeg de niet-ondertekende getallen van 2A94 toe H (toevoegen) aan 2ABF H (augend). Laat de invoer en uitvoer in het geheugen staan. Maak het samengestelde programmadocument ook met de hand.







Oplossing:



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



Samengesteld programma:





2) Schrijf een assembleertaalprogramma dat begint bij $0200, voor de 6502 µP, en trek de niet-ondertekende getallen af, 1569 H (aftrekker) van 2ABF H (aftrektal). Laat de invoer en uitvoer in het geheugen staan. Maak het samengestelde programmadocument ook met de hand.



Oplossing:

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

Samengesteld programma:

3) Schrijf een assembleertaalprogramma voor de 6502 µP dat met behulp van een lus optelt van $00 naar $09. Het programma zou moeten beginnen bij $ 0200. Maak het samengestelde programmadocument ook met de hand.

Oplossing:

LDA#$09
STA $0220; voor het vergelijken van X en $09
LDX#$00
lus INX
CPX $ 0220
BNE-lus

Samengesteld programma:

4) Schrijf een assembleertaalprogramma dat begint bij $0200 voor de 6502 µP. Het programma heeft twee subroutines. De eerste subroutine voegt de niet-ondertekende nummers van 0203 toe H (augend) en 0102 H (toevoegen). De tweede subroutine telt de som van de eerste subroutine op, namelijk 0305 H naar 0006 H (augend). Het eindresultaat wordt in het geheugen opgeslagen. Roep de eerste subroutine aan die FSTSUB is en de tweede subroutine die SECSUB is. Laat de in- en uitgangen in het geheugen staan. Maak ook het samengestelde programmadocument voor het hele programma met de hand.

Oplossing:

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

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

JSR FSTSUB

Samengesteld programma:

5) Gezien het feit dat een �IRQ handler voegt $02 tot $01 toe aan de accumulator als kernbehandeling terwijl �NMI wordt uitgegeven, en de kernafhandeling daarvoor �NMI voegt $05 tot $04 toe aan de accumulator, schrijf een assembleertaal voor beide handlers inclusief hun oproepen. De oproep aan de �IRQ De handler moet zich op het adres $0200 bevinden. De �IRQ handler moet beginnen op het adres $0300. De �NMI handler moet beginnen op het adres $0400. Het resultaat van de �IRQ handler moet op het adres $0500 worden geplaatst, en het resultaat van de �NMI handler moet op het adres $0501 worden geplaatst.

Oplossing:

NMISR PHA; De NMI-routine begint hier op het $0400-adres
PHX
PHY
;
LDA#$04
ADC #$05
STA $ 0501
;
PLY
PLX
PLA
RTI

ISR PHA; deze instructie bevindt zich op het adres $0300
PHX
PHY
;
LDA #$01
ADC #$02
; JMP NMISR: commentaar gegeven omdat het geen deel uitmaakt van de routine
STA $ 0500; gaat op stapel
;
PLY
PLX
PLA
RTI
;
JMP ISR; deze instructie bevindt zich op het adres $0200

6) Leg kort uit hoe de BRK-instructie wordt gebruikt om de software-interrupt in een 65C02-computer te produceren.

Oplossing:

De belangrijkste manier om een ​​software-interrupt voor de 65C02 µP te verkrijgen is door gebruik te maken van de impliciete adresinstructie van BRK. Stel dat het hoofdprogramma actief is en de BRK-instructie tegenkomt. Vanaf dat moment moet het adres van de volgende instructie op de pc naar de stapel worden gestuurd zodra de huidige instructie is voltooid. Vervolgens moet een subroutine worden aangeroepen die de software-instructie afhandelt. Deze interrupt-subroutine moet de inhoud van het A-, X- en Y-register naar de stapel duwen. Nadat de kern van de subroutine is uitgevoerd, moet de inhoud van de A-, X- en Y-registers door de voltooiing van de subroutine van de stapel naar hun registers worden teruggetrokken. De laatste instructie in de routine is RTI. De pc-inhoud wordt dankzij RTI ook automatisch teruggetrokken van de stapel naar de pc.

7) Maak een tabel die een normale subroutine vergelijkt en contrasteert met een interrupt-serviceroutine.

Oplossing:

8) Leg kort de belangrijkste adresseringsmodi van de 65C02 µP uit, gegeven de instructievoorbeelden in de assembleertaal.

Oplossing:

Elke instructie voor de 6502 is één byte, gevolgd door nul of meer operanden.

Onmiddellijke adresseringsmodus
Bij de directe adresseringsmodus staat na de operand de waarde en geen geheugenadres. De waarde moet worden voorafgegaan door #. Als de waarde hexadecimaal is, moet “#” worden gevolgd door “$”. De directe adresseringsinstructies voor de 65C02 zijn: ADC, AND, BIT, CMP, CPX, CPY, EOR, LDA, LDX, LDY, ORA, SBC. De lezer dient de documentatie voor 65C02 µP te raadplegen om te weten hoe hij de hier vermelde instructies moet gebruiken die niet in dit hoofdstuk zijn uitgelegd. Een voorbeeldinstructie is:

LDA#$77

Absolute adresseringsmodus
Bij de absolute adresseringsmodus is er één operand. Deze operand is het adres van de waarde in het geheugen (meestal in hexadecimaal of een label). Er zijn 64K10 = 65,53610 geheugenadressen voor de 6502 µP. Normaal gesproken bevindt de waarde van één byte zich op een van deze adressen. De absolute adresseringsinstructies voor de 65C02 zijn: 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. De lezer dient de documentatie voor 65C02 µP te raadplegen om te weten hoe hij de hier vermelde instructies moet gebruiken, evenals voor de rest van de adresseringsmodi die niet in dit hoofdstuk zijn uitgelegd. Een voorbeeldinstructie is:

ZE ZIJN $ 1234

Impliciete adresseringsmodus
Bij de impliciete adresseringsmodus is er geen operand. Elk betrokken µP-register wordt door de instructie geïmpliceerd. De impliciete adresseringsinstructies voor de 65C02 zijn: BRK, CLC, CLD, CLI, CLV, DEX, DEY, INX, INY, NOP, PHA, PHP, PHX, PHY, PLA, PLP, PLX, PLY, RTI, RTS, SEC , SED, SEI, BELASTING, TAY, TSX, TXA, TXS, TYA. Een voorbeeldinstructie is:

DEX: Verlaag het X-register met één eenheid.

Relatieve adresseringsmodus
De relatieve adresseringsmodus heeft alleen betrekking op aftakkingsinstructies. Bij de relatieve adresseringsmodus is er slechts één operand. Het is een waarde van -12810 tot +12710. Deze waarde wordt een offset genoemd. Op basis van het teken wordt deze waarde opgeteld bij of afgetrokken van de volgende instructie van de Programmateller tot het resultaat in het adres van de beoogde volgende instructie. De relatieve adresmodusinstructies zijn: BCC, BCS, BEQ, BMI, BNE, BPL, BRA, BVC, BVS. De instructievoorbeelden zijn:

BNE $7F : (tak als Z = 0 in statusregister, P)

die 127 optelt bij de huidige programmateller (uit te voeren adres) en de instructie op dat adres begint uit te voeren. Op dezelfde manier:

BEQ $F9 : (tak als Z = : in statusregister, P)

die een -7 toevoegt aan de huidige programmateller en de uitvoering start op het nieuwe programmatelleradres. De operand is een twee-complementgetal.

Absolute indexadressering
Bij absolute indexadressering wordt de inhoud van het X- of Y-register toegevoegd aan het gegeven absolute adres (ergens tussen $0000 en $FFFF, d.w.z. van 010 tot 6553610) om het echte adres te verkrijgen. Dit gegeven absolute adres wordt het basisadres genoemd. Als het X-register wordt gebruikt, is de montage-instructie ongeveer als volgt:

LDA $C453,X

Als het Y-register wordt gebruikt, zou het er ongeveer zo uitzien:

LDA $C453,J

De waarde voor het X- of Y-register wordt de tel- of indexwaarde genoemd en kan ergens tussen $00 (010) en $FF (25010) liggen. Het wordt niet de offset genoemd.

De absolute indexadresseringsinstructies zijn: ADC, AND, ASL (alleen X), BIT (met accumulator en geheugen, alleen met X), CMP, DEC (alleen geheugen en X), EOR, INC (alleen geheugen en X), LDA , LDX, LDY, LSR (alleen X), ORA, ROL (alleen X), ROR (alleen X), SBC, STA, STZ (alleen X).

Absoluut indirecte adressering
Dit wordt alleen gebruikt bij de spronginstructie. Hiermee heeft het gegeven absolute adres een pointeradres. Het pointeradres bestaat uit twee bytes. De aanwijzer van twee bytes verwijst naar (is het adres van) de bestemmingsbytewaarde in het geheugen. De assembleertaalinstructie is dus als volgt:

JMP ($3456)

Met de haakjes en $13 in $3456 adres terwijl $EB in $3457 (= $3456 + 1) adres staat, is het bestemmingsadres $13EB en is $13EB de aanwijzer. Absoluut $3456 staat tussen haakjes in de instructie.

9) a) Schrijf een 6502-machinetaalprogramma met de tekst 'Ik hou van jou!' reeks ASCII-codes in het geheugen, beginnend bij het adres $0300 met de lengte van de reeks. Het programma zou moeten starten op het adres $0200. Haal elk karakter uit de accu-mulator, ervan uitgaande dat ze daar één voor één door een of andere subroutine naartoe worden gestuurd. Monteer het programma ook met de hand. (Als je de ASCII-codes voor “I love you!” wilt weten, zijn ze hier: 'I':4916, spatie: 2016, 'l': 6C16, 'o':6F16, 'v':7616, ' e':65, 'y':7916, 'u':7516 en '!':2116. Opmerking: elke code beslaat 1 byte).

b) Schrijf een 6502-machinetaalprogramma met de tekst 'Ik hou van jou!' reeks ASCII-codes in het geheugen, beginnend bij het adres $0300 zonder de lengte van de reeks, maar eindigend op 0016. Het programma zou moeten beginnen bij het adres $0200. Haal elk personage uit de accumulator, ervan uitgaande dat ze daar één voor één door een of andere subroutine naartoe worden gestuurd. Monteer het programma ook met de hand.

Oplossing:

a) Strategie: Er zijn 12 bytes voor de string: 1 byte voor de stringlengte en 11 bytes voor de letterlijke string. Er moeten dus 12 iteraties (loopings) zijn, tellend vanaf 0. Dat wil zeggen: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11. Dit zijn 12 getallen.

Het gehele getal 0 wordt in het X-register geplaatst en het getal 1110 = 1210 – 110 = B16 = $0B wordt op een adreslocatie in het geheugen geplaatst, bijvoorbeeld adres $0250. Voor elke iteratie wordt de waarde in het X-register verhoogd en wordt het resultaat vergeleken met $0B op de adreslocatie $0250. Net nadat de waarde in X gelijk is aan de waarde van $0B, stopt de iteratie. Op dit punt bezetten de lengte (aantal bytes) van de string en de letterlijke string de adreslocaties van $0300 tot $030 miljard (inclusief). Om de geheugenadressen vanaf $0300 te verhogen, wordt het Y-register gebruikt. De code is:

LDA#$0 miljard
ZE ZIJN $ 0250
LDX#$00
LDY#$00
STA $ 0300; de lengte van 11 wordt door een subroutine in A geplaatst en gaat naar $0300
lus INX
DAAR
CPY $ 0250
BEQ-lus

b) Strategie: Er zijn 12 bytes voor de string: 1 byte voor de $00 Null-terminator en 11 bytes voor de letterlijke string. Er moeten dus 12 iteraties (loopings) zijn, tellend vanaf 0. Dat wil zeggen: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11. Dit zijn 12 getallen.

Het gehele getal 0 wordt in het X-register geplaatst en het getal 1110 = 1210 – 110 = B16 = $0B wordt op een adreslocatie in het geheugen geplaatst, bijvoorbeeld adres $0250. Voor elke iteratie wordt de waarde in het X-register verhoogd en wordt het resultaat vergeleken met $0B op de adreslocatie $0250. Net nadat de waarde in X gelijk is aan de waarde van $0B, stopt de iteratie. Op dit punt beslaat het aantal bytes van de letterlijke tekenreeks plus het Null-teken de adreslocaties van $0300 tot $030 miljard (inclusief). Om de geheugenadressen vanaf $0300 te verhogen, wordt het Y-register gebruikt. De code is:

LDA#$0 miljard
ZE ZIJN $ 0250
LDX#$00
LDY#$00
STA $ 0300; “I” wordt door een subroutine in A geplaatst en gaat naar $0300
lus INX
DAAR
CPY $ 0250
BEQ-lus