Λύσεις στα προβλήματα του Κεφαλαίου 4 της Πλήρους Διαδικτυακής Βάσης Δεδομένων Επιστήμης Υπολογιστών και του μαθήματος καριέρας στο Διαδίκτυο από την αρχή

Lyseis Sta Problemata Tou Kephalaiou 4 Tes Plerous Diadiktyakes Bases Dedomenon Epistemes Ypologiston Kai Tou Mathematos Karieras Sto Diadiktyo Apo Ten Arche



Προβλήματα και οι λύσεις τους

1) Γράψτε ένα πρόγραμμα γλώσσας συναρμολόγησης που ξεκινά από 0200 $ για τα 6502 μP και προσθέτει τους ανυπόγραφους αριθμούς του 2A94 H (προσθήκη) στο 2ABF H (augend). Αφήστε τις εισόδους και τις εξόδους να βρίσκονται στη μνήμη. Επίσης, δημιουργήστε το συναρμολογημένο έγγραφο προγράμματος με το χέρι.







Λύση:



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



Συγκεντρωμένο πρόγραμμα:





2) Γράψτε ένα πρόγραμμα γλώσσας συναρμολόγησης που ξεκινά από 0200 $, για τα 6502 μP, και αφαιρεί τους ανυπόγραφους αριθμούς, 1569 H (υπόστρωμα) από 2ABF H (minuend). Αφήστε τις εισόδους και τις εξόδους να βρίσκονται στη μνήμη. Δημιουργήστε επίσης το συναρμολογημένο έγγραφο προγράμματος, με το χέρι.



Λύση:

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

Συγκεντρωμένο πρόγραμμα:

3) Γράψτε ένα πρόγραμμα γλώσσας συναρμολόγησης για τα 6502 µP που μετράει από $00 έως $09 χρησιμοποιώντας έναν βρόχο. Το πρόγραμμα θα πρέπει να ξεκινά από $0200. Επίσης, δημιουργήστε το συναρμολογημένο έγγραφο προγράμματος με το χέρι.

Λύση:

LDA #09$
STA $0220 ; για σύγκριση X και 09 $
LDX #$00
βρόχος INX
CPX $0220
Βρόχος BNE

Συγκεντρωμένο πρόγραμμα:

4) Γράψτε ένα πρόγραμμα γλώσσας assembly που ξεκινά από 0200 $ για τα 6502 μP. Το πρόγραμμα έχει δύο υπορουτίνες. Η πρώτη υπορουτίνα προσθέτει τους ανυπόγραφους αριθμούς του 0203 H (augend) και 0102 H (προσθήκη). Η δεύτερη υπορουτίνα προσθέτει το άθροισμα από την πρώτη υπορουτίνα που είναι 0305 H στο 0006 H (augend). Το τελικό αποτέλεσμα αποθηκεύεται στη μνήμη. Καλέστε την πρώτη υπορουτίνα που είναι FSTSUB και τη δεύτερη υπορουτίνα που είναι SECSUB. Αφήστε τις εισόδους και τις εξόδους να βρίσκονται στη μνήμη. Επίσης, δημιουργήστε το συναρμολογημένο έγγραφο προγράμματος για ολόκληρο το πρόγραμμα με το χέρι.

Λύση:

SECSUB CLC
LDA $021A
ADC $0234
STA $0236
LDA $021 δις
ADC $0235
STA $0237
RTS

FSTSUB CLC
LDA 0216 $
ADC $0218
STA $021A
LDA 0217 $
ADC $0219
STA $021 δις
RTS

JSR FSTSUB

Συγκεντρωμένο πρόγραμμα:

