Κεφάλαιο 6: Βασικά στοιχεία της σύγχρονης αρχιτεκτονικής υπολογιστών με τη γλώσσα Assembly

Kephalaio 6 Basika Stoicheia Tes Synchrones Architektonikes Ypologiston Me Te Glossa Assembly



6.1 Εισαγωγή

Οι σύγχρονοι υπολογιστές γενικής χρήσης είναι δύο τύπων: CISC και RISC. Το CISC σημαίνει Complex Instruction Set Computer. RISK σημαίνει Υπολογιστής μειωμένου συνόλου εντολών. Οι μικροεπεξεργαστές 6502 ή 6510, όπως ισχύουν για τον υπολογιστή Commodore-64, μοιάζουν περισσότερο με την αρχιτεκτονική RISC παρά με την αρχιτεκτονική CISC.

Οι υπολογιστές RISC έχουν γενικά μικρότερες οδηγίες γλώσσας assembly (ανά αριθμό byte) σε σύγκριση με τους υπολογιστές CISC.







Σημείωση : Είτε πρόκειται για CISC, RISC ή παλιό υπολογιστή, ένα περιφερειακό ξεκινά από μια εσωτερική θύρα και πηγαίνει προς τα έξω μέσω μιας εξωτερικής θύρας στην κατακόρυφη επιφάνεια της μονάδας συστήματος του υπολογιστή (μονάδα βάσης) και στην εξωτερική συσκευή.



Μια τυπική οδηγία ενός υπολογιστή CISC μπορεί να θεωρηθεί σαν να συνδυάζει πολλές σύντομες οδηγίες γλώσσας συναρμολόγησης σε μια μακρύτερη εντολή γλώσσας συναρμολόγησης που κάνει την εντολή που προκύπτει πολύπλοκη. Συγκεκριμένα, ένας υπολογιστής CISC φορτώνει τους τελεστές από τη μνήμη στους καταχωρητές του μικροεπεξεργαστή, εκτελεί μια λειτουργία και στη συνέχεια αποθηκεύει το αποτέλεσμα πίσω στη μνήμη, όλα σε μία εντολή. Από την άλλη πλευρά, πρόκειται για τουλάχιστον τρεις οδηγίες (σύντομες) για τον υπολογιστή RISC.



Υπάρχουν δύο δημοφιλείς σειρές υπολογιστών CISC: οι υπολογιστές μικροεπεξεργαστή Intel και οι υπολογιστές μικροεπεξεργαστή AMD. Η AMD σημαίνει Advanced Micro Devices. είναι μια εταιρεία κατασκευής ημιαγωγών. Οι σειρές μικροεπεξεργαστών intel, κατά σειρά ανάπτυξης, είναι 8086, 8088, 80186, 80286, 80386, 80486, Pentium, Core, i Series, Celeron και Xeon. Οι οδηγίες γλώσσας συναρμολόγησης για τους πρώιμους μικροεπεξεργαστές της Intel, όπως οι 8086 και 8088, δεν είναι πολύ περίπλοκες. Ωστόσο, είναι πολύπλοκα για τους νέους μικροεπεξεργαστές. Οι πρόσφατοι μικροεπεξεργαστές AMD για τη σειρά CISC είναι οι Ryzen, Opteron, Athlon, Turion, Phenom και Sempron. Οι μικροεπεξεργαστές Intel και AMD είναι γνωστοί ως μικροεπεξεργαστές x86.





Το ARM σημαίνει Advanced RISC Machine. Οι αρχιτεκτονικές ARM ορίζουν μια οικογένεια επεξεργαστών RISC που είναι κατάλληλοι για χρήση σε μια μεγάλη ποικιλία εφαρμογών. Ενώ πολλοί μικροεπεξεργαστές Intel και AMD χρησιμοποιούνται στους επιτραπέζιους Προσωπικούς Υπολογιστές, πολλοί επεξεργαστές ARM χρησιμεύουν ως ενσωματωμένοι επεξεργαστές σε κρίσιμα για την ασφάλεια συστήματα, όπως αντιμπλοκαρίσματα αυτοκινήτων και ως επεξεργαστές γενικής χρήσης σε έξυπνα ρολόγια, φορητά τηλέφωνα, tablet και φορητούς υπολογιστές . Αν και και οι δύο τύποι μικροεπεξεργαστών μπορούν να παρατηρηθούν σε μικρές και μεγάλες συσκευές, οι μικροεπεξεργαστές RISC βρίσκονται περισσότερο σε μικρές συσκευές παρά σε μεγάλες συσκευές.

Υπολογιστής Word
Εάν ένας υπολογιστής λέγεται ότι είναι ένας υπολογιστής λέξης 32 bit, αυτό σημαίνει ότι οι πληροφορίες αποθηκεύονται, μεταφέρονται και χειρίζονται με τη μορφή δυαδικών κωδικών τριάντα δύο bit στο εσωτερικό μέρος της μητρικής πλακέτας. Σημαίνει επίσης ότι οι καταχωρητές γενικής χρήσης στον μικροεπεξεργαστή του υπολογιστή έχουν πλάτος 32 bit. Οι καταχωρητές A, X και Y του μικροεπεξεργαστή 6502 είναι καταχωρητές γενικής χρήσης. Έχουν πλάτος οκτώ bit και έτσι ο υπολογιστής Commodore-64 είναι ένας υπολογιστής λέξεων οκτώ bit.



Λίγο λεξιλόγιο
X86 Υπολογιστές

Οι έννοιες των byte, word, doubleword, quadword και double-quadword είναι οι εξής για τους υπολογιστές x86:

  • Ψηφιόλεξη : 8 bit
  • Λέξη : 16 bit
  • Διπλή λέξη : 32 bit
  • Τετραλέξη : 64 bit
  • Διπλή τετραλέξη : 128 bit

Υπολογιστές ARM
Οι έννοιες του byte, μισής λέξης, λέξης και διπλής λέξης είναι οι εξής για τους υπολογιστές ARM:

  • Ψηφιόλεξη : 8 bit
  • Γίνε μισός : 16 bit
  • Λέξη : 32 bit
  • Διπλή λέξη : 64 bit

Πρέπει να σημειωθούν οι διαφορές και οι ομοιότητες για τα ονόματα (και τις τιμές) x86 και ARM.

Σημείωση : Οι ακέραιοι πρόσημα και στους δύο τύπους υπολογιστών είναι συμπλήρωμα δύο.

Τοποθεσία μνήμης
Με τον υπολογιστή Commodore-64, μια θέση μνήμης είναι συνήθως ένα byte, αλλά θα μπορούσε να είναι δύο διαδοχικά byte περιστασιακά κατά την εξέταση των δεικτών (έμμεση διευθυνσιοδότηση). Με έναν σύγχρονο υπολογιστή x86, μια θέση μνήμης είναι 16 διαδοχικά byte όταν έχουμε να κάνουμε με μια διπλή τετραπλή λέξη των 16 bytes (128 bit), 8 συνεχόμενα byte όταν έχουμε να κάνουμε με quadword των 8 bytes (64 bit), 4 συνεχόμενα byte όταν έχουμε να κάνουμε με διπλή λέξη 4 byte (32 bit), 2 διαδοχικά byte όταν πρόκειται για μια λέξη 2 byte (16 bit) και 1 byte όταν ασχολείται με ένα byte (8 bit). Με έναν σύγχρονο υπολογιστή ARM, μια θέση μνήμης είναι 8 διαδοχικά byte όταν έχουμε να κάνουμε με μια διπλή λέξη 8 byte (64 bit), 4 συνεχόμενα byte όταν έχουμε να κάνουμε με μια λέξη 4 bytes (32 bit), 2 συνεχόμενα byte όταν έχουμε να κάνουμε με μισή λέξη 2 byte (16 bit) και 1 byte όταν πρόκειται για ένα byte (8 bit).

Αυτό το κεφάλαιο εξηγεί τι είναι κοινό στις αρχιτεκτονικές CISC και RISC και ποιες είναι οι διαφορές τους. Αυτό γίνεται σε σύγκριση με τον υπολογιστή 6502 µP και τον υπολογιστή commodore-64 όπου ισχύει.

6.2 Μπλοκ διάγραμμα μητρικής πλακέτας σύγχρονου υπολογιστή

Το PC σημαίνει Personal Computer. Το παρακάτω είναι ένα γενικό βασικό μπλοκ διάγραμμα για μια σύγχρονη μητρική πλακέτα με έναν μόνο μικροεπεξεργαστή για έναν προσωπικό υπολογιστή. Αντιπροσωπεύει μια μητρική πλακέτα CISC ή RISC.


Εικ. 6.21 Βασικό μπλοκ διάγραμμα μητρικής πλακέτας σύγχρονου υπολογιστή

Τρεις εσωτερικές θύρες φαίνονται στο διάγραμμα, αλλά υπάρχουν περισσότερες στην πράξη. Κάθε θύρα έχει έναν καταχωρητή που μπορεί να θεωρηθεί ως η ίδια η θύρα. Κάθε κύκλωμα θύρας έχει τουλάχιστον έναν άλλο καταχωρητή που μπορεί να ονομαστεί «καταχωρητής κατάστασης». Ο καταχωρητής κατάστασης υποδεικνύει τη θύρα του προγράμματος που στέλνει το σήμα διακοπής στον μικροεπεξεργαστή. Υπάρχει ένα κύκλωμα ελεγκτή διακοπής (δεν φαίνεται) που διαφοροποιεί τις διαφορετικές γραμμές διακοπής από τις διαφορετικές θύρες και έχει μόνο λίγες γραμμές προς το μP.

Το HD.C στο διάγραμμα σημαίνει Κάρτα σκληρού δίσκου. Το NIC σημαίνει κάρτα διασύνδεσης δικτύου. Η κάρτα (κύκλωμα) του σκληρού δίσκου συνδέεται με τον σκληρό δίσκο που βρίσκεται μέσα στη μονάδα βάσης (μονάδα συστήματος) του σύγχρονου υπολογιστή. Η κάρτα διασύνδεσης δικτύου (κύκλωμα) συνδέεται μέσω εξωτερικού καλωδίου σε άλλον υπολογιστή. Στο διάγραμμα, υπάρχει μία θύρα και ένα DMA (ανατρέξτε στην παρακάτω εικόνα) που συνδέονται με την κάρτα σκληρού δίσκου ή/και την κάρτα διασύνδεσης δικτύου. Το DMA σημαίνει Direct Memory Access.

Θυμηθείτε από το κεφάλαιο υπολογιστή Commodore-64 ότι για να στείλετε τα byte από τη μνήμη στη μονάδα δίσκου ή σε άλλον υπολογιστή, κάθε byte πρέπει να αντιγραφεί σε έναν καταχωρητή στον μικροεπεξεργαστή πριν αντιγραφεί στην αντίστοιχη εσωτερική θύρα και στη συνέχεια αυτόματα στη συσκευή. Για να ληφθούν τα byte από τη μονάδα δίσκου ή από άλλον υπολογιστή στη μνήμη, κάθε byte πρέπει να αντιγραφεί από τον αντίστοιχο καταχωρητή εσωτερικής θύρας σε έναν καταχωρητή μικροεπεξεργαστή πριν αντιγραφεί στη μνήμη. Αυτό συνήθως διαρκεί πολύ εάν ο αριθμός των byte στη ροή είναι μεγάλος. Η λύση για γρήγορη μεταφορά είναι η χρήση Direct Memory Access (κύκλωμα) χωρίς διέλευση από τον μικροεπεξεργαστή.

Το κύκλωμα DMA βρίσκεται μεταξύ της θύρας και του HD. C ή NIC. Με την άμεση πρόσβαση στη μνήμη του κυκλώματος DMA, η μεταφορά μεγάλων ροών byte γίνεται απευθείας μεταξύ του κυκλώματος DMA και της μνήμης (RAM) χωρίς τη συνεχή συμμετοχή του μικροεπεξεργαστή. Το DMA χρησιμοποιεί το δίαυλο διευθύνσεων και το δίαυλο δεδομένων στη θέση του μP. Η συνολική διάρκεια της μεταφοράς είναι μικρότερη από ό,τι εάν πρόκειται να χρησιμοποιηθεί το μP hard. Τόσο το HD C. όσο και το NIC χρησιμοποιούν το DMA όταν έχουν μεγάλη ροή δεδομένων (bytes) για μεταφορά με RAM (τη μνήμη).

Το GPU σημαίνει Μονάδα Επεξεργασίας Γραφικών. Αυτό το μπλοκ στη μητρική πλακέτα είναι υπεύθυνο για την αποστολή του κειμένου και των κινούμενων ή στατικών εικόνων στην οθόνη.

Με τους σύγχρονους υπολογιστές (PC), δεν υπάρχει μνήμη μόνο για ανάγνωση (ROM). Υπάρχει, ωστόσο, το BIOS ή UEFI που είναι ένα είδος μη πτητικής RAM. Οι πληροφορίες στο BIOS διατηρούνται στην πραγματικότητα από μια μπαταρία. Η μπαταρία είναι αυτή που διατηρεί στην πραγματικότητα και το χρονόμετρο του ρολογιού, τη σωστή ώρα και ημερομηνία για τον υπολογιστή. Το UEFI εφευρέθηκε μετά το BIOS και έχει αντικαταστήσει το BIOS αν και το BIOS εξακολουθεί να είναι αρκετά σχετικό στους σύγχρονους υπολογιστές. Θα συζητήσουμε περισσότερα για αυτά αργότερα!

Στους σύγχρονους υπολογιστές, οι δίαυλοι διευθύνσεων και δεδομένων μεταξύ του μP και των κυκλωμάτων εσωτερικής θύρας (και μνήμης) δεν είναι παράλληλοι δίαυλοι. Είναι σειριακά bus που χρειάζονται δύο αγωγούς για μετάδοση προς μία κατεύθυνση και άλλους δύο αγωγούς για μετάδοση προς την αντίθετη κατεύθυνση. Αυτό σημαίνει, για παράδειγμα, ότι τα 32-bit μπορούν να σταλούν σε σειρά (το ένα bit μετά το άλλο) προς οποιαδήποτε κατεύθυνση.

Εάν η σειριακή μετάδοση είναι μόνο προς μία κατεύθυνση με δύο αγωγούς (δύο γραμμές), αυτό λέγεται ότι είναι ημιαμφίδρομη. Εάν η σειριακή μετάδοση είναι και στις δύο κατευθύνσεις με τέσσερις αγωγούς, ένα ζεύγος προς οποιαδήποτε κατεύθυνση, λέγεται ότι είναι full-duplex.

Ολόκληρη η μνήμη του σύγχρονου υπολογιστή εξακολουθεί να αποτελείται από μια σειρά από θέσεις byte: οκτώ bit ανά byte. Ένας σύγχρονος υπολογιστής έχει χώρο μνήμης τουλάχιστον 4 giga byte = 4 x 210 x 2 10 x 2 10 = 4 x 1.073.741.824 10 byte = 4 x 1024 10/υπο> x 1024 10 x 1024 10 = 4 x 1.073.741.824 10 .

Σημείωση : Αν και δεν εμφανίζεται κανένα κύκλωμα χρονοδιακόπτη στην προηγούμενη μητρική πλακέτα, όλες οι σύγχρονες μητρικές έχουν κυκλώματα χρονοδιακόπτη.

6.3 Τα βασικά στοιχεία της αρχιτεκτονικής υπολογιστών x64

6.31 Το σετ καταχωρητή x64
Ο μικροεπεξεργαστής 64-bit της σειράς μικροεπεξεργαστών x86 είναι ένας μικροεπεξεργαστής 64-bit. Είναι αρκετά μοντέρνο η αντικατάσταση του επεξεργαστή 32-bit της ίδιας σειράς. Οι καταχωρητές γενικού σκοπού του μικροεπεξεργαστή 64-bit και τα ονόματά τους είναι τα εξής:


Εικ. 6.31 Μητρώα γενικής χρήσης για x64

Δεκαέξι (16) μητρώα γενικής χρήσης φαίνονται στην εικόνα που δίνεται. Καθένας από αυτούς τους καταχωρητές έχει πλάτος 64 bit. Κοιτάζοντας τον καταχωρητή στην επάνω αριστερή γωνία, τα 64 bit αναγνωρίζονται ως RAX. Τα πρώτα 32 bit αυτού του ίδιου καταχωρητή (από τα δεξιά) προσδιορίζονται ως EAX. Τα πρώτα 16 bit αυτού του ίδιου καταχωρητή (από τα δεξιά) προσδιορίζονται ως AX. Το δεύτερο byte (από τα δεξιά) αυτού του ίδιου καταχωρητή προσδιορίζεται ως AH (το H εδώ σημαίνει υψηλό). Και το πρώτο byte (του ίδιου καταχωρητή) προσδιορίζεται ως AL (το L εδώ σημαίνει χαμηλό). Κοιτάζοντας τον καταχωρητή στην κάτω δεξιά γωνία, τα 64 bit αναγνωρίζονται ως R15. Τα πρώτα 32 bit αυτού του ίδιου καταχωρητή αναγνωρίζονται ως R15D. Τα πρώτα 16 bit αυτού του ίδιου καταχωρητή αναγνωρίζονται ως R15W. Και το πρώτο byte προσδιορίζεται ως R15B. Τα ονόματα των άλλων μητρώων (και υπομητρώων) εξηγούνται με παρόμοιο τρόπο.

Υπάρχουν κάποιες διαφορές μεταξύ των μP της Intel και της AMD. Οι πληροφορίες σε αυτήν την ενότητα είναι για την Intel.

