Lösungen für die Probleme von Kapitel 4 der vollständigen Online-Datenbank für Informatik und des Internet-Karrierekurses von Anfang an

Losungen Fur Die Probleme Von Kapitel 4 Der Vollstandigen Online Datenbank Fur Informatik Und Des Internet Karrierekurses Von Anfang An



Probleme und ihre Lösungen

1) Schreiben Sie ein Assemblerprogramm, das bei $0200 für den 6502 µP beginnt und die vorzeichenlosen Zahlen von 2A94 hinzufügt H (addieren) zu 2ABF H (augend). Lassen Sie die Ein- und Ausgänge im Speicher liegen. Erstellen Sie außerdem das zusammengestellte Programmdokument von Hand.







Lösung:



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



Zusammengestelltes Programm:





2) Schreiben Sie ein Assemblerprogramm, das bei 0200 $ für 6502 µP beginnt und die vorzeichenlosen Zahlen 1569 subtrahiert H (Subtrahend) von 2ABF H (Minuend). Lassen Sie die Ein- und Ausgaben im Speicher liegen. Erstellen Sie außerdem das zusammengestellte Programmdokument handschriftlich.



Lösung:

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

Zusammengestelltes Programm:

3) Schreiben Sie ein Assemblerprogramm für den 6502 µP, das mithilfe einer Schleife von $00 bis $09 hochzählt. Das Programm sollte bei 0200 $ beginnen. Erstellen Sie außerdem das zusammengestellte Programmdokument von Hand.

Lösung:

LDA #$09
STA $0220 ; zum Vergleich von X und $09
LDX #$00
Schleife INX
CPX 0220 $
BNE-Schleife

Zusammengestelltes Programm:

4) Schreiben Sie ein Assemblerprogramm, das bei 0200 $ für den 6502 µP beginnt. Das Programm verfügt über zwei Unterprogramme. Das erste Unterprogramm fügt die vorzeichenlosen Zahlen 0203 hinzu H (augend) und 0102 H (Summand). Das zweite Unterprogramm addiert die Summe aus dem ersten Unterprogramm, also 0305 H bis 0006 H (augend). Das Endergebnis wird im Speicher abgelegt. Rufen Sie das erste Unterprogramm FSTSUB und das zweite Unterprogramm SECSUB auf. Lassen Sie die Ein- und Ausgänge im Speicher liegen. Erstellen Sie außerdem das zusammengestellte Programmdokument für das gesamte Programm von Hand.

Lösung:

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

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

JSR FSTSUB

Zusammengestelltes Programm:

5) Vorausgesetzt, dass ein ¯IRQ Der Handler addiert $02 zu $01 am Akkumulator als Kernverarbeitungs-Während ¯NMI ausgegeben wird, und das Kernhandling für ¯NMI Addiert $05 zu $04 im Akkumulator und schreibt eine Assemblersprache für beide Handler einschließlich ihrer Aufrufe. Der Aufruf an die ¯IRQ Der Handler sollte sich an der Adresse $0200 befinden. Der ¯IRQ Der Handler sollte bei der Adresse $0300 beginnen. Der ¯NMI Der Handler sollte bei der Adresse $0400 beginnen. Das Ergebnis der ¯IRQ Der Handler sollte an der Adresse $0500 abgelegt werden und das Ergebnis des ¯NMI Der Handler sollte auf die Adresse $0501 gesetzt werden.

Lösung:

NMISR PHA ; Die NMI-Routine beginnt hier bei der Adresse $0400
PHX
PHY
;
LDA #$04
ADC #$05
STA $0501
;
PLY
PLX
PLA
RTI

ISR PHA; Diese Anweisung befindet sich an der Adresse $0300
PHX
PHY
;
LDA #$01
ADC #$02
; JMP NMISR: auskommentiert, da es nicht Teil der Routine ist
STA $0500 ; wird zum Stapeln gehen
;
PLY
PLX
PLA
RTI
;
JMP ISR ; Diese Anweisung befindet sich an der Adresse $0200

6) Erklären Sie kurz, wie der BRK-Befehl verwendet wird, um den Software-Interrupt in einem 65C02-Computer zu erzeugen.

Lösung:

Der Hauptweg für einen Software-Interrupt für den 65C02 µP ist die Verwendung des impliziten Adressbefehls BRK. Gehen Sie davon aus, dass das Hauptprogramm ausgeführt wird und auf die BRK-Anweisung stößt. Von diesem Punkt an sollte die Adresse des nächsten Befehls im PC an den Stapel gesendet werden, wenn der aktuelle Befehl abgeschlossen ist. Als nächstes sollte eine Unterroutine zur Verarbeitung der Softwareanweisung aufgerufen werden. Diese Interrupt-Subroutine sollte die Inhalte der A-, X- und Y-Register auf den Stapel verschieben. Nachdem der Kern des Unterprogramms ausgeführt wurde, sollten die Inhalte der A-, X- und Y-Register vom abschließenden Unterprogramm vom Stapel in ihre Register zurückgezogen werden. Die letzte Anweisung in der Routine ist RTI. Der PC-Inhalt wird aufgrund von RTI auch automatisch vom Stapel auf den PC zurückgezogen.