5) Δεδομένου ότι ένα ¯IRQ Ο χειριστής προσθέτει $02 έως $01 στον συσσωρευτή ως χειρισμό πυρήνα ενώ ¯NMI εκδίδεται, και ο πυρήνας χειρισμός για ¯NMI προσθέτει $05 έως $04 στον συσσωρευτή, γράψτε μια γλώσσα συναρμολόγησης και για τους δύο χειριστές, συμπεριλαμβανομένων των κλήσεών τους. Η κλήση προς το ¯IRQ ο χειριστής θα πρέπει να βρίσκεται στη διεύθυνση των $0200. ο ¯IRQ ο χειριστής θα πρέπει να ξεκινά από τη διεύθυνση των $0300. ο ¯NMI ο χειριστής θα πρέπει να ξεκινά από τη διεύθυνση των $0400. Το αποτέλεσμα του ¯IRQ ο χειριστής θα πρέπει να τοποθετηθεί στη διεύθυνση των $0500, και το αποτέλεσμα του ¯NMI Ο χειριστής θα πρέπει να τοποθετηθεί στη διεύθυνση $0501.

Λύση:

NMISR PHA ; Η ρουτίνα NMI ξεκινά εδώ στη διεύθυνση $0400
PHX
PHY
;
LDA #04$
ADC #$05
STA $0501
;
ΦΥΛΛΟ
PLX
PLA
RTI

ISR PHA ; αυτή η οδηγία βρίσκεται στη διεύθυνση $0300
PHX
PHY
;
LDA #01$
ADC #$02
; JMP NMISR: σχολιάστηκε επειδή δεν αποτελεί μέρος της ρουτίνας
STA $0500 ; θα πάει στη στοίβα
;
ΦΥΛΛΟ
PLX
PLA
RTI
;
JMP ISR ; αυτή η οδηγία βρίσκεται στη διεύθυνση $0200

6) Εξηγήστε συνοπτικά πώς χρησιμοποιείται η εντολή BRK για την παραγωγή της διακοπής λογισμικού σε έναν υπολογιστή 65C02.

Λύση:

Ο κύριος τρόπος για να έχετε μια διακοπή λογισμικού για το 65C02 μP είναι με τη χρήση της εντολής σιωπηρής διεύθυνσης BRK. Ας υποθέσουμε ότι το κύριο πρόγραμμα εκτελείται και συναντά την εντολή BRK. Από εκείνο το σημείο, η διεύθυνση της επόμενης εντολής στον υπολογιστή θα πρέπει να σταλεί στη στοίβα καθώς ολοκληρώνεται η τρέχουσα εντολή. Στη συνέχεια θα πρέπει να καλέσετε μια υπορουτίνα για τη διαχείριση της εντολής λογισμικού. Αυτή η υπορουτίνα διακοπής θα πρέπει να ωθεί τα περιεχόμενα των καταχωρητών A, X και Y στη στοίβα. Αφού εκτελεστεί ο πυρήνας της υπορουτίνας, τα περιεχόμενα των καταχωρητών Α, Χ και Υ θα πρέπει να ανασυρθούν από τη στοίβα στους καταχωρητές τους από την υπορουτίνα ολοκλήρωσης. Η τελευταία δήλωση στη ρουτίνα είναι RTI. Το περιεχόμενο του υπολογιστή αποσύρεται επίσης από τη στοίβα στον υπολογιστή, αυτόματα, λόγω RTI.

7) Δημιουργήστε έναν πίνακα που συγκρίνει και αντιπαραβάλλει μια κανονική υπορουτίνα με μια ρουτίνα υπηρεσίας διακοπής.

Λύση:

8) Εξηγήστε συνοπτικά τους κύριους τρόπους διευθυνσιοδότησης του 65C02 µP, δεδοµένων των παραδειγµάτων οδηγιών της γλώσσας συναρµολόγησης.

Λύση:

Κάθε εντολή για το 6502 είναι ένα byte, ακολουθούμενη από μηδέν ή περισσότερους τελεστές.