Με το 6502 µP, ο καταχωρητής μετρητή προγράμματος (δεν είναι άμεσα προσβάσιμος) που περιέχει την επόμενη εντολή που θα εκτελεστεί έχει πλάτος 16 bit. Εδώ (x64), ο μετρητής προγράμματος ονομάζεται Instruction Pointer και έχει πλάτος 64 bit. Επισημαίνεται ως RIP. Αυτό σημαίνει ότι το x64 μP μπορεί να διευθύνει έως και 264 = 1,844674407 x 1019 (στην πραγματικότητα 18,446,744,073,709,551,616) θέσεις byte μνήμης. Το RIP δεν είναι μητρώο γενικής χρήσης.

Το Stack Pointer Register ή RSP είναι μεταξύ των 16 καταχωρητών γενικού σκοπού. Δείχνει την τελευταία καταχώρηση στοίβας στη μνήμη. Όπως και με τα 6502 μP, η στοίβα για το x64 μεγαλώνει προς τα κάτω. Με το x64, η στοίβα στη μνήμη RAM χρησιμοποιείται για την αποθήκευση των διευθύνσεων επιστροφής για υπορουτίνες. Χρησιμοποιείται επίσης για την αποθήκευση του «χώρου σκιάς» (ανατρέξτε στην ακόλουθη συζήτηση).

Το 6502 µP διαθέτει καταχωρητή κατάστασης επεξεργαστή 8-bit. Το ισοδύναμο στο x64 ονομάζεται καταχωρητής RFLAGS. Αυτός ο καταχωρητής αποθηκεύει τις σημαίες που χρησιμοποιούνται για τα αποτελέσματα των λειτουργιών και για τον έλεγχο του επεξεργαστή (μP). Έχει πλάτος 64 bit. Τα υψηλότερα 32 bit είναι δεσμευμένα και δεν χρησιμοποιούνται αυτήν τη στιγμή. Ο παρακάτω πίνακας δίνει τα ονόματα, το ευρετήριο και τις έννοιες για τα bit που χρησιμοποιούνται συνήθως στον καταχωρητή RFLAGS:

Πίνακας 6.31.1
Οι πιο χρησιμοποιημένες σημαίες RFLAGS (bit)
Σύμβολο Κομμάτι Ονομα Σκοπός
CF 0 Μεταφέρω Ορίζεται εάν μια αριθμητική πράξη δημιουργεί μια μεταφορά ή ένα δανεισμό από το πιο σημαντικό κομμάτι του αποτελέσματος. εκκαθαρίζεται διαφορετικά. Αυτή η σημαία υποδεικνύει μια συνθήκη υπερχείλισης για αριθμητική χωρίς ακέραιο αριθμό. Χρησιμοποιείται επίσης στην αριθμητική πολλαπλής ακρίβειας.
PF 2 Ισοτιμία Ορίζεται εάν το λιγότερο σημαντικό byte του αποτελέσματος περιέχει ζυγό αριθμό 1 bit. εκκαθαρίζεται διαφορετικά.
ΤΟΥ 4 Προσαρμόζω Ορίζεται εάν μια αριθμητική πράξη δημιουργεί μια μεταφορά ή ένα δανεισμό από το bit 3 του αποτελέσματος. εκκαθαρίζεται διαφορετικά. Αυτή η σημαία χρησιμοποιείται στην αριθμητική με δυαδική κωδικοποίηση δεκαδικών (BCD).
ΖΦ 6 Μηδέν Ορίζεται εάν το αποτέλεσμα είναι μηδέν. εκκαθαρίζεται διαφορετικά.
SF 7 Σημάδι Ορίζεται εάν είναι ίσο με το πιο σημαντικό bit του αποτελέσματος που είναι το bit πρόσημου ενός προσημασμένου ακέραιου αριθμού (0 δηλώνει θετική τιμή και 1 δηλώνει αρνητική τιμή).
ΤΟΥ έντεκα Ξεχείλισμα Ορίζεται εάν το ακέραιο αποτέλεσμα είναι πολύ μεγάλος ένας θετικός αριθμός ή πολύ μικρός ένας αρνητικός αριθμός (εξαιρουμένου του bit πρόσημου) για να χωρέσει στον τελεστή προορισμού. εκκαθαρίζεται διαφορετικά. Αυτή η σημαία υποδεικνύει μια συνθήκη υπερχείλισης για την αριθμητική με ακέραιο αριθμό (συμπλήρωμα δύο).
DF 10 Κατεύθυνση Ρυθμίζεται εάν λειτουργούν οι οδηγίες συμβολοσειράς κατεύθυνσης (αύξηση ή μείωση).
ταυτότητα είκοσι ένα Ταυτοποίηση Ορίζεται εάν η δυνατότητα αλλαγής υποδηλώνει την παρουσία της εντολής CPUID.

Εκτός από τους δεκαοκτώ καταχωρητές 64-bit που υποδεικνύονται προηγουμένως, η αρχιτεκτονική x64 µP διαθέτει οκτώ καταχωρητές πλάτους 80-bit για αριθµητική κινητή υποδιαστολή. Αυτοί οι οκτώ καταχωρητές μπορούν επίσης να χρησιμοποιηθούν ως καταχωρητές MMX (ανατρέξτε στην ακόλουθη συζήτηση). Υπάρχουν επίσης δεκαέξι καταχωρητές 128-bit για XMM (ανατρέξτε στην ακόλουθη συζήτηση).

Αυτό δεν αφορά μόνο τα μητρώα. Υπάρχουν περισσότεροι καταχωρητές x64 που είναι καταχωρητές τμημάτων (ως επί το πλείστον αχρησιμοποίητοι στο x64), καταχωρητές ελέγχου, καταχωρητές διαχείρισης μνήμης, καταχωρητές εντοπισμού σφαλμάτων, καταχωρητές εικονικοποίησης, καταχωρητές απόδοσης που παρακολουθούν κάθε είδους εσωτερικές παραμέτρους (επισκέψεις/αστοχίες κρυφής μνήμης, εκτελεσθείσες μικροεπιχειρήσεις, χρονισμός , και πολλα ΑΚΟΜΑ).

SIMD

Το SIMD σημαίνει Single Instruction Multiple Data. Αυτό σημαίνει ότι μια εντολή γλώσσας συγκρότησης μπορεί να ενεργεί σε πολλά δεδομένα ταυτόχρονα σε έναν μικροεπεξεργαστή. Σκεφτείτε τον παρακάτω πίνακα:

1 2 3 4 5 6 7 8
+ 9 10 έντεκα 12 13 14 δεκαπέντε 16
= 10 12 14 16 18 είκοσι 22 24

Σε αυτόν τον πίνακα, οκτώ ζεύγη αριθμών προστίθενται παράλληλα (στην ίδια διάρκεια) για να δώσουν οκτώ απαντήσεις. Μία οδηγία γλώσσας συγκρότησης μπορεί να κάνει τις οκτώ παράλληλες προσθήκες ακεραίων στους καταχωρητές MMX. Κάτι παρόμοιο μπορεί να γίνει με τους καταχωρητές XMM. Έτσι, υπάρχουν οδηγίες MMX για ακέραιους αριθμούς και εντολές XMM για πλωτήρες.

6.32 Χάρτης μνήμης και το x64

Με τον δείκτη εντολών (Μετρητής προγράμματος) να έχει 64 bit, αυτό σημαίνει ότι μπορούν να αντιμετωπιστούν 264 = 1,844674407 x 1019 θέσεις byte μνήμης. Στο δεκαεξαδικό, η υψηλότερη θέση byte είναι FFFF, FFFF, FFFF, FFFF16. Κανένας συνηθισμένος υπολογιστής σήμερα δεν μπορεί να παρέχει τόσο μεγάλο (πλήρη) χώρο μνήμης. Έτσι, ένας κατάλληλος χάρτης μνήμης για τον υπολογιστή x64 είναι ο εξής:

Παρατηρήστε ότι το κενό από 0000,8000,0000,000016 έως FFFF,7FFF,FFFF,FFFF16 δεν έχει θέσεις μνήμης (χωρίς τράπεζες RAM μνήμης). Αυτή είναι μια διαφορά FFFF,0000,0000,000116 που είναι αρκετά μεγάλη. Το κανονικό υψηλό μισό έχει το λειτουργικό σύστημα, ενώ το κανονικό χαμηλό μισό έχει τα προγράμματα χρήστη (εφαρμογές) και τα δεδομένα. Το λειτουργικό σύστημα αποτελείται από δύο μέρη: ένα μικρό UEFI (BIOS) και ένα μεγάλο μέρος που φορτώνεται από τον σκληρό δίσκο. Στο επόμενο κεφάλαιο γίνεται λόγος για τα σύγχρονα λειτουργικά συστήματα. Σημειώστε την ομοιότητα με αυτόν τον χάρτη μνήμης και αυτόν για το Commodore-64 όταν τα 64KB μπορεί να έμοιαζαν με πολλή μνήμη.

Σε αυτό το πλαίσιο, το λειτουργικό σύστημα ονομάζεται κατά προσέγγιση «πυρήνας». Ο πυρήνας είναι παρόμοιος με τον πυρήνα του υπολογιστή Commodore-64, αλλά έχει πολύ περισσότερες υπορουτίνες.

Η endianness για το x64 είναι μικρή endian, πράγμα που σημαίνει ότι για μια τοποθεσία, η χαμηλότερη διεύθυνση δείχνει το byte χαμηλότερου περιεχομένου στη μνήμη.

6.33 Λειτουργίες διευθυνσιοδότησης γλώσσας συναρμολόγησης για x64

Οι λειτουργίες διεύθυνσης είναι οι τρόποι με τους οποίους μια εντολή μπορεί να έχει πρόσβαση στους καταχωρητές μP και στη μνήμη (συμπεριλαμβανομένων των καταχωρητών εσωτερικών θυρών). Το x64 έχει πολλούς τρόπους διευθυνσιοδότησης, αλλά μόνο οι κοινώς χρησιμοποιούμενες λειτουργίες διευθυνσιοδότησης αντιμετωπίζονται εδώ. Η γενική σύνταξη για μια οδηγία εδώ είναι:

opcode προορισμός, πηγή

Οι δεκαδικοί αριθμοί γράφονται χωρίς πρόθεμα ή επίθημα. Με το 6502, η πηγή είναι σιωπηρή. Το x64 έχει περισσότερους κωδικούς λειτουργίας από το 6502, αλλά ορισμένοι από τους κωδικούς λειτουργίας έχουν τα ίδια μνημονικά. Οι μεμονωμένες εντολές x64 είναι μεταβλητού μήκους και μπορούν να κυμαίνονται σε μέγεθος από 1 έως 15 byte. Οι συνήθεις τρόποι διευθυνσιοδότησης είναι οι εξής:

Λειτουργία άμεσης διεύθυνσης
Εδώ, ο τελεστής πηγής είναι μια πραγματική τιμή και όχι μια διεύθυνση ή μια ετικέτα. Παράδειγμα (διαβάστε το σχόλιο):

ΠΡΟΣΘΗΚΗ EAX, 14 ; προσθέστε δεκαδικό 14 σε 32-bit EAX του 64-bit RAX, η απάντηση παραμένει στο EAX (προορισμός)

Εγγραφείτε για να εγγραφείτε στη λειτουργία διεύθυνσης
Παράδειγμα:

ADD R8B, AL; προσθέστε 8-bit AL του RAX στο R8B του 64-bit R8 - οι απαντήσεις παραμένουν στο R8B (προορισμός)

Λειτουργία έμμεσης και ευρετηριασμένης διεύθυνσης
Η έμμεση διευθυνσιοδότηση με το 6502 μP σημαίνει ότι η θέση της δεδομένης διεύθυνσης στην εντολή έχει την ενεργή διεύθυνση (δείκτη) της τελικής θέσης. Κάτι παρόμοιο συμβαίνει και με το x64. Η διευθυνσιοδότηση ευρετηρίου με το 6502 μP σημαίνει ότι το περιεχόμενο ενός καταχωρητή μP προστίθεται στη δεδομένη διεύθυνση στην εντολή για να έχει την πραγματική διεύθυνση. Κάτι αντίστοιχο συμβαίνει και με το x64. Επίσης, με το x64, το περιεχόμενο του μητρώου μπορεί επίσης να πολλαπλασιαστεί επί 1 ή 2 ή 4 ή 8 πριν προστεθεί στη δεδομένη διεύθυνση. Η εντολή mov (copy) του x64 μπορεί να συνδυάσει τόσο την έμμεση όσο και την ευρετηριασμένη διεύθυνση. Παράδειγμα:

MOV R8W, 1234[8*RAX+RCX]; μετακίνηση λέξης στη διεύθυνση (8 x RAX + RCX) + 1234

Εδώ, το R8W έχει τα πρώτα 16-bit του R8. Η δεδομένη διεύθυνση είναι 1234. Ο καταχωρητής RAX έχει έναν αριθμό 64 bit που πολλαπλασιάζεται επί 8. Το αποτέλεσμα προστίθεται στο περιεχόμενο του καταχωρητή RCX 64 bit. Αυτό το δεύτερο αποτέλεσμα προστίθεται στη δεδομένη διεύθυνση που είναι 1234 για να ληφθεί η πραγματική διεύθυνση. Ο αριθμός στη θέση της ενεργής διεύθυνσης μετακινείται (αντιγράφεται) στην πρώτη θέση 16-bit (R8W) του καταχωρητή R8, αντικαθιστώντας οτιδήποτε υπήρχε εκεί. Παρατηρήστε τη χρήση των αγκύλων. Θυμηθείτε ότι μια λέξη στο x64 έχει πλάτος 16 bit.

RIP Σχετική Διεύθυνση
Για τα 6502 µP, η σχετική διευθυνσιοδότηση χρησιμοποιείται μόνο με οδηγίες διακλάδωσης. Εκεί, ο μεμονωμένος τελεστής του opcode είναι μια μετατόπιση που προστίθεται ή αφαιρείται στο περιεχόμενο του μετρητή προγράμματος για την πραγματική διεύθυνση εντολής (όχι τη διεύθυνση δεδομένων). Κάτι παρόμοιο συμβαίνει με το x64 όπου ο μετρητής προγράμματος ονομάζεται δείκτης οδηγιών. Η εντολή με το x64 δεν πρέπει να είναι μόνο μια εντολή διακλάδωσης. Ένα παράδειγμα διευθυνσιοδότησης σχετικής με το RIP είναι:

MOV AL, [RIP]

Το AL του RAX έχει έναν υπογεγραμμένο αριθμό 8 bit ο οποίος προστίθεται ή αφαιρείται από το περιεχόμενο στο RIP (δείκτης εντολών 64 bit) για να υποδείξει την επόμενη εντολή. Σημειώστε ότι η πηγή και ο προορισμός ανταλλάσσονται κατ' εξαίρεση σε αυτήν την οδηγία. Σημειώστε επίσης τη χρήση των αγκύλων που αναφέρεται στο περιεχόμενο του RIP.

6.34 Οδηγίες που χρησιμοποιούνται συνήθως του x64

Στον παρακάτω πίνακα * σημαίνει διαφορετικά πιθανά επιθέματα ενός υποσυνόλου κωδικών λειτουργίας:

Πίνακας 6.34.1
Οδηγίες που χρησιμοποιούνται συνήθως στο x64
Κώδικας πράξης Εννοια
MOV Μετακίνηση (αντιγραφή) προς/από/μεταξύ μνήμης και καταχωρητών
CMOV* Διάφορες κινήσεις υπό όρους
XCHG Ανταλλαγή
BSWAP Ανταλλαγή byte
PUSH/POP Χρήση στοίβας
ADD/ADC Προσθήκη/με μεταφορά
SUB/SBC Αφαίρεση/με μεταφορά
MUL/IMUL Πολλαπλασιασμός/ανυπόγραφο
DIV/IDIV Διαιρέστε/ανυπόγραφο
INC/DEC Αύξηση/Μείωση
ΑΡΝΗ Αναιρώ
ΔΕΑ Συγκρίνω
ΚΑΙ/Η/XOR/ΟΧΙ Λειτουργίες bitwise
SHR/SAR Μετατόπιση λογικής/αριθμητικής δεξιά
SHL/SAL Μετατόπιση αριστερά λογική/αριθμητική
ROR/ROLE Περιστροφή δεξιά/αριστερά
RCR/RCL Περιστρέψτε δεξιά/αριστερά μέσω του bit μεταφοράς
BT/BTS/BTR Δοκιμή bit/και ρύθμιση/και επαναφορά
JMP Άλμα άνευ όρων
JE/JNE/JC/JNC/J* Πήδα αν είναι ίσο/όχι ίσο/ φέρω/δεν φέρω/πολλά άλλα
ΠΕΡΠΑΤΗΣΗ/ΠΕΡΠΑΤΗΣΗ/ΠΕΡΙΠΑΤΗΣΗ Βρόχος με ECX
CALL/RET Υπορουτίνα κλήσης/επιστροφή
ΟΧΙ Καμία επέμβαση
CPUID Πληροφορίες CPU

Το x64 έχει οδηγίες πολλαπλασιασμού και διαίρεσης. Διαθέτει κυκλώματα υλικού πολλαπλασιασμού και διαίρεσης στο μP του. Το 6502 μP δεν έχει κυκλώματα υλικού πολλαπλασιασμού και διαίρεσης. Είναι πιο γρήγορο να κάνετε τον πολλαπλασιασμό και τη διαίρεση με υλικό παρά με λογισμικό (συμπεριλαμβανομένης της μετατόπισης των bit).

