Διδακτικά Βιβλία του Παιδαγωγικού Ινστιτούτου

Αναζήτηση

Βρες
Εμφάνιση

Εντολές άλματος

Ας φανταστούμε ένα πρόγραμμα αρκετά μεγάλο, ώστε να καταλαμβάνει όλες τις θέσεις της μνήμης του Άβακα, που είναι 212 = 4096. Αν κάθε εντολή του Άβακα απαιτεί κατά μέσο όρο 2ms για να εκτελεστεί, τότε όλο το πρόγραμμα θα χρειαζόταν 4096 · 2ms = 8,192s για να εκτελεστεί. Ξέρουμε όμως πάρα πολλά προγράμματα που απαιτούν πολύ περισσότερο χρόνο για να εκτελεστούν σε πολύ πιο γρήγορους υπολογιστές. Τι συμβαίνει;

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

Ο Άβακας διαθέτει δύο εντολές άλματος:

Α) Την εντολή άλματος χωρίς συνθήκη (unconditional jump instruction) με κώδικα εντολής 0111.

Κατά την εκτέλεση της εντολής αυτής το περιεχόμενο του τμήματος διευθύνσεως του καταχωρητή εντολών IR γράφεται στο μετρητή προγράμματος PC.

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

Τα 2ms στην πραγματικότητα είναι πολύ μεγάλος χρόνος για μια εντολή. Οι σύγχρονοι επεξεργαστές εκτελούν χιλιάδες εντολές σ' αυτό το χρονικό διάστημα.

Ας δούμε τι θα γίνει, όταν εκτελεστεί το πρόγραμμα του σχήματος. Αρχικά ο μετρητής προγράμματος έχει την τιμή 0. Έτσι κατά τη φάση ανάκλησης διαβάζεται από τη μνήμη η εντολή που βρίσκεται στη θέση μνήμης 000000000000, και ο μετρητής προγράμματος αυξάνεται κατά 1, παίρνοντας την τιμή 000000000001. Η εντολή που θα εκτελεστεί είναι η 0111 000000000010. Πρόκειται για μια εντολή άλματος χωρίς συνθήκη και η εκτέλεση της έχει σαν αποτέλεσμα την εγγραφή στον PC του τμήματος διευθύνσεως του IR, το οποίο είναι το 000000000010. Η τιμή του PC λοιπόν αλλάζει και γίνεται 000000000010.

Η εκτέλεση της εντολής ολοκληρώθηκε και ήρθε η ώρα για την επόμενη φάση ανάκλησης. Τώρα το περιεχόμενο του PC «δείχνει» στην τρίτη εντολή του προγράμματος, και όχι στη δεύτερη όπως θα γινόταν αν δεν είχε εκτελεστεί η εντολή άλματος.

Β) Την εντολή άλματος υπό συνθήκη αρνητικού περιεχομένου του συσσωρευτή (conditional jump instruction) με κώδικα εντολής 1000.

Όταν εκτελείται η εντολή άλματος υπό συνθήκη αρνητικού περιεχομένου του συσσωρευτή, το αποτέλεσμα εξαρτάται από την τιμή του συσσωρευτή Α.

- Αν το περιεχόμενο του συσσωρευτή είναι αρνητικό (δηλαδή το αριστερότερο bit του συσσωρευτή, το bit του πρόσημου, είναι 1), εκτελείται το άλμα στην εντολή που υποδεικνύει το τμήμα διεύθυνσης της εντολής, γράφοντας στο μετρητή προγράμματος το περιεχόμενο του τμήματος διεύθυνσης.

- Αν το περιεχόμενο του συσσωρευτή είναι Ο ή θετικός αριθμός, δηλαδή το αριστερότερο του bit έχει την τιμή Ο, τότε η εντολή δεν προκαλεί την εκτέλεση καμιάς λειτουργίας.

Ας δούμε την εκτέλεση ενός προγράμματος, που υπολογίζει την απόλυτη τιμή του αριθμού που βρίσκεται στη θέση 20(10) = 10100(2) της μνήμης και την αποθηκεύει στη θέση 50(10) = 110010(2) της μνήμης.

Στο σχήμα βλέπουμε ότι ο αριθμός που είναι αποθηκευμένος στη θέση 20 είναι θετικός, αφού το πιο σημαντικό του ψηφίο έχει την τιμή 0. Έτσι, όταν εκτελεστεί το πρόγραμμα, η θέση 50 της μνήμης πρέπει να περιέχει τον αριθμό αυτό.

Οι εντολές του προγράμματος είναι οι εξής:

Εντολή 0: Ο κώδικας εντολής είναι 0001 και το τμήμα διευθύνσεως έχει την τιμή 10100(2) = 20(10). Η εντολή σημαίνει «φόρτωσε το συσσωρευτή Α με το περιεχόμενο της θέσης μνήμης 20».

Εντολή 1: Ο κώδικας εντολής είναι 1000 και το τμήμα διευθύνσεως έχει την τιμή 100(2) = 4(10). Αυτή είναι μια εντολή άλματος υπό συνθήκη, και σημαίνει «αν ο Α είναι αρνητικός, πήγαινε στην εντολή 4, αλλιώς μην κάνεις τίποτα».

Εντολή 2: Ο κώδικας εντολής είναι 0010 και το τμήμα διευθύνσεως έχει την τιμή 110010(2) = 50(10), πρόκειται δηλαδή για την εντολή «αποθήκευσε το περιεχόμενο του συσσωρευτή Α στη θέση μνήμης 50».

Εντολή 3: Η εντολή αυτή έχει κώδικα 0000, είναι δηλαδή μία εντολή STOP.

Εντολή 4: Έχει κώδικα 0001 και τμήμα διευθύνσεως 111(2) = 7(10). Η εντολή αυτή θα φέρει στον Α το περιεχόμενο της θέσης 7 της μνήμης, η οποία όπως βλέπουμε έχει την τιμή 0. Έτσι πρακτικά η εντολή αυτή θέτει τον Α στην τιμή 0.

Εντολή 5: Η εντολή αυτή με κωδικό 0100 αφαιρεί από το συσσωρευτή (που έχει την τιμή 0) το περιεχόμενο της θέσης μνήμης 20, υπολογίζοντας έτσι την αντίθετη τιμή του.

Εντολή 6: Ο κώδικας εντολής είναι 0111 0010 και το τμήμα διευθύνσεως έχει την τιμή 10(2) = 2(10), πρόκειται δηλαδή για άλμα χωρίς συνθήκη στην εντολή 2.

Μετά την εκτέλεση της τελευταίας εντολής η θέση μνήμης 50 περιέχει την τιμή 0000000010000000, η οποία είναι η απόλυτη τιμή του αριθμού που περιέχεται στη θέση 20 της μνήμης.

Ας δούμε τι γίνεται αν στη θέση μνήμης 20 περιέχεται ένας αρνητικός αριθμός, π.χ. ο -14(10) = 1111111111110010(2).

Αυτή τη φορά η θέση μνήμης 50 περιέχει την τιμή 0000000000001110(2) = 14(2), η οποία είναι και πάλι η απόλυτη τιμή του αριθμού που περιέχεται στη θέση 20 της μνήμης.