Λειτουργία άμεσης διεύθυνσης
Με τη λειτουργία άμεσης διεύθυνσης, μετά τον τελεστή, είναι η τιμή και όχι μια διεύθυνση μνήμης. Η τιμή πρέπει να προηγείται από το #. Εάν η τιμή είναι δεκαεξαδική, τότε το '#' πρέπει να ακολουθείται από το '$'. Οι άμεσες οδηγίες διευθυνσιοδότησης για το 65C02 είναι: ADC, AND, BIT, CMP, CPX, CPY, EOR, LDA, LDX, LDY, ORA, SBC. Ο αναγνώστης θα πρέπει να συμβουλευτεί την τεκμηρίωση για το 65C02 μP για να μάθει πώς να χρησιμοποιεί τις οδηγίες που παρατίθενται εδώ και δεν έχουν επεξηγηθεί σε αυτό το κεφάλαιο. Ένα παράδειγμα εντολής είναι:

LDA #77$

Απόλυτη λειτουργία διεύθυνσης
Με τον απόλυτο τρόπο διευθυνσιοδότησης, υπάρχει ένας τελεστής. Αυτός ο τελεστής είναι η διεύθυνση της τιμής στη μνήμη (συνήθως σε δεκαεξαδικό ή ετικέτα). Υπάρχουν 64K10 = 65.53610 διευθύνσεις μνήμης για τα 6502 µP. Συνήθως, η τιμή ενός byte βρίσκεται σε μία από αυτές τις διευθύνσεις. Οι απόλυτες οδηγίες διεύθυνσης για το 65C02 είναι: 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. Ο αναγνώστης θα πρέπει να συμβουλευτεί την τεκμηρίωση για το 65C02 µP για να γνωρίζει πώς να χρησιμοποιεί τις οδηγίες που παρατίθενται εδώ, καθώς και για τους υπόλοιπους τρόπους διευθυνσιοδότησης που δεν έχουν επεξηγηθεί σε αυτό το κεφάλαιο. Ένα παράδειγμα εντολής είναι:

ΕΙΝΑΙ 1234 $

Λειτουργία σιωπηρής διεύθυνσης
Με την υπονοούμενη λειτουργία διευθυνσιοδότησης, δεν υπάρχει τελεστής. Οποιοσδήποτε καταχωρητής μP εμπλέκεται υπονοείται από την οδηγία. Οι υπονοούμενες οδηγίες διεύθυνσης για το 65C02 είναι: 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. Ένα παράδειγμα εντολής είναι:

DEX: Μείωση του καταχωρητή X κατά μία μονάδα.

Σχετική λειτουργία διεύθυνσης
Η σχετική λειτουργία διευθυνσιοδότησης ασχολείται μόνο με οδηγίες διακλάδωσης. Με τη σχετική λειτουργία διευθυνσιοδότησης, υπάρχει μόνο ένας τελεστής. Είναι μια τιμή από -12810 έως +12710. Αυτή η τιμή ονομάζεται μετατόπιση. Με βάση το πρόσημο, αυτή η τιμή προστίθεται ή αφαιρείται από την επόμενη εντολή του μετρητή προγράμματος στο αποτέλεσμα στη διεύθυνση της προβλεπόμενης επόμενης εντολής. Οι σχετικές οδηγίες λειτουργίας διεύθυνσης είναι: BCC, BCS, BEQ, BMI, BNE, BPL, BRA, BVC, BVS. Τα παραδείγματα οδηγιών είναι:

BNE $7F : (κλάδος εάν Z = 0 στο μητρώο κατάστασης, P)

που προσθέτει 127 στον τρέχοντα μετρητή προγράμματος (διεύθυνση προς εκτέλεση) και ξεκινά την εκτέλεση της εντολής σε αυτή τη διεύθυνση. Ομοίως:

BEQ $F9 : (κλάδος εάν Z = : σε μητρώο κατάστασης, P)