Οδηγίες συμβολοσειράς
Υπάρχει ένας αριθμός εντολών συμβολοσειράς, αλλά η μόνη που πρέπει να συζητηθεί εδώ είναι η εντολή MOVS (για μετακίνηση συμβολοσειράς) για την αντιγραφή μιας συμβολοσειράς που ξεκινά από τη διεύθυνση C000 H . Για να ξεκινήσετε από τη διεύθυνση C100 H , χρησιμοποιήστε την ακόλουθη οδηγία:

MOVS [C100H], [C000H]

Σημειώστε το επίθημα H για δεκαεξαδικό.

6,35 Looping σε x64

Το 6502 µP έχει οδηγίες διακλάδωσης για βρόχο. Μια εντολή διακλάδωσης μεταβαίνει σε μια τοποθεσία διεύθυνσης που έχει τη νέα εντολή. Η τοποθεσία της διεύθυνσης μπορεί να ονομάζεται 'βρόχος'. Το x64 έχει οδηγίες LOOP/LOOPE/LOOPNE για επαναφορά. Αυτές οι δεσμευμένες λέξεις της γλώσσας συναρμολόγησης δεν πρέπει να συγχέονται με την ετικέτα 'βρόχος' (χωρίς τα εισαγωγικά). Η συμπεριφορά είναι η εξής:

Ο LOOP μειώνει το ECX και ελέγχει εάν το ECX δεν είναι μηδέν. Εάν πληρούται αυτή η συνθήκη (μηδέν), μεταβαίνει σε μια καθορισμένη ετικέτα. Διαφορετικά, πέφτει (συνεχίστε με τις υπόλοιπες οδηγίες στην παρακάτω συζήτηση).

Το LOOPE μειώνει το ECX και ελέγχει ότι το ECX δεν είναι μηδέν (μπορεί να είναι 1 για παράδειγμα) και το ZF έχει οριστεί (στο 1). Εάν πληρούνται αυτές οι προϋποθέσεις, πηδά στην ετικέτα. Διαφορετικά, πέφτει.

Το LOOPNE μειώνει το ECX και ελέγχει ότι το ECX δεν είναι μηδέν και ότι το ZF ΔΕΝ έχει οριστεί (δηλαδή, είναι μηδέν). Εάν πληρούνται αυτές οι προϋποθέσεις, μεταβαίνει στην ετικέτα. Διαφορετικά, πέφτει.

Με το x64, ο καταχωρητής RCX ή τα υποτμήματά του όπως ECX ή CX, κρατούν τον ακέραιο μετρητή. Με τις οδηγίες LOOP, ο μετρητής κανονικά μετράει αντίστροφα, μειώνοντας κατά 1 για κάθε άλμα (βρόχο). Στο ακόλουθο τμήμα κώδικα βρόχου, ο αριθμός στον καταχωρητή EAX αυξάνεται από 0 σε 10 σε δέκα επαναλήψεις, ενώ ο αριθμός στο ECX μετράει (μειώνεται) 10 φορές (διαβάστε τα σχόλια):

MOV EAX, 0 ;
MOV ECX, 10; μετρήστε αντίστροφα 10 φορές από προεπιλογή, μία φορά για κάθε επανάληψη
επιγραφή:
INC EAX ; αύξηση EAX ως σώμα βρόχου
Ετικέτα LOOP ; μειώστε το EAX και εάν το EAX δεν είναι μηδέν, εκτελέστε ξανά το σώμα βρόχου από το 'label:'

Η κωδικοποίηση βρόχου ξεκινά από το 'label:'. Σημειώστε τη χρήση του παχέος εντέρου. Η κωδικοποίηση βρόχου τελειώνει με την 'Ετικέτα LOOP' που λέει μείωση EAX. Εάν το περιεχόμενό της δεν είναι μηδέν, επιστρέψτε στην εντολή μετά το 'label:' και εκτελέστε ξανά οποιαδήποτε εντολή (όλες οι εντολές σώματος) που έρχεται προς τα κάτω μέχρι την 'LOOP label'. Σημειώστε ότι η 'ετικέτα' μπορεί να έχει άλλο όνομα.

6.36 Είσοδος/Έξοδος x64

Αυτή η ενότητα του κεφαλαίου ασχολείται με την αποστολή των δεδομένων σε μια θύρα εξόδου (εσωτερική) ή τη λήψη των δεδομένων από μια (εσωτερική) θύρα εισόδου. Το chipset διαθέτει θύρες οκτώ bit. Οποιεσδήποτε δύο διαδοχικές θύρες 8-bit μπορούν να αντιμετωπιστούν ως θύρα 16-bit και οποιεσδήποτε τέσσερις διαδοχικές θύρες μπορούν να είναι μια θύρα 32-bit. Με αυτόν τον τρόπο, ο επεξεργαστής μπορεί να μεταφέρει 8, 16 ή 32 bit προς ή από μια εξωτερική συσκευή.

Οι πληροφορίες μπορούν να μεταφερθούν μεταξύ του επεξεργαστή και μιας εσωτερικής θύρας με δύο τρόπους: χρησιμοποιώντας αυτό που είναι γνωστό ως είσοδο/έξοδο με αντιστοίχιση μνήμης ή χρησιμοποιώντας ξεχωριστό χώρο διευθύνσεων εισόδου/εξόδου. Το I/O με αντιστοίχιση μνήμης μοιάζει με αυτό που συμβαίνει με τον επεξεργαστή 6502 όπου οι διευθύνσεις των θυρών αποτελούν στην πραγματικότητα μέρος ολόκληρου του χώρου της μνήμης. Σε αυτήν την περίπτωση, κατά την αποστολή των δεδομένων σε μια συγκεκριμένη τοποθεσία διεύθυνσης, πηγαίνουν σε μια θύρα και όχι σε μια τράπεζα μνήμης. Οι θύρες μπορεί να έχουν ξεχωριστό χώρο διευθύνσεων I/O. Στην τελευταία αυτή περίπτωση, όλες οι τράπεζες μνήμης έχουν τις διευθύνσεις τους από το μηδέν. Υπάρχει ξεχωριστό εύρος διευθύνσεων από 0000H έως FFFF16. Αυτά χρησιμοποιούνται από τις θύρες στο chipset. Η μητρική πλακέτα είναι προγραμματισμένη έτσι ώστε να μην δημιουργεί σύγχυση μεταξύ I/O με αντιστοίχιση μνήμης και χωριστού χώρου διευθύνσεων I/O.

I/O με αντιστοίχιση μνήμης
Με αυτό, οι θύρες θεωρούνται ως θέσεις μνήμης και οι κανονικοί κωδικοί λειτουργίας μεταξύ της μνήμης και του μP χρησιμοποιούνται για τη μεταφορά δεδομένων μεταξύ του μP και των θυρών. Έτσι, για να μετακινήσετε ένα byte από μια θύρα στη διεύθυνση F000H στον καταχωρητή μP RAX:EAX:AX:AL, κάντε τα εξής:

MOV AL, [F000H]

Μια συμβολοσειρά μπορεί να μετακινηθεί από τη μνήμη σε μια θύρα και αντίστροφα. Παράδειγμα:

MOVS [F000H], [C000H] ; Η πηγή είναι C000H και ο προορισμός είναι η θύρα στο F000H.

Ξεχωριστός χώρος διευθύνσεων I/O

Με αυτό, πρέπει να χρησιμοποιηθούν οι ειδικές οδηγίες εισόδου και εξόδου.

Μεταφορά μεμονωμένων αντικειμένων
Ο καταχωρητής επεξεργαστή για τη μεταφορά είναι RAX. Στην πραγματικότητα, είναι RAX:EAX για διπλή λέξη, RAX:EAX:AX ​​για λέξη και RAX:EAX:AX:AL για byte. Έτσι, για να μεταφέρετε ένα byte από μια θύρα στις FFF0h, στο RAX:EAX:AX:AL, πληκτρολογήστε τα εξής:

ΣΕ AL, [FFF0H]

Για την αντίστροφη μεταφορά, πληκτρολογήστε τα εξής:

OUT [FFF0H], AL

Έτσι, για μεμονωμένα αντικείμενα, οι οδηγίες είναι IN και OUT. Η διεύθυνση θύρας μπορεί επίσης να δοθεί στον καταχωρητή RDX:EDX:DX.

Μεταφορά χορδών
Μια συμβολοσειρά μπορεί να μεταφερθεί από τη μνήμη σε μια θύρα chipset και αντίστροφα. Για να μεταφέρετε μια συμβολοσειρά από μια θύρα στη διεύθυνση FFF0H στη μνήμη, ξεκινήστε από το C100H, πληκτρολογήστε:

INS [ESI], [DX]

που έχει το ίδιο αποτέλεσμα με:

INS [EDI], [DX]

Ο προγραμματιστής θα πρέπει να τοποθετήσει τη διεύθυνση θύρας δύο byte του FFF0H στον καταχωρητή RDX:EDX:Dx και θα πρέπει να τοποθετήσει τη διεύθυνση δύο byte του C100H στον καταχωρητή RSI:ESI ή RDI:EDI. Για την αντίστροφη μεταφορά, κάντε τα εξής:

INS [DX], [ESI]

που έχει το ίδιο αποτέλεσμα με:

INS [DX], [EDI]

6.37 Η στοίβα σε x64

Όπως ο επεξεργαστής 6502, ο επεξεργαστής x64 έχει επίσης μια στοίβα στη μνήμη RAM. Η στοίβα για το x64 μπορεί να είναι 2 16 = 65.536 byte ή μπορεί να είναι 2 32 = 4.294.967.296 byte μήκος. Μεγαλώνει και προς τα κάτω. Όταν το περιεχόμενο ενός καταχωρητή ωθείται στη στοίβα, ο αριθμός στον δείκτη στοίβας RSP μειώνεται κατά 8. Θυμηθείτε ότι μια διεύθυνση μνήμης για το x64 έχει πλάτος 64 bit. Η τιμή στον δείκτη στοίβας στο μP δείχνει στην επόμενη θέση στη στοίβα στη μνήμη RAM. Όταν το περιεχόμενο ενός καταχωρητή (ή μια τιμή σε έναν τελεστή) εμφανίζεται από τη στοίβα σε έναν καταχωρητή, ο αριθμός στον δείκτη στοίβας RSP αυξάνεται κατά 8. Το λειτουργικό σύστημα αποφασίζει το μέγεθος της στοίβας και από πού ξεκινά στη μνήμη RAM και μεγαλώνει προς τα κάτω. Θυμηθείτε ότι μια στοίβα είναι μια δομή Last-In-First-Out (LIFO) που μεγαλώνει προς τα κάτω και συρρικνώνεται προς τα πάνω σε αυτήν την περίπτωση.

Για να προωθήσετε το περιεχόμενο του καταχωρητή μP RBX στη στοίβα, κάντε τα εξής:

PUSH RBX

Για να επαναφέρετε την τελευταία καταχώρηση στη στοίβα στο RBX, κάντε τα εξής:

POP RBX

6.38 Διαδικασία σε x64

Η υπορουτίνα στο x64 ονομάζεται 'διαδικασία'. Η στοίβα χρησιμοποιείται εδώ περισσότερο από ό,τι για τα 6502 μP. Η σύνταξη για μια διαδικασία x64 είναι:

proc_name:
όργανο της διαδικασίας

σωστά

Πριν συνεχίσετε, παρατηρήστε ότι οι κωδικοί και οι ετικέτες για μια υπορουτίνα x64 (οι οδηγίες γλώσσας συναρμολόγησης γενικά) δεν έχουν διάκριση πεζών-κεφαλαίων. Δηλαδή το proc_name είναι το ίδιο με το PROC_NAME. Όπως το 6502, το όνομα του ονόματος της διαδικασίας (ετικέτα) ξεκινά στην αρχή μιας νέας γραμμής στο πρόγραμμα επεξεργασίας κειμένου για τη γλώσσα συναρμολόγησης. Ακολουθεί άνω και κάτω τελεία και όχι κενό και κωδικός λειτουργίας όπως στο 6502. Ακολουθεί το σώμα της υπορουτίνας, που τελειώνει με RET και όχι RTS όπως με το 6502 μP. Όπως και με το 6502, κάθε εντολή στο σώμα, συμπεριλαμβανομένου του RET, δεν ξεκινά από την αρχή της γραμμής του. Σημειώστε ότι μια ετικέτα εδώ μπορεί να έχει περισσότερους από 8 χαρακτήρες. Για να καλέσετε αυτήν τη διαδικασία, από πάνω ή κάτω από τη διαδικασία πληκτρολόγησης, κάντε τα εξής:

ΚΛΗΣΗ proc_name

Με το 6502, το όνομα της ετικέτας είναι απλώς πληκτρολογήστε για κλήση. Ωστόσο, εδώ, πληκτρολογείται η δεσμευμένη λέξη 'CALL' ή 'call', ακολουθούμενη από το όνομα της διαδικασίας (υπορουτίνα) μετά από ένα κενό.

Όταν ασχολούμαστε με διαδικασίες, συνήθως υπάρχουν δύο διαδικασίες. Η μια διαδικασία καλεί την άλλη. Η διαδικασία που καλεί (έχει την εντολή κλήσης) ονομάζεται 'καλών' και η διαδικασία που καλείται ονομάζεται 'καλούμενος'. Υπάρχει μια σύμβαση (κανόνες) που πρέπει να ακολουθήσετε.

Οι κανόνες του καλούντος

Ο καλών πρέπει να τηρεί τους ακόλουθους κανόνες όταν επικαλείται μια υπορουτίνα:

1. Πριν καλέσετε μια υπορουτίνα, ο καλών πρέπει να αποθηκεύσει τα περιεχόμενα ορισμένων καταχωρητών που έχουν οριστεί ως αποθηκευμένα από τον καλούντα στη στοίβαξη. Οι καταχωρητές που αποθηκεύονται από τον καλούντα είναι R10, R11 και τυχόν καταχωρητές στους οποίους τοποθετούνται οι παράμετροι (RDI, RSI, RDX, RCX, R8, R9). Εάν τα περιεχόμενα αυτών των καταχωρητών πρόκειται να διατηρηθούν κατά τη διάρκεια της κλήσης υπορουτίνας, σπρώξτε τα στη στοίβα αντί να τα αποθηκεύσετε στη RAM. Αυτά πρέπει να γίνουν επειδή οι καταχωρητές πρέπει να χρησιμοποιηθούν από τον καλούντα για να διαγράψει τα προηγούμενα περιεχόμενα.

2. Εάν η διαδικασία είναι για παράδειγμα να προσθέσετε δύο αριθμούς, οι δύο αριθμοί είναι οι παράμετροι που πρέπει να περάσουν στη στοίβα. Για να μεταβιβάσετε τις παραμέτρους στην υπορουτίνα, τοποθετήστε έξι από αυτές στους ακόλουθους καταχωρητές με τη σειρά: RDI, RSI, RDX, RCX, R8, R9. Εάν υπάρχουν περισσότερες από έξι παράμετροι στην υπορουτίνα, σπρώξτε τις υπόλοιπες στη στοίβα με αντίστροφη σειρά (δηλαδή, πρώτα η τελευταία παράμετρος). Εφόσον η στοίβα μειώνεται, η πρώτη από τις επιπλέον παραμέτρους (πραγματικά η έβδομη παράμετρος) αποθηκεύεται στη χαμηλότερη διεύθυνση (αυτή η αντιστροφή παραμέτρων χρησιμοποιήθηκε ιστορικά για να επιτρέψει στις συναρτήσεις (υπορουτίνες) να περάσουν με μεταβλητό αριθμό παραμέτρων).

3. Για να καλέσετε την υπορουτίνα (διαδικασία), χρησιμοποιήστε την οδηγία κλήσης. Αυτή η οδηγία τοποθετεί τη διεύθυνση επιστροφής πάνω από τις παραμέτρους στη στοίβα (χαμηλότερη θέση) και τις διακλαδώσεις στον κωδικό υπορουτίνας.

4. Αφού επιστρέψει η υπορουτίνα (δηλαδή αμέσως μετά την εντολή κλήσης), ο καλών πρέπει να αφαιρέσει τυχόν πρόσθετες παραμέτρους (πέρα από τις έξι που είναι αποθηκευμένες σε καταχωρητές) από τη στοίβα. Αυτό επαναφέρει τη στοίβα στην κατάστασή της πριν από την εκτέλεση της κλήσης.

5. Ο καλών μπορεί να περιμένει να βρει την επιστρεφόμενη τιμή (διεύθυνση) της υπορουτίνας στον καταχωρητή RAX.

6. Ο καλών επαναφέρει τα περιεχόμενα των καταχωρητών που έχουν αποθηκευτεί από τον καλούντα (R10, R11 και οποιονδήποτε από τους καταχωρητές διέλευσης παραμέτρων) βγάζοντάς τους από τη στοίβα. Ο καλών μπορεί να υποθέσει ότι κανένας άλλος καταχωρητής δεν τροποποιήθηκε από την υπορουτίνα.

