ΕΘΝΙΚΟ ΜΕΤΣΟΒΙΟ ΠΟΛΥΤΕΧΝΕΙΟ ΣΧΟΛΗ ΗΛΕΚΤΡΟΛΟΓΩΝ ΜΗΧΑΝΙΚΩΝ ΚΑΙ ΜΗΧΑΝΙΚΩΝ ΥΠΟΛΟΓΙΣΤΩΝ ΤΟΜΕΑΣ ΤΕΧΝΟΛΟΓΙΑΣ ΠΛΗΡΟΦΟΡΙΚΗΣ ΚΑΙ ΥΠΟΛΟΓΙΣΤΩΝ ΕΡΓΑΣΤΗΡΙΟ ΥΠΟΛΟΓΙΣΤΙΚΩΝ ΣΥΣΤΗΜΑΤΩΝ www.cslab.ece.ntua.gr Εισαγωγή στην Επιστήµη των Υπολογιστών Εξάµηνο 4ο-ΣΗΜΜΥ 31/5/2005 Σηµειώσεις στη Συµβολική Γλώσσα του Υπολογιστή ΕΚΥ (ASSEMBLY) (διδάσκων καθηγητής: Νεκτάριος Κοζύρης) (επιµέλεια σηµειώσεων: Μαρία Αθανασάκη) I. ΟΜΗ ΚΑΙ ΛΕΙΤΟΥΡΓΙΑ ΤΟΥ ΥΠΟΛΟΓΙΣΤΗ 1. Εισαγωγή Κάθε Ηλεκτρονικός Υπολογιστής αποτελείται από τέσσερα βασικά τµήµατα: την αριθµητική λογική µονάδα (Arithmetic Logic Unit ή ALU) τη µονάδα µνήµης (memory unit) τη µονάδα εισόδου εξόδου (Input Output ή I/O unit) τη µονάδα ελέγχου (control unit) Η µονάδα ελέγχου, µαζί µε την αριθµητική λογική µονάδα αναφέρονται και σαν κεντρική µονάδα επεξεργασίας (Central Processing Unit, CPU). Παρόλο που κάθε µία από τις µονάδες αυτές διαφέρει από υπολογιστή σε υπολογιστή ως προς την πολυπλοκότητα, το µέγεθος και τον τρόπο της υλοποίησής της, η εργασία που επιτελεί είναι σε γενικές γραµµές πάντα η ίδια. Η αριθµητική λογική µονάδα εκτελεί τις εξής λειτουργίες: εκτελεί τις βασικές αριθµητικές πράξεις (πρόσθεση, αφαίρεση, πολλαπλασιασµό και διαίρεση) εκτελεί τις λογικές πράξεις, π.χ. εύρεση του λογικού αθροίσµατος OR, του λογικού γινοµένου AND, κλπ)
2 εκτελεί άλλες βοηθητικές εργασίες, π.χ. ολίσθηση (shift) του περιεχοµένου ενός καταχωρητή. Μονάδα Μνήµης Αριθµητική-Λογική Μονάδα Μονάδα Ελέγχου Μονάδα Εισόδου-Εξόδου ΚΕΝΤΡΙΚΟΣ ΥΠΟΛΟΓΙΣΤΗΣ σήµατα ελέγχου µεταφορά πληροφορίας ΠΕΡΙΦΕΡΙΑΚΕΣ ΜΟΝΑ ΕΣ Η µονάδα µνήµης χρησιµεύει για την αποθήκευση των αρχικών δεδοµένων, των αποτελεσµάτων που προκύπτουν ενδιάµεσα, των τελικών αποτελεσµάτων και του συνόλου εντολών που πρέπει να εκτελέσει ο υπολογιστής. Τα αρχικά δεδοµένα ονοµάζονται δεδοµένα εισόδου, τα τελικά αποτελέσµατα, δεδοµένα εξόδου και το σύνολο των εντολών, πρόγραµµα. Η µονάδα Ι/Ο επιτρέπει την επικοινωνία του ανθρώπου µε τον υπολογιστή. Σε αυτήν συνδέονται οι περιφερειακές µονάδες, όπως το πληκτρολόγιο, το ποντίκι (για την είσοδο), η οθόνη, ο εκτυπωτής (για την έξοδο). Η µονάδα ελέγχου είναι η πιο βασική µονάδα του υπολογιστή. Αποσκοπεί στον έλεγχο και συντονισµό όλης της λειτουργίας του. Παίρνει από τη µνήµη µία προς µία τις εντολές του προγράµµατος, τις αναλύει σε στοιχειώδεις λειτουργίες και στέλνει στις διάφορες µονάδες λεπτοµερείς οδηγίες για το τι και πότε πρέπει να εκτελέσουν. Το υπολογιστικό αυτό µοντέλο περιγράφηκε για πρώτη φορά από τον Von Neumann το 1947. Σήµερα το ακολουθούν ακόµη, σε γενικές γραµµές, αρκετοί υπολογιστές, παρόλο που η αρχιτεκτονική τους έχει υποστεί πολλές αλλαγές. 2. οµικά στοιχεία του υπολογιστή Για την καλύτερη κατανόησης της δοµής και της λειτουργίας των δοµικών µονάδων που απαριθµήθηκαν προηγουµένως, έχουµε απεικονίσει στο παρακάτω σχήµα τα βασικά κυκλώµατα ενός απλού ηλεκτρονικού υπολογιστή και τη ροή πληροφοριών µεταξύ τους. Πρόκειται για έναν υποθετικό υπολογιστή, που ονοµάζουµε ΕΚΥ (ΕΚπαιδευτικός
3 Υπολογιστής). Ο ΕΚΥ είναι σκόπιµα απλός και µικρός, χωρίς αυτό να σηµαίνει ότι λειτουργικά διαφέρει πολύ από τους πραγµατικούς υπολογιστές. Μονάδα Μνήµης 0 0 0 1 1 1 M A R 2 MDR 4 ΦΕ δ S 2 3 ΦΑ γ 6 Αριθµητική Μονάδα Μονάδα Ελέγχου Μ IR Κυκλώµατα πράξεων 5 8 S 3 α β S 1 ΦΕ ΦΑ Α 7 B PC 1 Μονάδα I/O X Y F/F F/F F/F Από και προς περιφερειακές µονάδες 2.1. Αριθµητική Λογική µονάδα Η ALU, όπως ήδη είπαµε, εκτελεί τις αριθµητικές και λογικές πράξεις, καθώς και διάφορες άλλες βοηθητικές λειτουργίες. Γενικά, αποτελείται από έναν αριθµό καταχωρητών και από τα απαραίτητα λογικά κυκλώµατα για την εκτέλεση των παραπάνω πράξεων. Συγκεκριµένα, ο υπολογιστής EKY, διαθέτει έναν µόνο καταχωρητή γενικού σκοπού (accumulator), τον οποίο συχνά συµβολίζουµε ως Α, και έναν καταχωρητή δείκτη, τον οποίο συνήθως συµβολίζουµε ως Β. Επίσης, υπάρχουν και αρκετοί ακόµη καταχωρητές, που
4 χρησιµοποιούνται για τη µεταφορά δεδοµένων και την αποθήκευση ενδιάµεσων αποτελεσµάτων, οι οποίοι δεν είναι άµεσα προσπελάσιµοι από τον προγραµµατιστή. Χρησιµοποιούνται µόνο για την εκτέλεση προκαθορισµένων λειτουργιών από το υλικό. Για την εκτέλεση µιας πράξης απαιτούνται δύο αριθµοί ορίσµατα. Ο ένας από αυτούς είναι το περιεχόµενο του καταχωρητή Α και ο άλλος του προσωρινού καταχωρητή Μ, που εικονίζεται στο παραπάνω σχήµα. Στον ΕΚΥ, το αποτέλεσµα µένει πάντα στον καταχωρητή Α. Για παράδειγµα, αν έχουµε να εκτελέσουµε διαδοχικές προσθέσεις, ο καταχωρητής Α συσσωρεύει όλους τους αριθµούς που προστίθενται, γι αυτό ονοµάζεται συσσωρευτής (accumulator). Για την εκτέλεση των πράξεων πρέπει να µεταφέρονται δεδοµένα προς και από τη µνήµη. Για το λόγο αυτό, όπως απεικονίζεται στο προηγούµενο σχήµα, υπάρχουν οι κατάλληλες συνδέσεις µεταξύ της µνήµης και της αριθµητικής µονάδας. 2.2. Μνήµη (Memory) Η µνήµη διαιρείται σε θέσεις µνήµης. Κάθε θέση αποτελείται από συγκεκριµένο αριθµό από bytes (1 byte = 8 bits). Η λέξη του υπολογιστή αποτελείται από συγκεκριµένο αριθµό bytes (σταθερό για κάθε υπολογιστή). Όταν αποθηκεύεται στη µνήµη, καταλαµβάνει τον ίδιο αριθµό από συνεχόµενες θέσεις µνήµης (µπορεί να καταλαµβάνει 1 ή περισσότερες θέσεις µνήµης). Ο αριθµός των bits µιας λέξης (=8 αριθµό bytes) ονοµάζεται µήκος λέξης (word length). Για να προσπελαύνουµε τις διάφορες θέσεις µνήµης, τις αριθµούµε και ο αριθµός που αντιστοιχεί σε κάθε µία από αυτές ονοµάζεται διεύθυνση (address). Συγκεκριµένα, στον υπολογιστή EKY, η λέξη έχει µήκος 16 bits. Εποµένως, αποτελείται από 2 bytes. Επίσης, κάθε θέση µνήµης αποτελείται από 2 bytes. Εποµένως, κάθε λέξη καταλαµβάνει ακριβώς µία θέση της µνήµης. Επίσης, κάθε εντολή της συµβολικής γλώσσας του αποθηκεύεται σε µία ακριβώς θέση µνήµης. Αυτό σηµαίνει ότι, για να προσπελάσουµε την επόµενη εντολή, θα πρέπει κάθε φορά να προχωράµε 1 διεύθυνση παρακάτω. Εκτός από τα flip-flops ή πυκνωτές, που αποσκοπούν καθαρά στην αποθήκευση των δεδοµένων, η µνήµη χρειάζεται και κάποιον µηχανισµό προσπέλασης αυτών. Για το σκοπό αυτό περιλαµβάνει και δύο καταχωρητές, τους MDR και MAR, που ονοµάζονται αντίστοιχα καταχωρητής δεδοµένων της µνήµης (memory data register) και καταχωρητής διευθύνσεων της µνήµης (memory address register). Όταν µια λέξη πρόκειται να αποθηκευτεί στη µνήµη, πρέπει πρώτα να αποθηκευτεί στον καταχωρητή δεδοµένων της µνήµης MDR και η διεύθυνση, στην οποία πρόκειται να γίνει η αποθήκευση, πρέπει να γραφεί στον καταχωρητή διευθύνσεων της µνήµης MAR. Στη συνέχεια, τα δεδοµένα µεταφέρονται από τον MDR στην αντίστοιχη λέξη της µνήµης, η διεύθυνση της οποίας είναι γραµµένη στον MAR. Η διαδικασία αυτή ονοµάζεται εγγραφή στη µνήµη. Η µνήµη διατηρεί το περιεχόµενό της αναλλοίωτο, µέχρι να συµβεί επανεγγραφή. Όταν γίνει επανεγγραφή σε µια θέση της µνήµης, το προηγούµενο περιεχόµενό της εξαφανίζεται. Η αντίστροφη διαδικασία της εγγραφής είναι η ανάγνωση µιας λέξης από τη µνήµη. Κατ αυτήν, το περιεχόµενο µιας λέξης, της οποίας η διεύθυνση είναι γραµµένη στον
5 MAR, µεταφέρεται στον MDR, για να µεταφερθεί στη συνέχεια στις άλλες µονάδες του υπολογιστή. Το µήκος τους MDR είναι όσο το µήκος της λέξης του υπολογιστή, ενώ το µήκος του MAR είναι k bits, όπου 2 k είναι το µέγιστο πλήθος θέσεων της µνήµης. (Επειδή 2 k το πλήθος αριθµοί µπορούν να παρασταθούν µε k bits.) Τέλος, η µνήµη περιέχει και αρκετά άλλα λογικά και ηλεκτρονικά κυκλώµατα για τον έλεγχο της λειτουργίας της και για την επικοινωνία µε τις υπόλοιπες µονάδες του υπολογιστή. 2.3. Μονάδα Εισόδου-Εξόδου (Input-Output, I/O Unit) Η µονάδα εισόδου-εξόδου δέχεται τις πληροφορίες, που δίνονται από τον άνθρωπο, µέσω των περιφερειακών µονάδων υπό µορφή λέξεων και δίνει µέσω αυτών τα αποτελέσµατα. Περιέχει έναν καταχωρητή δεδοµένων Χ, που δέχεται από τις περιφερειακές µονάδες τις λέξεις που προορίζονται για την κεντρική µονάδα επεξεργασίας και το αντίστροφο. Επίσης, περιέχει έναν καταχωρητή Υ, που περιέχει τη διεύθυνση του περιφερειακού από ή προς το οποίο θα γίνει η µεταφορά της λέξης. Το µήκος του καταχωρητή Χ είναι µικρότερο ή ίσο µε το µήκος λέξης του υπολογιστή και το µήκος του καταχωρητή Υ εξαρτάται από τον αριθµό των περιφερειακών µονάδων που µπορεί να έχει ο υπολογιστής. Οι περιφερειακές µονάδες γενικά έχουν µικρή ταχύτητα, αρκετά µικρότερη από την ταχύτητα µε την οποία µπορεί να γίνεται η επεξεργασία των αντίστοιχων δεδοµένων από τη CPU. Εποµένως, για να γίνεται συγχρονισµός της διαφοράς ταχύτητας µεταξύ CPU και περιφερειακών µονάδων, υπάρχουν µέσα στη µονάδα εισόδου-εξόδου flip-flops για κάθε περιφερειακό, που καθορίζουν αν έχει τελειώσει ή όχι µια µεταφορά λέξης από ή προς τον καταχωρητή Χ. Τέλος, η µονάδα εισόδου-εξόδου περιέχει και αρκετά άλλα λογικά και ηλεκτρονικά κυκλώµατα για τον έλεγχο της λειτουργίας της και για την επικοινωνία µε τις υπόλοιπες µονάδες του υπολογιστή. 2.4. Μονάδα ελέγχου (Control Unit) Η µονάδα ελέγχου αποτελείται από δύο κύριους καταχωρητές, τους IR και PC και από τα απαραίτητα κυκλώµατα για τον έλεγχο και συντονισµό της λειτουργίας του υπολογιστή. Ο καταχωρητής IR ονοµάζεται καταχωρητής εντολών (instruction register) και είναι ο καταχωρητής εκείνος που δέχεται µία προς µία τις εντολές του προγράµµατος από τη µνήµη για να αναγνωρισθούν, να αναλυθούν σε επιµέρους εργασίες και, τέλος, να εκτελεσθούν. Ο καταχωρητής PC ονοµάζεται µετρητής προγράµµατος, ή µετρητής εντολών (program counter, instruction counter). Το περιεχόµενό του δίνει κάθε φορά τη διεύθυνση της θέσης της µνήµης στην οποία είναι αποθηκευµένη η επόµενη εντολή. Η εντολή αυτή θα µεταφερθεί από τη µνήµη στον καταχωρητή IR της µονάδας ελέγχου. Όταν γίνει η µεταφορά, ο µετρητής προγράµµατος θα αυξηθεί αυτόµατα, ώστε να δείχνει την επόµενη εντολή που πρέπει να µεταφερθεί.
6 Το µήκος του καταχωρητή IR είναι ίσο µε το µήκος λέξης του υπολογιστή, ενώ το µήκος του µετρητή προγράµµατος ισούται µε k, όπου 2 k είναι το πλήθος των λέξεων ή των διευθύνσεων της µνήµης του υπολογιστή. 3. Λειτουργία του Υπολογιστή Όπως αναφέραµε και παραπάνω, στη µνήµη αποθηκεύονται δεδοµένα και εντολές. Υπάρχει, λοιπόν, µια οµάδα διευθύνσεων, που αντιστοιχούν σε θέσεις της µνήµης, που περιέχουν εντολές. Συνήθως, οι εντολές αποθηκεύονται σε διαδοχικές λέξεις της µνήµης, σύµφωνα µε την επιθυµητή σειρά εκτέλεσής τους. Για κάθε εντολή, ο υπολογιστής συµπληρώνει δύο φάσεις, τις οποίες ονοµάζουµε φάση ανάκλησης (fetch phase) και φάση εκτέλεσης (execution phase). Οι φάσεις µπορεί να αναφέρονται και σαν κύκλοι, δηλαδή κύκλος ανάκλησης (fetch cycle) και κύκλος εκτέλεσης (execution cycle). Κατά τη φάση ανάκλησης, η εντολή, της οποίας η διεύθυνση βρίσκεται στο µετρητή προγράµµατος PC, µεταφέρεται από τη µνήµη στον MDR και ύστερα, µέσω της διαδροµής 3 6, στον καταχωρητή εντολών IR της µονάδας ελέγχου. Οι διακόπτες S 1 και S 2 βρίσκονται κατά τη φάση ανάκλησης στις θέσεις α και γ αντίστοιχα. Στην πραγµατικότητα, τα κυκλώµατα που στο σχήµα συµβολίζονται ως διακόπτες είναι κυκλώµατα λογικών πυλών (π.χ. αποπλέκτες), τα οποία δέχονται σήµατα από τη µονάδα ελέγχου. Όταν ολοκληρωθεί η µεταφορά της εντολής στον IR, ο µετρητής προγράµµατος PC αυξάνεται αυτόµατα, ώστε να προετοιµαστεί η µεταφορά της επόµενης εντολής. Συγκεκριµένα, στον ΕΚΥ, που οι εντολές καταλαµβάνουν µία θέση µνήµης η κάθε µία, ο µετρητής προγράµµατος αυξάνεται κάθε φορά κατά 1. Στο σηµείο αυτό τελειώνει η φάση ανάκλησης. Έπειτα ακολουθεί η φάση εκτέλεσης. Κατά τη φάση εκτέλεσης, η εντολή που βρίσκεται στον καταχωρητή εντολών, αποκωδικοποιείται και αναλύεται σε επιµέρους εργασίες που πρέπει να εκτελεστούν. Στη συνέχεια, η µονάδα ελέγχου στέλνει στις υπόλοιπες µονάδες τα κατάλληλα σήµατα ελέγχου για την εκτέλεση των επιµέρους εργασιών µε την κατάλληλη σειρά. Η εκτέλεση των επιµέρους εργασιών σηµαίνει και την εκτέλεση της εντολής, οπότε τελειώνει η φάση εκτέλεσης και κλείνει ο κύκλος φάση ανάκλησης φάση εκτέλεσης για τη συγκεκριµένη εντολή. Στη συνέχεια, έχουµε νέο κύκλο φάσεως ανάκλησης - φάσεως εκτέλεσης για νέα εντολή. Κατά το νέο κύκλο θα γίνει πρώτα η µεταφορά από τη µνήµη της επόµενης εντολής, δεδοµένου ότι κατά τον προηγούµενο κύκλο είχε αυξηθεί κατάλληλα το περιεχόµενο του µετρητή προγράµµατος. Στη συνέχεια, θα ακολουθήσει η εκτέλεση της νέας εντολής, οπότε συµπληρώνεται ο νέος κύκλος. Οι κύκλοι των δύο φάσεων (ανάκλησης εκτέλεσης) θα επαναλαµβάνονται συνέχεια, µέχρι να εµφανισθεί και να εκτελεσθεί µία συγκεκριµένη εντολή, µε την οποία διακόπτεται η λειτουργία του υπολογιστή.
7 II. ΣΥΜΒΟΛΙΚΗ ΓΛΩΣΣΑ (ASSEMBLY) ΤΟΥ ΕΚΥ Για να ζητήσουµε από το υλικό του υπολογιστή να εκτελέσει µια λειτουργία, πρέπει να «µιλάµε τη γλώσσα του». Οι λέξεις στη γλώσσα του υπολογιστή ονοµάζονται εντολές και το λεξιλόγιο είναι το σύνολο εντολών. Στο κεφάλαιο αυτό θα δούµε το σύνολο εντολών του EKY στη µορφή που είναι εύχρηστη για τους ανθρώπους και στη µορφή που είναι κατανοητή από τους υπολογιστές. Μπορεί κανείς να σκεφτεί ότι οι γλώσσες των υπολογιστών ποικίλουν όσο οι γλώσσες των ανθρώπων. Στην πραγµατικότητα, όµως, οι γλώσσες των υπολογιστών µοιάζουν πολύ µεταξύ τους, όπως οι τοπικές διάλεκτοι της ίδιας γλώσσας. Εποµένως, αν κανείς µάθει µία από αυτές µπορεί πολύ εύκολα να εξοικειωθεί και µε τις υπόλοιπες. Η οµοιότητα αυτή µεταξύ τους οφείλεται στο ότι όλοι οι υπολογιστές κατασκευάζονται από τεχνολογίες υλικού που ακολουθούν τις ίδιες βασικές αρχές και στο ότι υπάρχουν κάποιες βασικές λειτουργίες που όλοι οι υπολογιστές πρέπει να εξυπηρετούν. Επίσης, οι αρχιτέκτονες υπολογιστών έχουν πάντα τον ίδιο σκοπό: να βρουν µια γλώσσα που κάνει εύκολη τόσο την κατασκευή του υλικού, όσο και του compiler, και µεγιστοποιεί την απόδοση, ενώ ταυτόχρονα ελαχιστοποιεί το κόστος. 1. Εντολές γλώσσας ASSEMBLY του ΕΚΥ 1.1. Μορφή εντολής Στον ΕΚΥ, κάθε εντολή παριστάνεται µε µία λέξη του υπολογιστή. Υπάρχουν και υπολογιστές, στους οποίους κάθε εντολή παριστάνεται µε δύο ή περισσότερες λέξεις, ή αντίστροφα, µία λέξη παριστάνει πολλές εντολές. Στον ΕΚΥ, η εντολή χωρίζεται νοερά σε δύο τµήµατα, από τα οποία το πρώτο ονοµάζεται κώδικας εντολής (instruction code) και το δεύτερο τµήµα διεύθυνσης (address part), όπως φαίνεται και στο παρακάτω σχήµα. Το πρώτο τµήµα είναι αυτό που χαρακτηρίζει την εντολή.
8 n=16 bits Bit: 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 Κώδικας εντολής n 1 = 4 bits Τµήµα διευθύνσεως n 2 = 12 bits Κάθε υπολογιστής µπορεί να εκτελέσει ένα συγκεκριµένο ρεπερτόριο εντολών, το οποίο καθορίζεται κατά το σχεδιασµό του. Ο κώδικας εντολής είναι ένας δυαδικός αριθµός µήκους n 1, διαφορετικός για κάθε εντολή. Εποµένως, ο µέγιστος αριθµός εντολών που µπορεί να 1 έχει ένας υπολογιστής µε µήκος του κώδικα εντολής n 1, είναι 2 n. Στον ΕΚΥ, n 1 =4, οπότε ο αριθµός των δυνατών διαφορετικών εντολών είναι 2 4 = 16. Ο πίνακας που περιγράφει τις εντολές ενός υπολογιστή και τους αντίστοιχους δυαδικούς κώδικές τους ονοµάζεται πίνακας εντολών του συγκεκριµένου υπολογιστή και περιέχει το ρεπερτόριο εντολών αυτού Οι εντολές χωρίζονται σε οµάδες, ανάλογα µε τη λειτουργία που επιτελούν π.χ. εντολές εκτέλεσης αριθµητικών πράξεων, εντολές µεταφοράς δεδοµένων, εντολές άλµατος, εντολές ολίσθησης, κ.λ.π. Το τµήµα διεύθυνσης της εντολής στον ΕΚΥ έχει µήκος 12 bits. Αυτό παριστάνει τη διεύθυνση µιας λέξης της µνήµης, η οποία αποτελεί το όρισµα της εντολής, που περιγράφεται από τον κώδικα της εντολής. Για παράδειγµα, η εντολή 0011 000000001101 του ΕΚΥ, έχει κώδικα εντολής 0011 και τµήµα διεύθυνσης 000000001101. Η εντολής µε κώδικα 0011 σηµαίνει «Πρόσθεση στο περιεχόµενο του συσσωρευτή του περιεχοµένου της διεύθυνσης της µνήµης, την οποία διεύθυνση δείχνει το τµήµα διεύθυνσης της εντολής. Το αποτέλεσµα της πρόσθεσης µένει στο συσσωρευτή.» Εποµένως, η εντολή 0011 000000001101 σηµαίνει «Πρόσθεση στο συσσωρευτή του περιεχοµένου της διεύθυνσης 000000001101. Το αποτέλεσµα µένει στο συσσωρευτή.» Στο σηµείο αυτό πρέπει να επισηµάνουµε τη διαφορά µεταξύ των όρων «διεύθυνση εντολής» και «τµήµα διευθύνσεως εντολής». ιεύθυνση εντολής είναι η διεύθυνση της θέσης της µνήµης, στην οποία είναι αποθηκευµένη η εντολή. Τµήµα διεύθυνσης της εντολής είναι τα n 2 δεξιότερα bits αυτής. Το τµήµα διεύθυνσης της εντολής µπορεί να δείχνει τη διεύθυνση κάποιας θέσης της µνήµης, της οποίας το περιεχόµενο θα χρησιµοποιηθεί κατά την εκτέλεση της εντολής. 1.2. Εντολές αναφοράς στη µνήµη (Memory Reference Instructions) Οι γλώσσες προγραµµατισµού έχουν απλές µεταβλητές, που περιέχουν απλά δεδοµένα, αλλά έχουν και πιο πολύπλοκες δοµές: πίνακες και δοµές δεδοµένων. Οι πολύπλοκες αυτές δοµές δεδοµένων µπορεί να περιέχουν πολύ περισσότερα δεδοµένα από αυτά που χωρούν στους καταχωρητές του υπολογιστή, όσους καταχωρητές και αν διαθέτει ένας υπολογιστής
9 (Αυτό, λοιπόν ισχύει πολύ περισσότερο για τον ΕΚΥ, ο οποίος έχει µόνο έναν καταχωρητήσυσσωρευτή, τον Α). Πώς θα γίνει, λοιπόν, η αναπαράσταση και η προσπέλαση αυτών των µεγάλων δοµών δεδοµένων; Η απάντηση είναι ότι πολύ λίγα δεδοµένα χωρούν στους καταχωρητές, αλλά η µνήµη του υπολογιστή µπορεί να αποθηκεύσει πολλές τάξεις µεγέθους περισσότερα. Εποµένως, οι δοµές δεδοµένων αποθηκεύονται στη µνήµη. Θα πρέπει, εποµένως, στο ρεπερτόριο των εντολών του να συµπεριλαµβάνονται πάντα και εντολές που µεταφέρουν δεδοµένα µεταξύ της µνήµης και των καταχωρητών. Οι εντολές αυτές ονοµάζονται εντολές µεταφοράς δεδοµένων. Για να προσπελαστεί µία λέξη της µνήµης, η εντολή πρέπει να παρέχει τη διεύθυνσή της. Η εντολή µεταφοράς δεδοµένων που αντιγράφει δεδοµένα από τη µνήµη σε έναν καταχωρητή λέγεται εντολή φόρτωσης (load) και συµβολίζεται ως LDA XXX Αυτό σηµαίνει: Αντέγραψε στον καταχωρητή Α τα περιεχόµενα της λέξης της µνήµης µε διεύθυνση ΧΧΧ LoaD A Η αντίστροφη εντολή της φόρτωσης είναι η εντολή αποθήκευσης (store). Αυτή αντιγράφει δεδοµένα από έναν καταχωρητή στη µνήµη και συµβολίζεται ως XXX Αυτό σηµαίνει: Αντέγραψε στη λέξη της µνήµης µε διεύθυνση ΧΧΧ τα περιεχόµενα του καταχωρητή Α STore A Εκτός από τις δύο αυτές εντολές που µόλις περιγράψαµε, στον ΕΚΥ, στην ίδια κατηγορία (εντολές αναφοράς στη µνήµη) εντάσσονται και οι εντολές που φορτώνουν δεδοµένα από τη µνήµη και εκτελούν κάποια αριθµητική πράξη µε αυτά. Για το λόγο αυτό, στις εντολές αυτές το τµήµα διεύθυνσης δείχνει τη διεύθυνση ενός αριθµού. Στον παρακάτω πίνακα περιγράφονται οι εντολές αυτές, µαζί µε τους αντίστοιχους δυαδικούς κώδικές τους. α/α Κώδικας εντολής (περιεχόµενο των 4 πρώτων bits της εντολής) Μνηµονικό όνοµα εντολής Σηµασία εντολής Επεξήγηση 1 0001 LDA (Α) := (Ν) Μεταφορά στο συσσωρευτή Α του περιεχοµένου της διεύθυνσης Ν της µνήµης 2 0010 (Ν) := (Α) Μεταφορά στη διεύθυνση Ν της µνήµης του περιεχοµένου του συσσωρευτή Α 3 0011 ADA (Α) := (Α) + (Ν) Πρόσθεση του περιεχοµένου του συσσωρευτή Α µε το περιεχόµενο της διεύθυνσης Ν της µνήµης. Το αποτέλεσµα µένει στο συσσωρευτή και αποτελεί το νέο περιεχόµενό του. 4 0100 SBA (Α) := (Α) - (Ν) Αφαίρεση από το περιεχόµενο του συσσωρευτή Α του περιεχοµένου της διεύθυνσης Ν της µνήµης. Το αποτέλεσµα µένει στο συσσωρευτή Α.
10 5 0101 MLA (Α) := (Α) * (Ν) Πολλαπλασιασµός του περιεχοµένου του συσσωρευτή Α µε το περιεχόµενο της διεύθυνσης Ν της µνήµης. Το αποτέλεσµα µένει στο συσσωρευτή Α. 6 0110 DVA (Α) := (Α) / (Ν) Πολλαπλασιασµός του περιεχοµένου του συσσωρευτή Α µε το περιεχόµενο της διεύθυνσης Ν της µνήµης. Το πηλίκο της διαίρεσης µένει στο συσσωρευτή Α, το υπόλοιπο χάνεται. Στον παραπάνω πίνακα χρησιµοποιούµε τον εξής συµβολισµό: := ανάθεση τιµής (Χ) το περιεχόµενο του καταχωρητή Χ, αν το Χ είναι καταχωρητής, ή το Για παράδειγµα, (Α) := (00000010001) σηµαίνει ότι το περιεχόµενο του καταχωρητή Α γίνεται ίσο µε το περιεχόµενο της διεύθυνσης 00000010001. Στη συνέχεια, θα παρακολουθήσουµε, µε τη βοήθεια του παραπάνω πίνακα, τη λειτουργία του ΕΚΥ κατά την εκτέλεση ενός στοιχειώδους προγράµµατος. Παράδειγµα: Ζητείται να γραφεί πρόγραµµα που να προσθέτει τα προσθέτει τα περιεχόµενα των διευθύνσεων 0000001010 και 0000001011 της µνήµης και να αποθηκεύει το αποτέλεσµα της πρόσθεσης στη διεύθυνση 0000001100. Υποθέτουµε ότι οι αριθµοί που είναι για πρόσθεση, καθώς και οι εντολές του προγράµµατος έχουν ήδη τοποθετηθεί στη µνήµη στις κατάλληλες θέσεις, πριν την έναρξή του. Εποµένως, πριν την έναρξη του προγράµµατος, το περιεχόµενο της µνήµης θα είναι το εξής: ιεύθυνση µνήµης Περιεχόµενο Κώδικας εντολής Τµήµα διεύθυνσης 000000000000 0001 000000001010 000000000001 0011 000000001011 000000000010 0010 000000001100 Εντολές προγράµµατος 000000000011 0000 000000000000 000000001010 0000 000100000000 000000001011 0000 000100000001 000000001100 0000 000000000000 εδοµένα ιεύθυνση αποθήκευσης αποτελέσµατος
11 Ο πίνακας αυτός αποτελεί ταυτόχρονα και το ζητούµενο πρόγραµµα σε γλώσσα µηχανής του ΕΚΥ. Στο σηµείο αυτό, λοιπόν, αξίζει να επισηµάνουµε τη διαφορά µεταξύ γλώσσας µηχανής και συµβολικής γλώσσας (ASSEMLY) ενός υπολογιστή (βλέπε και σελίδα 18). Η γλώσσα µηχανής είναι η γλώσσα που γίνεται απ ευθείας αντιληπτή από τον υπολογιστή. Η συµβολική γλώσσα είναι αντιληπτή από τον άνθρωπο. Η διαφορά της συµβολικής γλώσσας από τις γνωστές γλώσσες προγραµµατισµού υψηλού επιπέδου έγκειται στο ότι οι εντολές της συµβολικής γλώσσας αντιστοιχίζονται σε µία ακριβώς εντολή της γλώσσας µηχανής. Εποµένως, κάθε υπολογιστής, έχει τη δική του συµβολική γλώσσα, της οποίας οι εντολές αντιστοιχούν µία προς µία µε τις εντολές µηχανής αυτού. Για να γράψει ο προγραµµατιστής ένα πρόγραµµα σε γλώσσα µηχανής ενός υπολογιστή, πρέπει να γράψει τις εντολές µία προς µία, τα δεδοµένα, και τις διευθύνσεις των θέσεων µνήµης, οι οποίες θα περιέχουν τις εντολές και τα δεδοµένα, όπως στον παραπάνω πίνακα. Στο παράδειγµα αυτό, υποθέτουµε, επίσης, ότι το περιεχόµενο του µετρητή προγράµµατος PC είναι αρχικά ίσο µε 0. Πιέζοντας το πλήκτρο RT του υπολογιστή, αρχίζει η λειτουργία του. Αυτό σηµαίνει µία συνεχή επανάληψη κύκλων των δύο φάσεων ανάκλησης (ΦΑ i ) και εκτέλεσης (ΦΕ i ) για κάθε εντολή i. Στο παράδειγµά µας το i παίρνει τις τιµές 1, 2, 3, 4. Στη συνέχεια, περιγράφουµε αναλυτικά τι συµβαίνει κατά τις φάσεις ανάκλησης και εκτέλεσης του παραπάνω προγράµµατος. ΦΑ 1 : Αφού το περιεχόµενο του µετρητή προγράµµατος είναι 0, η εντολή που βρίσκεται στη διεύθυνση 0 της µνήµης, µεταφέρεται στον καταχωρητή εντολών IR µέσω της διαδροµής (3) (6), στο σχήµα της σελίδας 3. Για να γίνει αυτό, οι διακόπτες S 1 και S 2, που αλλάζουν θέση ταυτόχρονα, βρίσκονται στις θέσεις α και γ, αντίστοιχα. Το αποτέλεσµα της µεταφοράς αυτής είναι (IR) := 0001000000001010. Στη συνέχεια, το περιεχόµενο του µετρητή προγράµµατος PC αυξάνεται αυτόµατα κατά µία µονάδα, οπότε γίνεται: (PC) := 000000000001. ΦΕ 1 : Οι διακόπτες S 1 και S 2 αλλάζουν θέση και έρχονται αντίστοιχα στις θέσεις β και δ. Η εντολή, που είναι γραµµένη στον καταχωρητή εντολών IR, αναγνωρίζεται µε τη βοήθεια ενός αποκωδικοποιητή από τη µονάδα ελέγχου, µε εξέταση του τµήµατος κώδικα εντολής, που είναι 0001. Αναγνωρίζεται, εποµένως η εντολή LDA, (A):=(N), όπου, στη συγκεκριµένη περίπτωση Ν=000000001010. Η µονάδα ελέγχου, αναλύει, στη συνέχεια, την εντολή σε στοιχειώδεις εργασίες, που πρέπει να εκτελεσθούν. Στη συγκεκριµένη περίπτωση, πρέπει α) Η διεύθυνση Ν=000000001010 να σταλεί στον καταχωρητή διευθύνσεων MAR της µνήµης, µέσω του διακόπτη S 1 και της διαδροµής (2). β) Το περιεχόµενο της διεύθυνσης Ν να µεταφερθεί από τη µνήµη στον καταχωρητή δεδοµένων της µνήµης MDR. γ) Το περιεχόµενο του καταχωρητή δεδοµένων της µνήµης να µεταφερθεί από τη διαδροµή (3) (4), µέσω του διακόπτη S 2, στο συσσωρευτή Α της αριθµητικής µονάδας. Το αποτέλεσµα της εκτέλεσης της εντολής αυτής είναι: (Α) := 0000000100000000. ΦΑ 2 : Οι διακόπτες S 1 και S 2 πηγαίνουν στις θέσεις α και γ αντίστοιχα. Εποµένως, γίνεται το εξής: (IR) := ((PC)) = (000000000001), δηλαδή (IR) :=
12 0011000000001011. Τέλος, (PC) := (PC) +1, δηλαδή, (PC) := 000000000010. ΦΕ 2 : Οι διακόπτες S 1 και S 2 µεταφέρονται πάλι στις θέσεις β και δ, αντίστοιχα. Αναγνωρίζεται η εντολή ADA, (Α) := (Α) + (Ν) (κώδικας 0011), όπου Ν=000000001011. Το περιεχόµενο της διεύθυνσης 000000001011 µεταφέρεται στον καταχωρητή Μ της αριθµητικής µονάδας και προστίθεται στο περιεχόµενο του συσσωρευτή Α. (Α) := (Α) + (000000001011) = 0000000100000000 + 0000000100000001 = 0000001000000001. ΦΑ 3 : Οι διακόπτες S 1 και S 2 πηγαίνουν στις θέσεις α και γ αντίστοιχα. Εποµένως, γίνεται το εξής: (IR) := ((PC)) = (000000000010), δηλαδή (IR) := 0010000000001100. Τέλος, (PC) := (PC) +1, δηλαδή, (PC) := 000000000011. ΦΕ 3 : Οι διακόπτες S 1 και S 2 µεταφέρονται πάλι στις θέσεις β και δ, αντίστοιχα. Αναγνωρίζεται η εντολή, (N) := (A), όπου Ν=000000001100. Εποµένως, το περιεχόµενο του Α µεταφέρεται στη διεύθυνση 000000001100. Αποτέλεσµα της εκτέλεσης της εντολής αυτής είναι (000000001100) := 0000001000000001. ΦΑ 4 : Οι διακόπτες S 1 και S 2 πηγαίνουν στις θέσεις α και γ αντίστοιχα. Εποµένως, γίνεται το εξής: (IR) := ((PC)) = (000000000011), δηλαδή (IR) := 0000000000000000. Τέλος, (PC) := (PC) +1, δηλαδή, (PC) := 000000000100. ΦΕ 4 : Οι διακόπτες S 1 και S 2 µεταφέρονται πάλι στις θέσεις β και δ, αντίστοιχα. Αναγνωρίζεται η εντολή µε κώδικα 0000. Πρόκειται για την εντολή διακοπής της λειτουργίας του υπολογιστή. Το τµήµα διεύθυνσης της εντολής αυτής δε χρησιµοποιείται και µπορεί να περιέχει ο,τιδήποτε. Μετά τον τερµατισµό του παραπάνω προγράµµατος, τα περιεχόµενα της µνήµης είναι σχεδόν τα ίδια µε προηγουµένως, µε τη µόνη διαφορά ότι το περιεχόµενο της διεύθυνσης 000000001100 δεν είναι 0 όπως πριν, αλλά 0000001000000001, ίσο δηλαδή µε το άθροισµα των περιεχοµένων των διευθύνσεων 000000001010 και 000000001011 της µνήµης. Παρατηρούµε ότι στις διευθύνσεις 000000000000 έως και 000000000011, το περιεχόµενο των αντίστοιχων θέσεων µνήµης είναι εντολές, ενώ στις διευθύνσεις 000000001010 έως και 000000001100 έχουµε δεδοµένα. Ο υπολογιστής δεν κάνει διάκριση µεταξύ εντολών και δεδοµένων. Εποµένως, είναι ευθύνη του προγραµµατιστή να γράψει το πρόγραµµα κατά τέτοιο τρόπο, ώστε να υπολογιστής να εκτελεί εντολές και όχι δεδοµένα ως εντολές. Για συντοµία, τα προγράµµατα συνήθως δεν γράφονται σε δυαδική µορφή, αλλά σε οκταδική ή δεκαεξαδική.. Σε δεκαεξαδική µορφή, χρησιµοποιούµε 3 ψηφία για τις διευθύνσεις, ενώ για την παράσταση λέξεων 4 ψηφία. Το πρόγραµµα του παραπάνω πίνακα, γράφεται, εποµένως, σε δεκαεξαδική µορφή ως εξής:
13 ιεύθυνση µνήµης Περιεχόµενο Κώδικας εντολής Τµήµα διεύθυνσης 000 1 00A 001 3 00B 002 2 00C 003 0 000 00A 0 100 00B 0 101 00C 0 000 1.3. Εντολές άλµατος (Jump Instructions) Η κυριότερη διαφορά µεταξύ ενός υπολογιστή και µίας αριθµοµηχανής είναι ότι ο υπολογιστής µπορεί να παίρνει αποφάσεις και να τροποποιεί τη ροή του προγράµµατος, ανάλογα µε το αποτέλεσµά τους. Στις γλώσσες προγραµµατισµού υψηλού επιπέδου, η λήψη αποφάσεων υλοποιείται µε την εντολής if, σε συνδυασµό, κάποιες φορές, µε την εντολή goto και τη χρήση ετικετών. Εξάλλου, ακόµη και οι δοµές των βρόχων (while, repeat, κλπ) µπορούν να παρασταθούν µε χρήση µόνο των if και goto. Η διαφοροποίηση της ροής εκτέλεσης του προγράµµατος πραγµατοποιείται µε τις εντολές άλµατος (jump instructions). Ο ΕΚΥ διαθέτει δύο εντολές άλµατος, την εντολή άλµατος χωρίς συνθήκη (unconditional jump instruction) και την εντολή άλµατος υπό συνθήκη (conditional jump instruction). Η εντολή άλµατος χωρίς συνθήκη συµβολίζεται ως JMP XXX Αυτό σηµαίνει: Η επόµενη εντολή που πρέπει να εκτελεστεί βρίσκεται στη λέξη της µνήµης µε διεύθυνση ΧΧΧ - JuMP Κατά την εκτέλεση της εντολής αυτής, το περιεχόµενο του τµήµατος διευθύνσεων του καταχωρητή εντολών (Instruction Register IR), αντιγράφεται στο µετρητή προγράµµατος. Η εντολή άλµατος υπό συνθήκη συµβολίζεται ως JΑΝ XXX Αυτό σηµαίνει:
14 Αν το περιεχόµενο του καταχωρητή Α είναι αρνητικός αριθµός, η επόµενη εντολή που πρέπει να εκτελεστεί βρίσκεται στη λέξη της µνήµης µε διεύθυνση ΧΧΧ Jump if A Negative Κατά την εκτέλεση της εντολής αυτής, το περιεχόµενο του τµήµατος διευθύνσεων του καταχωρητή εντολών (IR), αντιγράφεται στο µετρητή προγράµµατος µόνο αν το περιεχόµενο του καταχωρητή Α είναι αρνητικός αριθµός, δηλ. αν το πρώτο bit του είναι ίσο µε 1. ιαφορετικά, η εντολή αυτή δεν έχει καµία επίδραση στην εκτέλεση του προγράµµατος. 1.4. Εντολές ολίσθησης (Shift Instruction) Ο EKY διαθέτει δύο εντολές ολίσθησης. Η πρώτη ονοµάζεται εντολή ολίσθησης προς τα αριστερά και συµβολίζεται ως SAL XXX Αυτό σηµαίνει: Ολίσθησε το περιεχόµενο του καταχωρητή Α κατά ΧΧΧ θέσεις αριστερά Shift A Left Επισηµαίνουµε ότι το τµήµα διεύθυνσης της εντολής αυτής περιέχει τον αριθµό των ολισθήσεων που πρέπει να πραγµατοποιηθούν και όχι κάποια διεύθυνση. Τα ΧΧΧ δεξιά bits του αριθµού αντικαθίστανται µε µηδενικά bits καθώς µετατοπίζονται. Εποµένως, αν τα ΧΧΧ+1 αριστερότερα bits ενός θετικού προσηµασµένου ακεραίου αριθµού, ή τα ΧΧΧ αριστερότερα bits ενός µη προσηµασµένου ακεραίου αριθµού είναι ίσα µε 0, τότε η εντολή αυτή ισοδυναµεί µε πολλαπλασιασµό του αριθµού µε 2 ΧΧΧ. Η δεύτερη εντολή ολίσθησης ονοµάζεται εντολή ολίσθησης προς τα δεξιά και συµβολίζεται ως SAR XXX Αυτό σηµαίνει: Ολίσθησε το περιεχόµενο του καταχωρητή Α κατά ΧΧΧ θέσεις δεξιά Shift A Right Τα ΧΧΧ αριστερά bits του αριθµού αντικαθίστανται µε µηδενικά bits καθώς µετατοπίζονται. Εποµένως, αν πρόκειται για µη προσηµασµένο ή θετικό προσηµασµένο ακέραιο αριθµό, η εντολή αυτή ισοδυναµεί µε ακέραια διαίρεση του αριθµού µε 2 ΧΧΧ. 1.5. Εντολές Εισόδου Εξόδου (Input Output Instructions) Όπως αναφέραµε και στην παράγραφο 2.3 του µέρους I. του κειµένου αυτού, η επικοινωνία ανθρώπου υπολογιστή πραγµατοποιείται µε τις περιφερειακές µονάδες, µέσω της µονάδας εισόδου-εξόδου (η οποία συµβολίζεται ως µονάδα Ι/Ο). Υπάρχουν πολλών ειδών περιφερειακές µονάδες στους Η/Υ. Για απλούστευση εδώ θα θεωρήσουµε ότι ο ΕΚΥ διαθέτει µόνο ένα τηλέτυπο, συνδεδεµένο µε τη µονάδα Ι/Ο. Αυτό µπορεί να είναι πολύ απαρχαιωµένο σαν περιφερειακή συσκευή, αλλά η αρχή λειτουργίας του είναι σχεδόν ίδια µε όλες τις σύγχρονες περιφερειακές συσκευές. Με το τηλέτυπο µπορούν να εισαχθούν
15 δεδοµένα και εντολές στον ΕΚΥ, αλλά και να ληφθούν αποτελέσµατα που προκύπτουν από την εκτέλεση των προγραµµάτων. Ο ΕΚΥ διαθέτει δύο εντολές Ι/Ο. Η πρώτη είναι η εντολή εξόδου. Το αποτέλεσµα της εντολής αυτής είναι να στέλνονται προς το τηλέτυπο τα τρία δεξιά bits του καταχωρητή Α (bits 2, 1, 0), τα οποία εκτυπώνονται σαν ένας οκταδικός αριθµός. Με την ίδια εντολή µπορούν να αποσταλούν προς το τηλέτυπο τα 7 δεξιά bits του καταχωρητή Α (bits 6,, 0), τα οποία εκτυπώνονται σαν ένας χαρακτήρας ASCII (βλέπε Παράρτηµα). Το εάν θα αποσταλεί οκταδικός αριθµός ή ASCII χαρακτήρας εξαρτάται από το bit 0 της εντολής. Αν το bit αυτό ισούται µε 1, θα αποσταλεί οκταδικό ψηφίο, αν ισούται µε 0, θα αποσταλεί χαρακτήρας ASCII. Η εντολή αυτή συµβολίζεται ως εξής: OUT, 1 προκειµένου για εκτύπωση οκταδικού αριθµού, ή OUT, 0 προκειµένου για εκτύπωση χαρακτήρα ASCII. Η δεύτερη εντολή Ι/Ο είναι η εντολή εισόδου. Τα αποτελέσµατα της εκτέλεσής της είναι ακριβώς τα αντίθετα των αποτελεσµάτων της εντολής εξόδου. Η εντολή αυτή συµβολίζεται ως εξής: INP, 1 προκειµένου για ανάγνωση οκταδικού αριθµού, ο οποίος καταλαµβάνει τα τρία δεξιά bits του καταχωρητή Α, ή INP, 0 προκειµένου για ανάγνωση χαρακτήρα ASCII, ο οποίος καταλαµβάνει τα 7 δεξιά bits του καταχωρητή Α. Στο σηµείο αυτό επισηµαίνουµε ότι και στις εντολές Ι/Ο, το τµήµα διευθύνσεως δεν περιέχει κάποια διεύθυνση. Το bit 0 του τµήµατος διεύθυνσης καθορίζει αν θα γίνει µεταφορά οκταδικού αριθµού ή χαρακτήρα ASCII. Τα υπόλοιπα bits µπορούν να χρησιµοποιηθούν σε µία πιθανή επέκταση του ΕΚΥ, για την επικοινωνία του µε άλλες περιφερειακές συσκευές. Για παράδειγµα, αν το bit k (k 0) ισούται µε 1, τότε η είσοδος ή η έξοδος θα πραγµατοποιηθεί από ή προς την περιφερειακή συσκευή k. 1.6. Εντολές καταχωρητή δείκτη (Index register instructions) Για τη διευκόλυνση της υλοποίησης προγραµµάτων που περιέχουν βρόχους, οι υπολογιστές διαθέτουν έναν αριθµό καταχωρητών, που ονοµάζονται καταχωρητές δείκτη (index registers) και βρίσκονται στη µονάδα ελέγχου. Ο ΕΚΥ διαθέτει έναν καταχωρητή δείκτη Β, µήκους 16 bits. Συνήθως, σε κάθε καταχωρητή δείκτη αντιστοιχεί ένα bit στην εντολή, που καθορίζει εάν η εντολή αναφέρεται στο συγκεκριµένο καταχωρητή δείκτη, ανάλογα αν το bit αυτό ισούται µε 0 ή 1. Στον ΕΚΥ, το bit δείκτη, όπως ονοµάζεται, είναι το bit 11. Εποµένως, η µορφή της εντολής διαµορφώνεται όπως φαίνεται στο παρακάτω σχήµα.
16 n=16 bits Bit: 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 Κώδικας εντολής n 1 = 4 bits bit δείκτη Τµήµα διευθύνσεως n 2 = 11 bits Αν µία εντολή αναφοράς στη µνήµη χρησιµοποιεί τον καταχωρητή δείκτη, δηλαδή αν το bit δείκτη ισούται µε 1, τότε η διεύθυνση Ν της θέσης της µνήµης, στην οποία αναφέρεται η εντολή αυτή, δεν είναι πλέον αυτή που είναι γραµµένη στο τµήµα διεύθυνσης της εντολής. Η διεύθυνση Ν προκύπτει από το άθροισµα του περιεχοµένου του καταχωρητή Β και του περιεχοµένου του τµήµατος διεύθυνσης της εντολής. Επίσης, στις εντολές άλµατος, αν το bit δείκτη είναι 1, το άλµα δεν πραγµατοποιείται στη διεύθυνση που δείχνει το τµήµα διεύθυνσης της εντολής, αλλά στη διεύθυνση που δίδεται από το άθροισµα του περιεχοµένου του καταχωρητή Β και του περιεχοµένου του τµήµατος διεύθυνσης της εντολής. Οι υπολογιστές διαθέτουν, επίσης, µια οµάδα εντολών, που ονοµάζονται εντολές καταχωρητών δείκτη, µέσω των οποίων τροποποιούµε και χρησιµοποιούµε τους καταχωρητές δείκτη. Ο ΕΚΥ έχει 3 τέτοιες εντολές. Η πρώτη είναι η εντολή ανάγνωσης του καταχωρητή δείκτη Β, που συµβολίζεται ως LDI XXX Αυτό σηµαίνει: Αντέγραψε το περιεχόµενο της διεύθυνσης ΧΧΧ της µνήµης στον καταχωρητή Β LoaD Index Η δεύτερη εντολή καταχωρητή δείκτη είναι η εντολή αποθήκευσης του καταχωρητή δείκτη Β, που συµβολίζεται ως STI XXX Αυτό σηµαίνει: Αντέγραψε το περιεχόµενο του καταχωρητή Β στη διεύθυνση ΧΧΧ της µνήµης STore Index Η τρίτη εντολή καταχωρητή δείκτη είναι η εντολή δείκτη άλµατος, που συµβολίζεται ως INJ XXX Αυτό σηµαίνει: Αν το περιεχόµενο του Β είναι διάφορο του 0, τότε (α) το περιεχόµενο του Β µειώνεται κατά 1 και (β) η επόµενη εντολή που θα εκτελεστεί βρίσκεται στη διεύθυνση ΧΧΧ. ιαφορετικά, δεν συµβαίνει καµία αλλαγή στη ροή εκτέλεσης του προγράµµατος, ούτε στο περιεχόµενο του Β. INdex Jump
17 Στο σηµείο αυτό επισηµαίνουµε ότι οι εντολές καταχωρητή δείκτη, οι εντολές ολίσθησης και οι εντολές εισόδου-εξόδου δεν χρησιµοποιούν το bit δείκτη. 1.7. Ανακεφαλαίωση Ο παρακάτω πίνακας ανακεφαλαιώνει όλες τις εντολές του EKY, που περιγράψαµε στις προηγούµενες παραγράφους: Γλώσσα ASSEMBLY του ΕΚΥ Κατηγορία Κώδικας (δεκαεξαδικό) Μνηµονικό όνοµα εντολής Σηµασία 0 HLT STOP 1 LDA (A) := (N), LoaD A 2 (N) := (A), Store A Αναφοράς στη µνήµη 3 ADA (A) := (A) + (N), Add to A 4 SBA (A) := (A) - (N), SuBtract from A 5 MLA (A) := (A) * (N), MuLtiply with A 6 DVA (A) := (A) / (N), DiVide with A 7 JMP (PC):=N, JuMP Άλµατος 8 JAN (PC):=N, αν (Α)<0, Jump if A Negative Εισόδου-Εξόδου 9 OUT OUTput A INP INPut B SAL Ολίσθηση του Α προς τα αριστερά Ν θέσεις, Ολίσθησης Shift A Left C SAR Ολίσθηση του Α προς τα δεξιά Ν θέσεις, Shift A Right D LDI (B) := (N), LoaD Index E STI (N) := (B), STore Index Καταχωρητή δείκτη F INJ Αν (Β) 0, τότε (Β):=(Β)-1 και (PC):=N, INdex Jump
18 Στον πίνακα αυτό ακολουθούµε τους εξής συµβολισµούς: := ανάθεση τιµής (Χ) περιεχόµενο του Χ (καταχωρητή ή θέσης µνήµης) PC Μετρητής προγράµµατος Α Καταχωρητής γενικού σκοπού (συσσωρευτής) Β Καταχωρητής δείκτη Ν (α) Για τις εντολές ολίσθησης είναι ο αριθµός που περιέχεται στο τµήµα διεύθυνσης της εντολής (β) Για τις εντολές καταχωρητή δείκτη είναι η διεύθυνση που περιέχεται στο τµήµα διεύθυνσης της εντολής (γ) Για τις εντολές αναφοράς στη µνήµη και τις εντολές άλµατος, (i) Αν bit 11=0, είναι η διεύθυνση που περιέχεται στο τµήµα διεύθυνσης της εντολής (ii) Αν bit 11=1, είναι η διεύθυνση που δίδεται από το άθροισµα του περιεχοµένου του τµήµατος διεύθυνσης της εντολής και του περιεχοµένου του καταχωρητή δείκτη 2. Προγραµµατισµός Η/Υ Συνήθως ο προγραµµατιστής γράφει το πρόγραµµά του σε κάποια γλώσσα υψηλού επιπέδου (C, C++, Java, Pacal, κλπ). Στην περίπτωση αυτή, ο compiler µετατρέπει το πρόγραµµα σε γλώσσα µηχανής. Ένα πρόγραµµα σε γλώσσα µηχανής αποτελείται από ένα σύνολο λέξεων υπολογιστή, όπως στο σχήµα της Σελ.16, τοποθετηµένες σε συγκεκριµένη διεύθυνση της µνήµης του υπολογιστή. Ένα πρόγραµµα σε γλώσσα µηχανής βρίσκεται ακριβώς στη µορφή που είναι κατανοητή για τον υπολογιστή, οπότε είναι έτοιµο για εκτέλεση. Πολλές φορές, όµως, είναι απαραίτητο ο προγραµµατιστής να έχει µεγαλύτερο έλεγχο στην τελική µορφή του προγράµµατος, από αυτόν που του παρέχει ο compiler. Για παράδειγµα, αν στόχος του είναι η επίτευξή ιδιαίτερα υψηλής απόδοσης, µπορεί να χρειαστεί να ελέγχει ακριβώς ποια είναι η ακολουθία εντολών µηχανής ή σε ποια θέση αποθηκεύονται τα δεδοµένα του προγράµµατος. Στην περίπτωση αυτή, είναι απαραίτητο να γραφεί το πρόγραµµα σε γλώσσα assembly, η οποία αποτελείται από εντολές όµοιες µε αυτές που εξετάσαµε στις παραγράφους 1.2 έως 1.7. (Ή, τουλάχιστον, µπορεί να χρειαστεί ο προγραµµατιστής να επέµβει στο πρόγραµµα assembly που παράγεται αυτόµατα από τον compiler ως ενδιάµεσο στάδιο µεταξύ του προγράµµατος σε γλώσσα υψηλού επιπέδου και του προγράµµατος σε γλώσσα µηχανής.) Στη συνέχεια, ο assembler µετατρέπει το πρόγραµµα από γλώσσα assembly σε γλώσσα µηχανής. Ο assembler δίδεται από τον κατασκευαστή κάθε υπολογιστή. Η βασική διαφορά του από τον compiler έγκειται στο ότι, ο assembler µεταφράζει µία εντολή γλώσσας assembly σε µία ακριβώς εντολή γλώσσας µηχανής, ενώ ο compiler µεταφράζει µία εντολή γλώσσας assembly σε πολλές εντολές γλώσσας µηχανής.
19 2.1. Περιεχόµενο πεδίου διεύθυνσης Στο πεδίο διεύθυνσης των εντολών assembly µπορεί να περιέχονται: (1) ένα συµβολικό όνοµα. Τα συµβολικά ονόµατα που χρησιµοποιούνται στο πεδίο διεύθυνσης των εντολών πρέπει απαραίτητα να ορίζονται ως labels µπροστά από κάποια εντολή ή ψευδοεντολή (βλ. παράγραφο 2.2). (2) ένας αριθµός. Οι αριθµοί µπορεί να είναι αριθµητικές διευθύνσεις σε οκταδική µορφή, ή αριθµητικές σταθερές. Οι αριθµητικές σταθερές µπορεί να είναι ακέραιοι δεκαδικοί προσηµασµένοι ή οκταδικοί αριθµοί. Στην τελευταία περίπτωση χρησιµοποιείται το σύµβολο $ για να γίνεται διάκριση από τους δεκαδικούς αριθµούς. (3) το σύµβολο *. Αυτό είναι ένα ειδικό σύµβολο, του οποίου η τιµή είναι η απόλυτη διεύθυνση της εντολής που το περιέχει στο πεδίο διεύθυνσής της. ηλαδή, παριστάνει το περιεχόµενο του µετρητή προγράµµατος κατά την ανάκληση της εντολής. (4) συνδυασµό των παραπάνω, µαζί µε αριθµητικούς τελεστές (+, -, *, /) για το σχηµατισµό παραστάσεων διεύθυνσης. Π.χ. TAG+3, *-2. Αυτό έχει σαν αποτέλεσµα να υπολογίζεται η παράσταση σαν αριθµητική έκφραση, όπου κάθε συµβολικό όνοµα αντικαθίσταται µε την αντίστοιχη απόλυτη διεύθυνση. 2.2. Ψευδοεντολές Η συµβολική γλώσσα assembly, εκτός των εντολών που είδαµε στις προηγούµενες παραγράφους, διαθέτει και τις ονοµαζόµενες ψευδοεντολές (pseudo instructions), οι οποίες διευκολύνουν τον προγραµµατισµό και ταυτόχρονα καθοδηγούν τον assembler κατά τη µετάφραση σε γλώσσα µηχανής. Οι ψευδοεντολές δεν εκτελούνται από τον υπολογιστή κατά την εκτέλεση του προγράµµατος, αλλά χρησιµοποιούνται από τον assembler κατά το στάδιο της µετάφρασης. Τοποθετούνται ή στην αρχή του προγράµµατος, πριν την πρώτη εκτελέσιµη εντολή, ή στο τέλος του προγράµµατος. Στη συνέχεια, περιγράφονται οι ψευδοεντολές του ΕΚΥ. 2.2.1. Ψευδοεντολή CON H ψευδοεντολή CON χρησιµοποιείται για τη δήλωση σταθερών. Η µορφή της είναι: label CON e1, e2, όπου label είναι το συµβολικό όνοµα που αντιστοιχεί στη διεύθυνση της εντολής και e1, e2, είναι αριθµητικές σταθερές (οκταδικές ή δεκαδικές). Κατά τη µετάφραση αντιστοιχίζεται µία διεύθυνση στη συµβολική διεύθυνση label και το περιεχόµενο αυτής της διεύθυνσης γίνεται ίσο µε η σταθερά e1. Το περιεχόµενο της επόµενης διεύθυνσης της µνήµης γίνεται ίσο µε e2, κοκ. 2.2.2. Ψευδοεντολή RES Η ψευδοεντολή RES χρησιµοποιείται για τη δήλωση µεταβλητών και πινάκων. Η µορφή της είναι:
20 label RES n όπου label είναι το συµβολικό όνοµα της διεύθυνσης της πρώτης θέσης µιας περιοχής n διαδοχικών θέσεων της µνήµης, η οποία θα χρησιµοποιηθεί από το πρόγραµµα για βοηθητικούς λόγους, π.χ. για αποθήκευση ενδιάµεσων και τελικών αποτελεσµάτων. 2.3. Υποπρογράµµατα Όταν σε διαφορετικές θέσεις ενός προγράµµατος επαναλαµβάνεται η ίδια εργασία, µπορούµε να γράψουµε ένα άλλο πρόγραµµα που να εκτελεί την εργασία αυτή και να το καλούµε όποτε χρειάζεται. Το δεύτερο αυτό πρόγραµµα, όπως και στις γλώσσες προγραµµατισµού υψηλού επιπέδου, ονοµάζεται υποπρόγραµµα και µπορεί να είναι µέρος του κυρίως προγράµµατος. Η επικοινωνία του κυρίως προγράµµατος µε το υποπρόγραµµα γίνεται ως εξής: Κυρίως πρόγραµµα: ADR1 LDA X1 TAG JMP TAG+1 ADR2 LDA X2 TAG JMP TAG+1 X1 JMP ADR1+3 X2 JMP ADR2+3 Υποπρόγραµµα: TAG JMP * Εντολές υποπρογράµµατος JMP TAG Στο παραπάνω τµήµα κώδικα υποθέτουµε ότι στις διευθύνσεις ADR1 και ADR2 του κυρίως προγράµµατος, θέλουµε να χρησιµοποιήσουµε το υποπρόγραµµα που αρχίζει στη
21 διεύθυνση TAG. Η κλήση του υποπρογράµµατος γίνεται µε τρεις εντολές. Η πρώτη από αυτές φορτώνει στο συσσωρευτή (την πρώτη φορά που εκτελείται το υποπρόγραµµα) το περιεχόµενο της διεύθυνσης X1 και η δεύτερη το αντιγράφει στη διεύθυνση TAG του υποπρογράµµατος. ηλαδή, η διεύθυνση TAG αλλάζει περιεχόµενο και τώρα περιέχει µία εντολή άλµατος στη διεύθυνση στην οποία πρέπει να επιστρέψει ο έλεγχος του προγράµµατος µετά την εκτέλεση του προγράµµατος. Με την τρίτη εντολή κλήσεως, JMP TAG+1, καλείται και εκτελείται το υποπρόγραµµα. Σηµειώνουµε ότι η εκτέλεση δεν ξεκινά από τη διεύθυνση TAG, που περιέχει τη διεύθυνση επιστροφής, αλλά από την αµέσως επόµενη εντολή. Η τελευταία εντολή του υποπρογράµµατος είναι µία εντολή άλµατος στη διεύθυνση TAG, στην οποία έχει αποθηκευτεί η διεύθυνση επιστροφής. Έτσι, επανερχόµαστε στο κυρίως πρόγραµµα, στο σηµείο από το οποίο έγινε η κλήση του υποπρογράµµατος. 2.4. Μακροεντολές Ένας άλλος τρόπος να αποφύγουµε την επανάληψη ενός τµήµατος του προγράµµατος που εκτελεί την ίδια εργασία είναι η χρησιµοποίηση των µακροεντολών. Στη συνέχεια, θα περιγράψουµε τις µακροεντολές µε ένα παράδειγµα: Έστω ότι σε πολλά σηµεία του κυρίως προγράµµατος απαιτείται η εύρεση του αθροίσµατος των περιεχοµένων δύο θέσεων µνήµης και η αποθήκευση του αποτελέσµατος στην πρώτη από αυτές: LDA ADA X1 X2 X1 LDA ADA Y1 Y2 Y1 Αντί να επαναλαµβάνουµε το ίδιο κοµµάτι κώδικα, µε διαφορετικές συµβολικές διευθύνσεις κάθε φορά, µπορούµε να χρησιµοποιήσουµε µία µακροεντολή, ως εξής: ΕΧ Χ1, Χ2 ΕΧ Υ1, Υ2 ΕΧ MACRO A, B LDA A
22 ADA B A EMC Κατά τη µετάφραση του προγράµµατος αυτού, ο assembler αντικαθιστά τη µακροεντολή EX µε τις εντολές LDA A, ADA B, A. Σαν διευθύνσεις Α και Β βάζει τις διευθύνσεις που υπάρχουν στο πεδίο διεύθυνσης της µακροεντολής, δηλαδή τις X1 και Χ2 κατά την πρώτη κλήση της, τις Υ1 και Υ2 κατά τη δεύτερη. Στο τέλος της περιγραφής της µακροεντολής υπάρχει πάντα η ψευδοεντολή EMC, που οριοθετεί το τέλος της. Σε κάποιους υπολογιστές έχουν ορισθεί από πριν κάποιες απλές µακροεντολές, οι οποίες µπορούν να χρησιµοποιούνται από τον προγραµµατιστή χωρίς να χρειάζεται να ορίζονται κάθε φορά. Η βασική διαφορά µεταξύ υποπρογραµµάτων και µακροεντολών έγκειται στο εξής: Στα υποπρογράµµατα έχουµε ενέργεια στο στάδιο της εκτέλεσης του προγράµµατος (δηλ. από το κυρίως πρόγραµµα γίνεται άλµα στο υποπρόγραµµα, εκτέλεση αυτού και άλµα πάλι πίσω στο κυρίως πρόγραµµα. Στις µακροεντολές έχουµε ενέργεια στο στάδιο της µετάφρασης, δηλαδή ο assembler αντικαθιστά τις µακροεντολές µε µια οµάδα εντολών που αναφέρονται κάθε φορά στις κατάλληλες διευθύνσεις.
23 3. Ασκήσεις 3.1. Σε 100 θέσεις µνήµης που αρχίζουν από την διέυθυνση LIST, βρίσκονται 100 αριθµοί. Να γραφεί πρόγραµµα σε γλώσσα assembly που να θέτει στη θέση DIV3 το άθροισµα αυτών που διαιρούνται δια του 3 και στη θέση MOROS το µέσο όρο των υπολοίπων. Το παρακάτω πρόγραµµα σαρώνει τους 100 αριθµούς που βρίσκονται αποθηκευµένοι στις θέσεις LIST έως LIST+99, από κάτω προς τα πάνω. Για κάθε έναν από αυτούς ελέγχει αν διαιρείται µε το 3. Αν ναι, τότε τον προσθέτει στο άθροισµα που βρίσκεται ήδη στη θέση DIV3. Αν όχι, τον προσθέτει στο άθροισµα που βρίσκεται ήδη στη θέση MOROS. Ταυτόχρονα, υπάρχει αποθηκευµένος στη θέση CNT ένας µετρητής που δείχνει πόσοι αριθµοί έχουν βρεθεί µέχρι στιγµής µη διαιρετοί µε το 3. Κάθε φορά που βρίσκεται άλλος ένας τέτοιος αριθµός, αµέσως µετά την ενηµέρωση του αθροίσµατος MOROS, ενηµερώνεται και ο µετρητής CNT, αυξάνοντάς τον κατά 1. Ολες οι θέσεις µνήµης που χρησιµοποιούνται για υπολογισµούς: DIV3, MOROS, CNT, έχουν αρχικοποιηθεί στην τιµή 0. Επίσης, σηµειώστε ότι στη συγκεκριµένη άσκηση ο µέσος όρος έχει υπολογιστεί µε αποκοπή των δεκαδικών ψηφίων και όχι στρογγυλοποίηση. ΟΝΕ CON 1 THREE CON 3 HUNDRED CON 99 LIST RES 100 DIV3 RES 1 MOROS RES 1 CNT RES 1 HELP RES 1 SAL 16 ; Μηδενισµός του καταχωρητή Α DIV3 ; και στη συνέχεια και των MOROS ; θέσων που χρησιµοποιύνται CNT ; για υπολογισµούς LDI HUNDRED
24 LOOP LDA,I LIST HELP DVA THREE ; Έλεγχος για διαιρετότητα µε MLA THREE ; το 3 βασιζόµενοι στην SBA HELP ; ιδιότητα: (x/3)*3<x ανν x ; δεν είναι πολλαπλάσιο του 3. JAN N_DIV LDA DIV3 ; Το πρόγραµµα φτάνει εδώ µόνο ADA HELP ; σε περίπτωση που ο αριθµός DIV3 ; διαιρείται µε 3. INJ LOOP ; Ενηµερώνεται εποµένως το JMP END ; αντίστοιχο άθροισµα N_DIV LDA MOROS ; Το πρόγραµµα φτάνει εδώ µόνο ADA HELP ; σε περίπτωση που ο αριθµός MOROS ; δε διαιρείται µε 3. LDA CNT ADA ONE ; Ενηµερώνεται το αντίστοιχο CNT ; άθροισµα και ο µετρητής των INJ LOOP ; µη διαιρετών µε 3 αριθµών. END LDA MOROS ; Πριν τον τερµατισµό του DVA CNT ; προγράµµατος, το άθροισµα MOROS ; των µη διαιρετών µε 3 ; αριθµών διαιρείται µε το ; πλήθος τους, ώστε να ; προκύψει ο µέσος όρος αυτών HLT 3.2. Στη θέση µνήµης ενός Η/Υ RT βρίσκεται ο αριθµός Ν. Να γραφεί πρόγραµµα ASSEMBLY που να υπολογίζει το Ν! Υπόδειξη: Ν! = Ν (Ν-1)!
25 1 η λύση: INDEX RES 1 ; Ο τρέχων αριθµός (παράγοντας) που ; θα πολλαπλασιαστεί. Αυξάνεται σε ; κάθε βρόχο κατά 1 µέχρι να γίνει ; ΙNDEX=N FACTOR RES 1 ; Το τρέχων παραγοντικό, δηλαδή ONE CON 1 RT CON N+1 ; INDEX! LDA ONE ; Αρχικοποίηση των INDEX & FACTOR ; FACTOR στην τιµή 1 INDEX LOOP LDA FACTOR END MLA INDEX FACTOR ; FACTOR *= INDEX LDA INDEX ADA ONE INDEX ; INDEX ++ SBA RT JAN LOOP ; Aν INDEX > Ν, τέλος HLT 2 η λύση: Στο παρακάτω πρόγραµµα χρησιµοποιούµε index register. Προκειµένου να αποφύγουµε το µηδενισµό του τελικού αποτελέσµατος όταν ο index register πάρει την τιµή 0, πολλαπλασιάζουµε κάθε φορά την τιµή του τρέχοντος αποτελέσµατος µε την τιµή του index register προσαυξηµένη κατά ένα. Για το λόγο αυτό όµως προσέχουµε ώστε η αρχική τιµή του index register να µην είναι Ν, αλλά Ν-1. INDEX RES 1 ; Βοηθητική θέση ; µνήµης για την αποθήκευση ; του index register. FACTOR RES 1 ; Εδώ αποθηκεύεται το αποτέλεσµα
26 ONE CON 1 RT CON N-1 LDA LDI ONE FACTOR RT LOOP STI INDEX LDA INDEX ; Φόρτωση και αύξηση ADA ONE ; της τιµής του index MLA FACTOR ; register κατά 1 πριν FACTOR ; πολλαπλασιαστεί στο INJ LOOP ; µέχρι στιγµής αποτέλεσµα HLT 3.3. Στις θέσεις µνήµης Ν έως και Ν+Κ βρίσκονται Κ+1 ακέραιοι αριθµοί. Να τοποθετηθούν στις θέσεις ΜΙΝ και ΜΑΧ ο µικρότερος και ο µεγαλύτερος από αυτούς αντίστοιχα. Το παρακάτω πρόγραµµα αρχικοποιεί τις θέσεις ΜΙΝ και ΜΑΧ µε την τιµή του τελευταίου αποθηκευµένου αριθµού στη θέση Ν+Κ. Στη συνέχεια σαρώνει τις Κ υπόλοιπες θέσεις µνήµης από το τέλος προς την αρχή. Συγκρίνει κάθε φορά τον υπό εξέταση αριθµό µε αυτούς που βρίσκονται ήδη στις θέσεις ΜΙΝ και ΜΑΧ και, αν χρειάζεται, ενηµερώνει τις θέσεις ΜΙΝ και ΜΑΧ. ΜΙΝ RES 1 MAX RES 1 N RES K+1 IND CON K-1 LDA N+Κ ; Αρχικοποίηση θέσεων ΜΙΝ MIN ; και ΜΑΧ MAX
27 LDI IND LOOP LDA,I N ; Σύγκριση περιεχοµένου SBA MAX ; (Ν+ΙΝD) µε ΜΑΧ JAN CONT UPDATE_MAX LDA,I N MAX ; Ενηµέρωση ΜΑΧ INJ LOOP ; Σε περίπτωση που HLT ; χρειάστηκε ενηµέρωση του ; ΜΑΧ αποκλείεται να ; χρειαστεί ενηµέρωση και ; του ΜΙΝ µε τον ίδιο ; αριθµό. Άρα αποφεύγεται ; και η σύγκριση. CONT LDA,I N ; Σύγκριση περιεχοµένου SBA MIN ; (Ν+ΙΝD) µε ΜΙΝ JAN INJ HLT UPDATE_MIN LOOP UPDATE_MIN LDA,I N MIN ; Ενηµέρωση ΜΙΝ INJ HLT LOOP 3.4. Σε µια περιοχή της µνήµης που ξεκινά από τη συµβολική διεύθυνση BEGIN έχουν καταχωρηθεί Ν ακέραιοι αριθµοί. Να γραφεί πρόγραµµα που να τους ταξινοµεί κατά σειρά φθίνοντος µεγέθους. Χρησιµοποιείται η µέθοδος ταξινόµησης Bubblesort. TEMP RES 1
28 FLAG RES 1 ; Θα χρησιµοποιηθεί για έλεγχο ; αν κατά την τελευταία σάρωση ; υπήρξε ανάγκη εναλλαγής δύο ; γειτονικών θέσεων POS CON 1 NEG CON -1 RT CON N-2 BEGIN RES N LOOP_EXT LDI RT ; Αρχίζει µια σάρωση από κάτω LDA POS ; προς τα πάνω. FLAG ; LOOP LDA,I BEGIN ; Σύγκριση δύο γειτονικών SBA,I BEGIN+1 ; θέσεων JAN SWAP ; και εναλλαγή αν χρειάζεται TAG INJ LOOP LDA JAN HLT FLAG LOOP_EXT SWAP LDA,I BEGIN LDA,I LDA,I LDA JMP TEMP BEGIN+1 BEGIN TEMP BEGIN+1 NEG FLAG TAG Επεξηγηµατικά, δίδεται και το αντίστοιχο πρόγραµµα σε ψευδοκώδικα:
29 REPEAT FLAG:=1 FOR I=N-2 DOWNTO 0 { IF (A[I]-A[I+1]<0) { SWAP(A[I],A[I+1]) FLAG:=-1 } } UNTIL FLAG>=0 3.5. Να γραφεί πρόγραµµα σε ASSEMBLY που να τυπώνει το αλφάβητο. Υπόδειξη: Ο κώδικας ASCII έχει τα γράµµατα του αλφαβήτου σε διαδοχικές θέσεις. AA CON $101 ; ASCII A σε οκταδικό Z_NEXT CON $133 ; ASCII Z +1 ONE CON 1 CUR RES 1 ; Βοηθητική θέση µνήµης για την ; αποθήκευση του τρέχοντος ; ψηφίου LDA AA CUR LOOP LDA CUR OUT,0 ; Τυπώνεται ο ASCII του ADA ONE ; τρέχοντος ψηφίου, CUR ; προσαυξάνεται κατά 1 και αν SBA Z_NEXT ; ξεπέρασε το Ζ, τότε το JAN LOOP ; πρόγραµµα τελειώνει
30 END HLT 3.6. Σε µια περιοχή της µνήµης, που ξεκινά από τη συµβολική διεύθυνση AREA1, έχουν τοποθετηθεί Ν αριθµοί. Να γραφεί πρόγραµµα σε γλώσσα ASSEMBLY, µέσω του οποίου αυτοί να τοποθετούνται σε µια άλλη περιοχή της µνήµης, που ξεκινά από τη συµβολική διεύθυνση AREA2, έτσι ώστε πρώτοι να τοποθετούνται οι µη αρνητικοί αριθµοί και στη συνέχεια οι αρνητικοί αριθµοί µε την ίδια σειρά, µε την οποία εµφανίζονται στην αρχική περιοχή. εν υπάρχει δυνατότητα δηµιουργίας άλλων νέων περιοχών στη µνήµη του υπολογιστή. 1 η λύση: Κατά την εκτέλεση του προγράµµατος η περιοχή AREA1 σαρώνεται δύο φορές. Την πρώτη φορά αντιγράφονται οι µη αρνητικοί αριθµοί στην περιοχή AREA2 και τη δεύτερη φορά αντιγράφονται οι αρνητικοί. Σε κάθε περίπτωση διατηρούνται δύο δείκτες IND1, IND2. Ο IND1 δείχνει από ποιο σηµείο της AREA1 διαβάζουµε και ο IND2 σε ποιο σηµείο της AREA2 γράφουµε. AREA1 RES N AREA2 RES N IND1 RES 1 IND2 RES 1 NUM CON N ONE CON 1 SAL 16 ; Αρχικά µηδενίζονται οι IND1 ; δείκτες των δύο περιοχών IND2 LOOP_POS LDI IND1 ; Σαρώνεται για πρώτη φορά LDA,I AREA1 ; η AREA1 JAN NEXT LDI IND2 ; Αν βρούµε θετικό,i AREA2 ; τον αντιγράφουµε LDA IND2 ; και ενηµερώνουµε τον IND2 ADA ONE ; αυξάνοντάς τον κατά 1
31 IND2 NEXT LDA IND1 ; Αυξάνεται ο IND1 ώστε να ADA ONE ; προσπελαστεί το επόµενο IND1 ; στοιχείο της AREA1 SBA NUM ; Έλεγχος αν υπάρχει άλλο JAN LOOP_POS ; στοιχείο στην AREA1 SAL 16 ; Μηδενισµός του IND1 ώστε να IND1 ; αρχίσει η σάρωση της AREA1 ; από την αρχή. Ο IND2 δεν ; αλλάζει, αφού οι αρνητικοί ; θα αποθηκευθούν αµέσων µετά ; τους θετικούς LOOP_NEG LDI IND1 ; Σαρώνεται για δεύτερη φορά LDA,I AREA1 ; η AREA1 JAN STORE CONT_NEG LDA IND1 ; Αυξάνεται ο IND1 ώστε να ADA ONE ; προσπελαστεί το επόµενο IND1 ; στοιχείο της AREA1 SBA NUM ; Έλεγχος αν υπάρχει άλλο JAN LOOP_NEG ; στοιχείο στην AREA1 END HLT ; Αν δεν υπάρχει, τέλος. STORE LDI IND2 ; Οµοίως, αν βρούµε αρνητικό,i AREA2 ; τον αντιγράφουµε LDA IND2 ; και ενηµερώνουµε τον IND2 ADA ONE ; αυξάνοντάς τον κατά 1 JMP IND2 CONT_NEG