που προσθέτει ένα -7 στον τρέχοντα μετρητή προγράμματος και ξεκινά την εκτέλεση στη διεύθυνση του νέου μετρητή προγράμματος. Ο τελεστής είναι ένας αριθμός συμπληρώματος δύο.

Απόλυτη Διεύθυνση Ευρετηρίου
Με τη διευθυνσιοδότηση απόλυτου ευρετηρίου, το περιεχόμενο του καταχωρητή X ή Y προστίθεται στη δεδομένη απόλυτη διεύθυνση (οπουδήποτε από $0000 έως $FFFF, δηλ. από 010 έως 6553610) για να έχει την πραγματική διεύθυνση. Αυτή η δεδομένη απόλυτη διεύθυνση ονομάζεται διεύθυνση βάσης. Εάν χρησιμοποιείται ο καταχωρητής X, η οδηγία συναρμολόγησης είναι κάπως έτσι:

LDA $C453,X

Εάν χρησιμοποιείται ο καταχωρητής Y, θα είναι κάπως έτσι:

LDA $C453,Y

Η τιμή για τον καταχωρητή X ή Y ονομάζεται τιμή μέτρησης ή δείκτη και μπορεί να είναι από $00 (010) έως $FF (25010). Δεν λέγεται μετατόπιση.

Οι οδηγίες διευθυνσιοδότησης απόλυτου ευρετηρίου είναι: ADC, AND, ASL (μόνο X), BIT (με συσσωρευτή και μνήμη, μόνο με X), CMP, DEC (μόνο μνήμη και X), EOR, INC (μόνο μνήμη και X), LDA , LDX, LDY, LSR (μόνο X), ORA, ROL (μόνο X), ROR (μόνο X), SBC, STA, STZ (μόνο X).

Απόλυτη Έμμεση Διεύθυνση
Αυτό χρησιμοποιείται μόνο με την εντολή άλματος. Με αυτό, η δεδομένη απόλυτη διεύθυνση έχει μια διεύθυνση δείκτη. Η διεύθυνση του δείκτη αποτελείται από δύο byte. Ο δείκτης των δύο byte δείχνει (είναι η διεύθυνση) της τιμής του byte προορισμού στη μνήμη. Έτσι, η οδηγία της γλώσσας assembly είναι η εξής:

JMP (3456 $)

Με τις παρενθέσεις και τη διεύθυνση $13 στη διεύθυνση $3456 ενώ η $EB είναι στη διεύθυνση $3457 (= $3456 + 1), η διεύθυνση προορισμού είναι $13EB και $13EB είναι ο δείκτης. Το απόλυτο $3456 βρίσκεται στις παρενθέσεις στην οδηγία.

9) α) Γράψτε ένα πρόγραμμα γλώσσας μηχανής 6502 για να βάλετε το 'Σ' αγαπώ!' συμβολοσειρά κωδικών ASCII στη μνήμη, ξεκινώντας από τη διεύθυνση $0300 με το μήκος της συμβολοσειράς. Το πρόγραμμα θα πρέπει να ξεκινά από τη διεύθυνση $0200. Αποκτήστε κάθε χαρακτήρα από τον συσσωρευτή, υποθέτοντας ότι αποστέλλονται εκεί ένας προς έναν από κάποια υπορουτίνα. Επίσης, συναρμολογήστε το πρόγραμμα με το χέρι. (Εάν χρειάζεται να γνωρίζετε τους κωδικούς ASCII για το 'I love you!', ορίστε: 'I':4916, space : 2016, 'l': 6C16, 'o':6F16, 'v':7616, ' e':65, 'y':7916, 'u':7516 και '!':2116. Σημείωση: κάθε κωδικός καταλαμβάνει 1 byte).