Λόγω του τρόπου με τον οποίο είναι δομημένη η σύμβαση κλήσης, συνήθως συμβαίνει ότι ορισμένα (ή τα περισσότερα) από αυτά τα βήματα δεν θα κάνουν αλλαγές στη στοίβα. Για παράδειγμα, εάν υπάρχουν έξι ή λιγότερες παράμετροι, τίποτα δεν προωθείται στη στοίβα σε αυτό το βήμα. Ομοίως, οι προγραμματιστές (και οι μεταγλωττιστές) τυπικά διατηρούν τα αποτελέσματα που τους ενδιαφέρουν εκτός των καταχωρητών που αποθηκεύονται από καλούντες στα βήματα 1 και 6 για να αποτρέψουν τις υπερβολικές ωθήσεις και αναρριχήσεις.

Υπάρχουν δύο άλλοι τρόποι μεταβίβασης των παραμέτρων σε μια υπορουτίνα, αλλά αυτοί δεν θα εξεταστούν σε αυτό το διαδικτυακό μάθημα καριέρας. Ένας από αυτούς χρησιμοποιεί την ίδια τη στοίβα αντί για τους καταχωρητές γενικής χρήσης.

Οι κανόνες του Callee

Ο ορισμός της καλούμενης υπορουτίνας πρέπει να ακολουθεί τους ακόλουθους κανόνες:

1. Εκχωρήστε τις τοπικές μεταβλητές (μεταβλητές που αναπτύσσονται στο πλαίσιο της διαδικασίας) χρησιμοποιώντας τους καταχωρητές ή κάνοντας χώρο στη στοίβα. Θυμηθείτε ότι η στοίβα μεγαλώνει προς τα κάτω. Έτσι, για να δημιουργήσετε χώρο στην κορυφή της στοίβας, ο δείκτης στοίβας θα πρέπει να μειωθεί. Το ποσό κατά το οποίο μειώνεται ο δείκτης στοίβας εξαρτάται από τον απαιτούμενο αριθμό τοπικών μεταβλητών. Για παράδειγμα, εάν απαιτείται τοπικό float και τοπικό long (συνολικά 12 byte), ο δείκτης στοίβας πρέπει να μειωθεί κατά 12 για να δημιουργηθεί χώρος για αυτές τις τοπικές μεταβλητές. Σε μια γλώσσα υψηλού επιπέδου όπως η C, αυτό σημαίνει να δηλώσετε τις μεταβλητές χωρίς να εκχωρήσετε (αρχικοποιήσετε) τις τιμές.

2. Στη συνέχεια, πρέπει να αποθηκευτούν οι τιμές τυχόν καταχωρητών που είναι οι καθορισμένοι καλούμενοι-αποθηκευμένοι (οι καταχωρητές γενικού σκοπού που δεν αποθηκεύονται από τον καλούντα) που χρησιμοποιούνται από τη συνάρτηση. Για να αποθηκεύσετε τους καταχωρητές, σπρώξτε τους στη στοίβα. Οι καταχωρητές που αποθηκεύονται από τον καλούμενο είναι RBX, RBP και R12 έως R15 (το RSP διατηρείται επίσης από τη σύμβαση κλήσης, αλλά δεν χρειάζεται να ωθηθεί στη στοίβα κατά τη διάρκεια αυτού του βήματος).

Αφού εκτελεστούν αυτές οι τρεις ενέργειες, μπορεί να προχωρήσει η πραγματική λειτουργία της υπορουτίνας. Όταν η υπορουτίνα είναι έτοιμη να επιστρέψει, οι κανόνες της σύμβασης κλήσης συνεχίζονται.

3. Όταν ολοκληρωθεί η υπορουτίνα, η τιμή επιστροφής για την υπορουτίνα θα πρέπει να τοποθετηθεί σε RAX εάν δεν υπάρχει ήδη.

4. Η υπορουτίνα πρέπει να επαναφέρει τις παλιές τιμές οποιωνδήποτε καταχωρητών που έχουν αποθηκευτεί από τον καλούμενο (RBX, RBP και R12 έως R15) που τροποποιήθηκαν. Τα περιεχόμενα του καταχωρητή αποκαθίστανται με την ανάδυσή τους από τη στοίβα. Σημειώστε ότι οι καταχωρητές θα πρέπει να εμφανίζονται με την αντίστροφη σειρά που ωθήθηκαν.

5. Στη συνέχεια, κατανείμουμε τις τοπικές μεταβλητές. Ο ευκολότερος τρόπος για να το κάνετε αυτό είναι να προσθέσετε στο RSP το ίδιο ποσό που αφαιρέθηκε από αυτό στο βήμα 1.

6. Τέλος, επιστρέφουμε στον καλούντα εκτελώντας μια εντολή ret. Αυτή η οδηγία θα βρει και θα αφαιρέσει την κατάλληλη διεύθυνση επιστροφής από τη στοίβα.

Ένα παράδειγμα του σώματος μιας υπορουτίνας καλούντος για να καλέσετε μια άλλη υπορουτίνα που είναι 'myFunc' είναι το εξής (διαβάστε τα σχόλια):

; Θέλετε να καλέσετε μια συνάρτηση 'myFunc' που διαρκεί τρεις
; ακέραιος παράμετρος. Η πρώτη παράμετρος είναι σε RAX.
; Δεύτερη παράμετρος είναι η σταθερά 456. Τρίτη
; η παράμετρος βρίσκεται στη θέση μνήμης 'varibl'

ώθηση rdi ; Το rdi θα είναι παράμετρο, οπότε αποθηκεύεται
; long retVal = myFunc ( x , 456 , z ) ;

mov rdi, rax; βάλτε την πρώτη παράμετρο στο RDI
mov rsi, 456; βάλτε δεύτερη παράμετρο στο RSI
mov rdx , [variabl] ; βάλτε τρίτη παράμετρο στο RDX

καλέστε το myFunc; καλέστε τη συνάρτηση

pop rdi ; επαναφέρετε την αποθηκευμένη τιμή RDI
; Η επιστρεφόμενη τιμή του myFunc είναι πλέον διαθέσιμη στο RAX

Ένα παράδειγμα μιας συνάρτησης καλούμενου (myFunc) είναι (διαβάστε τα σχόλια):

myFunc:
; ∗∗∗ Τυπικός πρόλογος υπορουτίνας ∗∗∗
sub rsp, 8 ; χώρος για μια τοπική μεταβλητή 64-bit (αποτέλεσμα) χρησιμοποιώντας τον «υπο» κωδικό

ώθηση rbx ; αποθήκευση καταχωρητών καλούμενου-αποθήκευση
ώθηση rbp ; και τα δύο θα χρησιμοποιηθούν από το myFunc

; ∗∗∗ Υπο-ρουτίνα Σώμα ∗∗∗
mov rax, rdi; παράμετρος 1 σε RAX
mov rbp, rsi; παράμετρος 2 σε RBP
mov rbx, rdx; παράμετρος 3 έως rb x
mov [rsp + 1 6], rbx; βάλτε το rbx στην τοπική μεταβλητή
προσθέστε [rsp + 1 6], rbp; προσθέστε rbp στην τοπική μεταβλητή
mov rax, [rsp +16]; mov περιεχόμενα της τοπικής μεταβλητής σε RAX
; (επιστρεφόμενη τιμή/τελικό αποτέλεσμα)

; ∗∗∗ Τυπικός επίλογος υπορουτίνας ∗∗∗
pop rbp ; ανάκτηση καλούμενου αποθήκευση καταχωρητών
ποπ rbx ; αντίστροφα όταν πιέζεται
προσθήκη rsp, 8 ; κατανομή τοπικής μεταβλητής (ες). 8 σημαίνει 8 byte
ret ; pop top value από τη στοίβα, μεταβείτε εκεί

6.39 Διακοπές και εξαιρέσεις για το x64

Ο επεξεργαστής παρέχει δύο μηχανισμούς για τη διακοπή της εκτέλεσης του προγράμματος, τις διακοπές και τις εξαιρέσεις:

  • Μια διακοπή είναι ένα ασύγχρονο συμβάν (μπορεί να συμβεί ανά πάσα στιγμή) που συνήθως ενεργοποιείται από μια συσκευή I/O.
  • Μια εξαίρεση είναι ένα σύγχρονο συμβάν (συμβαίνει καθώς ο κώδικας εκτελείται, προγραμματίζεται εκ των προτέρων, με βάση κάποιο περιστατικό) που δημιουργείται όταν ο επεξεργαστής εντοπίζει μία ή περισσότερες προκαθορισμένες συνθήκες κατά την εκτέλεση μιας εντολής. Καθορίζονται τρεις κατηγορίες εξαιρέσεων: σφάλματα, παγίδες και ακυρώσεις.

Ο επεξεργαστής ανταποκρίνεται σε διακοπές και εξαιρέσεις ουσιαστικά με τον ίδιο τρόπο. Όταν σηματοδοτείται μια διακοπή ή μια εξαίρεση, ο επεξεργαστής σταματά την εκτέλεση του τρέχοντος προγράμματος ή εργασίας και μεταβαίνει σε μια διαδικασία χειριστή που είναι γραμμένη ειδικά για τη διαχείριση της συνθήκης διακοπής ή εξαίρεσης. Ο επεξεργαστής έχει πρόσβαση στη διαδικασία του χειριστή μέσω μιας καταχώρησης στον Πίνακα Περιγραφής Διακοπών (IDT). Όταν ο χειριστής έχει ολοκληρώσει τον χειρισμό της διακοπής ή της εξαίρεσης, ο έλεγχος προγράμματος επιστρέφεται στο πρόγραμμα ή την εργασία που έχει διακοπεί.

Το λειτουργικό σύστημα, τα εκτελεστικά προγράμματα οδήγησης ή/και τα προγράμματα οδήγησης συσκευών συνήθως χειρίζονται τις διακοπές και τις εξαιρέσεις ανεξάρτητα από τα προγράμματα ή τις εργασίες εφαρμογής. Τα προγράμματα εφαρμογής μπορούν, ωστόσο, να έχουν πρόσβαση στους χειριστές διακοπής και εξαίρεσης που είναι ενσωματωμένοι σε ένα λειτουργικό σύστημα ή να το εκτελούν μέσω των κλήσεων στη γλώσσα συγκρότησης.

Ορίζονται δεκαοκτώ (18) προκαθορισμένες διακοπές και εξαιρέσεις, οι οποίες σχετίζονται με εγγραφές στο IDT. Μπορούν επίσης να γίνουν και να συσχετιστούν με τον πίνακα διακόσιες είκοσι τέσσερις (224) διακοπές καθορισμένες από τον χρήστη. Κάθε διακοπή και εξαίρεση στο IDT προσδιορίζεται με έναν αριθμό που ονομάζεται «διάνυσμα». Ο Πίνακας 6.39.1 παραθέτει τις διακοπές και τις εξαιρέσεις με καταχωρήσεις στο IDT και τα αντίστοιχα διανύσματά τους. Τα διανύσματα 0 έως 8, 10 έως 14 και 16 έως 19 είναι οι προκαθορισμένες διακοπές και εξαιρέσεις. Τα διανύσματα 32 έως 255 είναι για τις διακοπές που καθορίζονται από το λογισμικό (χρήστης) οι οποίες είναι είτε για διακοπές λογισμικού είτε για διακοπές υλικού με δυνατότητα κάλυψης.

Όταν ο επεξεργαστής εντοπίζει μια διακοπή ή εξαίρεση, κάνει ένα από τα ακόλουθα:

  • Εκτελέστε μια σιωπηρή κλήση σε μια διαδικασία χειριστή
  • Εκτελέστε μια σιωπηρή κλήση σε μια εργασία χειριστή

6.4 Βασικές αρχές αρχιτεκτονικής υπολογιστή ARM 64-bit

Οι αρχιτεκτονικές ARM ορίζουν μια οικογένεια επεξεργαστών RISC που είναι κατάλληλοι για χρήση σε μεγάλη ποικιλία εφαρμογών. Το ARM είναι μια αρχιτεκτονική φόρτωσης/αποθήκευσης που απαιτεί τη φόρτωση των δεδομένων από τη μνήμη σε έναν καταχωρητή πριν από οποιαδήποτε επεξεργασία, όπως μια λειτουργία ALU (Arithmetic Logic Unit) με αυτό. Μια επόμενη εντολή αποθηκεύει το αποτέλεσμα πίσω στη μνήμη. Αν και αυτό μπορεί να φαίνεται σαν ένα βήμα πίσω από τις αρχιτεκτονικές x86 και x64, οι οποίες λειτουργούν απευθείας στους τελεστές στη μνήμη σε μία μόνο εντολή (χρησιμοποιώντας καταχωρητές επεξεργαστή, φυσικά), η προσέγγιση φόρτωσης/αποθήκευσης, στην πράξη, επιτρέπει αρκετές διαδοχικές λειτουργίες να εκτελεστεί με υψηλή ταχύτητα σε έναν τελεστή μόλις φορτωθεί σε έναν από τους πολλούς καταχωρητές επεξεργαστή. Οι επεξεργαστές ARM έχουν την επιλογή της μικρής ή της μεγάλης έντασης. Η προεπιλεγμένη ρύθμιση ARM 64 είναι λίγο-endian, η οποία είναι η διαμόρφωση που χρησιμοποιείται συνήθως από τα λειτουργικά συστήματα. Η αρχιτεκτονική ARM 64 bit είναι σύγχρονη και πρόκειται να αντικαταστήσει την αρχιτεκτονική ARM των 32 bit.

Σημείωση : Κάθε εντολή για το 64-bit ARM µP έχει μήκος 4 byte (32 bit).

6.41 Το σετ καταχωρητή ARM 64-bit
Υπάρχουν 31 καταχωρητές γενικής χρήσης 64-bit για το ARM µP 64-bit. Το παρακάτω διάγραμμα δείχνει τα μητρώα γενικής χρήσης και ορισμένους σημαντικούς καταχωρητές:


Εικ.4.11.1 Γενικός σκοπός 64 bit και ορισμένοι σημαντικοί καταχωρητές

Τα μητρώα γενικής χρήσης αναφέρονται ως X0 έως X30. Το πρώτο τμήμα 32-bit για κάθε καταχωρητή αναφέρεται ως W0 έως W30. Όταν δεν δίνεται έμφαση στη διαφορά μεταξύ 32 bit και 64 bit, χρησιμοποιείται το πρόθεμα 'R'. Για παράδειγμα, το R14 αναφέρεται σε W14 ή X14.

Το 6502 µP διαθέτει μετρητή προγράμματος 16-bit και μπορεί να απευθυνθεί στο 2 16 θέσεις byte μνήμης. Το 64-bit ARM µP διαθέτει μετρητή προγράμματος 64-bit και μπορεί να διευθύνει έως και 2 64 = 1,844674407 x 1019 (στην πραγματικότητα 18,446,744,073,709,551,616) θέσεις byte μνήμης. Ο μετρητής προγράμματος διατηρεί τη διεύθυνση της επόμενης εντολής που θα εκτελεστεί. Το μήκος της εντολής του ARM64 ή του AArch64 είναι συνήθως τέσσερα byte. Ο επεξεργαστής αυξάνει αυτόματα αυτόν τον καταχωρητή κατά τέσσερα μετά την ανάκτηση κάθε εντολής από τη μνήμη.

Ο καταχωρητής Stack Pointer ή SP δεν συγκαταλέγεται στους 31 καταχωρητές γενικού σκοπού. Ο δείκτης στοίβας οποιασδήποτε αρχιτεκτονικής δείχνει την τελευταία καταχώρηση στοίβας στη μνήμη. Για το ARM-64, η στοίβα αυξάνεται προς τα κάτω.

Το 6502 µP διαθέτει καταχωρητή κατάστασης επεξεργαστή 8-bit. Το ισοδύναμο στο ARM64 ονομάζεται καταχωρητής PSTATE. Αυτός ο καταχωρητής αποθηκεύει τις σημαίες που χρησιμοποιούνται για τα αποτελέσματα των λειτουργιών και για τον έλεγχο του επεξεργαστή (μP). Έχει πλάτος 32 bit. Ο παρακάτω πίνακας δίνει τα ονόματα, το ευρετήριο και τις έννοιες για τα bit που χρησιμοποιούνται συνήθως στον καταχωρητή PSTATE:

Πίνακας 6.41.1
Πιο χρησιμοποιούμενες σημαίες PSTATE (bit)
Σύμβολο Κομμάτι Σκοπός
Μ 0-3 Λειτουργία: Το τρέχον επίπεδο προνομίου εκτέλεσης (USR, SVC και ούτω καθεξής).
Τ 4 Thumb: Ρυθμίζεται εάν το σετ εντολών T32 (Thumb) είναι ενεργό. Εάν είναι καθαρό, το σετ εντολών ARM είναι ενεργό. Ο κωδικός χρήστη μπορεί να ορίσει και να διαγράψει αυτό το bit.
ΚΑΙ 9 Endianness: Η ρύθμιση αυτού του bit ενεργοποιεί τη λειτουργία big-endian. Εάν είναι σαφές, η λειτουργία μικρής έντασης είναι ενεργή. Η προεπιλογή είναι η λειτουργία small-endian.
Q 27 Σημαία αθροιστικού κορεσμού: Ορίζεται εάν, σε κάποιο σημείο σε μια σειρά λειτουργιών, συμβεί υπερχείλιση ή κορεσμός
ΣΕ 28 Σημαία υπερχείλισης: Ορίζεται εάν η λειτουργία οδήγησε σε υπογεγραμμένη υπερχείλιση.
ντο 29 Σημαία μεταφοράς: Υποδεικνύει εάν η πρόσθεση παρήγαγε μεταφορά ή η αφαίρεση παρήγαγε δάνειο.
ΜΕ 30 Σημαία μηδέν: Ορίζεται εάν το αποτέλεσμα μιας πράξης είναι μηδέν.
Ν 31 Αρνητική σημαία: Ορίζεται εάν το αποτέλεσμα μιας λειτουργίας είναι αρνητικό.