7) Erstellen Sie eine Tabelle, die eine normale Unterroutine mit einer Interrupt-Service-Routine vergleicht und gegenüberstellt.

Lösung:

8) Erklären Sie kurz die wichtigsten Adressierungsmodi des 65C02 µP anhand der Assembler-Anweisungsbeispiele.

Lösung:

Jede Anweisung für den 6502 besteht aus einem Byte, gefolgt von null oder mehr Operanden.

Sofortiger Adressierungsmodus
Beim unmittelbaren Adressierungsmodus steht hinter dem Operanden der Wert und keine Speicheradresse. Dem Wert muss ein # vorangestellt werden. Wenn der Wert hexadezimal ist, muss „#“ von „$“ gefolgt werden. Die unmittelbaren Adressierungsanweisungen für den 65C02 sind: ADC, AND, BIT, CMP, CPX, CPY, EOR, LDA, LDX, LDY, ORA, SBC. Der Leser sollte die Dokumentation für 65C02 µP konsultieren, um zu erfahren, wie er die hier aufgeführten Anweisungen verwendet, die in diesem Kapitel nicht erläutert wurden. Eine Beispielanweisung ist:

LDA #77

Absoluter Adressierungsmodus
Beim absoluten Adressierungsmodus gibt es einen Operanden. Dieser Operand ist die Adresse des Werts im Speicher (normalerweise hexadezimal oder als Label). Für den 6502 µP gibt es 64K10 = 65,53610 Speicheradressen. Normalerweise befindet sich der Ein-Byte-Wert an einer dieser Adressen. Die absoluten Adressierungsanweisungen für den 65C02 sind: 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. Der Leser sollte die Dokumentation für 65C02 µP konsultieren, um zu erfahren, wie die hier aufgeführten Anweisungen sowie für die übrigen Adressierungsmodi verwendet werden, die in diesem Kapitel nicht erläutert wurden. Eine Beispielanweisung ist:

SIE SIND 1234 $

Impliziter Adressierungsmodus
Beim impliziten Adressierungsmodus gibt es keinen Operanden. Alle beteiligten µP-Register werden durch den Befehl impliziert. Die impliziten Adressierungsanweisungen für den 65C02 sind: 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. Eine Beispielanweisung ist:

DEX: Dekrementieren Sie das X-Register um eine Einheit.

Relativer Adressierungsmodus
Der relative Adressierungsmodus befasst sich nur mit Verzweigungsanweisungen. Beim relativen Adressierungsmodus gibt es nur einen Operanden. Es handelt sich um einen Wert zwischen -12810 und +12710. Dieser Wert wird als Offset bezeichnet. Basierend auf dem Vorzeichen wird dieser Wert vom nächsten Befehl des Programmzählers zum Ergebnis in der Adresse des vorgesehenen nächsten Befehls addiert oder subtrahiert. Die relativen Adressmodusanweisungen sind: BCC, BCS, BEQ, BMI, BNE, BPL, BRA, BVC, BVS. Die Anleitungsbeispiele sind:

BNE $7F : (Verzweigung, wenn Z = 0 im Statusregister, P)

Dadurch wird 127 zum aktuellen Programmzähler (zur auszuführenden Adresse) addiert und mit der Ausführung des Befehls an dieser Adresse begonnen. Ähnlich:

BEQ $F9 : (Verzweigung wenn Z = : im Statusregister, P)

Dadurch wird ein -7 zum aktuellen Programmzähler hinzugefügt und die Ausführung an der neuen Programmzähleradresse gestartet. Der Operand ist eine Zweierkomplementzahl.

Absolute Indexadressierung
Bei der absoluten Indexadressierung wird der Inhalt des X- oder Y-Registers zur gegebenen absoluten Adresse (irgendwo zwischen $0000 und $FFFF, also zwischen 010 und 6553610) addiert, um die tatsächliche Adresse zu erhalten. Diese gegebene absolute Adresse wird Basisadresse genannt. Wenn das X-Register verwendet wird, sieht die Assembleranweisung etwa so aus:

LDA $C453,X

Wenn das Y-Register verwendet wird, würde es ungefähr so ​​aussehen:

LDA $C453,Y

Der Wert für das X- oder Y-Register wird als Zähl- oder Indexwert bezeichnet und kann zwischen $00 (010) und $FF (25010) liegen. Es wird nicht als Offset bezeichnet.

Die absoluten Indexadressierungsanweisungen sind: ADC, AND, ASL (nur X), BIT (mit Akkumulator und Speicher, nur mit X), CMP, DEC (nur Speicher und X), EOR, INC (nur Speicher und X), LDA , LDX, LDY, LSR (nur X), ORA, ROL (nur X), ROR (nur X), SBC, STA, STZ (nur X).