β) Γράψτε ένα πρόγραμμα γλώσσας μηχανής 6502 για να βάλετε το 'Σ'αγαπώ!' συμβολοσειρά κωδικών ASCII στη μνήμη, ξεκινώντας από τη διεύθυνση $0300 χωρίς το μήκος της συμβολοσειράς αλλά τελειώνουν στο 0016. Το πρόγραμμα πρέπει να ξεκινά από τη διεύθυνση $0200. Αποκτήστε κάθε χαρακτήρα από τον συσσωρευτή, υποθέτοντας ότι αποστέλλονται εκεί ένας προς έναν από κάποια υπορουτίνα. Επίσης, συναρμολογήστε το πρόγραμμα με το χέρι.

Λύση:

α) Στρατηγική: Υπάρχουν 12 byte για τη συμβολοσειρά: 1 byte για το μήκος συμβολοσειράς και 11 byte για την κυριολεκτική συμβολοσειρά. Άρα, πρέπει να υπάρχουν 12 επαναλήψεις (loopings) μετρώντας από το 0. Δηλαδή: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11. Αυτοί είναι 12 αριθμοί.

Ο ακέραιος 0 τοποθετείται στον καταχωρητή X και ο αριθμός 1110 = 1210 – 110 = B16 = $0B τοποθετείται σε μια θέση διεύθυνσης στη μνήμη, ας πούμε διεύθυνση $0250. Για κάθε επανάληψη, η τιμή στον καταχωρητή X αυξάνεται και το αποτέλεσμα συγκρίνεται με $0B στη θέση διεύθυνσης $0250. Μόλις η τιμή στο X ισούται με την τιμή των $0B, η επανάληψη σταματά. Σε αυτό το σημείο, το μήκος (αριθμός byte) της συμβολοσειράς και η κυριολεκτική συμβολοσειρά καταλαμβάνουν τις θέσεις διευθύνσεων $0300 έως $030B (συμπεριλαμβανομένων). Για να αυξηθούν οι διευθύνσεις μνήμης από $0300, χρησιμοποιείται ο καταχωρητής Y. Ο κωδικός είναι:

LDA #$0 δις
ΕΙΝΑΙ 0250$
LDX #$00
LDY#$00
STA $0300 ; το μήκος του 11 μπαίνει στο A από κάποια υπορουτίνα και πηγαίνει στα $0300
βρόχος INX
ΕΚΕΙ
CPY $0250
Βρόχος BEQ

β) Στρατηγική: Υπάρχουν 12 byte για τη συμβολοσειρά: 1 byte για τον τερματιστή Null $00 και 11 byte για την κυριολεκτική συμβολοσειρά. Άρα, πρέπει να υπάρχουν 12 επαναλήψεις (loopings) μετρώντας από το 0. Δηλαδή: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11. Αυτοί είναι 12 αριθμοί.

Ο ακέραιος 0 τοποθετείται στον καταχωρητή X και ο αριθμός 1110 = 1210 – 110 = B16 = $0B τοποθετείται σε μια θέση διεύθυνσης στη μνήμη, ας πούμε διεύθυνση $0250. Για κάθε επανάληψη, η τιμή στον καταχωρητή X αυξάνεται και το αποτέλεσμα συγκρίνεται με $0B στη θέση διεύθυνσης $0250. Μόλις η τιμή στο X ισούται με την τιμή των $0B, η επανάληψη σταματά. Σε αυτό το σημείο, ο αριθμός των byte της κυριολεκτικής συμβολοσειράς συν τον χαρακτήρα Null καταλαμβάνουν τις θέσεις διευθύνσεων $0300 έως $030B (συμπεριλαμβανομένων). Για να αυξηθούν οι διευθύνσεις μνήμης από $0300, χρησιμοποιείται ο καταχωρητής Y. Ο κωδικός είναι:

LDA #$0 δις
ΕΙΝΑΙ 0250$
LDX #$00
LDY#$00
STA $0300 ; Το 'I' μπαίνει στο A από κάποια υπορουτίνα και πηγαίνει στα $0300
βρόχος INX
ΕΚΕΙ
CPY $0250
Βρόχος BEQ