Το ARM-64 µP έχει πολλούς άλλους καταχωρητές.

SIMD
Το SIMD σημαίνει Single Instruction, Multiple Data. Αυτό σημαίνει ότι μια εντολή γλώσσας συγκρότησης μπορεί να ενεργεί σε πολλά δεδομένα ταυτόχρονα σε έναν μικροεπεξεργαστή. Υπάρχουν τριάντα δύο καταχωρητές πλάτους 128 bit για χρήση με λειτουργίες SIMD και κινητής υποδιαστολής.

6.42 Χαρτογράφηση μνήμης
Η RAM και η DRAM είναι και οι δύο Μνήμες τυχαίας πρόσβασης. Η DRAM λειτουργεί πιο αργά από τη μνήμη RAM. Η DRAM είναι φθηνότερη από τη μνήμη RAM. Εάν υπάρχουν περισσότερα από 32 gigabyte (GB) συνεχούς μνήμης DRAM στη μνήμη, θα υπάρξουν περισσότερα προβλήματα διαχείρισης μνήμης: 32 GB = 32 x 1024 x 1024 x 1024 byte. Για ολόκληρο χώρο μνήμης που είναι πολύ μεγαλύτερος από 32 GB, η μνήμη DRAM άνω των 32 GB θα πρέπει να είναι διάσπαρτη με RAM για καλύτερη διαχείριση της μνήμης. Για να κατανοήσετε τον χάρτη μνήμης ARM-64, θα πρέπει πρώτα να κατανοήσετε τον χάρτη μνήμης 4 GB για την κεντρική μονάδα επεξεργασίας ARM (CPU) 32 bit. CPU σημαίνει μP. Για έναν υπολογιστή 32 bit, ο μέγιστος διαθέσιμος χώρος στη μνήμη είναι 2 32 = 4 x 2 10 x 2 10 x 2 10 = 4 x 1024 x 1024 x 1024 = 4.294.967.296 = 4 GB.

Χάρτης μνήμης ARM 32 bit
Ο χάρτης μνήμης για ένα ARM 32-bit είναι:

Για έναν υπολογιστή 32 bit, το μέγιστο μέγεθος ολόκληρης της μνήμης είναι 4 GB. Από τη διεύθυνση 0 GB έως τη διεύθυνση 1 GB είναι οι θέσεις ROM Operating System, RAM και I/O. Η όλη ιδέα των διευθύνσεων ROM OS, RAM και I/O είναι παρόμοια με την κατάσταση του Commodore-64 με μια πιθανή CPU 6502. Το OS ROM για το Commodore-64 βρίσκεται στο επάνω μέρος του χώρου μνήμης. Το λειτουργικό σύστημα ROM εδώ είναι πολύ μεγαλύτερο από αυτό του Commodore-64 και βρίσκεται στην αρχή ολόκληρου του χώρου διευθύνσεων της μνήμης. Σε σύγκριση με άλλους σύγχρονους υπολογιστές, το λειτουργικό σύστημα ROM εδώ είναι πλήρες, με την έννοια ότι είναι συγκρίσιμο με την ποσότητα του λειτουργικού συστήματος στους σκληρούς δίσκους τους. Υπάρχουν δύο κύριοι λόγοι για τους οποίους υπάρχει το λειτουργικό σύστημα στα ολοκληρωμένα κυκλώματα ROM: 1) Οι επεξεργαστές ARM χρησιμοποιούνται κυρίως σε μικρές συσκευές όπως τα smartphone. Πολλοί σκληροί δίσκοι είναι μεγαλύτεροι από smartphone και άλλες μικρές συσκευές, 2) για ασφάλεια. Όταν το λειτουργικό σύστημα βρίσκεται στη μνήμη μόνο για ανάγνωση, δεν μπορεί να καταστραφεί (αντικαταστάθηκαν εξαρτήματα) από χάκερ. Τα τμήματα RAM και τα τμήματα εισόδου/εξόδου είναι επίσης πολύ μεγάλα σε σύγκριση με αυτά του Commodore-64.

Όταν ενεργοποιείται η τροφοδοσία με το λειτουργικό σύστημα ROM 32-bit, το λειτουργικό σύστημα πρέπει να ξεκινά (εκκίνηση από) τη διεύθυνση 0x00000000 ή τη διεύθυνση 0xFFFF0000 εάν είναι ενεργοποιημένο το HiVECs. Έτσι, όταν ενεργοποιείται η τροφοδοσία μετά τη φάση επαναφοράς, το υλικό της CPU φορτώνει 0x00000000 ή 0xFFFF0000 στον μετρητή προγράμματος. Το πρόθεμα '0x' σημαίνει Δεκαεξαδικό. Η διεύθυνση εκκίνησης των CPU ARMv8 64bit είναι μια καθορισμένη υλοποίηση. Ωστόσο, ο συγγραφέας συμβουλεύει τον μηχανικό υπολογιστών να ξεκινήσει από 0x00000000 ή 0xFFFF0000 για λόγους συμβατότητας προς τα πίσω.

Από 1 GB έως 2 GB είναι η αντιστοιχισμένη είσοδος/έξοδος. Υπάρχει μια διαφορά μεταξύ του αντιστοιχισμένου I/O και του μόνο I/O που βρίσκεται μεταξύ 0GB και 1GB. Με το I/O, η διεύθυνση για κάθε θύρα είναι σταθερή όπως στο Commodore-64. Με αντιστοιχισμένα I/O, η διεύθυνση για κάθε θύρα δεν είναι απαραίτητα η ίδια για κάθε λειτουργία του υπολογιστή (δυναμική).

Από 2 GB έως 4 GB είναι DRAM. Αυτή είναι η αναμενόμενη (ή συνηθισμένη) μνήμη RAM. Το DRAM σημαίνει Dynamic RAM, δεν είναι η αίσθηση μιας αλλαγής διεύθυνσης κατά τη λειτουργία του υπολογιστή, αλλά με την έννοια ότι η τιμή κάθε κελιού στη φυσική μνήμη RAM πρέπει να ανανεώνεται σε κάθε παλμό ρολογιού.

Σημείωση :

  • Από 0x0000,0000 έως 0x0000, το FFFF είναι το OS ROM.
  • Από 0x0001,0000 έως 0x3FFF, FFFF, μπορεί να υπάρχει περισσότερη ROM, μετά RAM και μετά κάποια I/O.
  • Από 0x4000,0000 έως 0x7FFF, FFFF, επιτρέπεται επιπλέον I/O ή/και αντιστοιχισμένη I/O.
  • Από 0x8000.0000 έως 0xFFFF, FFFF είναι η αναμενόμενη DRAM.

Αυτά σημαίνουν ότι η αναμενόμενη DRAM δεν χρειάζεται να ξεκινά από το όριο της μνήμης των 2 GB, στην πράξη. Γιατί να σέβεται ο προγραμματιστής τα ιδανικά όρια όταν δεν υπάρχουν αρκετές φυσικές τράπεζες RAM που έχουν τοποθετηθεί στη μητρική πλακέτα; Αυτό συμβαίνει επειδή ο πελάτης δεν έχει αρκετά χρήματα για όλες τις τράπεζες RAM.

Χάρτης μνήμης ARM 36 bit
Για έναν υπολογιστή ARM 64 bit, και τα 32 bit χρησιμοποιούνται για την αντιμετώπιση ολόκληρης της μνήμης. Για έναν υπολογιστή ARM 64 bit, τα πρώτα 36 bit μπορούν να χρησιμοποιηθούν για την αντιμετώπιση ολόκληρης της μνήμης που, σε αυτήν την περίπτωση, είναι 2 36 = 68.719.476.736 = 64 GB. Αυτή είναι ήδη πολλή μνήμη. Οι συνηθισμένοι υπολογιστές σήμερα δεν χρειάζονται αυτή την ποσότητα μνήμης. Αυτό δεν είναι ακόμη μέχρι το μέγιστο εύρος μνήμης που μπορεί να προσπελαστεί με 64 bit. Ο χάρτης μνήμης για 36-bit για την CPU ARM είναι:

Από τη διεύθυνση 0 GB έως τη διεύθυνση 4 GB είναι ο χάρτης μνήμης 32 bit. «Δεσμευμένο» σημαίνει ότι δεν χρησιμοποιείται και διατηρείται για μελλοντική χρήση. Δεν χρειάζεται να είναι φυσικές τράπεζες μνήμης που έχουν τοποθετηθεί στη μητρική πλακέτα για αυτόν τον χώρο. Εδώ, η μνήμη DRAM και η αντιστοιχισμένη είσοδος/έξοδος έχουν τις ίδιες έννοιες όπως για τον χάρτη μνήμης 32-bit.

Στην πράξη μπορεί να βρεθεί η ακόλουθη κατάσταση:

  • 0x1 0000 0000 – 0x3 FFFF FFFF; κατοχυρωμένα. 12 GB χώρου διευθύνσεων έχει δεσμευτεί για μελλοντική χρήση.
  • 0x4 0000 0000 – 0x7 FFFF FFFF; αντιστοίχιση εισόδου/εξόδου. Διατίθενται 16 GB χώρου διευθύνσεων για δυναμικά αντιστοιχισμένες I/O.
  • 0x8 0000 0000 – 0x8 7FFF FFFF FFFF; Τρύπα ή DRAM. 2 GB χώρου διευθύνσεων μπορεί να περιέχει ένα από τα ακόλουθα:
    • Τρύπα για να ενεργοποιήσετε το διαμέρισμα της συσκευής DRAM (όπως περιγράφεται στην ακόλουθη συζήτηση).
    • ΔΡΑΜΙ.
  • 0x8 8000 0000 – 0xF FFFF FFFF; ΔΡΑΜΙ. 30 GB χώρου διευθύνσεων για DRAM.

Αυτός ο χάρτης μνήμης είναι ένα υπερσύνολο του χάρτη διευθύνσεων 32 bit, με τον πρόσθετο χώρο να χωρίζεται ως 50% DRAM (1/2) με μια προαιρετική οπή σε αυτό και 25% αντιστοιχισμένο χώρο εισόδου/εξόδου και δεσμευμένο χώρο (1/4 ). Το υπόλοιπο 25% (1/4) είναι για τον χάρτη μνήμης 32 bit ½ + ¼ + ¼ = 1.

Σημείωση : Από 32 bit έως 360 bit είναι μια προσθήκη 4 bit στην πιο σημαντική πλευρά των 36 bit.

Χάρτης μνήμης 40 bit
Ο χάρτης διευθύνσεων 40 bit είναι ένα υπερσύνολο του χάρτη διευθύνσεων 36 bit και ακολουθεί το ίδιο μοτίβο 50% DRAM μιας προαιρετικής οπής σε αυτό, 25% αντιστοιχισμένου χώρου εισόδου/εξόδου και δεσμευμένου χώρου και το υπόλοιπο 25% χώρο για τον προηγούμενο χάρτη μνήμης (36-bit). Το διάγραμμα για τον χάρτη μνήμης είναι:

Το μέγεθος της τρύπας είναι 544 – 512 = 32 GB. Στην πράξη μπορεί να βρεθεί η ακόλουθη κατάσταση:

  • 0x10 0000 0000 – 0x3F FFFF FFFF; κατοχυρωμένα. 192 GB χώρου διευθύνσεων είναι δεσμευμένα για μελλοντική χρήση.
  • 0x40 0000 0000 – 0x7F FFFF FFFF; χαρτογραφημένος. I/O Διατίθεται χώρος διευθύνσεων 256 GB για δυναμικά αντιστοιχισμένες εισόδους/εξόδους.
  • 0x80 0000 0000 – 0x87 FFFF FFFF; τρύπα ή DRAM. Ο χώρος διευθύνσεων 32 GB μπορεί να περιέχει ένα από τα ακόλουθα:
    • Τρύπα για να ενεργοποιήσετε το διαμέρισμα της συσκευής DRAM (όπως περιγράφεται στην ακόλουθη συζήτηση)
    • ΔΡΑΜΙ
  • 0x88 0000 0000 – 0xFF FFFF FFFF; ΔΡΑΜΙ. 480 GB χώρου διευθύνσεων για DRAM.

Σημείωση : Από 36 bit έως 40 bit είναι μια προσθήκη 4 bit στην πιο σημαντική πλευρά των 36 bit.

DRAM Τρύπα
Στον χάρτη μνήμης πέρα ​​από τα 32 bit, είναι είτε μια τρύπα DRAM είτε μια συνέχεια της DRAM από την κορυφή. Όταν πρόκειται για τρύπα, πρέπει να εκτιμηθεί ως εξής: Η οπή DRAM παρέχει έναν τρόπο διαμερισμού μιας μεγάλης συσκευής DRAM σε πολλαπλές περιοχές διευθύνσεων. Η προαιρετική οπή DRAM προτείνεται στην αρχή του ανώτερου ορίου διεύθυνσης DRAM. Αυτό επιτρέπει ένα απλοποιημένο σχήμα αποκωδικοποίησης κατά την κατάτμηση μιας συσκευής DRAM μεγάλης χωρητικότητας στην κατώτερη περιοχή με φυσική διεύθυνση.

Για παράδειγμα, ένα τμήμα DRAM 64 GB υποδιαιρείται σε τρεις περιοχές με τις μετατοπίσεις διευθύνσεων να εκτελούνται με μια απλή αφαίρεση στα bit διεύθυνσης υψηλής τάξης ως εξής:

Πίνακας 6.42.1
Παράδειγμα διαχωρισμού 64 GB DRAM με οπές
Φυσικές διευθύνσεις στο SoC Αντισταθμίζεται Εσωτερική διεύθυνση DRAM
2 GByte (χάρτης 32 bit) 0x00 8000 0000 – 0x00 FFFF FFFF -0x00 8000 0000 0x00 0000 0000 – 0x00 7FFF FFFF
30 GByte (χάρτης 36 bit) 0x08 8000 0000 – 0x0F FFFF FFFF -0x08 0000 0000 0x00 8000 0000 – 0x07 FFFF FFFF
32 GByte (χάρτης 40 bit) 0x88 0000 0000 – 0x8F FFFF FFFF -0x80 0000 0000 0x08 0000 0000 – 0x0F FFFF FFFF

Προτεινόμενοι χάρτες μνήμης με διευθύνσεις 44 bit και 48 bit για επεξεργαστές ARM
Ας υποθέσουμε ότι ένας Προσωπικός Υπολογιστής έχει 1024 GB (= 1 TB) μνήμης. αυτό είναι πάρα πολύ μνήμη. Και έτσι, οι χάρτες μνήμης διευθύνσεων 44-bit και 48-bit για επεξεργαστές ARM για 16 TB και 256 TB, αντίστοιχα, είναι απλώς προτάσεις για μελλοντικές ανάγκες υπολογιστή. Στην πραγματικότητα, αυτές οι προτάσεις για τους επεξεργαστές ARM ακολουθούν την ίδια διαίρεση της μνήμης κατά αναλογία με τους προηγούμενους χάρτες μνήμης. Δηλαδή: 50% DRAM με προαιρετική τρύπα, 25% αντιστοιχισμένος χώρος εισόδου/εξόδου και δεσμευμένος χώρος και το υπόλοιπο 25% για τον προηγούμενο χάρτη μνήμης.

Οι χάρτες μνήμης διευθύνσεων 52-bit, 56-bit, 60-bit και 64-bit πρόκειται να προταθούν ακόμη για τα bit ARM 64 για το απώτερο μέλλον. Εάν οι επιστήμονες εκείνη τη στιγμή εξακολουθούν να βρίσκουν χρήσιμο το διαχωρισμό 50 : 25 : 25 ολόκληρου του χώρου μνήμης, θα διατηρήσουν την αναλογία.

Σημείωση : Το SoC σημαίνει System-on-Chip που αναφέρεται σε κυκλώματα στο μP chip τα οποία διαφορετικά δεν θα υπήρχαν.

Η SRAM ή η στατική μνήμη τυχαίας πρόσβασης είναι ταχύτερη από την πιο παραδοσιακή μνήμη DRAM, αλλά απαιτεί περισσότερη επιφάνεια πυριτίου. Η SRAM δεν απαιτεί ανανέωση. Ο αναγνώστης μπορεί να φανταστεί τη μνήμη RAM ως SRAM.

6.43 Λειτουργίες διευθυνσιοδότησης γλώσσας συναρμολόγησης για ARM 64
Το ARM είναι μια αρχιτεκτονική φόρτωσης/αποθήκευσης που απαιτεί τη φόρτωση των δεδομένων από τη μνήμη σε έναν καταχωρητή επεξεργαστή προτού πραγματοποιηθεί οποιαδήποτε επεξεργασία, όπως μια Αριθμητική Λογική Πράξη. Μια επόμενη εντολή αποθηκεύει το αποτέλεσμα πίσω στη μνήμη. Αν και αυτό μπορεί να φαίνεται σαν ένα βήμα πίσω από το x86 και τις επακόλουθες αρχιτεκτονικές του x64, οι οποίες λειτουργούν απευθείας στους τελεστές στη μνήμη σε μία μόνο εντολή, στην πράξη, η προσέγγιση φόρτωσης/αποθήκευσης επιτρέπει την εκτέλεση πολλών διαδοχικών λειτουργιών με υψηλή ταχύτητα σε ένας τελεστής μόλις φορτωθεί σε έναν από τους πολλούς καταχωρητές επεξεργαστή.