Absolute indirekte Adressierung
Dies wird nur mit der Sprunganweisung verwendet. Damit hat die angegebene absolute Adresse eine Zeigeradresse. Die Zeigeradresse besteht aus zwei Bytes. Der Zwei-Byte-Zeiger zeigt auf den Zielbytewert im Speicher (ist dessen Adresse). Die Assembler-Anweisung lautet also wie folgt:

JMP (3456 $)

Mit den Klammern und $13 in der Adresse $3456, während $EB in der Adresse $3457 (= $3456 + 1) steht, ist die Zieladresse $13EB und $13EB ist der Zeiger. Der absolute Betrag von 3456 $ steht in der Anleitung in Klammern.

9) a) Schreiben Sie ein 6502-Maschinensprachenprogramm, um das „Ich liebe dich!“ zu setzen. Zeichenfolge von ASCII-Codes im Speicher, beginnend bei der Adresse $0300 mit der Länge der Zeichenfolge. Das Programm sollte an der Adresse $0200 starten. Holen Sie sich jedes Zeichen aus dem Akku, vorausgesetzt, dass sie einzeln von einer Unterroutine dorthin gesendet werden. Stellen Sie das Programm außerdem manuell zusammen. (Wenn Sie die ASCII-Codes für „Ich liebe dich!“ kennen müssen, finden Sie sie hier: „I“:4916, Leerzeichen: 2016, „l“: 6C16, „o“:6F16, „v“:7616, „ e':65, 'y':7916, 'u':7516 und '!':2116. Hinweis: Jeder Code belegt 1 Byte.

b) Schreiben Sie ein 6502-Maschinensprachenprogramm, um das „Ich liebe dich!“ zu formulieren. Zeichenfolge von ASCII-Codes im Speicher, beginnend bei der Adresse $0300 ohne die Länge der Zeichenfolge, aber endend bei 0016. Das Programm sollte bei der Adresse $0200 beginnen. Erhalten Sie jedes Zeichen aus dem Akkumulator, vorausgesetzt, dass sie einzeln von einer Unterroutine dorthin gesendet werden. Stellen Sie das Programm außerdem von Hand zusammen.

Lösung:

a) Strategie: Es gibt 12 Bytes für den String: 1 Byte für die String-Länge und 11 Bytes für das String-Literal. Es muss also 12 Iterationen (Schleifen) geben, beginnend bei 0. Das heißt: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11. Das sind 12 Zahlen.

Die Ganzzahl 0 wird in das X-Register eingefügt und die Zahl 1110 = 1210 – 110 = B16 = $0B wird an einer Adressstelle im Speicher abgelegt, beispielsweise an der Adresse $0250. Bei jeder Iteration wird der Wert im X-Register erhöht und das Ergebnis mit $0B an der Adressposition $0250 verglichen. Kurz nachdem der Wert in X dem Wert von $0B entspricht, stoppt die Iteration. Zu diesem Zeitpunkt belegen die Länge (Anzahl der Bytes) der Zeichenfolge und das Zeichenfolgenliteral die Adresspositionen $0300 bis $030B (einschließlich). Um die Speicheradressen ab $0300 zu erhöhen, wird das Y-Register verwendet. Der Code lautet:

LDA #$0B
SIE SIND 0250 $
LDX #$00
LDY#$00
STA $0300 ; Die Länge von 11 wird von einer Unterroutine in A eingegeben und geht an $0300
Schleife INX
DORT
CPY 0250 $
BEQ-Schleife

b) Strategie: Es gibt 12 Bytes für den String: 1 Byte für den $00-Null-Terminator und 11 Bytes für das String-Literal. Es muss also 12 Iterationen (Schleifen) geben, beginnend bei 0. Das heißt: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11. Das sind 12 Zahlen.

Die Ganzzahl 0 wird in das X-Register eingefügt und die Zahl 1110 = 1210 – 110 = B16 = $0B wird an einer Adressstelle im Speicher abgelegt, beispielsweise an der Adresse $0250. Bei jeder Iteration wird der Wert im X-Register erhöht und das Ergebnis mit $0B an der Adressposition $0250 verglichen. Kurz nachdem der Wert in X dem Wert von $0B entspricht, stoppt die Iteration. Zu diesem Zeitpunkt belegen die Anzahl der Bytes des Zeichenfolgenliterals plus das Nullzeichen die Adresspositionen $0300 bis $030B (einschließlich). Um die Speicheradressen ab $0300 zu erhöhen, wird das Y-Register verwendet. Der Code lautet:

LDA #$0B
SIE SIND 0250 $
LDX #$00
LDY#$00
STA $0300 ; „I“ wird von einer Unterroutine in A gesetzt und geht auf $0300
Schleife INX
DORT
CPY 0250 $
BEQ-Schleife