Η μορφή της γλώσσας συναρμολόγησης ARM έχει ομοιότητες και διαφορές με τη σειρά x64 (x86).

  • Αντισταθμίζεται : Μια υπογεγραμμένη σταθερά μπορεί να προστεθεί στον βασικό καταχωρητή. Η μετατόπιση πληκτρολογείται ως μέρος της εντολής. Για παράδειγμα: ldr x0, [rx, #10] φορτώνει το r0 με τη λέξη στη διεύθυνση r1+10.
  • Κανω ΕΓΓΡΑΦΗ : Μια ανυπόγραφη αύξηση που είναι αποθηκευμένη σε έναν καταχωρητή μπορεί να προστεθεί ή να αφαιρεθεί από την τιμή σε έναν βασικό καταχωρητή. Για παράδειγμα: ldr r0, [x1, x2] φορτώνει το r0 με τη λέξη στη διεύθυνση x1+x2. Οποιοσδήποτε από τους καταχωρητές μπορεί να θεωρηθεί ως ο βασικός καταχωρητής.
  • Κλιμακωμένο μητρώο : Μια αύξηση σε έναν καταχωρητή μετατοπίζεται αριστερά ή δεξιά κατά έναν καθορισμένο αριθμό θέσεων bit πριν προστεθεί ή αφαιρεθεί από την τιμή του βασικού καταχωρητή. Για παράδειγμα: ldr x0, [x1, x2, lsl #3] φορτώνει το r0 με τη λέξη στη διεύθυνση r1+(r2×8). Η μετατόπιση μπορεί να είναι μια λογική μετατόπιση προς τα αριστερά ή προς τα δεξιά (lsl ή lsr) που εισάγει μηδενικά bit στις κενές θέσεις bit ή μια αριθμητική δεξιά μετατόπιση (asr) που αναπαράγει το bit πρόσημου στις κενές θέσεις.

Όταν εμπλέκονται δύο τελεστές, ο προορισμός βρίσκεται πριν (στα αριστερά) από την πηγή (υπάρχουν ορισμένες εξαιρέσεις σε αυτό). Οι κωδικοί λειτουργίας για τη γλώσσα συναρμολόγησης ARM δεν έχουν διάκριση πεζών-κεφαλαίων.

Άμεση λειτουργία διεύθυνσης ARM64
Παράδειγμα:

mov r0, #0xFF000000 ; Φορτώστε την τιμή 32-bit FF000000h στο r0

Μια δεκαδική τιμή είναι χωρίς 0x αλλά εξακολουθεί να προηγείται το #.

Εγγραφείτε απευθείας
Παράδειγμα:

mov x0, x1 ; Αντιγράψτε το x1 στο x0

Εγγραφή Έμμεση
Παράδειγμα:

str x0, [x3] ; Αποθηκεύστε το x0 στη διεύθυνση στο x3

Εγγραφή Indirect με Offset
Παραδείγματα:

ldr x0, [x1, #32] ; Φορτώστε το r0 με την τιμή στη διεύθυνση [r1+32]. Το r1 είναι ο βασικός καταχωρητής
str x0, [x1, #4] ; Αποθηκεύστε το r0 στη διεύθυνση [r1+4]. r1 είναι ο βασικός καταχωρητής. οι αριθμοί είναι η βάση 10

Εγγραφή Έμμεσης με Offset (Προαυξημένη)
Παραδείγματα:

ldr x0, [x1, #32]! ; Φορτώστε το r0 με [r1+32] και ενημερώστε το r1 σε (r1+32)
str x0, [x1, #4]! ; Αποθηκεύστε το r0 σε [r1+4] και ενημερώστε το r1 σε (r1+4)

Σημειώστε τη χρήση του '!' σύμβολο.

Εγγραφή Έμμεσης με Μετατόπιση (Μετα-αύξηση)
Παραδείγματα:

ldr x0, [x1], #32 ; Φορτώστε το [x1] σε x0 και, στη συνέχεια, ενημερώστε το x1 σε (x1+32)
str x0, [x1], #4 ; Αποθηκεύστε το x0 σε [x1] και, στη συνέχεια, ενημερώστε το x1 σε (x1+4)

Διπλή εγγραφή Έμμεση
Η διεύθυνση του τελεστή είναι το άθροισμα ενός καταχωρητή βάσης και ενός καταχωρητή αύξησης. Τα ονόματα του μητρώου περιβάλλονται από αγκύλες.
Παραδείγματα:

ldr x0, [x1, x2] ; Φόρτωση x0 με [x1+x2]
str x0, [rx, x2] ; Αποθήκευση x0 έως [x1+x2]

Σχετική λειτουργία διεύθυνσης
Στη λειτουργία σχετικής διευθυνσιοδότησης, η αποτελεσματική εντολή είναι η επόμενη εντολή στον μετρητή προγράμματος, συν ένα ευρετήριο. Ο δείκτης μπορεί να είναι θετικός ή αρνητικός.
Παράδειγμα:

ldr x0, [pc, #24]

Αυτό σημαίνει τον καταχωρητή φόρτωσης X0 με τη λέξη που υποδεικνύεται από το περιεχόμενο του υπολογιστή συν 24.

6.44 Ορισμένες κοινά χρησιμοποιούμενες οδηγίες για το ARM 64
Ακολουθούν οι κοινές οδηγίες:

6,45 Βρόχος

Απεικόνιση
Ο ακόλουθος κώδικας προσθέτει συνεχώς την τιμή στον καταχωρητή X10 στην τιμή του X9 έως ότου η τιμή στο X8 μηδενιστεί. Ας υποθέσουμε ότι όλες οι τιμές είναι ακέραιοι. Η τιμή στο X8 αφαιρείται κατά 1 σε κάθε επανάληψη:

βρόχος:
CBZ X8, παραλείψτε
ΠΡΟΣΘΗΚΗ X9, X9, X10 ; πρώτο το X9 είναι ο προορισμός και το δεύτερο το X9 είναι η πηγή
SUB X8, X8, #1 ; πρώτο το X8 είναι ο προορισμός και το δεύτερο το X8 είναι η πηγή
Βρόχος Β
παραλείπω:

Όπως και με το 6502 µP και το X64 µP, η ετικέτα στο ARM 64 µP ξεκινά από την αρχή της γραμμής. Οι υπόλοιπες οδηγίες ξεκινούν σε ορισμένα κενά μετά την αρχή της γραμμής. Με x64 και ARM 64, η ετικέτα ακολουθείται από άνω και κάτω τελεία και μια νέα γραμμή. Ενώ με το 6502, η ετικέτα ακολουθείται από μια οδηγία μετά από ένα κενό. Στον προηγούμενο κώδικα, η πρώτη εντολή που είναι 'CBZ X8, skip' σημαίνει ότι εάν η τιμή στο X8 είναι μηδέν, συνεχίστε στην ετικέτα 'skip:', παρακάμπτοντας τις ενδιάμεσες οδηγίες και συνεχίζοντας με τις υπόλοιπες οδηγίες παρακάτω 'παραλείπω:'. Το 'B loop' είναι ένα άνευ όρων άλμα στην ετικέτα 'loop'. Οποιοδήποτε άλλο όνομα ετικέτας μπορεί να χρησιμοποιηθεί στη θέση του 'loop'.

Έτσι, όπως με το 6502 μP, χρησιμοποιήστε τις οδηγίες διακλάδωσης για να έχετε έναν βρόχο με το ARM 64.

6,46 ARM 64 Είσοδος/Έξοδος
Όλα τα περιφερειακά ARM (εσωτερικές θύρες) είναι αντιστοιχισμένα στη μνήμη. Αυτό σημαίνει ότι η διεπαφή προγραμματισμού είναι ένα σύνολο καταχωρητών με διεύθυνση μνήμης (εσωτερικές θύρες). Η διεύθυνση ενός τέτοιου καταχωρητή είναι μια μετατόπιση από μια συγκεκριμένη διεύθυνση βάσης μνήμης. Αυτό είναι παρόμοιο με το πώς το 6502 κάνει την είσοδο/έξοδο. Το ARM δεν έχει την επιλογή για χωριστό χώρο διευθύνσεων I/O.

6.47 Στοίβα ARM 64
Το ARM 64 έχει μια στοίβα στη μνήμη (RAM) με παρόμοιο τρόπο που έχουν τα 6502 και x64. Ωστόσο, με το ARM64, δεν υπάρχει push ή pop opcode. Η στοίβα στο ARM 64 αυξάνεται επίσης προς τα κάτω. Η διεύθυνση στον δείκτη στοίβας δείχνει ακριβώς μετά το τελευταίο byte της τελευταίας τιμής που έχει τοποθετηθεί στη στοίβα.

Ο λόγος για τον οποίο δεν υπάρχει γενικός κώδικας pop ή push opcode για το ARM64 είναι ότι το ARM 64 διαχειρίζεται τη στοίβα του σε ομάδες των διαδοχικών 16 byte. Ωστόσο, οι τιμές υπάρχουν σε ομάδες byte ενός byte, δύο byte, τεσσάρων byte και 8 byte. Έτσι, μια τιμή μπορεί να τοποθετηθεί στη στοίβα και οι υπόλοιπες θέσεις (τοποθεσίες byte) για την κάλυψη 16 byte είναι γεμάτες με εικονικά byte. Αυτό έχει το μειονέκτημα της σπατάλης μνήμης. Μια καλύτερη λύση είναι να γεμίσετε τη θέση των 16 byte με μικρότερες τιμές και να έχετε γραμμένο κώδικα προγραμματιστή που παρακολουθεί από πού προέρχονται οι τιμές στη θέση των 16 byte (καταχωρεί). Αυτός ο επιπλέον κωδικός είναι επίσης απαραίτητος για την απόσυρση των τιμών. Μια εναλλακτική λύση σε αυτό είναι να γεμίσετε δύο καταχωρητές γενικής χρήσης 8 byte με τις διαφορετικές τιμές και στη συνέχεια να στείλετε τα περιεχόμενα των δύο καταχωρητών 8 byte σε μια στοίβα. Ένας επιπλέον κωδικός χρειάζεται ακόμα εδώ για να παρακολουθείτε τις συγκεκριμένες μικρές τιμές που μπαίνουν στη στοίβα και βγαίνουν από τη στοίβα.

Ο ακόλουθος κώδικας αποθηκεύει τέσσερα δεδομένα 4 byte στη στοίβα:

str w0, [sp, #-4]!
str w1, [sp, #-8]!
str w2, [sp, #-12]!
str w3, [sp, #-16]!

Τα πρώτα τέσσερα byte (w) καταχωρητών – x0, x1, x2 και x3 – αποστέλλονται σε θέσεις 16 διαδοχικών byte στη στοίβα. Σημειώστε τη χρήση του “str” και όχι του “push”. Σημειώστε το θαυμαστικό στο τέλος κάθε εντολής. Εφόσον η στοίβα μνήμης αυξάνεται προς τα κάτω, η πρώτη τιμή των τεσσάρων byte ξεκινά από μια θέση που είναι μείον τέσσερα byte κάτω από την προηγούμενη θέση του δείκτη στοίβας. Οι υπόλοιπες τιμές των τεσσάρων byte ακολουθούν, μειώνονται. Το ακόλουθο τμήμα κώδικα θα κάνει το σωστό (και με τη σειρά) ισοδύναμο της εμφάνισης των τεσσάρων byte:

ldr w3, [sp], #0
ldr w2, [sp], #4
ldr w1, [sp], #8
ldr w0, [sp], #12

Σημειώστε τη χρήση του ldr opcode αντί του pop. Σημειώστε επίσης ότι το σύμβολο θαυμαστικού δεν χρησιμοποιείται εδώ.

Όλα τα byte στο X0 (8 byte) και στο X1 (8 byte) μπορούν να σταλούν στη θέση των 16 byte στη στοίβα ως εξής:

stp x0, x1, [sp, #-16]! ; 8 + 8 = 16

Σε αυτήν την περίπτωση, οι καταχωρητές x2 (w2) και x3 (w3) δεν χρειάζονται. Όλα τα ζητούμενα byte βρίσκονται στους καταχωρητές X0 και X2. Σημειώστε τον opcode stp για την αποθήκευση των ζευγών περιεχομένων καταχωρητή στη μνήμη RAM. Σημειώστε επίσης το σύμβολο του θαυμαστικού. Το αντίστοιχο ποπ είναι:

ldp x0, x1, [sp], #0

Δεν υπάρχει θαυμαστικό για αυτήν την οδηγία. Σημειώστε τον κωδικό LDP αντί για LDR για τη φόρτωση δύο διαδοχικών θέσεων δεδομένων από τη μνήμη σε δύο καταχωρητές μP. Θυμηθείτε επίσης ότι η αντιγραφή από τη μνήμη σε έναν καταχωρητή μP είναι φόρτωση, δεν πρέπει να συγχέεται με τη φόρτωση ενός αρχείου από το δίσκο στη μνήμη RAM και η αντιγραφή από έναν καταχωρητή μP στη μνήμη RAM είναι αποθήκευση.

6.48 Υπορουτίνα
Μια υπορουτίνα είναι ένα μπλοκ κώδικα που εκτελεί μια εργασία, προαιρετικά βασισμένη σε ορισμένα ορίσματα και προαιρετικά επιστρέφει ένα αποτέλεσμα. Κατά σύμβαση, οι καταχωρητές R0 σε R3 (τέσσερις καταχωρητές) χρησιμοποιούνται για να περάσουν τα ορίσματα (παραμέτρους) σε μια υπορουτίνα και το R0 χρησιμοποιείται για να μεταβιβάσει ένα αποτέλεσμα πίσω στον καλούντα. Μια υπορουτίνα που χρειάζεται περισσότερες από 4 εισόδους χρησιμοποιεί τη στοίβα για τις πρόσθετες εισόδους. Για να καλέσετε μια υπορουτίνα, χρησιμοποιήστε τη σύνδεση ή την εντολή διακλάδωσης υπό όρους. Η σύνταξη για την εντολή σύνδεσης είναι:

Ετικέτα BL

Όπου BL είναι ο opcode και η ετικέτα αντιπροσωπεύει την αρχή (διεύθυνση) της υπορουτίνας. Αυτός ο κλάδος είναι άνευ όρων, προς τα εμπρός ή προς τα πίσω εντός 128 MB. Η σύνταξη για την εντολή διακλάδωσης υπό όρους είναι:

Ετικέτα B.cond

Όπου cond είναι η συνθήκη, π.χ. eq (ίσο) ή ne (όχι ίσο). Το παρακάτω πρόγραμμα έχει την υπορουτίνα doadd που προσθέτει τις τιμές δύο ορισμάτων και επιστρέφει ένα αποτέλεσμα σε R0:

AREA subrout, CODE, READONLY ; Ονομάστε αυτό το μπλοκ κώδικα
ΕΙΣΟΔΟΣ ; Σημειώστε την πρώτη εντολή προς εκτέλεση
εκκίνηση MOV r0, #10 ; Ρύθμιση παραμέτρων
MOV r1, #3
BL doadd ; Υπορουτίνα κλήσης
διακοπή MOV r0, #0x18 ; angel_SWIreason_ReportException
LDR r1, =0x20026; ADP_Stopped_ApplicationExit
SVC #0x123456 ; ARM semihosting (πρώην SWI)
doadd ΠΡΟΣΘΗΚΗ r0, r0, r1 ; Κωδικός υπορουτίνας
BX lr ; Επιστροφή από την υπορουτίνα
;
ΤΕΛΟΣ ; Σημειώστε το τέλος του αρχείου

Οι αριθμοί που πρέπει να προσθέσετε είναι δεκαδικός 10 και δεκαδικός 3. Οι δύο πρώτες γραμμές σε αυτό το μπλοκ κώδικα (πρόγραμμα) θα επεξηγηθούν αργότερα. Οι επόμενες τρεις γραμμές στέλνουν 10 στον καταχωρητή R0 και 3 στον καταχωρητή R1 και καλούν επίσης την υπορουτίνα doadd. Το 'doadd' είναι η ετικέτα που περιέχει τη διεύθυνση της αρχής της υπορουτίνας.

Η υπορουτίνα αποτελείται από δύο μόνο γραμμές. Η πρώτη γραμμή προσθέτει το περιεχόμενο 3 του R στο περιεχόμενο 10 του R0 που επιτρέπει το αποτέλεσμα του 13 στο R0. Η δεύτερη γραμμή με τον κωδικό λειτουργίας BX και τον τελεστή LR επιστρέφει από την υπορουτίνα στον κωδικό καλούντος.

ΣΩΣΤΑ
Ο κωδικός ενεργοποίησης RET στο ARM 64 εξακολουθεί να ασχολείται με την υπορουτίνα, αλλά λειτουργεί διαφορετικά από το RTS στο 6502 ή το RET στο x64 ή τον συνδυασμό 'BX LR' στο ARM 64. Στο ARM 64, η σύνταξη για το RET είναι:

ΕΥΘΕΙΑ {Xn}

Αυτή η οδηγία δίνει την ευκαιρία στο πρόγραμμα να συνεχίσει με μια υπορουτίνα που δεν είναι η υπορουτίνα καλούντος ή απλώς να συνεχίσει με κάποια άλλη εντολή και το ακόλουθο τμήμα κώδικα της. Το Xn είναι ένας καταχωρητής γενικής χρήσης που περιέχει τη διεύθυνση στην οποία πρέπει να συνεχιστεί το πρόγραμμα. Αυτή η οδηγία διακλαδίζεται άνευ όρων. Από προεπιλογή ορίζεται το περιεχόμενο του X30 εάν δεν δοθεί το Xn.

Πρότυπο κλήσης διαδικασίας
Εάν ο προγραμματιστής θέλει ο κώδικάς του να αλληλεπιδρά με έναν κώδικα που έχει γραφτεί από κάποιον άλλο ή με έναν κώδικα που παράγεται από έναν μεταγλωττιστή, ο προγραμματιστής πρέπει να συμφωνήσει με το άτομο ή τον συγγραφέα του μεταγλωττιστή σχετικά με τους κανόνες για τη χρήση του μητρώου. Για την αρχιτεκτονική ARM, αυτοί οι κανόνες ονομάζονται Standard Call Procedure ή PCS. Πρόκειται για συμφωνίες μεταξύ δύο ή τριών μερών. Το PCS καθορίζει τα ακόλουθα:

  • Ποιοι καταχωρητές μP χρησιμοποιούνται για τη μεταβίβαση των ορισμάτων στη συνάρτηση (υπορουτίνα)
  • Ποιοι καταχωρητές µP χρησιμοποιούνται για την επιστροφή του αποτελέσματος στη συνάρτηση που κάνει την κλήση, η οποία είναι γνωστή ως καλούντος
  • Ποιο µP καταχωρεί τη συνάρτηση που καλείται, η οποία είναι γνωστή ως καλούμενος, μπορεί να καταστρέψει
  • Ποιο µP καταχωρεί ο καλούμενος δεν μπορεί να αλλοιώσει

6.49 Διακοπές
Υπάρχουν δύο τύποι κυκλωμάτων ελεγκτή διακοπής διαθέσιμα για τον επεξεργαστή ARM:

  • Τυπικός ελεγκτής διακοπής: Ο χειριστής διακοπών καθορίζει ποια συσκευή χρειάζεται σέρβις διαβάζοντας έναν καταχωρητή bitmap συσκευής στον ελεγκτή διακοπής.
  • Vector Interrupt Controller (VIC): Δίνει προτεραιότητα στις διακοπές και απλοποιεί τον προσδιορισμό της συσκευής που προκάλεσε τη διακοπή. Μετά τη συσχέτιση μιας προτεραιότητας και μιας διεύθυνσης χειριστή με κάθε διακοπή, το VIC επιβεβαιώνει ένα σήμα διακοπής στον επεξεργαστή μόνο εάν η προτεραιότητα μιας νέας διακοπής είναι υψηλότερη από τον τρέχοντα χειριστή διακοπής που εκτελείται.

Σημείωση : Η εξαίρεση αναφέρεται σε σφάλμα. Οι λεπτομέρειες για τον ελεγκτή διανυσματικής διακοπής για τον υπολογιστή ARM 32 bit είναι οι εξής (τα 64 bit είναι παρόμοια):

Πίνακας 6.49.1
Εξαίρεση/Διακοπή διανυσμάτων ARM για υπολογιστή 32 bit
Εξαίρεση/Διακοπή Κοντό χέρι Διεύθυνση Υψηλή διεύθυνση
Επαναφορά ΕΠΑΝΑΦΟΡΑ 0x00000000 0xffff0000
Απροσδιόριστη οδηγία UNDEF 0x00000004 0xffff0004
Διακοπή λογισμικού SWI 0x00000008 0xffff0008
Προανάκτηση ματαίωσης pabt 0x0000000C 0xffff000C
Ημερομηνία άμβλωσης DABT 0x00000010 0xffff0010
Κατοχυρωμένα 0x00000014 0xffff0014
Αίτημα διακοπής IRQ 0x00000018 0xffff0018
Αίτημα γρήγορης διακοπής FIQ 0x0000001C 0xffff001C

Αυτό μοιάζει με τη διάταξη για την αρχιτεκτονική 6502 όπου NMI , BR , και IRQ μπορεί να έχει δείκτες στη σελίδα μηδέν και οι αντίστοιχες ρουτίνες βρίσκονται ψηλά στη μνήμη (ROM OS). Οι συνοπτικές περιγραφές των σειρών του προηγούμενου πίνακα είναι οι εξής:

ΕΠΑΝΑΦΟΡΑ
Αυτό συμβαίνει όταν ενεργοποιείται ο επεξεργαστής. Αρχικοποιεί το σύστημα και ρυθμίζει τις στοίβες για διαφορετικές λειτουργίες επεξεργαστή. Είναι η εξαίρεση ύψιστης προτεραιότητας. Κατά την είσοδο στον χειριστή επαναφοράς, το CPSR βρίσκεται σε λειτουργία SVC και τα bit IRQ και FIQ ορίζονται στο 1, καλύπτοντας τυχόν διακοπές.

ΗΜΕΡΟΜΗΝΙΑ ΕΚΤΡΩΣΗΣ
Η δεύτερη υψηλότερη προτεραιότητα. Αυτό συμβαίνει όταν προσπαθούμε να διαβάσουμε/εγγράψουμε σε μια μη έγκυρη διεύθυνση ή να αποκτήσουμε πρόσβαση σε λάθος άδεια πρόσβασης. Κατά την είσοδο στο Data Abort Handler, τα IRQ θα απενεργοποιηθούν (σύνολο I-bit 1) και το FIQ θα ενεργοποιηθεί. Τα IRQ είναι καλυμμένα, αλλά τα FIQ διατηρούνται χωρίς μάσκα.

FIQ
Η διακοπή υψηλότερης προτεραιότητας, IRQ και FIQ, απενεργοποιούνται μέχρι να γίνει χειρισμός του FIQ.

IRQ
Η διακοπή υψηλής προτεραιότητας, ο χειριστής IRQ, εισάγεται μόνο εάν δεν υπάρχει συνεχής διακοπή FIQ & δεδομένων.

Ακύρωση πριν από την ανάκτηση
Αυτό είναι παρόμοιο με τη διακοπή δεδομένων, αλλά συμβαίνει σε περίπτωση αποτυχίας λήψης διεύθυνσης. Κατά την είσοδο στο πρόγραμμα χειρισμού, τα IRQ απενεργοποιούνται, αλλά τα FIQ παραμένουν ενεργοποιημένα και μπορούν να συμβούν κατά τη διάρκεια μιας ματαίωσης εκ των προτέρων ανάκτησης.

SWI
Μια εξαίρεση διακοπής λογισμικού (SWI) προκύπτει όταν εκτελείται η εντολή SWI και καμία από τις άλλες εξαιρέσεις υψηλότερης προτεραιότητας δεν έχει επισημανθεί.

Απροσδιόριστη Οδηγία
Η εξαίρεση Undefined Instruction προκύπτει όταν μια εντολή που δεν βρίσκεται στο σύνολο εντολών ARM ή Thumb φτάνει στο στάδιο εκτέλεσης του pipeline και καμία από τις άλλες εξαιρέσεις δεν έχει επισημανθεί. Αυτή είναι η ίδια προτεραιότητα με το SWI που μπορεί να συμβεί κάθε φορά. Αυτό σημαίνει ότι η εντολή που εκτελείται δεν μπορεί να είναι ταυτόχρονα μια εντολή SWI και μια απροσδιόριστη εντολή.

Χειρισμός εξαίρεσης ARM
Τα ακόλουθα συμβάντα συμβαίνουν όταν συμβαίνει μια εξαίρεση:

  • Αποθηκεύστε το CPSR στο SPSR της λειτουργίας εξαίρεσης.
  • Ο υπολογιστής αποθηκεύεται στο LR της λειτουργίας εξαίρεσης.
  • Ο καταχωρητής συνδέσμων έχει οριστεί σε μια συγκεκριμένη διεύθυνση με βάση την τρέχουσα εντολή. Για παράδειγμα: για ISR, LR = τελευταία εκτελεσμένη εντολή + 8.
  • Ενημερώστε το CPSR σχετικά με την εξαίρεση.
  • Ρυθμίστε τον υπολογιστή στη διεύθυνση του προγράμματος χειρισμού εξαιρέσεων.

6.5 Οδηγίες και δεδομένα

Τα δεδομένα αναφέρονται σε μεταβλητές (ετικέτες με τις τιμές τους) και πίνακες και άλλες δομές που είναι παρόμοιες με τον πίνακα. Η συμβολοσειρά είναι σαν μια σειρά χαρακτήρων. Μια σειρά από ακέραιους αριθμούς φαίνεται σε ένα από τα προηγούμενα κεφάλαια. Οι οδηγίες αναφέρονται στους opcodes και τους τελεστές τους. Ένα πρόγραμμα μπορεί να γραφτεί με τους κωδικούς και τα δεδομένα αναμεμειγμένα σε ένα συνεχές τμήμα της μνήμης. Αυτή η προσέγγιση έχει μειονεκτήματα, αλλά δεν συνιστάται.

Ένα πρόγραμμα θα πρέπει να γραφτεί με τις οδηγίες πρώτα, ακολουθούμενο από τα δεδομένα (ο πληθυντικός του datum είναι δεδομένα). Ο διαχωρισμός μεταξύ των οδηγιών και των δεδομένων μπορεί να είναι μόνο μερικά byte. Για ένα πρόγραμμα, τόσο οι οδηγίες όσο και τα δεδομένα μπορούν να βρίσκονται σε μία ή δύο ξεχωριστές ενότητες στη μνήμη.

6.6 Η Αρχιτεκτονική του Χάρβαρντ

Ένας από τους πρώτους υπολογιστές ονομάζεται Harvard Mark I (1944). Μια αυστηρή αρχιτεκτονική του Χάρβαρντ χρησιμοποιεί έναν χώρο διευθύνσεων για οδηγίες προγράμματος και έναν διαφορετικό ξεχωριστό χώρο διευθύνσεων για δεδομένα. Αυτό σημαίνει ότι υπάρχουν δύο ξεχωριστές αναμνήσεις. Το παρακάτω δείχνει την αρχιτεκτονική:


Εικόνα 6.71 Αρχιτεκτονική του Χάρβαρντ

Η Μονάδα Ελέγχου κάνει την αποκωδικοποίηση εντολών. Η Αριθμητική Λογική Μονάδα (ALU) κάνει τις αριθμητικές πράξεις με συνδυαστική λογική (πύλες). Η ALU κάνει επίσης τις λογικές πράξεις (π.χ. shifting).

Με τον μικροεπεξεργαστή 6502, μια εντολή πηγαίνει πρώτα στον μικροεπεξεργαστή (μονάδα ελέγχου) πριν το δεδομένο (ενικό για δεδομένα) μεταβεί στον καταχωρητή μP πριν αλληλεπιδράσουν. Αυτό απαιτεί τουλάχιστον δύο παλμούς ρολογιού και δεν είναι ταυτόχρονη πρόσβαση στην εντολή και το σημείο αναφοράς. Από την άλλη πλευρά, η αρχιτεκτονική του Χάρβαρντ παρέχει ταυτόχρονη πρόσβαση στις οδηγίες και τα δεδομένα, με την εντολή και το δεδομένο να εισέρχονται στο μP ταυτόχρονα (κωδικός λειτουργίας στη μονάδα ελέγχου και καταχωρητής σημείου σε μP), εξοικονομώντας τουλάχιστον έναν παλμό ρολογιού. Αυτή είναι μια μορφή παραλληλισμού. Αυτή η μορφή παραλληλισμού χρησιμοποιείται στην κρυφή μνήμη υλικού στις σύγχρονες μητρικές πλακέτες (ανατρέξτε στην ακόλουθη συζήτηση).

6.7 Μνήμη προσωρινής μνήμης

Η προσωρινή μνήμη (RAM) είναι μια περιοχή μνήμης υψηλής ταχύτητας (σε σύγκριση με την ταχύτητα της κύριας μνήμης) που αποθηκεύει προσωρινά τις οδηγίες του προγράμματος ή τα δεδομένα για μελλοντική χρήση. Η κρυφή μνήμη λειτουργεί πιο γρήγορα από την κύρια μνήμη. Συνήθως, αυτές οι οδηγίες ή τα στοιχεία δεδομένων ανακτώνται από την πρόσφατη κύρια μνήμη και είναι πιθανό να χρειαστούν ξανά σύντομα. Ο πρωταρχικός σκοπός της κρυφής μνήμης είναι να αυξήσει την ταχύτητα της επανειλημμένης πρόσβασης στις ίδιες θέσεις κύριας μνήμης. Για να είναι αποτελεσματική, η πρόσβαση στα κρυφά αποθηκευμένα στοιχεία πρέπει να είναι σημαντικά ταχύτερη από την πρόσβαση στην αρχική πηγή των οδηγιών ή των δεδομένων που αναφέρεται ως Backing Store.

Όταν χρησιμοποιείται η προσωρινή αποθήκευση, κάθε προσπάθεια πρόσβασης σε μια θέση κύριας μνήμης ξεκινά με αναζήτηση της κρυφής μνήμης. Εάν υπάρχει το ζητούμενο αντικείμενο, ο επεξεργαστής το ανακτά και το χρησιμοποιεί αμέσως. Αυτό ονομάζεται επίσκεψη στην προσωρινή μνήμη. Εάν η αναζήτηση της κρυφής μνήμης είναι ανεπιτυχής (έλλειψη προσωρινής μνήμης), η εντολή ή το στοιχείο δεδομένων πρέπει να ανακτηθεί από τον χώρο αποθήκευσης υποστήριξης (κύρια μνήμη). Κατά τη διαδικασία ανάκτησης του ζητούμενου στοιχείου, προστίθεται ένα αντίγραφο στην κρυφή μνήμη για μια αναμενόμενη εγγύς μελλοντική χρήση.

Μονάδα Διαχείρισης Μνήμης
Η μονάδα διαχείρισης μνήμης (MMU) είναι ένα κύκλωμα που διαχειρίζεται την κύρια μνήμη και τους σχετικούς καταχωρητές μνήμης στη μητρική πλακέτα. Στο παρελθόν, ήταν ένα ξεχωριστό ολοκληρωμένο κύκλωμα στη μητρική πλακέτα. αλλά σήμερα, είναι τυπικά μέρος του μικροεπεξεργαστή. Το MMU θα πρέπει επίσης να διαχειρίζεται την κρυφή μνήμη (κύκλωμα) που είναι επίσης μέρος του μικροεπεξεργαστή σήμερα. Το κύκλωμα κρυφής μνήμης είναι ένα ξεχωριστό ολοκληρωμένο κύκλωμα στο παρελθόν.

Στατική RAM
Η στατική μνήμη RAM (SRAM) έχει ουσιαστικά ταχύτερο χρόνο πρόσβασης από τη DRAM, αν και σε βάρος πολύ πιο πολύπλοκων κυκλωμάτων. Οι κυψέλες bit SRAM καταλαμβάνουν πολύ περισσότερο χώρο στο καλούπι ολοκληρωμένου κυκλώματος από τις κυψέλες μιας συσκευής DRAM που είναι ικανή να αποθηκεύσει ισοδύναμη ποσότητα δεδομένων. Η κύρια μνήμη (RAM) συνήθως αποτελείται από DRAM (Dynamic RAM).

Η προσωρινή μνήμη βελτιώνει την απόδοση του υπολογιστή επειδή πολλοί αλγόριθμοι που εκτελούνται από λειτουργικά συστήματα και εφαρμογές εμφανίζουν την τοποθεσία αναφοράς. Η Τοποθεσία αναφοράς αναφέρεται στην επαναχρησιμοποίηση δεδομένων στα οποία έγινε πρόσβαση πρόσφατα. Αυτό αναφέρεται ως προσωρινή τοποθεσία. Σε μια σύγχρονη μητρική πλακέτα, η κρυφή μνήμη βρίσκεται στο ίδιο ολοκληρωμένο κύκλωμα με τον μικροεπεξεργαστή. Η κύρια μνήμη (DRAM) είναι μακριά και είναι προσβάσιμη μέσω των λεωφορείων. Η Τοπικότητα Αναφοράς αναφέρεται επίσης στη χωρική εντοπιότητα. Η χωρική τοποθεσία έχει να κάνει με την υψηλότερη ταχύτητα πρόσβασης δεδομένων λόγω της φυσικής εγγύτητας.

Κατά κανόνα, οι περιοχές της κρυφής μνήμης είναι μικρές (σε αριθμό θέσεων byte) σε σύγκριση με τον χώρο αποθήκευσης υποστήριξης (κύρια μνήμη). Οι συσκευές μνήμης κρυφής μνήμης έχουν σχεδιαστεί για μέγιστη ταχύτητα, πράγμα που σημαίνει γενικά ότι είναι πιο περίπλοκες και δαπανηρές ανά bit από την τεχνολογία αποθήκευσης δεδομένων που χρησιμοποιείται στον χώρο αποθήκευσης υποστήριξης. Λόγω του περιορισμένου μεγέθους τους, οι συσκευές προσωρινής μνήμης τείνουν να γεμίζουν γρήγορα. Όταν μια προσωρινή μνήμη δεν έχει διαθέσιμη θέση για την αποθήκευση μιας νέας καταχώρησης, μια παλαιότερη καταχώρηση πρέπει να απορριφθεί. Ο ελεγκτής προσωρινής μνήμης χρησιμοποιεί μια πολιτική αντικατάστασης προσωρινής μνήμης για να επιλέξει ποια καταχώρηση κρυφής μνήμης θα αντικατασταθεί από τη νέα καταχώρηση.

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

Η λογική προσωρινής αποθήκευσης ενός επεξεργαστή δεν παρέχει διαβεβαίωση ότι ένα στοιχείο δεδομένων που έχει αποθηκευτεί στην κρυφή μνήμη θα χρησιμοποιηθεί ξανά όταν εισαχθεί στην κρυφή μνήμη.

Η λογική της προσωρινής αποθήκευσης βασίζεται στην πιθανότητα ότι λόγω της χρονικής (επανάληψης με την πάροδο του χρόνου) και της χωρικής (χωρικής) εντοπιότητας, υπάρχει πολύ καλή πιθανότητα πρόσβασης στα αποθηκευμένα δεδομένα στο εγγύς μέλλον. Σε πρακτικές εφαρμογές σε σύγχρονους επεξεργαστές, οι επισκέψεις της προσωρινής μνήμης συνήθως συμβαίνουν στο 95 έως 97 τοις εκατό των προσβάσεων στη μνήμη. Δεδομένου ότι η καθυστέρηση της κρυφής μνήμης είναι ένα μικρό κλάσμα του λανθάνοντος χρόνου της μνήμης DRAM, ένας υψηλός ρυθμός επίσκεψης στην κρυφή μνήμη οδηγεί σε σημαντική βελτίωση της απόδοσης σε σύγκριση με έναν σχεδιασμό χωρίς κρυφή μνήμη.

Κάποιος παραλληλισμός με την προσωρινή μνήμη
Όπως αναφέρθηκε προηγουμένως, ένα καλό πρόγραμμα στη μνήμη έχει τις οδηγίες διαχωρισμένες από τα δεδομένα. Σε ορισμένα συστήματα κρυφής μνήμης, υπάρχει ένα κύκλωμα κρυφής μνήμης στα 'αριστερά' του επεξεργαστή και υπάρχει ένα άλλο κύκλωμα κρυφής μνήμης στα 'δεξιά' του επεξεργαστή. Η αριστερή κρυφή μνήμη χειρίζεται τις οδηγίες ενός προγράμματος (ή μιας εφαρμογής) και η δεξιά κρυφή μνήμη διαχειρίζεται τα δεδομένα του ίδιου προγράμματος (ή της ίδιας εφαρμογής). Αυτό οδηγεί σε καλύτερη αυξημένη ταχύτητα.

6.8 Διεργασίες και νήματα

Τόσο οι υπολογιστές CISC όσο και οι υπολογιστές RISC έχουν διαδικασίες. Υπάρχει μια διαδικασία στο λογισμικό. Ένα πρόγραμμα που εκτελείται (εκτελείται) είναι μια διαδικασία. Το λειτουργικό σύστημα έρχεται με τα δικά του προγράμματα. Ενώ λειτουργεί ο υπολογιστής, εκτελούνται επίσης τα προγράμματα του λειτουργικού συστήματος που επιτρέπουν στον υπολογιστή να λειτουργεί. Αυτές είναι διαδικασίες λειτουργικού συστήματος. Ο χρήστης ή ο προγραμματιστής μπορεί να γράψει τα δικά του προγράμματα. Όταν το πρόγραμμα του χρήστη εκτελείται, είναι μια διαδικασία. Δεν έχει σημασία αν το πρόγραμμα είναι γραμμένο σε γλώσσα assembly ή σε γλώσσα υψηλού επιπέδου όπως η C ή η C++. Όλες οι διεργασίες (χρήστης ή λειτουργικό σύστημα) διαχειρίζονται από μια άλλη διεργασία που ονομάζεται «προγραμματιστής».

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

6.9 Πολυεπεξεργασία

Η διαχείριση των νημάτων γίνεται σχεδόν όπως οι διαδικασίες. Πολυεπεξεργασία σημαίνει εκτέλεση περισσότερων από μία διεργασιών ταυτόχρονα. Υπάρχουν υπολογιστές με έναν μόνο μικροεπεξεργαστή. Υπάρχουν υπολογιστές με περισσότερους από έναν μικροεπεξεργαστές. Με έναν μόνο μικροεπεξεργαστή, οι διεργασίες και/ή τα νήματα χρησιμοποιούν τον ίδιο μικροεπεξεργαστή με τρόπο παρεμβολής (ή χρονικής κοπής). Αυτό σημαίνει ότι μια διαδικασία χρησιμοποιεί τον επεξεργαστή και σταματά χωρίς να τελειώσει. Μια άλλη διεργασία ή νήμα χρησιμοποιεί τον επεξεργαστή και σταματά χωρίς να τελειώσει. Στη συνέχεια, μια άλλη διεργασία ή νήμα χρησιμοποιεί τον μικροεπεξεργαστή και σταματά χωρίς να τελειώσει. Αυτό συνεχίζεται έως ότου όλες οι διεργασίες και τα νήματα που τέθηκαν στην ουρά από τον προγραμματιστή έχουν μερίδιο του επεξεργαστή. Αυτό αναφέρεται ως ταυτόχρονη πολυεπεξεργασία.

Όταν υπάρχουν περισσότεροι από ένας μικροεπεξεργαστές, υπάρχει παράλληλη πολυεπεξεργασία, σε αντίθεση με την ταυτόχρονη. Σε αυτήν την περίπτωση, κάθε επεξεργαστής εκτελεί μια συγκεκριμένη διεργασία ή νήμα, διαφορετικό από αυτό που εκτελεί ο άλλος επεξεργαστής. Όλοι οι επεξεργαστές στην ίδια μητρική πλακέτα εκτελούν τις διαφορετικές διεργασίες τους ή/και διαφορετικά thread την ίδια στιγμή σε παράλληλη πολυεπεξεργασία. Η διαχείριση των διεργασιών και των νημάτων σε παράλληλη πολυεπεξεργασία εξακολουθεί να γίνεται από τον προγραμματιστή. Η παράλληλη πολυεπεξεργασία είναι ταχύτερη από την ταυτόχρονη πολυεπεξεργασία.

Σε αυτό το σημείο, ο αναγνώστης μπορεί να αναρωτηθεί πώς η παράλληλη επεξεργασία είναι ταχύτερη από την ταυτόχρονη επεξεργασία. Αυτό συμβαίνει επειδή οι επεξεργαστές μοιράζονται (πρέπει να χρησιμοποιούν σε διαφορετικούς χρόνους) την ίδια μνήμη και τις ίδιες θύρες εισόδου/εξόδου. Λοιπόν, με τη χρήση της προσωρινής μνήμης, η συνολική λειτουργία της μητρικής πλακέτας είναι πιο γρήγορη.

6.10 σελιδοποίηση

Η μονάδα διαχείρισης μνήμης (MMU) είναι ένα κύκλωμα που βρίσκεται κοντά στον μικροεπεξεργαστή ή στο τσιπ του μικροεπεξεργαστή. Χειρίζεται το χάρτη μνήμης ή τη σελιδοποίηση και άλλα ζητήματα μνήμης. Ούτε ο υπολογιστής 6502 µP ούτε ο υπολογιστής Commodore-64 έχουν MMU per se (αν και υπάρχει ακόμα κάποια διαχείριση μνήμης στο Commodore-64). Το Commodore-64 χειρίζεται τη μνήμη μέσω σελιδοποίησης όπου κάθε σελίδα είναι 256 10 μήκος byte (100 16 bytes μήκος). Δεν ήταν υποχρεωτικό να χειρίζεται τη μνήμη μέσω σελιδοποίησης. Θα μπορούσε να έχει απλώς έναν χάρτη μνήμης και στη συνέχεια προγράμματα που απλώς ταιριάζουν στις διαφορετικές καθορισμένες περιοχές τους. Λοιπόν, η σελιδοποίηση είναι ένας τρόπος για την παροχή αποτελεσματικής χρήσης της μνήμης χωρίς να υπάρχουν πολλά τμήματα μνήμης που δεν μπορούν να έχουν δεδομένα ή πρόγραμμα.

Η αρχιτεκτονική υπολογιστή x86 386 κυκλοφόρησε το 1985. Ο δίαυλος διευθύνσεων έχει πλάτος 32 bit. Συνολικά λοιπόν 2 32 = 4.294.967.296 χώρος διευθύνσεων είναι δυνατός. Αυτός ο χώρος διευθύνσεων χωρίζεται σε 1.048.576 σελίδες = 1.024 KB σελίδες. Με αυτόν τον αριθμό σελίδων, μια σελίδα αποτελείται από 4.096 byte = 4 KB. Ο παρακάτω πίνακας δείχνει τις σελίδες φυσικών διευθύνσεων για την αρχιτεκτονική x86 32-bit:

Πίνακας 6.10.1
Φυσικές Διευθυνσιοδοτούμενες Σελίδες για την Αρχιτεκτονική x86
Διευθύνσεις Βάσης 16 Σελίδες Διευθύνσεις Βάσης 10
FFFFF000 – ΦΦΦΦΦΦΦΦ Σελίδα 1.048.575 4.294.963.200 – 4.294.967.295
FFFFE000 – FFFFEFFFF Σελίδα 1.044.479 4.294.959.104 – 4.294.963.199
FFFFD000 – FFFFDFFFF Σελίδα 1.040.383 4.294.955.008 – 4.294.959.103
|
|
|
|
|
|
|
|
|
00002000 – 00002FFF Σελίδα 2 8.192 – 12.288
00001000 – 00001FFF Σελίδα 1 4.096 – 8.191
00000000 – 00000 FFF Σελίδα 0 0 – 4.095

Μια εφαρμογή σήμερα αποτελείται από περισσότερα από ένα προγράμματα. Ένα πρόγραμμα μπορεί να διαρκέσει λιγότερο από μια σελίδα (λιγότερο από 4096) ή μπορεί να πάρει δύο ή περισσότερες σελίδες. Έτσι, μια εφαρμογή μπορεί να πάρει μία ή περισσότερες σελίδες όπου κάθε σελίδα έχει μήκος 4096 byte. Διαφορετικά άτομα μπορούν να γράψουν μια εφαρμογή, με κάθε άτομο να ανατίθεται σε μία ή περισσότερες σελίδες.

Σημειώστε ότι η σελίδα 0 είναι από 00000000H έως 00000FFF
Η σελίδα 1 είναι από 00001000H έως 00001FFFH, σελίδα 2 είναι από 00002000 H – 00002FFF H , και ούτω καθεξής. Για έναν υπολογιστή 32 bit, υπάρχουν δύο καταχωρητές 32 bit στον επεξεργαστή για τη διεύθυνση φυσικής σελίδας: ένας για τη διεύθυνση βάσης και ο άλλος για τη διεύθυνση ευρετηρίου. Για να αποκτήσετε πρόσβαση στις θέσεις byte της σελίδας 2, για παράδειγμα, ο καταχωρητής για τη διεύθυνση βάσης θα πρέπει να είναι 00002 H που είναι τα πρώτα 20 bit (από τα αριστερά) για τις αρχικές διευθύνσεις της σελίδας 2. Τα υπόλοιπα bit στην περιοχή των 000 H στο FFF H βρίσκονται στο μητρώο που ονομάζεται «μητρώος ευρετηρίου». Έτσι, όλα τα byte της σελίδας είναι προσβάσιμα απλά αυξάνοντας το περιεχόμενο στον καταχωρητή ευρετηρίου από 000 H στο FFF H . Το περιεχόμενο στο μητρώο ευρετηρίου προστίθεται στο περιεχόμενο το οποίο δεν αλλάζει στον βασικό καταχωρητή για να ληφθεί η πραγματική διεύθυνση. Αυτό το σχήμα διεύθυνσης ευρετηρίου ισχύει για τις άλλες σελίδες.

Ωστόσο, δεν είναι πραγματικά ο τρόπος με τον οποίο γράφεται το πρόγραμμα της γλώσσας assembly για κάθε σελίδα. Για κάθε σελίδα, ο προγραμματιστής γράφει τον κώδικα ξεκινώντας από τη σελίδα 000 H στη σελίδα FFF H . Δεδομένου ότι ο κώδικας σε διαφορετικές σελίδες είναι συνδεδεμένος, ο μεταγλωττιστής χρησιμοποιεί τη διεύθυνση ευρετηρίου για να συνδέσει όλες τις σχετικές διευθύνσεις σε διαφορετικές σελίδες. Για παράδειγμα, υποθέτοντας ότι η σελίδα 0, η σελίδα 1 και η σελίδα 2 είναι για μία εφαρμογή και η καθεμία έχει το 555 H διεύθυνση που είναι συνδεδεμένη μεταξύ τους, ο μεταγλωττιστής μεταγλωττίζει με τέτοιο τρόπο ώστε όταν 555 H της σελίδας 0 είναι προς πρόσβαση, 00000 H θα είναι στον βασικό καταχωρητή και 555 H θα είναι στο μητρώο ευρετηρίου. Όταν το 555 H της σελίδας 1 είναι προς πρόσβαση, 00001 H θα είναι στον βασικό καταχωρητή και 555 H θα είναι στο μητρώο ευρετηρίου. Όταν το 555 H της σελίδας 2 είναι προς πρόσβαση, 00002 H θα είναι στον βασικό καταχωρητή και το 555H θα είναι στον καταχωρητή ευρετηρίου. Αυτό είναι δυνατό επειδή οι διευθύνσεις μπορούν να αναγνωριστούν χρησιμοποιώντας ετικέτες (μεταβλητές). Οι διαφορετικοί προγραμματιστές πρέπει να συμφωνήσουν για το όνομα των ετικετών που θα χρησιμοποιηθούν για τις διαφορετικές διευθύνσεις σύνδεσης.

Εικονική μνήμη σελίδας
Η σελιδοποίηση, όπως περιγράφηκε προηγουμένως, μπορεί να τροποποιηθεί για να αυξηθεί το μέγεθος της μνήμης σε μια τεχνική που αναφέρεται ως 'Εικονική μνήμη σελίδας'. Αν υποθέσουμε ότι όλες οι σελίδες φυσικής μνήμης, όπως περιγράφηκε προηγουμένως, έχουν κάτι (οδηγίες και δεδομένα), δεν είναι όλες οι σελίδες ενεργές αυτήν τη στιγμή. Οι σελίδες που δεν είναι ενεργές αυτήν τη στιγμή αποστέλλονται στον σκληρό δίσκο και αντικαθίστανται από τις σελίδες του σκληρού δίσκου που πρέπει να εκτελούνται. Με αυτόν τον τρόπο, το μέγεθος της μνήμης αυξάνεται. Καθώς ο υπολογιστής συνεχίζει να λειτουργεί, οι σελίδες που γίνονται ανενεργές ανταλλάσσονται με τις σελίδες του σκληρού δίσκου που μπορεί να εξακολουθούν να είναι οι σελίδες που στάλθηκαν από τη μνήμη στο δίσκο. Όλα αυτά γίνονται από τη Μονάδα Διαχείρισης Μνήμης (MMU).

6.11 Προβλήματα

Συνιστάται στον αναγνώστη να λύσει όλα τα προβλήματα σε ένα κεφάλαιο πριν προχωρήσει στο επόμενο κεφάλαιο.

1) Δώστε τις ομοιότητες και τις διαφορές των αρχιτεκτονικών υπολογιστών CISC και RISC. Ονομάστε ένα παράδειγμα για καθένα από έναν υπολογιστή SISC και RISC.

2) α) Ποια είναι τα ακόλουθα ονόματα για τον υπολογιστή CISC ως προς τα bit: byte, word, doubleword, quadword και double quadword.
β) Ποια είναι τα ακόλουθα ονόματα για τον υπολογιστή RISC ως προς τα bit: byte, μισή λέξη, λέξη και διπλή λέξη.
γ) Ναι ή Όχι. Η διπλή λέξη και η τετραλέξη σημαίνουν τα ίδια πράγματα και στις δύο αρχιτεκτονικές CISC και RISC;

3 α) Για το x64, ο αριθμός των byte για τις οδηγίες της γλώσσας συγκρότησης κυμαίνεται από τι έως τι;
β) Είναι σταθερός ο αριθμός των byte για όλες τις οδηγίες γλώσσας συναρμολόγησης για το ARM 64; Εάν ναι, ποιος είναι ο αριθμός των byte για όλες τις οδηγίες;

4) Καταγράψτε τις πιο συχνά χρησιμοποιούμενες οδηγίες γλώσσας assembly για το x64 και τις έννοιές τους.

5) Καταγράψτε τις πιο συχνά χρησιμοποιούμενες οδηγίες γλώσσας assembly για το ARM 64 και τις έννοιές τους.

6) Σχεδιάστε ένα μπλοκ διάγραμμα με ετικέτα του παλιού υπολογιστή Harvard Architecture. Εξηγήστε πώς χρησιμοποιούνται οι οδηγίες και οι δυνατότητες δεδομένων του στην κρυφή μνήμη των σύγχρονων υπολογιστών.

7) Διακρίνετε μεταξύ μιας διεργασίας και ενός νήματος και δώστε το όνομα της διεργασίας που χειρίζεται τις διεργασίες και τα νήματα στα περισσότερα συστήματα υπολογιστών.

8) Εξηγήστε συνοπτικά τι είναι η πολυεπεξεργασία.

9) α) Εξηγήστε τη σελιδοποίηση όπως ισχύει για την αρχιτεκτονική υπολογιστή x86 386 µP.
β) Πώς μπορεί να τροποποιηθεί αυτή η σελιδοποίηση ώστε να αυξηθεί το μέγεθος ολόκληρης της μνήμης;