1. ΕΙΣΑΓΩΓΗ 1.1. ΟΜΙΚΑ ΣΤΟΙΧΕΙΑ ΥΠΟΛΟΓΙΣΤΩΝ Οι βασικές λογικές πράξεις

Μέγεθος: px
Εμφάνιση ξεκινά από τη σελίδα:

Download "1. ΕΙΣΑΓΩΓΗ 1.1. ΟΜΙΚΑ ΣΤΟΙΧΕΙΑ ΥΠΟΛΟΓΙΣΤΩΝ. 1.1.1. Οι βασικές λογικές πράξεις"

Transcript

1 1. ΕΙΣΑΓΩΓΗ 1.1. ΟΜΙΚΑ ΣΤΟΙΧΕΙΑ ΥΠΟΛΟΓΙΣΤΩΝ «Έξω βρέχει». Η πρόταση αυτή µπορεί να είναι αληθής ή ψευδής. Κάτι άλλο αποκλείεται. Στο σκεπτικό αυτό βασίζεται η κατασκευή των υπολογιστών. Ακόµη και άλλες θεωρίες, όπου µία πρόταση µπορεί να είναι κατά ένα ποσοστό αληθής και κατά το υπόλοιπο ψευδής, ανάγουν την επεξεργασία τους στη δυαδική λογική. Η δυαδική λογική χρησιµοποιείται στους υπολογιστές, επειδή υλοποιείται εύκολα. ιακόπτης κλειστός ή ύπαρξη τάσης σε ένα καλώδιο ή ένα λαµπάκι αναµµένο σηµαίνει αληθές. Ανοικτός διακόπτης ή απουσία τάσης ή λαµπάκι σβηστό σηµαίνει ψευδές. Η πρόταση «έξω βρέχει» µπορεί να κωδικοποιηθεί µε τέτοιο τρόπο, ώστε ένα καλώδιο να έχει τάση, όταν έξω πράγµατι βρέχει. Προς το σκοπό αυτό, τοποθετούµε µία λεκάνη µε δύο ηλεκτρόδια στην ταράτσα και µία ενισχυτική βαθµίδα, ώστε, αν η λεκάνη έχει νερό, να δίνει στην έξοδό της τάση. Όταν έξω βρέχει, το καλώδιο θα δίνει λογικό 1 και, εάν συνδέσουµε ένα λαµπάκι, το λαµπάκι θα ανάβει. Έστω Α = «Έξω βρέχει», η πρόταση. Εάν είναι αληθής, λέµε ότι Α = 1, διαφορετικά, Α = 0. Με ένα µπουτόν, όπως αυτό που βρίσκεται στις πόρτες των ψυγείων, στην εξώπορτα µπορούµε να κωδικοποιήσουµε, µε παρόµοιο τρόπο, την πρόταση Β = «πόρτα ανοικτή». Έστω, τώρα, ότι θέλω να κατασκευάσω ένα σύστηµα που να ανάβει ένα λαµπάκι, όταν ανοίγω την εξώπορτα να βγω έξω και έξω βρέχει. Το λαµπάκι αυτό µπορώ να το τοποθετήσω στην οµπρελοθήκη, ώστε να µου θυµίζει ότι πρέπει να πάρω την οµπρέλα. Θέλω, δηλαδή, να κατασκευάσω ένα σύστηµα που να υπολογίζει την τιµή (αληθής ή ψευδής) της πρότασης Υ = «πρέπει να πάρω οµπρέλα». Μπορούµε µε κατάλληλο κύκλωµα να συνδυάσουµε τα δύο σήµατα Α και Β, ώστε να παράγουµε ένα σήµα Υ που να είναι αληθές όταν και η πρόταση Α και η πρόταση Β είναι αληθείς. Η πρόταση Υ λέγεται «συµπέρασµα» ή αποτέλεσµα µιας σκέψης (λογικής πράξης) που κάνουµε µεταξύ των Α και Β. Η συγκεκριµένη λογική πράξη είναι το λογικό ΚΑΙ (AND). Το κύκλωµα που υλοποιεί τη λογική πράξη AND λέγεται λογική πύλη AND και η λογική εξίσωση που περιγράφει την πράξη αυτή είναι η Υ=Α. Β. Άλλες λογικές πράξεις είναι η Η (OR), η ΟΧΙ (NOT) και η αποκλειστική διάζευξη XOR. Όπως οι λογικές σταθερές ΑΛΗΘΕΣ και ΨΕΥ ΕΣ κωδικοποιούνται σε 1 και 0 αντίστοιχα, έτσι και τα ψηφία ΕΝΑ και ΜΗ ΕΝ. Θα πρέπει να γίνει η διάκριση των εννοιών «αληθές» και «µονάδα» που κωδικοποιούνται και οι δύο σε «1». Παρόµοια, πρέπει να γίνεται η διάκριση των εννοιών «ψευδές» και «µηδέν». Το καλό είναι πως, ό,τι και να σηµαίνουν τα ψηφία 0 και 1, τα κυκλώµατα του υπολογιστή τα επεξεργάζονται µε τον ίδιο ακριβώς τρόπο. Τα βασικά της άλγεβρας Boole και του δυαδικού συστήµατος είναι γνώσεις απαραίτητες για την κατανόηση του βιβλίου αυτού και, αν έχετε κάποιες ελλείψεις, καλό θα είναι να τις αναπληρώσετε. Στη συνέχεια θα γίνει µία σύντοµη αναφορά στα βασικά αυτά σηµεία Οι βασικές λογικές πράξεις Στον επόµενο πίνακα φαίνονται οι βασικές λογικές πράξεις και ιδιότητες. Για την απόδειξη των παραπάνω σχέσεων αρκεί η εξέταση όλων των δυνατών συνδυασµών.

2 1. ΕΙΣΑΓΩΓΗ Σελ Μνήµες Ονοµάζονται τα κυκλώµατα εκείνα, συνδυαστικά ή ακολουθιακά, που χρησιµοποιούνται στη φύλαξη και ανάκληση πληροφοριών σε δυαδική µορφή. Οι απαιτήσεις που έχουµε από τέτοια κυκλώµατα είναι: - Να είναι γρήγορα σε σχέση µε την ταχύτητα της CPU. - Να µπορούµε και να γράφουµε και να διαβάζουµε πληροφορίες. - Να διατηρούν τα περιεχόµενά τους και µετά τη διακοπή της τάσης τροφοδοσίας. Μνήµες που να ικανοποιούν και τις τρεις αυτές απαιτήσεις δε µας έχει ακόµη χαρίσει η τεχνολογία σε λογικό κόστος. Έτσι, ανάλογα µε την απαίτηση που δεν ικανοποιείται, διακρίνουµε τριών ειδών µνήµες: - Οι σκληροί δίσκοι και τα άλλα µαγνητικά και οπτικά µέσα αποθήκευσης δεν είναι γρήγορα. Ένας τυπικός σκληρός δίσκος είναι περίπου φορές πιο αργός από τη CPU. Επειδή η CPU δεν µπορεί να συνεργαστεί απευθείας µε το σκληρό δίσκο, όταν πρέπει να επεξεργαστεί δεδοµένα του, απαιτείται η µεταφορά των δεδοµένων αυτών από το δίσκο στη µνήµη. Η διαδικασία αυτή λέγεται φόρτωµα ή load. Μετά το πέρας της επεξεργασίας τα δεδοµένα πρέπει να γραφούν και πάλι στο δίσκο διαγράφοντας τα παλιά. Η διαδικασία αυτή λέγεται αποθήκευση ή save. - Στις µνήµες ROM η CPU δεν µπορεί να γράψει πληροφορίες, µόνο διαβάζει από αυτές. Από το γεγονός αυτό προέρχεται και το όνοµά τους, Read Only Memory. Τα δεδοµένα της ROM εγγράφονται µε ειδικές συσκευές, τους προγραµµατιστές ROM. - Οι µνήµες RAM χάνουν τα περιεχόµενά τους µετά τη διακοπή της τάσης τροφοδοσίας. Μερικές, µάλιστα, από αυτές (οι δυναµικές RAM) δεν µπορούν να διατηρήσουν τα περιεχόµενά τους ούτε µε µπαταρία. Στη συνέχεια θα περιγράψουµε τις µνήµες ROM και RAM που χρησιµοποιούνται σε συστήµατα µε µικροελεγκτές. Οι µνήµες ROM Η σύνδεση σε σειρά ενός αποκωδικοποιητή (decoder) µε έναν κωδικοποιητή (encoder) δίνει ένα κύκλωµα που λέγεται µνήµη ROM. Σύµφωνα µε τον ορισµό των κυκλωµάτων µε µνήµη, ή αλλιώς ακολουθιακών κυκλωµάτων, η ROM δεν είναι κύκλωµα µε µνήµη! Το όνοµά τους προέρχεται από την κύρια εφαρµογή των κυκλωµάτων αυτών που είναι η ανάκληση µόνιµα αποθηκευµένων πληροφοριών. Αντί εξήγησης της δοµής της ROM, θα σχεδιάσουµε µία ROM οκτώ θέσεων που να περιέχει τα 8 πρώτα ψηφία του αριθµού π. Ο πίνακας αλήθειας της ROM θα είναι ο εξής (θυµηθείτε ότι η µνήµη ROM είναι συνδυαστικό κύκλωµα και, άρα, έχει πίνακα αλήθειας): Είσοδοι υαδικό εκαδικό Α 2 Α 1 Α 0 Έξοδοι υαδικό εκαδικό D 3 D 2 D 1 D Το κύκλωµα θα έχει τρεις εισόδους A2, A1 και Α0 και τέσσερις εξόδους D3, D2, D1 και D0. Οι λογικές εξισώσεις που προκύπτουν από τον παραπάνω πίνακα είναι: D3= A2.!A1. A0 1 D2=!A2. A1.!A0 + A2.!A1.!A0 + A2. A1. A0 D1=!A2.!A1.!A0 + A2. A1.!A0 + A2. A1. A0 D0=!A2.!A1.!A0 +!A2.!A1. A0 +!A2. A1. A0 + A2.!A1.!A0 + A2.!A1. A0 + A2. A1. A0 Παρατηρούµε ότι χρειάζονται όλα τα λογικά γινόµενα (και τα 2 3 =8) των τριών µεταβλητών. Το λογικό κύκλωµα που δίνει όλα τα λογικά γινόµενα των εισόδων του είναι ο αποκωδικοποιητής (decoder). Ας θυµηθούµε τη σχεδίασή του. Ο Πίνακας αλήθειας του αποκωδικοποιητή θα είναι ο εξής (αντιγράφουµε το αριστερό µισό του πίνακα αλήθειας της ROM και συµπληρώνουµε τις εξόδους): 1 Το θαυµαστικό χρησιµοποιείται, στο βιβλίο αυτό, για να δηλώσει την πράξη της άρνησης. Η πάνω γραµµή, για να δηλώσει ενεργά χαµηλό σήµα.

3 1. ΕΙΣΑΓΩΓΗ Σελ. 3 Είσοδοι υαδικό εκαδικό Α 2 Α 1 Α 0 Έξοδοι w 0 w 1 w 2 w 3 w 4 w 5 w 6 w Οι λογικές του εξισώσεις είναι: W 0 =!A2.!A1.!A0, W 1 =!A2.!A1.A0, W 2 =!A2. A1.!A0, W 3 =!A2. A1. A0 W 4 = A2.!A1.!A0, W 5 = A2.!A1.A0, W 6 = A2. A1.!A0, W 7 = A2. A1. A0 Το σχέδιο του αποκωδικοποιητή που προκύπτει από τις εξισώσεις είναι το εξής: A2 A2 A1 A1 A0 A0 W0 W1 W2 W3 W4 W5 W6 W7 A2 A1 A0 Σχήµα 1-1. Το κύκλωµα του αποκωδικοποιητή Συνεχίζουµε µε το κύκλωµα που θα έχει ως εισόδους τις εξόδους του αποκωδικοποιητή και εξόδους τα ψηφία του αριθµού π. Επειδή οι είσοδοι του κυκλώµατος αυτού προέρχονται από τις εξόδους Wi του αποκωδικοποιητή, µία, και µόνο µία, κάθε φορά είσοδος θα έχει λογικό 1 (θα είναι ενεργοποιηµένη). Το κύκλω- µα, όµως, που δίνει ένα συνδυασµό στην έξοδό του, όταν µία, και µόνο µία κάθε φορά, είσοδος διεγείρεται, είναι ο κωδικοποιητής. Ο πίνακας αλήθειας του κωδικοποιητή, οι λογικές εξισώσεις και το κύκλωµα είναι:

4 1. ΕΙΣΑΓΩΓΗ Σελ. 4 Είσοδοι Έξοδοι w 0 w 1 w 2 w 3 w 4 w 5 w 6 w 7 D 3 D 2 D 1 D 0 εκαδικό D3=W5, D2=W2+W4+W7, D1=W0+W6+W7, D0=W0+W1+W3+W4+W5+W7 W0 W1 W2 W3 W4 W5 W6 W7 D3 D2 D1 D0 Σχήµα 1-2. Το κύκλωµα του κωδικοποιητή. Συνδυάζοντας τους πίνακες αλήθειας και τα κυκλώµατα του αποκωδικοποιητή και του κωδικοποιητή προκύπτουν ο πίνακας αλήθειας και το κύκλωµα της µνήµης ROM.

5 1. ΕΙΣΑΓΩΓΗ Σελ. 5 Είσοδοι Θέση Έξοδοι υαδικό Α 2 Α 1 Α 0 εκαδικό υαδικό D 3 D 2 D 1 D 0 εκαδικό W W W W W W W W A2 A2 A1 A1 A0 A0 W0 W1 W2 W3 W4 W5 W6 W7 A2 A1 A0 D3 D2 D1 D0 Σχήµα 1-3. Το κύκλωµα της µνήµης ROM Ο αποκωδικοποιητής λέγεται και πίνακας AND (AND matrix) και ο κωδικοποιητής πίνακας OR (OR matrix) ή πίνακας µνήµης (memory matrix). Ο αριθµός που εφαρµόζεται στις εισόδους Α2, Α1 και Α0 της ROM λέγεται διεύθυνση (address), επειδή προσδιορίζει τον αριθµό που θα εµφανιστεί στις εξόδους. Ο αποκωδικοποιητής σε όλες τις µνήµες ROM είναι στάνταρ και έχει ν εισόδους και 2 ν εξόδους. Κάθε έξοδος του αποκωδικοποιητή οδηγεί και έναν αριθµό στην έξοδο της ROM. Το σύνολο, λοιπόν, των θέσεων µνήµης είναι 2 ν. Εάν π.χ. εφαρµόσουµε τη διεύθυνση Α 2 Α 1 Α 0 =000, επιλέγεται η πρώτη θέση µνήµης W 0 που δίνει 1 στις εισόδους των δύο δεξιά OR. Ο αριθµός που θα εµφανιστεί στην έξοδο θα είναι 0011, δηλαδή το πρώτο αποθηκευµένο ψηφίο. Ο αριθµός που είναι αποθηκευµένος σε κάθε θέση µνήµης λέγεται δεδοµένο (data) και οι έξοδοι της ROM λέγονται έξοδοι δεδοµένων. Η διαδικασία της εφαρµογής της διεύθυνσης µέχρι την εµφάνιση στις εξόδους του περιεχοµένου της θέσης που επιλέγεται λέγεται προσπέλαση (access). Ο χρόνος προσπέλασης (access time) είναι χαρακτηριστικό µέγεθος σε κάθε µνήµη µε τυπική τιµή για τις ROM τα 100ns. Το πλήθος των εξόδων στις ROM είναι στάνταρ 8 ώστε να αποθηκεύονται bytes. Το µέγεθος της ROM, όπως και όλων των ολοκληρωµένων µνήµης, µετριέται σε bits. Όµως, το µέγεθος της µνήµης που προσδίδεται

6 1. ΕΙΣΑΓΩΓΗ Σελ. 6 σε ένα υπολογιστικό σύστηµα µετριέται σε bytes. Η ονοµατολογία των εξαρτηµάτων ROM είναι συνήθως 27CXXX όπου ΧΧΧ η χωρητικότητα της ROM σε Kbits π.χ. 27C512. Οι µνήµες RAM Ονοµάζονται µνήµες τυχαίας προσπέλασης (Random Access Memories), επειδή είναι δυνατή η προσπέλαση οποιασδήποτε θέσης. Ο όρος αυτός, αν και έχει καθιερωθεί, δεν είναι σωστός, µια που µνήµες τυχαίας προσπέλασης είναι και οι µνήµες ROM. Μερικές φορές αναφέρεται σαν Read/Write Memory (RWM, µνήµη ανάγνωσης / εγγραφής). Ο όρος αυτός είναι πιο σωστός µια και αναφέρεται στο πιο βασικό χαρακτηριστικό της RAM, αλλά δεν έχει καθιερωθεί. Στο εµπόριο διατίθενται ολοκληρωµένα RAM σε µεγάλη ποικιλία. Συνηθισµένες τιµές είναι από 16 Kbits µέχρι 512 Kbits. Εδώ, θα εξετάσουµε µία «διδακτική» µνήµη 16 bits (Σχήµα 1-4). Ο τρόπος µε τον οποίο διευθετούνται τα bits σε bytes λέγεται οργάνωση της µνήµης. Η µνήµη µας είναι οργανωµένη σε bytes (ή, πιο σωστά, λέξεις) των 4 bits. Τα bits αποθηκεύονται σε στοιχειώδη latch που αποτελούνται από δύο πύλες ΝΟΤ. Τα bits διεύθυνσης Α1 και Α0 εφαρµόζονται σε έναν αποκωδικοποιητή από 2 σε 4. Κάθε έξοδος W0 έως W3 του decoder ενεργοποιεί και µία σειρά από latch (δηλαδή επιλέγει µία θέση µνήµης). Η µνήµη έχει εισόδους και εξόδους που µπορεί να αποσυνδέονται από το εσωτερικό κύκλωµα µέσω διακοπτών. Εάν η είσοδος CS έχει λογικό 0, τότε οι δύο AND δίνουν 0 και οι είσοδοι και οι έξοδοι αποκόπτονται. Λέµε τότε ότι οι έξοδοι του κυκλώµατος είναι σε κατάσταση υψηλής αντίστασης (high impedance state) ή στην τρίτη κατάσταση. Τα ολοκληρωµένα που προορίζονται να συνδεθούν σε διάδροµο, δηλαδή να ενώσουν τις εξόδους τους µε εξόδους άλλων ολοκληρωµένων, πρέπει να έχουν απαραίτητα εξόδους τριών καταστάσεων (tri-state outputs). I3 I2 I1 I0 Latch Latch Latch Latch W0 Αποκωδ/τής 2 σε 4 Latch Latch Latch Latch W1 Latch Latch Latch Latch W2 Latch Latch Latch Latch W3 A0 A1 O3 O2 O1 O0 CS WE Σχήµα 1-4. Το µπλοκ διάγραµµα της µνήµης RAM. Εάν η γραµµή WE είναι 0, συνδέονται οι είσοδοι στα latch και γίνεται εγγραφή δεδοµένων σ αυτά. Εάν είναι 1, συνδέονται οι έξοδοι και διαβάζονται τα δεδοµένα των latch. Η είσοδος WE, λοιπόν, επιλέγει την εργασία που θα εκτελέσει η µνήµη, ανάγνωση ή εγγραφή (Not Write Enable). Πολλές φορές η είσοδος αυτή αναφέρεται ως R/ W (Read / Not Write). Επειδή δεν υπάρχει περίπτωση να είναι συνδεµένες µε το εσωτερικό κύκλωµα και οι είσοδοι I3 I0 και οι έξοδοι O3 O0 της µνήµης, οι γραµµές αυτές ενώνονται ανά δύο και παρουσιάζονται σαν γραµµές δεδοµένων D3 D0. Οι γραµµές αυτές είναι τώρα αµφίδροµες (bi-directional), δηλαδή άλλοτε λειτουργούν ως είσοδοι και άλλοτε ως έξοδοι. Το αν θα είναι ενεργοποιηµένη ή όχι η µνήµη RAM και αν θα είναι σε κατάσταση ανάγνωσης ή εγγραφής, το αποφασίζει η CPU. Η ενεργοποίηση της RAM αποφασίζεται έµµεσα µέσω ειδικού κυκλώµατος, του αποκωδικοποιητή διευθύνσεων. Αυτός παρακολουθεί τη διεύθυνση που εκπέµπεται από τη CPU και, αν αυτή

7 1. ΕΙΣΑΓΩΓΗ Σελ. 7 ανήκει σε συγκεκριµένη περιοχή, ενεργοποιεί τη µνήµη µέσω του ακροδέκτη CS. Η κατάσταση εγγραφής ή ανάγνωσης ρυθµίζεται απευθείας από τη CPU µε τη βοήθεια µιας οµώνυµης γραµµής Για να γίνει εγγραφή στη RAM, πρέπει να γίνουν οι εξής χειρισµοί: 1. Εφαρµόζεται η επιθυµητή διεύθυνση στους ακροδέκτες διεύθυνσης Αi. 2. Εφαρµόζονται τα δεδοµένα προς εγγραφή στους ακροδέκτες δεδοµένων Di. 3. Εφαρµόζεται λογικό 0 στην είσοδο WE. R/ W που αυτή διαθέτει. 4. Εφαρµόζεται λογικό 1 στην είσοδο CS (ή λογικό 0 αν η είσοδος είναι ενεργά χαµηλή, CS ). Οι εργασίες 1 και 2 µπορεί να γίνουν µε αντίστροφη σειρά. Το ίδιο ισχύει και για τις εργασίες 3 και 4. Οι RAM που περιγράφηκαν λέγονται στατικές. Κάθε bit φυλάγεται σε ένα latch. Στις δυναµικές µνήµες κάθε bit φυλάγεται σε έναν πυκνωτή. Το κέρδος είναι η πολύ µεγάλη ολοκλήρωση: το ίδιο µέγεθος µνήµης χρειάζεται πολύ λιγότερο χώρο. Πρέπει, όµως, σε τακτά χρονικά διαστήµατα, περίπου κάθε 1 ms, να γίνεται ανανέωση των περιεχοµένων των δυναµικών µνηµών. Για την ανανέωση αυτή απαιτούνται ειδικά κυκλώµατα και για το λόγο αυτό δε χρησιµοποιούνται οι δυναµικές µνήµες σε συστήµατα µικροελεγκτών παρά το γεγονός ότι είναι φθηνότερες, καταλαµβάνουν µικρότερο όγκο και έχουν χαµηλότερη κατανάλωση ρεύµατος. Οι µικροελεγκτές συνήθως δε διαθέτουν τα κατάλληλα κυκλώµατα για την περιοδική ανανέωση των περιεχοµένων τους. Η απαιτούµενη ανανέωση των δυναµικών µνηµών είναι η αιτία που δεν µπορούν να διατηρήσουν τα δεδοµένα τους, όταν τροφοδοτούνται από µπαταρία. Η οργάνωση των στατικών µνηµών γίνεται συνήθως σε bytes, ενώ κάθε θέση των δυναµικών RAM µπορεί να είναι των 1, 2, 4 και 8 bits Καταχωρητές (registers) Οκτώ F/F τύπου D µε κοινό ρολόι είναι ένας καταχωρητής. Σε κάθε παλµό του ρολογιού τα δεδοµένα των εισόδων καταχωρούνται στην έξοδο. Η καταχώρηση γίνεται σε µία από τις εξής τρεις φάσεις του παλµού του ρολογιού, ανάλογα µε τον τύπο του καταχωρητή. - Στην ανερχόµενη παρυφή του παλµού. - Όσο το ρολόι είναι 1. - Στην πίπτουσα παρυφή. Στην πρώτη περίπτωση ο καταχωρητής λέγεται θετικής διέγερσης, στη δεύτερη σταθερής διέγερσης ή διαφανής (transparent) και στην τρίτη αρνητικής διέγερσης. εδοµένα που είχε η είσοδος τη στιγµή του παλµού ρολογιού. Q0 Q1 Q2 Q3 Q4 Q5 Q6 Q7 D Q CLK Q D Q CLK Q D Q CLK Q D Q CLK Q D Q CLK Q D Q CLK Q D Q CLK Q D Q CLK Q D0 D1 D2 D3 D4 D5 D6 D7 CLK εδοµένα εισόδου, µεταβάλλονται. Εντολήεγγραφής Σχήµα 1-5. Το κύκλωµα του καταχωρητή Αθροιστής Το πρώτο, συνήθως, συνδυαστικό κύκλωµα που µαθαίνουν να σχεδιάζουν όσοι µαθαίνουν ψηφιακά κυκλώµατα. Αποτελείται από: α) ηµιαθροιστές, τα κυκλώµατα εκείνα που προσθέτουν δύο bits και δίνουν άθροισµα S και κρατούµενο C, και β) πλήρεις αθροιστές, τα κυκλώµατα που προσθέτουν τρία bits A, B και C και δίνουν άθροισµα Σ και κρατούµενο Κ. Ο παράλληλος αθροιστής είναι από τις βασικές δοµικές µονάδες των υπολογιστών.

8 1. ΕΙΣΑΓΩΓΗ Σελ. 8 A7 B7 A6 B6 A5 B5 A4 B4 A3 B3 A2 B2 A1 B1 A0 B0 Κ Σ Κ Σ Κ Σ Κ Σ Κ Σ Κ Σ Κ Σ Κ Σ A B C A B C A B C A B C A B C A B C A B C A B C Σ7 Κρατούµενο Σ6 Σ5 Σ4 Σ3 Σ2 Σ1 Σ0 Σχήµα 1-6. Παράλληλος αθροιστής των 8 bits Συσσωρευτής Είναι ο πιο σηµαντικός καταχωρητής των υπολογιστών. Εκτελεί την πράξη A A+B, δηλαδή, «πρόσθεσε στον καταχωρητή Α τον αριθµό Β και βάλε το αποτέλεσµα πίσω στον Α διαγράφοντας το αρχικό του περιεχόµενο». CLK Q7 Q6 Q5 Q4 Q3 Q2 Q1 Q0 D7 D6 D5 D4 D3 D2 D1 D0 S7 S6 S5 S4 S3 S2 S1 S0 A7 A6 A5 A4 A3 A2 A1 A0 B7 B6 B5 B4 B3 B2 B1 B0 B7 B6 B5 B4 B3 B2 B1 B0 Εντολή πρόσθεσης Α7 Α6 Α5 Α4 Α3 Α2 Α1 Α0 Σχήµα 1-7. Ο συσσωρευτής. Για ευκολία στη σχεδίαση συµβολίζουµε τον αθροιστή και τον καταχωρητή σαν µπλοκ. Όταν εφαρµοστεί παλµός πρόσθεσης στην είσοδο ρολογιού του καταχωρητή, το άθροισµα της τρέχουσας τιµής του καταχωρητή και της εισόδου Β εµφανίζεται στην έξοδο Α του συσσωρευτή. Η φιλοσοφία προγραµµατισµού σε συµβολική γλώσσα, τη γλώσσα χαµηλού επιπέδου που καταλαβαίνουν τα κυκλώµατα του υπολογιστή, βασίζεται στην ύπαρξη του συσσωρευτή. Εάν, για παράδειγµα, θέλουµε να προσθέσουµε δύο αριθµούς, πρέπει να βάλουµε πρώτα τον ένα αριθµό στο συσσωρευτή και, στη συνέχεια, να προσθέσουµε τον άλλο Αριθµητική και λογική µονάδα Είναι η µονάδα που εκτελεί τις αριθµητικές και λογικές πράξεις στον υπολογιστή. Οι αριθµητικές πράξεις που εκτελούνται συνήθως είναι: πρόσθεση και αφαίρεση στον καθαρά δυαδικό κώδικα και στον κώδικα του συµπληρώµατος ως προς δύο, πρόσθεση στον κώδικα BCD, και, σπανιότερα, πολλαπλασιασµός και διαίρεση σε αριθµούς του καθαρά δυαδικού κώδικα. Οι λογικές πράξεις είναι οι: AND, OR, NOT, XOR και η ολίσθηση. Επίσης, η αριθµητική και λογική µονάδα (Arithmetic and Logic Unit, ALU) εκτελεί και συγκρίσεις για ισότητα και ανισότητα. Έχει δύο εισόδους και µία έξοδο. Το πλήθος των bits της ALU είναι το κυριότερο χαρακτηριστικό ενός υπολογιστή.

9 1. ΕΙΣΑΓΩΓΗ Σελ. 9 Είσοδος Α Είσοδος B ALU Επιλογή πράξης Έξοδος Υ Σχήµα 1-8. Η αριθµητική και λογική µονάδα (ALU) ιάδροµοι πληροφοριών Ας υποθέσουµε ότι έχουµε τέσσερις καταχωρητές και θέλουµε να µεταφέρουµε πληροφορία από τον ένα στον άλλο. Τέτοιο σύστηµα δεν έχει πρακτική παρά µόνο διδακτική αξία. Προσπαθήστε, όµως, να το φανταστείτε. Ο αριθµός των 8 bits που είναι αποθηκευµένος σε ένα καταχωρητή πρέπει να αντιγράφεται σε έναν άλλο µε κατάλληλο χειρισµό σηµάτων ελέγχου. Χρειαζόµαστε δύο επιλογείς, έναν να επιλέγει τον καταχωρητή που θα δώσει δεδοµένα και έναν που να επιλέγει αυτόν που θα τα εγγράψει. Πώς, όµως, θα γίνει να επικοινωνεί κάθε καταχωρητής µε όλους τους άλλους; Γνωρίζουµε ότι, εάν ενώσουµε παράλληλα δύο εξόδους ολοκληρωµένων, θα καταστραφεί η µία από τις δύο, αν όχι και οι δύο. Είναι, άρα, απαραίτητο να µπορούν να αποµονώνονται οι έξοδοι από τους αγωγούς σύνδεσης και να ενώνονται µε αυτούς µόνον τη στιγµή που πρέπει να δώσουν δεδοµένα. Αυτό επιτυγχάνεται εύκολα, αν συνδέσουµε σε σειρά µε τις εξόδους διακόπτες αποµόνωσής τους. Όλοι οι διακόπτες ελέγχονται από µία ψηφιακή είσοδο CS. Αποκωδ/τής 2 σε 4 A1 A D0 D1 D2 D3 D4 D5 D6 D7 Q0 Q1 Q2 Q3 Q4 Q5 Q6 Q7 CLK CS1 CS2 CS3 CS4 D0 D1 D2 D3 D4 D5 D6 D7 Q0 Q1 Q2 Q3 Q4 Q5 Q6 Q7 CLK D0 Q0 D1 Q1 D2 Q2 D3 Q3 D4 Q4 D5 Q5 D6 Q6 D7 Q7 CLK D0 Q0 D1 Q1 D2 Q2 D3 Q3 D4 Q4 D5 Q5 D6 Q6 D7 Q7 CLK CLK1 CLK2 CLK3 CLK4 Σχήµα 1-9. Επικοινωνία καταχωρητών µέσω διαδρόµου εν είναι ανάγκη να προστεθούν εξωτερικά οι διακόπτες. Όλα τα ολοκληρωµένα, που προορίζεται να συνδεθούν σε διάδροµο, έχουν ενσωµατωµένους τέτοιους διακόπτες και διαθέτουν την είσοδο CS (Chip Select = επιλογή ολοκληρωµένου), µε την οποία ελέγχουν τη σύνδεση και αποσύνδεση των ακροδεκτών τους. Λέµε τότε ότι τα ολοκληρωµένα αυτά διαθέτουν εξόδους τριών καταστάσεων (βλέπε και σελίδα 6). Για ευκολία στη σχεδίαση οι οκτώ αγωγοί που συνδέουν παράλληλα πολλές εξόδους και εισόδους συµβολίζονται µε µία παχύτερη γραµµή και λέγονται διάδροµος. Για να µπορεί ένα ολοκληρωµένο να συνδεθεί σε διάδροµο, πρέπει απαραίτητα να έχει εξόδους τριών καταστάσεων. Η ύπαρξη του αποκωδικοποιητή από 2 σε 4 είναι απαραίτητη, για να διασφαλιστεί ότι ποτέ δε θα συνδεθούν στο διάδροµο ταυτόχρονα οι έξοδοι δύο ολοκληρωµένων. Οι δύο είσοδοι Α1 και Α0 του αποκωδικοποιητή επιλέγουν από 00 µέχρι 11 το ολοκληρωµένο που θα συνδέσει τις εξόδους του στο διάδροµο, ενώ οι είσοδοι CLK1 µέχρι CLK4 επιλέγουν τον καταχωρητή που θα κάνει την καταχώρηση Κεντρική µονάδα επεξεργασίας (CPU) Περιλαµβάνει µία ALU, ένα συσσωρευτή, µερικούς καταχωρητές γενικής χρήσης, µερικούς καταχωρητές ειδικής χρήσης και, τέλος, τη µονάδα χρονισµού και ελέγχου.

10 1. ΕΙΣΑΓΩΓΗ Σελ. 10 Οι διάφορες µονάδες συνδέονται µε δύο διαδρόµους, το διάδροµο δεδοµένων και το διάδροµο διευθύνσεων. Ο διάδροµος διευθύνσεων είναι µονόδροµος, επειδή η CPU µόνον εκπέµπει διευθύνσεις. Ο διάδροµος δεδοµένων είναι αµφίδροµος, επειδή η CPU και στέλνει και δέχεται δεδοµένα. Ο καταχωρητής MAR κρατά τη διεύθυνση που εκπέµπει ο διάδροµος διευθύνσεων και ο MDR το δεδοµένο του διαδρόµου δεδοµένων. A temp Καταχωρ. εντολών PSW Σηµαίες Τµήµα ALU ALU Τµήµα εντολών Αποκωδικ. εντολών Μονάδα ελέγχου Καταχωρητές γενικής χρήσης MUX R0 R1 R2 R3... Καταχωρητές ειδικής χρήσης ιάδροµος δεδοµένων ιάδροµος Σχήµα Το µπλοκ διάγραµµα της CPU. B IE... PC SP DPTR... διευθύνσεων Στο τµήµα της Αριθµητικής και Λογικής Μονάδας (ALU) περιλαµβάνονται, εκτός από την ALU, ο συσσωρευτής Α, ο καταχωρητής προσωρινής αποθήκευσης temp και ο καταχωρητής σηµαιών PSW (Processor Status Word = λέξη κατάστασης επεξεργαστή). Όταν πρόκειται να εκτελεστεί µία πράξη, πρέπει να γραφεί το ένα από τα δύο δεδοµένα στο συσσωρευτή, που θα κρατήσει και το αποτέλεσµα της πράξης. Το άλλο δεδοµένο γράφεται στον προσωρινό καταχωρητή temp. Τέλος, επιλέγεται από τη µονάδα χρονισµού και ελέγχου η πράξη που θα εκτελεστεί και δίδεται το σήµα για την εκτέλεσή της. Ο καταχωρητής PSW περιέχει F/F (σηµαίες) που γίνονται 1, όταν το αποτέλεσµα της πράξης ικανοποιεί κάποιες συνθήκες. Αν π.χ. από την πρόσθεση έχει προκύψει κρατούµενο, η σηµαία κρατούµενου θα γίνει 1. Στο τµήµα εντολών περιλαµβάνονται ο καταχωρητής εντολών (IR = Instruction Register), ο αποκωδικοποιητής εντολών (Instruction Decoder) και η µονάδα χρονισµού και ελέγχου. Για απλούστευση, στο Σχήµα 1-10 δεν έχουν σχεδιαστεί οι γραµµές που αναχωρούν από τη µονάδα χρονισµού και ελέγχου και καταλήγουν σε όλα τα υπόλοιπα τµήµατα της CPU. Η µονάδα ελέγχου ρυθµίζει την εργασία που θα εκτελέσει κάθε µία από τις υπόλοιπες µονάδες και την κατάλληλη σειρά ενεργοποίησης, ώστε να εκτελεστεί η εντολή που έχει αποκωδικοποιηθεί. Οι εντολές ανακαλούνται από εξωτερική µνήµη προγράµµατος, αποθηκεύονται όση ώρα διαρκεί η εκτέλεσή τους στον καταχωρητή εντολών και αποκωδικοποιούνται. Στους καταχωρητές γενικής χρήσης περιλαµβάνεται µία οµάδα καταχωρητών όπου ο προγραµµατιστής µπορεί να αποθηκεύει ενδιάµεσα δεδοµένα και αποτελέσµατα στη διάρκεια εκτέλεσης ενός προγράµµατος. Παρατηρήστε ότι κάποιοι καταχωρητές συνδέονται µόνο στον εσωτερικό διάδροµο δεδοµένων και µπορούν να αποθηκεύσουν µόνο δεδοµένα. Ο R0, ο R1 και ο DPTR (Data Pointer) συνδέονται και στον εσωτερικό διάδροµο διευθύνσεων. Οι καταχωρητές αυτοί λέγονται και καταχωρητές δείκτη (index registers ή pointers), επειδή µπορούν να δείξουν στη µνήµη, δηλαδή το περιεχόµενό τους µπορεί να ερµηνευτεί ως διεύθυνση. Σηµειώστε ότι η τιµή της διεύθυνσης φορτώνεται στους καταχωρητές δείκτη ως δεδοµένο µε κατάλληλη εντολή και ερµηνεύεται στη συνέχεια ως διεύθυνση µε άλλη εντολή. Τέλος, η οµάδα καταχωρητών ειδικής χρήσης περιλαµβάνει καταχωρητές απαραίτητους στην ίδια τη λειτουργία της CPU. Σηµαντικότερος είναι ο απαριθµητής προγράµµατος (Program Counter, PC) που περιέχει κάθε φορά τη διεύθυνση στη µνήµη προγράµµατος της εντολής που έχει σειρά να εκτελεστεί. Ο PC συνοδεύεται από ειδικό κύκλωµα αύξησης κατά 1 την ώρα που ανακαλείται από τη µνήµη η εντολή. Με τον τρόπο αυτό επιτυγχάνεται η διαδοχική εκτέλεση των εντολών του προγράµµατος, αφού αυτές φυλάγονται σε διαδοχικές θέσεις µνήµης. O SP (Stack pointer = δείκτης στοίβας) χρησιµοποιείται από την ίδια τη CPU σε προσπελάσεις της στοίβας και συνοδεύεται από κύκλωµα αυτόµατης αύξησης / µείωσης µετά από κάθε εγγραφή / ανάγνωση από τη στοίβα. Οι εντολές της CPU Κάθε εντολή αποτελείται από δύο µέρη: τον κωδικό λειτουργίας (operation code) που περιγράφει την εργασία που θα εκτελεστεί και το αντικείµενο (operand) που υποδεικνύει τον αποδέκτη της ενέργειας. Κωδικός λειτουργίας και αντικείµενο µπορεί να είναι σε ένα byte ή µπορεί το αντικείµενο να καταλαµβάνει το δεύτερο byte της εντολής ή ακόµη το δεύτερο και το τρίτο. Έτσι, η µικρότερη εντολή έχει µήκος 1 byte και η µεγαλύτερη 3. Τα bytes των εντολών αποθηκεύονται σε διαδοχικές θέσεις της µνήµης προγράµµατος. MDR MAR

11 1. ΕΙΣΑΓΩΓΗ Σελ. 11 Ας εξετάσουµε, για παράδειγµα, µερικές εντολές πρόσθεσης. Η πρώτη εντολή, που θα δούµε, είναι η «πρόσθεσε στο συσσωρευτή τον αριθµό που περιέχει ο καταχωρητής R2». Η εντολή αυτή σε συµβολική γλώσσα γράφεται ADD A,R2, ενώ στο δυαδικό σύστηµα είναι (ή στο 16δικό 2Α). Είναι λοιπόν, µία εντολή του ενός byte. Ο καταχωρητής R2 είναι το αντικείµενο της εντολής και περιέχεται στα 4 bits χαµηλής τάξης (low bits), ενώ ο κωδικός λειτουργίας της εντολής (πρόσθεσε) είναι τα 4 bits υψηλής τάξης (high bits). Ας δούµε µε λεπτοµέρεια τη δοµή της εντολής ADD A,Rn r r r 0010=πρόσθεσε, 1=καταχωρητή, rrr=0 7 Επόµενη εντολή είναι η «πρόσθεσε στο συσσωρευτή τον αριθµό που βρίσκεται στη µνήµη µε διεύθυνση που περιέχεται στον καταχωρητή R0» ή αλλιώς «πρόσθεσε στο συσσωρευτή τον αριθµό που δείχνει ο R0 στη µνήµη». Ο κωδικός λειτουργίας είναι ο ίδιος (πρόσθεσε), αλλάζει όµως το αντικείµενο της εντολής (τον αριθµό που δείχνει ο R0). Σε συµβολική γλώσσα η εντολή αυτή γράφεται: ADD Στο δυαδικό σύστηµα (κώδικα µηχανής) η εντολή αυτή είναι: Ας δούµε τη δοµή της εντολής: i 0010=πρόσθεσε, 011=τη θέση µνήµης που δείχνει ο καταχωρητής δείκτη Ri, i=0 (R0) ή i=1 (R1) Στην επόµενη εντολή το αντικείµενο βρίσκεται στο δεύτερο byte της εντολής. Πρόκειται για την «πρόσθεσε στο συσσωρευτή το περιεχόµενο µνήµης µε διεύθυνση 12» µε συµβολική µορφή ADD A,12 και δυαδικό κώδικα Η µορφή της εντολής αυτής είναι: δ/νση 0101=το περιεχόµενο της µνήµης µε διεύθυνση που ακολουθεί. Τελευταία µορφή της εντολής της πρόσθεσης είναι η «πρόσθεσε στο συσσωρευτή τον αριθµό 12» µε συµβολική µορφή ADD A,#12 και δυαδικό κώδικα Είναι και αυτή µία εντολή των 2 bytes. Η µορφή της εντολής είναι: δεδοµένο 0100=τον αριθµό που ακολουθεί. Στις δύο τελευταίες εντολές παρατηρήστε ότι το δεύτερο byte της εντολής, δηλαδή ο αριθµός 12, είναι το ίδιο και ως διεύθυνση και ως δεδοµένο. Η ερµηνεία από τη CPU είναι διαφορετική ανάλογα µε το nibble χαµηλής τάξης του κωδικού λειτουργίας: 0101 στην πρώτη περίπτωση και 0100 στη δεύτερη. Ο διαχωρισµός του πρώτου byte της εντολής σε δύο µισά (nibbles), όπου το πρώτο σηµαίνει ενέργεια και το δεύτερο τον τρόπο εύρεσης του αντικειµένου, ισχύει µόνο στην πρόσθεση. ιαφορετικά, η CPU θα είχε µόνο 16 εντολές. Το πρόγραµµα Πρόγραµµα είναι µία σειρά από εντολές, προκειµένου να εκτελέσει η CPU µία σύνθετη εργασία. Οι εντολές του προγράµµατος, όπως ήδη αναφέραµε, φυλάγονται σε διαδοχικές θέσεις της µνήµης προγράµµατος. Ας δούµε ένα παράδειγµα. Η εργασία «πρόσθεσε τα περιεχόµενα των R1 και R2 και φύλαξε το αποτέλεσµα στον καταχωρητή Β» δεν µπορεί να εκτελεστεί µε µία εντολή. Πρέπει λοιπόν, να γίνει µε πρόγραµµα. Το πρόγραµµα αυτό θα αποτελείται από τρεις εντολές. Η πρώτη θα µεταφέρει στον Α το περιεχόµενο του R1. Η δεύτερη θα προσθέσει στον Α το περιεχόµενο του R2. Τέλος, η τρίτη εντολή θα µεταφέρει το άθροισµα που φυλάγεται στον Α στον καταχωρητή Β. Για τη συγγραφή του προγράµµατος αυτού απαιτείται και µία εντολή µεταφοράς δεδοµένων. Οι µεταφορές δεδοµένων στον 8051 γίνονται µε την εντολή MOV: MOV προορισµός, προέλευση Για παράδειγµα, η εντολή MOV B,A σηµαίνει να αντιγραφεί το περιεχόµενο του συσσωρευτή στον καταχωρητή Β. Το πρόγραµµα, λοιπόν, θα είναι το εξής:

12 1. ΕΙΣΑΓΩΓΗ Σελ. 12 MOV A,R1 ADD A,R2 MOV B,A ; ιάβασε στον Α το περιεχόµενο του καταχωρητή R1 ;Πρόσθεσε στον Α το περιεχόµενο του R2 ;Γράψε το περιεχόµενο του Α στον καταχωρητή B Σε κώδικα µηχανής, τον κώδικα που καταλαβαίνει και εκτελεί η CPU (η µηχανή), το πρόγραµµα αυτό θα είναι: υαδικός κώδικας Ο κώδικας στο 16δικό Συµβολική γλώσσα E9 ; MOV A,R A ; ADD A,R F5 F0 ; MOV B,A Για κέρδος χρόνου το δυαδικό κώδικα τον παριστάνουµε στο δεκαεξαδικό σύστηµα. Γράφουµε λιγότερα ψηφία ενώ η µετατροπή από το δυαδικό στο 16δικό και αντίστροφα γίνεται πολύ εύκολα. Το προηγούµενο πρόγραµµα στη µνήµη προγράµµατος θα έχει την εξής µορφή: Ε Α 0001 F F Σε κάθε θέση µνήµης αναγράφεται η διεύθυνσή της. Έτσι, το πρώτο byte του προγράµµατος Ε9 βρίσκεται στη θέση µνήµης 0000, δηλαδή θα είναι η πρώτη εντολή που θα ανακαλέσει η CPU. Λειτουργία της CPU Για να κατανοήσουµε τον τρόπο που εργάζεται η CPU, θα δούµε πώς εκτελείται βήµα - βήµα το προηγούµενο πρόγραµµα στο απλοποιηµένο µοντέλο της. Για την εκτέλεση της πρώτης εντολής (MOV A,R1) η CPU εκτελεί τις εξής εργασίες: (6) ALU (3) A temp Καταχωρ. εντολών PSW Αποκωδικ. εντολών Μονάδα ελέγχου MUX R0 R1 R2 R3... (5) (1) B IE... DPTR SP PC... (4) +1 MDR MAR (2) E9 2A F5 F Σχήµα Ανάκληση και εκτέλεση της εντολής MOV A,R1 1) Το περιεχόµενο του απαριθµητή προγράµµατος PC τοποθετείται στο διάδροµο διευθύνσεων. Επειδή είναι η πρώτη εντολή που εκτελεί η CPU, ο PC θα έχει αρχικό περιεχόµενο Ο αποκωδικοποιητής της µνήµης επιλέγει την πρώτη θέση. 2) Η µονάδα ελέγχου ειδοποιεί µε κατάλληλο σήµα ανάγνωσης τη µνήµη να τοποθετήσει το περιεχόµενο της θέσης που επιλέχθηκε στο διάδροµο δεδοµένων. Η πρώτη εντολή του προγράµµατος εµφανίζεται στο διάδροµο. 3) Η µονάδα ελέγχου βάζει το διάδροµο δεδοµένων σε κατάσταση εισόδου και τοποθετεί το περιεχόµενό του στον καταχωρητή εντολών IR. Η εντολή αποκωδικοποιείται και η µονάδα ελέγχου αναλαµβάνει την εκτέλεσή της. 4) Ταυτόχρονα, το περιεχόµενο του απαριθµητή προγράµµατος PC αυξάνεται κατά 1, ώστε να είναι έτοιµος για την επόµενη εντολή. Έτσι, ο PC δείχνει συνεχώς την εντολή που έχει σειρά να εκτελεστεί. Στο σηµείο αυτό ολοκληρώνεται η ανάκληση (fetch) της εντολής. Η δεύτερη φάση είναι η εκτέλεσή της (execute).

13 1. ΕΙΣΑΓΩΓΗ Σελ. 13 5) Σε εκτέλεση της εντολής MOV A,R1 που αποκωδικοποιήθηκε η µονάδα ελέγχου ειδοποιεί µε κατάλληλο σήµα ανάγνωσης τον καταχωρητή R1 να τοποθετήσει το περιεχόµενό του στο διάδροµο δεδοµένων. 6) Η µονάδα ελέγχου δίνει σήµα εγγραφής στο συσσωρευτή Α που καταχωρεί το περιεχόµενο που έστειλε ο R1. Έτσι, Α και R1 έχουν, τώρα, το ίδιο περιεχόµενο. Το παλιό περιεχόµενο του Α διαγράφεται. Έτσι, ολοκληρώνεται η εκτέλεση της πρώτης εντολής του προγράµµατος. (14) ALU (13) (12) (9) A temp Καταχωρ. εντολών PSW Αποκωδικ. εντολών Μονάδα ελέγχου MUX R0 R1 R2 R3... (11) (7) B IE... DPTR SP PC... (10) +1 MDR MAR (8) E9 2A F5 F Σχήµα Ανάκληση και εκτέλεση της εντολής ADD A,R2 Για την ανάκληση της δεύτερης εντολής εκτελούνται οι εξής εργασίες: 7) Το αυξηµένο περιεχόµενο του PC τοποθετείται στο διάδροµο διευθύνσεων και επιλέγεται, τώρα, η θέση µνήµης ) Η µνήµη ειδοποιείται από τη µονάδα ελέγχου και τοποθετεί στο διάδροµο δεδοµένων το δεύτερο byte του προγράµµατος (2Αh). 9) Η νέα εντολή καταχωρείται στον IR και αποκωδικοποιείται. 10) Το περιεχόµενο του απαριθµητή προγράµµατος PC αυξάνεται κατά 1 και γίνεται Για την εκτέλεση της δεύτερης εντολής: 11) Το περιεχόµενο του R2 τοποθετείται στο διάδροµο δεδοµένων. 12) Ο προσωρινός καταχωρητής temp εγγράφει τον αριθµό που εµφανίζεται στο διάδροµο δεδοµένων. 13) Επιλέγεται στην ALU η εργασία της πρόσθεσης και δίνεται το σήµα για την εκτέλεσή της. Το άθροισµα εµφανίζεται στην έξοδο της ALU και στο διάδροµο, ενώ ταυτόχρονα ενηµερώνονται και οι σηµαίες. 14) Ο συσσωρευτής ειδοποιείται να εγγράψει τον αριθµό που εµφανίζει ο διάδροµος δεδοµένων. Ολοκληρώνεται µε το βήµα αυτό η εκτέλεση της δεύτερης εντολής. (23) (17) (24) A temp Καταχωρ. εντολών PSW ALU Αποκωδικ. εντολών Μονάδα ελέγχου MUX R0 R1 R2 R3... (15) (19) B IE... DPTR SP PC... (21) (18) (22) +1 MDR MAR (20) (16) E9 2A F5 F Σχήµα Ανάκληση και εκτέλεση της εντολής MOV B,A Η φάση της ανάκλησης της τρίτης εντολής (MOV B,A) περιλαµβάνει περισσότερα βήµατα, επειδή είναι εντολή των δύο bytes. Στα βήµατα 15 έως 18 ανακαλείται το πρώτο byte της εντολής, όπως προηγουµένως. Έχοντας τον κωδικό λειτουργίας της εντολής, ο αποκωδικοποιητής εντολών οδηγείται στο να φέρει ακόµη ένα byte από τη µνήµη. Το δεύτερο αυτό byte θα επιλέξει τη θέση µνήµης που θα δεχθεί το περιεχόµενο του συσσωρευτή. Η ανάκληση του δεύτερου byte της εντολής γίνεται στα βήµατα 19 έως 22. Στο βήµα 21 γίνεται η επιλογή του καταχωρητή Β µε βάση τον αριθµό F0, που είναι το δεύτερο byte της εντολής. Στη φάση της εκτέλεσης, στο βήµα 23, ο συσσωρευτής τοποθετεί το περιεχόµενό του στο διάδροµο δεδοµένων και στο βήµα 24 δίδεται σήµα στον επιλεγµένο ειδικό καταχωρητή να γράψει τον αριθµό.

14 1. ΕΙΣΑΓΩΓΗ Σελ. 14 Το µοντέλο του µικροελεγκτή 8051, που περιγράφηκε, δεν είναι πλήρες και έχει αποκλειστικό στόχο να παρουσιάσει τις βασικές αρχές λειτουργίας της CPU Θύρα Εισόδου / Εξόδου (I/O) Αν συνδέσουµε έναν καταχωρητή µε τις εισόδους του στο διάδροµο δεδοµένων και τις εξόδους του τις διαθέσουµε για τη σύνδεση περιφερειακών συσκευών, προκύπτει µία θύρα εξόδου. Ως συσκευές εξόδου µπορούν να χρησιµοποιηθούν LED, τρανζίστορ οδήγησης φορτίων, οθόνες LCD, κλπ. Αν συνδέσουµε έναν καταχωρητή µε τις εξόδους του στο διάδροµο δεδοµένων και τις εισόδους του τις διαθέσουµε για τη σύνδεση περιφερειακών συσκευών, προκύπτει µία θύρα εισόδου. Ως συσκευές εισόδου µπορούν να χρησιµοποιηθούν µπουτόν, τερµατικοί διακόπτες, κλπ. Ο καταχωρητής που προαναφέρθηκε είναι το πιο απλό κύκλωµα διασύνδεσης περιφερειακών. Εάν, όµως, οδηγεί συσκευές εξόδου, θα πρέπει να µπορεί να δίνει περισσότερο ρεύµα. Εάν, δε, δέχεται συσκευές εισόδου, θα πρέπει να έχει εξόδους τριών καταστάσεων, ώστε να µπορούν να συνδεθούν στο διάδροµο δεδοµένων. Ένα ολοκληρωµένο κύκλωµα που χρησιµοποιείται κατά κόρον είναι το 74HC573. ιαθέτει µία ενεργά χαµηλή (low active) είσοδο ενεργοποίησης των εξόδων ( OE ) και µία ενεργά υψηλή (high active) είσοδο ρολογιού (LE- Latch Enable). 74HC D 1Q D 2Q D 3Q D 4Q Είσοδοι D 5Q 15 Έξοδοι 7 6D 6Q D 7Q D 8Q 12 Παλµός καταχώρησης Ενεργοποίηση εξόδων 11 1 LE OE Σχήµα Ο καταχωρητής οδηγός 74HC573 Το κύκλωµα διασύνδεσης Ι/Ο (I/O interface) πρέπει να δέχεται σήµατα ενεργοποίησης από: Τη CPU που θα προσδιορίσει την εργασία που πρόκειται να εκτελεστεί, το δεδοµένο που θα επεξεργαστεί και τη χρονική στιγµή που θα εκτελεστεί το Ι/Ο. Τον αποκωδικοποιητή διευθύνσεων που θα ενεργοποιήσει τον καταχωρητή όταν η CPU εκπέµψει την κατάλληλη διεύθυνση. Η εργασία που πρόκειται να εκτελεστεί από τη CPU προσδιορίζεται από τα σήµατα RDκαι WR αντίστοιχα. Το δεδοµένο που πρόκειται να γραφεί είναι τοποθετηµένο από τη CPU τη στιγµή του παλµού WR. Η CPU υποθέτει ότι το δεδοµένο που πρόκειται να διαβαστεί υπάρχει στο διάδροµο δεδοµένων τη στιγµή του παλµού RD. Σχήµα ιασύνδεση µιας συσκευής εισόδου και µιας συσκευής εξόδου.

15 1. ΕΙΣΑΓΩΓΗ Σελ. 15 Εάν στο πρόγραµµά σας εκτελεστεί η εντολή MOV Α,δ/νση_θύρας_εισόδου, η CPU ενεργοποιεί αυτόµατα µε λογικό 0 την έξοδο RDκαι διαβάζει το διάδροµο δεδοµένων. Ό,τι υπάρχει στο διάδροµο τοποθετείται στον Α. Εάν εκτελεστεί η εντολή MOV δ/νση_θύρας_εξόδου,α, η CPU τοποθετεί στο διάδροµο το περιεχόµενο του Α και ενεργοποιεί αυτόµατα µε λογικό 0 την έξοδο WR. Ο αποκωδικοποιητής διευθύνσεων, ανάλογα µε τη διεύθυνση που στέλνει η CPU, δίνει λογικό 0 σε µία, και µόνο µία, έξοδό του για την ενεργοποίηση του κατάλληλου περιφερειακού. Ο κατασκευαστής του υπολογιστή επιλέγει για κάθε περιφερειακό µία διεύθυνση ή µία περιοχή διευθύνσεων και σχεδιάζει τον αποκωδικοποιητή έτσι, ώστε να υλοποιείται η επιλογή αυτή. Η κατανοµή των διευθύνσεων στα περιφερειακά και τις µνήµες ROM και RAM λέγεται χάρτης µνήµης (memory map) οµή Μικροϋπολογιστή Όταν η CPU ενός υπολογιστή αποτελείται από ένα και µόνο ολοκληρωµένο κύκλωµα, ο υπολογιστής αυτός χαρακτηρίζεται ως µικροϋπολογιστής. Η CPU συνεργάζεται µε µνήµη ROM για την ανάκληση των εντολών του προγράµµατος, µνήµη RAM για την αποθήκευση και ανάκληση δεδοµένων και τις µονάδες διασύνδεσης περιφερειακών. RD Συσκευές Εισόδου ιάδροµος εδοµένων RD ROM RD RAM RD I/F Εισόδου CPU CS CS WR CS ιάδροµος /νσεων Αποκωδ/τής /νσεων CS I/F Εξόδου WR WR Συσκευές Εξόδου Σχήµα οµή ενός µικροϋπολογιστή Παρατηρούµε την ύπαρξη των δύο διαδρόµων, του διαδρόµου δεδοµένων και του διαδρόµου διευθύνσεων. Η γραµµή RD συνδέεται στην αντίστοιχη είσοδο των συσκευών από τις οποίες η CPU διαβάζει δεδοµένα και η WR στην είσοδο εγγραφής των συσκευών στις οποίες η CPU γράφει δεδοµένα. Ο αποκωδικοποιητής διευθύνσεων έχει είσοδο το διάδροµο διευθύνσεων ή µέρος αυτού και ενεργοποιεί την κατάλληλη συσκευή µε βάση το χάρτη µνήµης του σχεδιαστή του υπολογιστή. Μικροελεγκτής είναι ένα ολοκληρωµένο κύκλωµα που περιλαµβάνει όλα τα τµήµατα ενός υπολογιστή, δηλαδή CPU, µνήµη ROM, µνήµη RAM και µονάδες διασύνδεσης περιφερειακών. Επίσης, ενσωµατώνει την πιο συνηθισµένη περιφερειακή συσκευή που χρειάζεται σε κάθε εφαρµογή, το χρονιστή. Χαρακτηριστικά µικροελεγκτών 1. εν είναι γενικής χρήσης, απευθύνονται σε συγκεκριµένη εφαρµογή. 2. Το πρόγραµµα είναι µόνιµα αποθηκευµένο στη µνήµη ROM, δεν υπάρχει δυνατότητα µεταφοράς προγράµµατος στη RAM και εκτέλεσης από εκεί. 3. Το µέγεθος των µνηµών είναι µικρό. Η µνήµη RAM κυµαίνεται από 64 bytes µέχρι 1 KByte και η ROM από 1 KByte µέχρι 64 KBytes Σήµατα χρονισµού διαδρόµων Στο χρονισµό τύπου Intel, ο µικροελεγκτής διαθέτει τα σήµατα ανάγνωσης RD και εγγραφής WR µε τα οποία συγχρονίζονται οι περιφερειακές συσκευές. Στο Σχήµα 1-17 φαίνεται ο κύκλος ανάγνωσης και στο Σχήµα 1-18 ο κύκλος εγγραφής.

16 1. ΕΙΣΑΓΩΓΗ Σελ. 16 RD (1) (3) (5) WR (2) Address bus Data bus (4) Σχήµα Χρονισµός διαδρόµου Intel σε ανάγνωση (6) Τα σήµατα RD και WR πρέπει να είναι ανενεργά (1) ορισµένο χρόνο πριν από την έναρξη του κύκλου ανάγνωσης. Η CPU εφαρµόζει τη διεύθυνση στο διάδροµο διευθύνσεων (2) και στη συνέχεια αποστέλλει τo σήµα RD στην περιφερειακή συσκευή (3). Η συσκευή εφαρµόζει τα δεδοµένα στο διάδροµο δεδοµένων (4) λίγη ώρα µετά από την αρνητική παρυφή του σήµατος RD. Τέλος, η CPU, αφού διαβάσει τα δεδοµένα, απενεργοποιεί το σήµα RD (5), οπότε η συσκευή αίρει τα δεδοµένα (6). Σηµαντικός είναι ο χρόνος εγκατάστασης δεδοµένων (data setup time), δηλαδή ο χρόνος που µεσολαβεί από την πίπτουσα παρυφή του παλµού RD µέχρι την εµφάνιση των δεδοµένων στο διάδροµο (3-4) και ο χρόνος συγκράτησης δεδοµένων (data hold time) που είναι ο χρόνος που χρειάζεται, για να αρθούν τα δεδοµένα µετά την ανερχόµενη παρυφή του RD (5-6). Περισσότερα για τους χρόνους αυτούς σε επόµενο κεφάλαιο. Ο χρονισµός του διαδρόµου σε εγγραφή δεδοµένων φαίνεται στο Σχήµα Τα σήµατα RD και WR πρέπει να είναι ανενεργά (1) ορισµένο χρόνο πριν από την έναρξη του κύκλου εγγραφής. Η CPU εφαρµόζει τη διεύθυνση και τα δεδοµένα στους αντίστοιχους διαδρόµους (2) και ενεργοποιεί το σήµα WR (3). Μετά από ορισµένο χρόνο η CPU αίρει το σήµα WR (4) και, τέλος, αίρει και τα δεδοµένα (5) απελευθερώνοντας τους διαδρόµους. (1) RD (3) (4) WR Address bus (2) (5) Data bus Σχήµα Χρονισµός διαδρόµου Intel σε εγγραφή Ο χρονισµός τύπου Motorola έχει και αυτός δύο σήµατα, ένα CS και ένα R / W. Το πρώτο δηλώνει προσπέλαση στο διάδροµο και το δεύτερο το είδος της προσπέλασης, ανάγνωση µε 1 ή εγγραφή µε 0. Στο Σχήµα 1-19 φαίνεται ο χρονισµός σε ανάγνωση και στο Σχήµα 1-20 ο χρονισµός σε εγγραφή.

17 1. ΕΙΣΑΓΩΓΗ Σελ. 17 RD/WR (3) ΜΕΜ (1) (4) (6) (2) Address bus Data bus (5) (7) Σχήµα Χρονισµός διαδρόµου Motorola σε ανάγνωση. Σε ανάγνωση, το σήµα MEM πρέπει να είναι ανενεργό (1) λίγη ώρα πριν από την έναρξη του κύκλου. Η CPU εφαρµόζει τη διεύθυνση (2) στο διάδροµο διευθύνσεων και δηλώνει την εργασία της ανάγνωσης κάνοντας 1 το σήµα RD/ WR (3). Στη συνέχεια εφαρµόζει το σήµα προσπέλασης µνήµης MEM (4). Μετά από λίγη ώρα το περιφερειακό παρουσιάζει στο διάδροµο τα δεδοµένα (5). Η CPU, αφού διαβάσει τα δεδοµένα, απενεργοποιεί το σήµα MEM (6), οπότε η περιφερειακή συσκευή αίρει τα δεδοµένα από το διάδροµο (7) απελευθερώνοντάς τον. RD/WR (3) (6) ΜΕΜ (1) (4) (5) Address bus (2) (7) Data bus Σχήµα Χρονισµός διαδρόµου Motorola σε εγγραφή. Στην εγγραφή, το σήµα MEM πρέπει να είναι ανενεργό (1) ορισµένο χρόνο πριν από την έναρξη του κύκλου. Η CPU εφαρµόζει τη διεύθυνση και τα δεδοµένα (2), ειδοποιεί για το είδος του κύκλου κάνοντας 0 το RD/ WR (3) και δίνει σήµα εγγραφής στη συσκευή κάνοντας 0 το σήµα MEM (4). Μετά από ορισµένο χρόνο αίρει τα σήµατα MEM (5) και RD/ WR (6) και, τέλος, αίρει και τη διεύθυνση και τα δεδοµένα απελευθερώνοντας τους διαδρόµους (7) ιασύνδεση των ολοκληρωµένων µνήµης Η µνήµη RAM είναι συνήθως ένα ολοκληρωµένο στον ελεγκτή. Εάν το µέγεθος ενός ολοκληρωµένου δεν επαρκεί, τοποθετούνται περισσότερα από ένα. Μερικές, δε, φορές τοποθετείται µία RAM και προβλέπεται η τοποθέτηση εκ των υστέρων και δεύτερης σε µία κενή βάση. Στη συνέχεια περιγράφεται ο τρόπος διασύνδεσης ολοκληρωµένων µνήµης RAM. Τα ίδια ισχύουν στις ROM µε τη διαφορά ότι δεν υπάρχει η γραµµή ιασύνδεση µνηµών για αύξηση του πλήθους των bits ανά byte. R / W. Η διασύνδεση αυτή είναι πολύ απλή. Όλες οι γραµµές συνδέονται παράλληλα εκτός από τις γραµµές δεδοµένων που πρέπει να σχηµατίσουν ένα byte. Ας πάρουµε για παράδειγµα τη µνήµη RAM Είναι µία µνήµη των 4 Kbits µε οργάνωση 1 KByte X 4 bits/byte. Επειδή το µέγεθός της είναι bytes, θα έχει λογ = 10 γραµµές διεύθυνσης. Εφόσον κάθε µνήµη 2114 διαθέτει 4 γραµµές δεδοµένων, απαιτούνται δύο ολοκληρωµένα µνήµης για έναν οκτάµπιτο διάδροµο δεδοµένων. Σε κάθε εγγραφή στο σύστηµα αυτό των δύο µνηµών θα γράφεται το ένα nibble στη µία µνήµη και το άλλο nibble στην ίδια διεύθυνση στην άλλη. Η επιλογή των γραµµών διεύθυνσης είναι τυχαία, είναι όµως «λογικό» να συνδέσουµε τα 4 low bits στη µία µνήµη και τα 4 high στην άλλη. Εάν, π.χ., στείλουµε τη διεύθυνση 17Fh και το δεδοµένο 5Ah, θα γραφεί στη διεύθυνση 17Fh της µνήµης U1 το nibble Αh και στη διεύθυνση 17Fh της U2 το nibble 5h. Όλες οι διευθύνσεις του συστήµατος παραµένουν όπως στο ένα ολοκληρωµένο από 000h µέχρι 3FFh.

18 1. ΕΙΣΑΓΩΓΗ Σελ. 18 Address Bus (A0...A9) U1 A0 5 A0 A1 6 A1 A2 7 A2 A3 4 A3 A4 3 A4 A5 2 A5 A6 1 A6 A7 17 A7 A8 16 A8 A9 15 A9 D0 14 D1 13 D2 12 D3 11 D0 D1 D2 D3 U2 A0 5 A0 A1 6 A1 A2 7 A2 A3 4 A3 A4 3 A4 A5 2 A5 A6 1 A6 A7 17 A7 A8 16 A8 A9 15 A9 D0 14 D4 D1 13 D5 D2 12 D6 D3 11 D E W 8 10 E W CS R/W Data Bus (D0...D7) Σχήµα ιασύνδεση µνηµών για αύξηση των bits ανά byte. ιασύνδεση ολοκλ. µνήµης για αύξηση του µεγέθους της µνήµης Με τη σύνδεση αυτή αυξάνεται το πλήθος των bytes του συστήµατος µνήµης. Το συνολικό µέγεθος θα είναι το άθροισµα των µεγεθών των ολοκληρωµένων. Όλες οι γραµµές συνδέονται παράλληλα, εκτός από τις εισόδους ενεργοποίησης των ολοκληρωµένων E ή CS, που οδηγούνται από τις εξόδους ενός αποκωδικοποιητή διευθύνσεων. Οι είσοδοι στον decoder θα είναι οι απαιτούµενες επί πλέον γραµµές διεύθυνσης για την προσπέλαση της επί πλέον µνήµης. Στην πιο απλή περίπτωση, ας θεωρήσουµε δύο µνήµες 6116 των 16 Kbits µε οργάνωση 2 KBytes των 8 bits ανά byte. Το κάθε ολοκληρωµένο έχει λογ = 11 γραµµές διεύθυνσης, από Α0 µέχρι Α10. Το σύστηµα των δύο µνηµών θα έχει διπλάσιο µέγεθος, άρα θα χρειάζεται µία επί πλέον γραµµή διεύθυνσης Α11. Αυτή θα οδηγήσει έναν decoder του οποίου οι δύο έξοδοι θα οδηγήσουν, σε συνδυασµό µε τη γραµµή CS, τις δύο εισόδους E των δύο µνηµών. Ο επιθυµητός πίνακας αλήθειας θα είναι: Α11 CS E 1 E 2 x Ο πίνακας αλήθειας περιγράφεται ως εξής: αν η είσοδος CS του συστήµατος µνήµης είναι ανενεργή 1, τότε οι δύο έξοδοι ενεργοποίησης των RAM, E 1 και E 2, πρέπει να είναι και οι δύο ανενεργές 1. Εάν η είσοδος CS είναι ενεργή 0, πρέπει να ενεργοποιείται η πρώτη µνήµη αν Α11=0 και η δεύτερη αν Α11=1. Οι λογικές εξισώσεις και το κύκλωµα που προκύπτει είναι:!e 1 =!Α11.! CS E 1 = Α11 + CS!E 2 = Α11.! CS E 2 =!Α11 + CS 2 2 Το σύµβολο της παύλας πάνω από το όνοµα της µεταβλητής χρησιµοποιείται, στο βιβλίο αυτό, για να δηλώσει ενεργά χαµηλό σήµα. Το θαυµαστικό πριν από το όνοµα της µεταβλητής χρησιµοποιείται, για να δηλώσει την πράξη της άρνησης στη µεταβλητή αυτή, µε πύλη ΝΟΤ.

19 1. ΕΙΣΑΓΩΓΗ Σελ. 19 Address Bus (A0...A11) A11 U1 A0 8 A0 A1 7 A1 A2 6 A2 A3 5 A3 A4 4 A4 A5 3 A5 A6 2 A6 A7 1 A7 A8 23 A8 A9 22 A9 A10 19 A OE CS 21 W D0 9 D1 10 D2 11 D3 13 D4 14 D5 15 D6 16 D7 17 D0 D1 D2 D3 D4 D5 D6 D7 U2 A0 8 A0 A1 7 A1 A2 6 A2 A3 5 A3 A4 4 A4 A5 3 A5 A6 2 A6 A7 1 A7 A8 23 A8 A9 22 A9 A10 19 A OE CS 21 W D0 9 D1 10 D2 11 D3 13 D4 14 D5 15 D6 16 D7 17 D0 D1 D2 D3 D4 D5 D6 D7 R/W Data Bus A11+CS CS!A11+CS Αποκωδικοποιητής 1 σε 2 µε ενεργοποίηση από CS Σχήµα Κύκλωµα διασύνδεσης RAM για αύξηση του µεγέθους της µνήµης. Μπορούµε να απλοποιήσουµε το προηγούµενο κύκλωµα, αν χρησιµοποιήσουµε την είσοδο OE (Not Output Enable) της µνήµης. Η είσοδος OE εκτελεί την ίδια σχεδόν εργασία µε την CS. Όταν OE = 0, οι έξοδοι είναι στην τρίτη κατάσταση. Η διαφορά είναι ότι, όταν OE =1, η µνήµη «ακούει» τις εισόδους της και επιλέγει την κατάλληλη θέση µνήµης. Για το λόγο αυτό, όταν η είσοδος OE γίνει ενεργή 0, η εµφάνιση των δεδοµένων στην έξοδο γίνεται πιο γρήγορα από ότι όταν η είσοδος CS γίνεται 0. Το πλεονέκτηµα της εισόδου CS είναι ότι η µνήµη δεν καταναλίσκει ρεύµα. Address Bus (A0...A11) A11 R/W U? A0 8 A0 A1 7 A1 A2 6 A2 A3 5 A3 A4 4 A4 A5 3 A5 A6 2 A6 A7 1 A7 A8 23 A8 A9 22 A9 A10 19 A OE CS 21 W D0 9 D1 10 D2 11 D3 13 D4 14 D5 15 D6 16 D7 17 D0 D1 D2 D3 D4 D5 D6 D7 U? A0 8 A0 A1 7 A1 A2 6 A2 A3 5 A3 A4 4 A4 A5 3 A5 A6 2 A6 A7 1 A7 A8 23 A8 A9 22 A9 A10 19 A10 A OE CS 21 W D0 9 D1 10 D2 11 D3 13 D4 14 D5 15 D6 16 D7 17 D0 D1 D2 D3 D4 D5 D6 D CS Data Bus (D0...D7) Σχήµα ιασύνδεση µνηµών RAM µε τη βοήθεια επί πλέον γραµµών ενεργοποίησης Όταν CS =0, ενεργοποιούνται οι είσοδοι και των δύο ολοκληρωµένων και επιλέγεται, και στα δύο ολοκληρωµένα, η θέση µνήµης που προσδιορίζουν οι γραµµές διεύθυνσης Α0 Α10. Η γραµµή Α11, όµως, ενεργοποιεί την έξοδο του κατάλληλου ολοκληρωµένου.

20 1. ΕΙΣΑΓΩΓΗ Σελ. 20 Εάν έχουµε να διασυνδέσουµε τέσσερα ολοκληρωµένα µνήµης (U1 U4), θα χρειαστούµε έναν αποκωδικοποιητή από 2 σε 4 που θα οδηγηθεί από τις δύο επί πλέον γραµµές διεύθυνσης. Οι τέσσερις έξοδοι του decoder θα οδηγήσουν τις εισόδους CS (ή OE αν δεν ενδιαφέρει η κατανάλωση και ενδιαφέρει η ταχύτητα). Αξιοποιώντας και τις εισόδους CS και τις εισόδους OE θα χρειαστούµε έναν αποκωδικοποιητή από 1 σε 2 µε είσοδο από τη µία επί πλέον γραµµή διεύθυνσης. Κάθε έξοδος του decoder θα οδηγήσει και ένα ζευγάρι µνηµών (U1+U2 και U3+U4). Η δεύτερη γραµµή διεύθυνσης θα οδηγήσει απευθείας ένα ζευγάρι (U1+U3) και µε πύλη ΝΟΤ το δεύτερο (U2+U4). Με τον τρόπο αυτόν, κάθε τιµή από 00 µέχρι 11 των δύο επί πλέον γραµµών διεύθυνσης θα επιλέγει ένα µοναδικό ολοκληρωµένο µνήµης. Η χρήση των εισόδων ενεργοποίησης CS των ίδιων των ολοκληρωµένων των αποκωδικοποιητών απλοποιεί ακόµη περισσότερο το κύκλωµα επιλογής της µνήµης. Όσο λιγότερες είναι θέσεις µνήµης που ενεργοποιούν ένα περιφερειακό τόσο πιο περίπλοκος γίνεται ο address decoder. Εάν υπάρχει διαθέσιµος χώρος διευθύνσεων, διατίθενται περισσότερες θέσεις, ώστε να απλοποιηθεί ο decoder. Παράδειγµα: Σχεδίαση συστήµατος µνήµης. Να σχεδιαστεί σύστηµα µνήµης µε µία ROM 16 Kbits στις διευθύνσεις από 0000h και µετά, µία RAM1 16 Kbits στις διευθύνσεις 8000h και µετά, µιας θύρας εξόδου OUT1 µε το 74HC573 στη θέση 4000h και µιας θύρας εισόδου IN1 µε το 74HC573 στη θέση 6000h. Να προβλεφθεί επέκταση του συστήµατος µε µία επί πλέον RAM2 στις θέσεις C000h και µετά, µιας θύρας εξόδου OUT1 και µιας θύρας εισόδου ΙΝ2. Ο απαιτούµενος χάρτης µνήµης φαίνεται στο επόµενο σχήµα FFF FFF 8000 BFFF C000 ROM I/O RAM1 RAM2 FFFF FF 4000 OUT1 OUT2 IN1 IN2 4FFF FFF FFF FFF C000- C7FF Αφού δεν προσδιορίζεται η χρήση των κενών θέσεων µνήµης, µπορούν να διατεθούν στις υπάρχουσες συσκευές για απλοποίηση του decoder. Εάν διαµερίσουµε όλο το χώρο µνήµης (address space) σε 4 τµήµατα, µπορούµε να διαθέσουµε το πρώτο τµήµα στη ROM και το τρίτο και τέταρτο στις δύο RAM. Ο διαµερισµός αυτός µπορεί να γίνει µε έναν αποκωδικοποιητή από 2 σε 4 µε εισόδους τις γραµµές διεύθυνσης Α15 και Α14. Το δεύτερο τµήµα πρέπει να διαµεριστεί εκ νέου σε τέσσερα τµήµατα και να διατεθεί το κάθε ένα σε µία από τις τέσσερις περιφερειακές συσκευές. Ο νέος αυτός διαµερισµός µπορεί να γίνει µε έναν αποκωδικοποιητή από 2 σε 4 µε εισόδους τις γραµµές Α13 και Α12 και ενεργοποίηση από τη δεύτερη έξοδο του πρώτου αποκωδικοποιητή. Η εργασία του διαµερισµού ενός ήδη αποκωδικοποιηµένου τµήµατος µνήµης, όπως το τµήµα 4000h 7FFFh στο παράδειγµα αυτό, ονοµάζεται αποκωδικοποίηση δευτέρου επιπέδου. Συσκευή Μέγεθος bytes Απαιτούµενες διευθύνσεις ιατιθέµενες διευθύνσεις ROM h - 07FFh 0000h 3FFFh OUT h 4000h 4FFFh OUT h 5FFFh IN h FFFh IN FFFh RAM h - 87FFh 8000h BFFFh RAM C000h C7FFh C000 FFFFh Το σχέδιο του κυκλώµατος του συστήµατος µνήµης φαίνεται στο Σχήµα 1-24.

21 1. ΕΙΣΑΓΩΓΗ Σελ. 21 CS A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 A10 RD U A0 D0 9 7 A1 D A2 D A3 D A4 D A5 D A6 D A7 D A8 22 A9 19 A OE E/P 21 VPP U3A A14 2 A A15 3 B 1 G Y0 4 Y1 5 Y2 6 Y3 7 RAM2 D0 D1 D2 D3 D4 D5 D6 D7 A12 14 A A13 13 B 15 G WR U A0 8 A0 D0 9 A1 7 A1 D1 10 A2 6 A2 D2 11 A3 5 A3 D3 13 A4 4 A4 D4 14 A5 3 A5 D5 15 A6 2 A6 D6 16 A7 1 A7 D7 17 A8 23 A8 A9 22 A9 A1019 A OE CS 21 W Y0 12 Y1 11 Y2 10 Y3 9 U3B WR RD U7B 7433 U7A 1 D0 D1 D2 D3 D4 D5 D6 D7 OUT D0 D1 D2 D3 D4 D5 D6 D7 OUT1 11 LE D0 D1 D2 D3 D4 D5 D6 D7 3 IN1 1 U8A OE 7432 U8B 6 U D 1Q D 2Q D 3Q D 4Q D 5Q D 6Q D 7Q D 8Q IN2 OE 1 U Q 1D 2 2Q 2D 3 3Q 3D 4 4Q 4D 5 5Q 5D 6 6Q 6D 7 7Q 7D 8 8Q 8D 9 LE 11 Vcc Σχήµα Ο αποκωδικοποιητής δύο επιπέδων, επτά συσκευών. Παρατηρήστε στο κύκλωµα το συγχρονισµό όλων των συσκευών µε το σήµα CS που εφαρµόζεται στην είσοδο ενεργοποίησης του αποκωδικοποιητή πρώτου επιπέδου U3A. Επίσης προσέξτε ότι, ενώ οι µνήµες διαθέτουν εισόδους συγχρονισµού µε τα σήµατα RD και WR, στα περιφερειακά απαιτούνται πύλες OR και NOR. Η σύνδεση της εισόδου W της RAM µε τη γραµµή WR της CPU είναι απαραίτητη, για να µπορεί να γίνεται διάκριση της εγγραφής από την ανάγνωση στη RAM. Οι υπόλοιπες συσκευές δεν είναι απαραίτητο να συγχρονιστούν µε τα σήµατα RD και WR. Θα εργάζονται και χωρίς συγχρονισµό µε ένα µόνο «µικρό» πρόβληµα. Υποθέστε ότι ο ακροδέκτης OE της ROM είναι συνδεµένος µόνιµα στο µηδέν. Εάν, από λάθος του προγράµµατος ή άλλη αιτία, η CPU γράψει στις διευθύνσεις της ROM, τότε στο διάδροµο δεδοµένων θα εφαρµόσουν δεδοµένα και η CPU και η ROM. Η κατάσταση αυτή λέγεται σύγκρουση δεδοµένων (conflict) και µπορεί να οδηγήσει σε καταστροφή των ολοκληρωµένων. Στη παράδειγµα αυτό υποθέτουµε ότι, εάν γίνεται προσπέλαση από τη CPU σε θέσεις της µνήµης RAM και δεν είναι ενεργοποιηµένο το WR, πρόκειται για διαδικασία εγγραφής. Θα δούµε στα επόµενα ότι αυτό δεν είναι πάντοτε αληθές. Υπάρχει περίπτωση η CPU να ανακαλεί κώδικα από τις διευθύνσεις αυτές, οπότε η RAM δε θα πρέπει να δώσει δεδοµένα στο διάδροµο. Θα πρέπει, σε τέτοια περίπτωση, να συνδυαστεί η έξοδος Y 2 του U3A µε τα σήµατα RD και WR µέσω πύλης OR τριών εισόδων Υλοποίηση αποκωδικοποιητή δ/νσεων µε PLD Προγραµµατιζόµενα Λογικά Εξαρτήµατα Προγραµµατιζόµενη λογική, όπως υπονοεί και το όνοµα, είναι µία οικογένεια εξαρτηµάτων που περιέχουν συστοιχίες από στάνταρ λογικά δοµικά στοιχεία (AND, OR, NOT, latch και Flip-Flop) και µπορούν να ρυθµιστούν από το χρήστη, ώστε να ικανοποιούν οποιαδήποτε λογική συνάρτηση από αυτές που υποστηρίζει το εξάρτηµα. Ένα προγραµµατιζόµενο εξάρτηµα είναι η µνήµη EPROM που περιέχει ένα στάνταρ αποκωδικοποιητή. Ο πίνακας µνήµης, όµως, περιέχει πύλες OR των οποίων οι είσοδοι συνδέονται µέσω ασφαλειών µε τις εξόδους του αποκωδικοποιητή. Ο χρήστης καίγοντας τις ασφάλειες των λογικών γινοµένων που δε χρειάζεται µπορεί να υλοποιήσει λογικές συναρτήσεις (να «γράψει» στο εξάρτηµα).

22 1. ΕΙΣΑΓΩΓΗ Σελ. 22 A2 A2 A1 A1 A0 A0 W0 W1 W2 W3 W4 W5 W6 W7 A2 A1 A0 D1 D0 Σχήµα PROM: σταθερός αποκωδικοποιητής - προγραµµατιζόµενος κωδικοποιητής. Για ευκολία στη σχεδίαση, οι οκτώ είσοδοι της δεύτερης πύλης OR οκτώ εισόδων σχεδιάζονται µε µία γραµµή και µία προγραµµατιζόµενη σύνδεση (Χ) για κάθε είσοδο. Στο Σχήµα 1-25 οι δύο έξοδοι της PROM είναι ίδιες, απλά σχεδιάστηκαν η µία µε τον αναλυτικό και η άλλη µε το σύντοµο τρόπο. Τα εξαρτήµατα PAL (Programmable Array Logic = λογική προγραµµατιζόµενης συστοιχίας) έχουν προγραµµατιζόµενο αποκωδικοποιητή και σταθερό κωδικοποιητή. Είναι υποσύνολα των PROM µια και δε σχηµατίζουν όλα τα δυνατά λογικά γινόµενα. Οι PAL ήταν πολύ διαδεδοµένα εξαρτήµατα µέχρι την εµφάνιση των GAL. Σχήµα PAL: προγραµµατιζόµενος αποκωδικοποιητής σταθερός κωδικοποιητής.

23 1. ΕΙΣΑΓΩΓΗ Σελ. 23 Οι περισσότερες PAL διαθέτουν F/F σε κάθε έξοδο µε ανάδραση στον πίνακα AND. Μπορούν µε τον τρόπο αυτό να πραγµατοποιηθούν ακολουθιακά κυκλώµατα. Τα εξαρτήµατα GAL Τα εξαρτήµατα GAL είναι επαναπρογραµµατιζόµενα από το χρήστη µέσω των προγραµµατιστών EPROM. Έχουν την αρχιτεκτονική των PAL και διαθέτουν στις εξόδους τους macrocells. Στη συνέχεια θα περιγραφεί η GAL16V8 όσα, όµως, αναφέρονται, εκτός από τους αριθµούς των ακροδεκτών, ισχύουν σε όλες τις GAL IN0/CLK IN1 IN2 IN3 IN4 IN5 IN6 IN7 IN8 GAL16V8 IO7 19 IO6 18 IO5 17 IO4 16 IO3 15 IO2 14 IO1 13 IO0 12 IN9/OE 11 Οι GAL έχουν τρεις τρόπους λειτουργίας ανάλογα µε τη διάταξη του macrocell: registered, complex και simple. Registered Mode (Σχήµα 1-27): Στη λειτουργία αυτή κάθε macrocell ρυθµίζεται ως έξοδος µε F/F ή ως Είσοδος / Έξοδος (Ι/Ο). Όλα τα F/F έχουν κοινό ρολόι από τον ακροδέκτη 1. Οι έξοδοι µε F/F µπορούν να έχουν οκτώ λογικά γινόµενα, οι είσοδοι / έξοδοι µόνον επτά. Σχήµα Λειτουργία registered της GAL Complex Mode (Σχήµα 1-28): Στη λειτουργία αυτή της GAL οι δύο εξωτερικές έξοδοι (ακροδέκτες 11 και 19) λειτουργούν µόνον ως έξοδοι ενώ οι 6 εσωτερικές µπορούν να ρυθµιστούν ως έξοδοι µόνον ή ως είσοδοι / έξοδοι. Τα macrocell µπορούν να έχουν επτά λογικά γινόµενα, επειδή το ένα χρησιµοποιείται για την οδήγηση της ενεργοποίησης της εξόδου. Simple Mode (Σχήµα 1-29): Τα macrocell ρυθµίζονται είτε ως είσοδοι είτε ως έξοδοι συνεχώς ενεργές (µε ανάδραση ή χωρίς). Κάθε έξοδος µπορεί να είναι το άθροισµα οκτώ λογικών γινοµένων. Οι ακροδέκτες 1 και 11 µπορεί να είναι µόνον είσοδοι στον πίνακα AND. Οι ακροδέκτες 15 και 16 (οι δύο µεσαίες έξοδοι) δεν µπορούν να ρυθµιστούν ως είσοδοι ή είσοδοι / έξοδοι. Είναι διαθέσιµοι µόνον ως έξοδοι.

24 1. ΕΙΣΑΓΩΓΗ Σελ. 24 Macrocell Πίνακας AND Complement output pin Complex Mode - Combinatorial I/O Macrocell Πίνακας AND Complement output Complex Mode - Combinatorial Output pin Σχήµα Λειτουργία complex της GAL Η επιλογή τρόπου λειτουργίας (mode) της GAL γίνεται στο πρόγραµµα CUPL επιλέγοντας Device GAL16V8MS για λειτουργία registered, GAL16V8MA για λειτουργία complex και GAL16V8AS για λειτουργία simple. Αυτόµατη επιλογή είναι δυνατή µε δήλωση εξαρτήµατος G16V8. Στοιχεία της γλώσσας CUPL Στο τέλος κάθε γραµµής του αρχείου που περιγράφει τον προγραµµατισµό του εξαρτήµατος πρέπει να µπαίνει ο χαρακτήρας «;». Τα σχόλια ανοίγουν µε /* και κλείνουν µε */. Το πρόγραµµα ξεκινά µε δηλώσεις PIN όπου δηλώνεται ο αριθµός του ακροδέκτη και το όνοµα της µεταβλητής που αντιστοιχίζεται στον ακροδέκτη αυτό. Ακολουθούν δηλώσεις τυχόν ενδιάµεσων µεταβλητών (intermediate variables). Ενδιάµεσες µεταβλητές είναι αυτές που δεν αντιστοιχίζονται σε ακροδέκτες, αλλά βοηθούν στον ορισµό εξισώσεων πολλών µεταβλητών και κάνουν πιο κατανοητό το πρόγραµµα. Ονόµατα µεταβλητών που τελειώνουν σε αριθµούς από 0 µέχρι 31 αντιστοιχούν σε δεικτοδοτούµενες µεταβλητές. Μπορεί να γίνει οµαδοποίηση αυτών, για να δηλώσουν διάδροµο διευθύνσεων ή δεδοµένων ή άλλα σειριακά αριθµηµένα στοιχεία. Εάν δε δηλωθεί η βάση αρίθµησης των αριθµών, εννοείται το δεκαεξαδικό σύστηµα εκτός από τους δείκτες των µεταβλητών και τους αριθµούς των ακροδεκτών όπου εννοείται το δεκαδικό. υαδικές, δεκαεξαδικές και οκταδικές σταθερές µπορούν να έχουν «αδιάφορα» ψηφία που δηλώνονται µε «Χ». Η δυαδική σταθερά δηλώνεται µε b, η δεκαεξαδική µε h, η δεκαδική µε d και η οκταδική µε o στην αρχή του αριθµού. Π.χ. b , h 7F00. Η δήλωση µιας λίστας µεταβλητών γίνεται µε την εντολή FIELD και αγκύλες. Π.χ.: FIELD ADDRESS = [A7, A6, A5, A4, A3, A2, A1, A0]; FIELD DATA = [D7..D0]; FIELD Mode = [Up, Down, Hold]; Οι δύο συνεχόµενες τελείες δηλώνουν «µέχρι». Όταν γίνονται πράξεις σε λίστες µεταβλητών δηλωµένες µε FIELD, αυτές εκτελούνται σε όλα τα bits της λίστας.

25 1. ΕΙΣΑΓΩΓΗ Σελ. 25 Macrocell Vcc Πίνακας AND Complement output pin Simple Mode - Combinatorial Output - Ανάδραση Macrocell Vcc Πίνακας AND Complement output Simple Mode - Combinatorial Output - Χωρίς ανάδραση pin Macrocell Πίνακας AND pin Simple Mode - Dedicated input Σχήµα Λειτουργία simple της GAL Οι λογικοί τελεστές της CUPL είναι: Οι αριθµητικοί τελεστές της CUPL είναι: Τελεστής Παράδειγµα Περιγραφή Προτεραιότητα!!A NOT 1 & A & B AND 2 # A # B OR 3 $ A $ B XOR 4 Τελεστής Παράδειγµα Περιγραφή Προτεραιότητα ** 2**3 Ύψωση σε δύναµη 1 * 2*Α Πολλαπλασιασµός 2 / 4/2 ιαίρεση 2 % 9%8 Υπόλοιπο διαίρεσης (mod) Πρόσθεση 3-4-Α Αφαίρεση 3 Η δήλωση πίνακα αλήθειας γίνεται ως εξής: TABLE [A2,A1,A0] => [C,S] { b 000 => b 00; b 001 => b 01; b 010 => b 01;

26 1. ΕΙΣΑΓΩΓΗ Σελ. 26 b 011 => b 10; b 100 => b 01; b 101 => b 10; b 110 => b 10; b 111 => b 11; } Η δήλωση διαγραµµάτων καταστάσεων Moore και Mealy ξεφεύγει από τους σκοπούς του βιβλίου αυτού. Για τη σχεδίαση αποκωδικοποιητών διευθύνσεων χρησιµοποιούµε τον τελεστή σύγκρισης «:». Π.χ. FIELD ADDRESS = [A15..A12]; ROM_CS = ADDRESS:'h'[ FFF] &!CS; Η συσκευή προγραµµατισµού της GAL ανοίγει και κλείνει επαφές συνδέοντας εισόδους σε πύλες. Οι περισσότερες συσκευές προγραµµατισµού PLD δέχονται τις πληροφορίες προγραµµατισµού του εξαρτήµατος σε αρχείο τύπου JEDEC. Το αρχείο JEDEC περιέχει σειρές από µηδενικά και άσσους. Το 1 δείχνει ασύνδετη γραµµή και το 0 δείχνει συνδεµένη. Αφού γράψουµε το πρόγραµµα σε CUPL, κάνουµε µετάφραση (compilation) για να παραχθεί το αρχείο JEDEC. Παράδειγµα: Σχεδίαση αποκωδικοποιητή διευθύνσεων. Να σχεδιαστεί σύστηµα µνήµης µε µία µνήµη ROM 2 KBytes στις διευθύνσεις από 0000h και µετά, µία µνήµη RAM 2 KByte στις διευθύνσεις από 8000h και µετά και δύο περιφερειακά, ένα εισόδου και ένα εξόδου, που το καθένα απαιτεί µία θέση µνήµης στην περιοχή διευθύνσεων από C000h και µετά, σε θέσεις της επιλογής σας. Προβλέψτε χώρο επέκτασης της RAM µε ακόµη ένα ολοκληρωµένο των 2 KBytes. Επίσης, προβλέψτε την προσθήκη ακόµη δύο περιφερειακών. Υποθέστε µνήµες µε εισόδους CS και OE. Χρησιµοποιήστε τη GAL16V8. Αφού δεν προσδιορίζεται η χρήση των κενών θέσεων µνήµης, µπορούν να διατεθούν στις υπάρχουσες συσκευές για την απλοποίηση του decoder. Επίσης, δεν προσδιορίζονται οι διευθύνσεις των συσκευών επέκτασης, της δεύτερης RAM και των δύο επί πλέον περιφερειακών. Επιλέγονται θέσεις που να απλοποιούν τη σχεδίαση. Ο χάρτης µνήµης, µε βάση την εκφώνηση της άσκησης, χωρίς προσεκτική επιλογή των περιοχών µνήµης θα είναι ο εξής: ΧΑΡΤΗΣ ΜΝΗΜΗΣ FFF FFF 8000 BFFF C000 FFFF FF (ROM) FF (RAM1) FF (RAM2) C000- C003 (Periph1...Periph4) Με κόκκινο χρώµα φαίνονται οι περιοχές που προσδιορίζονται από την εκφώνηση και µε κίτρινο οι περιοχές που µπορούν να µετακινηθούν. Έτσι, µία πρώτη διάθεση των περιοχών θα είναι η εξής: Πρώτη Τελευταία Συσκευή Μέγεθος δ/νση δ/νση ROM h 07FFh RAM h 83FFh RAM h 87FFh Periph1 1 C000h C000h Periph2 1 C001h C001h Periph3 1 C002h C002h Periph4 1 C003h C003h

27 1. ΕΙΣΑΓΩΓΗ Σελ. 27 Η υλοποίηση ενός τέτοιου χάρτη µνήµης είναι δύσκολη. Για να µπορεί να υλοποιηθεί µε διακριτά ψηφιακά στοιχεία (όχι προγραµµατιζόµενη λογική) πρέπει να τοποθετηθεί η RAM2 στο δεύτερο µισό του χώρου 8000h- BFFFh, δηλαδή στις θέσεις A000h-A3FFh. Για τα περιφερειακά πρέπει να χωρίσουµε τη διαθέσιµη περιοχή C000h-FFFFh σε τέσσερα τµήµατα και να διαθέσουµε κάθε τµήµα και σε ένα περιφερειακό. Θα τοποθετήσουµε κάθε περιφερειακό στην πρώτη διεύθυνση κάθε τµήµατος. Προσπαθούµε, δηλαδή, να χωρίζουµε τις περιοχές σε 2, 4, 8, 16, ίσα τµήµατα (δυνάµεις του 2) και να καταλαµβάνουµε όσο το δυνατό µεγαλύτερα τµήµατα. Με βάση τα παραπάνω ο χάρτης µνήµης θα είναι ο εξής: ΧΑΡΤΗΣ ΜΝΗΜΗΣ 0000 (ROM) 7FFF 8000 (RAM1) (RAM2) 9FFF (Periph1) (Periph2) (Periph3) (Periph4) FFFF FF FF A000- A3FF C000 D000 E000 F000 Η νέα διάθεση των περιοχών θα είναι: Βασικές δ/νσεις Εικόνες Πρώτη Τελευταία Πρώτη Τελευταία Συσκευή Μέγεθος δ/νση δ/νση δ/νση δ/νση ROM h 07FFh 0800h 7FFFh RAM h 83FFh 8400h 9FFFh RAM A000h A3FFh A400h BFFFh Periph1 1 C000h C000h C001h CFFFh Periph2 1 D000h D000h D001h DFFFh Periph3 1 E000h E000h E001h EFFFh Periph4 1 F000h F000h F001h FFFFh Για την υλοποίηση µε τη GAL16V8 σκεπτόµαστε ως εξής: Η GAL αυτή έχει διαθέσιµους 18 ακροδέκτες σε simple mode. Χρειαζόµαστε 7 ακροδέκτες για τις εξόδους και τρεις για τις εισόδους RD, WR και CS. Αποµένουν 8 γραµµές που µπορούν να διατεθούν για τις γραµµές διεύθυνσης. Εάν οι γραµµές αυτές δεν επαρκούν, σε κάποια εφαρµογή, θα πρέπει να υλοποιηθεί ο αποκωδικοποιητής σε µεγαλύτερη GAL, π.χ. στη GAL20V8. Οι 8 διαθέσιµες γραµµές µπορούν να επιλέξουν περιοχή των 256 bytes. Με βάση το δεδοµένο αυτό η διάθεση των περιοχών στις συσκευές θα είναι ως εξής: Βασικές δ/νσεις Εικόνες Πρώτη Τελευταία Πρώτη Τελευταία Συσκευή Μέγεθος δ/νση δ/νση δ/νση δ/νση ROM h 07FFh RAM h 83FFh RAM A000h A3FFh Periph1 1 C000h C000h C001h C0FFh Periph2 1 D000h D000h D001h D0FFh Periph3 1 E000h E000h E001h E0FFh Periph4 1 F000h F000h F001h F0FFh Σε γλώσσα CUPL ο αποκωδικοποιητής θα είναι ως εξής: Device g16v8as; Name AddrDec; /** Inputs **/

28 1. ΕΙΣΑΓΩΓΗ Σελ. 28 Pin 1 = A15; Pin 2 = A14; Pin 3 = A13; Pin 4 = A12; Pin 5 = A11; Pin 6 = A10; Pin 7 = A9; Pin 8 = A8; Pin 9 = NotCS; Pin 11 = NotWR; Pin 19 = NotRD; /** Outputs **/ Pin 12 = ROM; Pin 13 = RAM1; Pin 14 = RAM2; Pin 15 = OUT1; Pin 16 = OUT2; Pin 17 = IN1; Pin 18 = IN2; FIELD ADDR=[A15..A8]; /** Logic Equations **/!ROM = ADDR:'h'[ FF] &!NotCS;!RAM1= ADDR:'h'[ FF] &!NotCS &!(NotRD & NotWR);!RAM2= ADDR:'h'[A000..A3FF] &!NotCS &!(NotRD & NotWR); OUT1 = ADDR:'h'[C000..C0FF] &!NotCS &!NotWR; OUT2 = ADDR:'h'[D000..D0FF] &!NotCS &!NotWR;!IN1 = ADDR:'h'[E000..E0FF] &!NotCS &!NotRD;!IN2 = ADDR:'h'[F000..F0FF] &!NotCS &!NotRD; Στο πιο πάνω πρόγραµµα προσέξτε: - Την άρνηση πριν από τα ενεργά χαµηλά (low active) σήµατα, π.χ.!rom. - Όλα τα σήµατα είναι ανενεργά, εάν CS =1. - Η έξοδος για τη µνήµη ROM δε χρειάζεται να συγχρονιστεί µε το σήµα RD, επειδή διαθέτει την είσοδο OE που οδηγείται από το RD. Πάντως, δεν είναι λάθος και αν τη συγχρονίσετε. - Οι µνήµες RAM ενεργοποιούνται, εάν είτε το RD είτε το WR είναι σε χαµηλή στάθµη. Έτσι, δεν ενεργοποιούνται σε ανάκληση προγράµµατος, όταν ούτε το RD ούτε το WR είναι ενεργά 0. Προσοχή: δεν ανιχνεύεται από το µεταφραστή το λάθος να δηλώσετε λιγότερες από 256 θέσεις µνήµης για κάθε περιφερειακό, ενώ η διεύθυνση είναι δηλωµένη ως FIELD ADDR=[A15..A8]. Με τα 8 bits υψηλής τάξης Α8 µέχρι Α15 η µικρότερη περιοχή, που µπορείτε να δηλώσετε, είναι 256 bytes (2 8, όπου 8 οι γραµµές από Α0 µέχρι Α7 που λείπουν). Η µετάφραση του αρχείου αυτού δίνει τις εξισώσεις: ADDR => A15, A14, A13, A12, A11, A10, A9, A8!IN1 =>!A8 &!A9 &!A10 &!A11 &!A12 & A13 & A14 & A15 &!NotCS &!NotRD!IN2 =>!A8 &!A9 &!A10 &!A11 & A12 & A13 & A14 & A15 &!NotCS &!NotRD OUT1 =>!A8 &!A9 &!A10 &!A11 &!A12 &!A13 & A14 & A15 &!NotCS &!NotWR

29 1. ΕΙΣΑΓΩΓΗ Σελ. 29 OUT2 =>!A8 &!A9 &!A10 &!A11 & A12 &!A13 & A14 & A15 &!NotCS &!NotWR!RAM1 =>!A10 &!A11 &!A12 &!A13 &!A14 & A15 &!NotCS &!NotRD #!A10 &!A11 &!A12 &!A13 &!A14 & A15 &!NotCS &!NotWR!RAM2 =>!A10 &!A11 &!A12 & A13 &!A14 & A15 &!NotCS &!NotRD #!A10 &!A11 &!A12 & A13 &!A14 & A15 &!NotCS &!NotWR!ROM =>!A11 &!A12 &!A13 &!A14 &!A15 &!NotCS Επίσης, η µετάφραση δίνει και το διάγραµµα της GAL. AddrDec A Vcc A NotRD A IN2 A IN1 A OUT2 A OUT1 A RAM2 A RAM1 NotCS ROM GND NotWR Το αρχείο JEDEC που παράγεται το µεταφέρουµε µε τη βοήθεια του προγραµµατιστή στη GAL και τοποθετούµε τη GAL στο κύκλωµα. Το σύστηµα µνήµης που θα προκύψει φαίνεται στο Σχήµα CS WR RD U A0 8 A0 A1 7 A1 A2 6 A2 A3 5 A3 A4 4 A4 A5 3 A5 A6 2 A6 A7 1 A7 A8 23 A8 A9 22 A9 A10 19 A10 RD 20 ROM 18 OE E/P 21 VPP D0 9 D1 10 D2 11 D3 13 D4 14 D5 15 D6 16 D7 17 U3 GAL16V8 A15 1 IN/CLK IO 19 A14 2 IN IO 18 A13 3 IN IO 17 A12 4 IN IO 16 A11 5 IN IO 15 A10 6 IN IO 14 A9 7 IN IO 13 A8 8 IN IO 12 9 IN IN/OE 11 D0 D1 D2 D3 D4 D5 D6 D7 RD WR IN1 OUT1 RAM1 ROM U A0 8 A0 D0 9 A1 7 A1 D1 10 A2 6 A2 D2 11 A3 5 A3 D3 13 A4 4 A4 D4 14 A5 3 A5 D5 15 A6 2 A6 D6 16 A7 1 A7 D7 17 A8 23 A8 A9 22 A9 A10 19 A10 20 RAM1 18 OE CS 21 W IN2 OUT2 RAM2 D0 D1 D2 D3 D4 D5 D6 D7 D0 D1 D2 D3 D4 D5 D6 D7 OUT1 11 D0 19 D1 18 D2 17 D3 16 D4 15 D5 14 D6 13 D7 12 IN1 U D 1Q D 2Q D 3Q D 4Q D 5Q D 6Q D 7Q D 8Q 12 1 LE OE OE 1 U Q 1D 2 2Q 2D 3 3Q 3D 4 4Q 4D 5 5Q 5D 6 6Q 6D 7 7Q 7D 8 8Q 8D 9 LE 11 Vcc Σχήµα Σύστηµα µνήµης µε αποκωδικοποιητή δ/νσεων µε GAL.

30 1. ΕΙΣΑΓΩΓΗ Σελ ΤΟ ΥΑ ΙΚΟ ΣΥΣΤΗΜΑ ΑΡΙΘΜΗΣΗΣ Καθαρά δυαδικός κώδικας Στο δυαδικό σύστηµα χρησιµοποιούνται µόνο δύο ψηφία για την παράσταση των αριθµών, το 0 και το 1 (δυαδικά ψηφία ή bits). Πριν προχωρήσουµε στο δυαδικό, ας δούµε µερικούς από τους ορισµούς στο δεκαδικό σύστηµα. Ανάλογα µε τη θέση του στον αριθµό, το ψηφίο παριστά και διαφορετικό βάρος (µονάδες, δεκάδες, χιλιάδες, κλπ). Βάση του συστήµατος αρίθµησης Θέση του ψηφίου 0...3, 0=δεξιά Ψηφίο = 2 x x x x 10 2 x x x x 1 Βάρος του ψηφίου Βάση του συστήµατος αρίθµησης Θέση του ψηφίου 0...3, 0=δεξιά Ψηφίο = 1 x x x x 2 1 x x x x 1 = 13 Βάρος του ψηφίου Παρατηρούµε ότι στο δυαδικό σύστηµα τα βάρη των ψηφίων δεν είναι µονάδες, δεκάδες, εκατοντάδες, χιλιάδες κλπ, αλλά µονάδες, δυάδες, τετράδες, οκτάδες, κλπ. Για τη µετατροπή ενός αριθµού από το δυαδικό στο δεκαδικό παρατηρούµε ότι δεν είναι ανάγκη να πολλαπλασιάζουµε το ψηφίο επί το βάρος του. Το κάθε ψηφίο θα είναι είτε 1, οπότε προσθέτουµε απλά το βάρος, είτε 0, οπότε αγνοούµε το βάρος. Με βάση την παρατήρηση αυτή η διαδικασία της µετατροπής απλοποιείται ως εξής: Γράφουµε πάνω από κάθε ψηφίο το βάρος του και προσθέτουµε όσα βάρη αντιστοιχούν σε ψηφίο = = 91 Στο βιβλίο αυτό κάνουµε την εξής παραδοχή: εάν ένας αριθµός αποτελείται µόνον από τα ψηφία 0 και 1 είναι του δυαδικού συστήµατος. Στους αριθµούς του δεκαδικού συστήµατος που αποτελούνται µόνον από τα ψηφία 0 και 1 θα προσθέτουµε στο τέλος τους το γράµµα «d». Π.χ = 11d. Για τη µετατροπή από το δεκαδικό στο δυαδικό µπορούµε να διαιρούµε συνεχώς δια δύο µέχρις ότου βρούµε πηλίκο 1. Το πηλίκο αυτό θα είναι το πρώτο ψηφίο του αριθµού στο δυαδικό. Τα υπόλοιπα των διαιρέσεων µε αντίστροφη σειρά θα είναι τα υπόλοιπα ψηφία Μία δεύτερη µέθοδος βασίζεται στις αφαιρέσεις των βαρών από τον αριθµό µέχρις ότου βρούµε υπόλοιπο µηδέν. Το πρώτο βήµα έχει ως εξής: από τον αρχικό αριθµό 304 το µεγαλύτερο βάρος που µπορούµε να αφαιρέσουµε είναι το 256 µε υπόλοιπο =48. Κάτω από το βάρος 256 σηµειώνουµε 1. Η συνέχεια είναι: τα βάρη 128 και 64 δεν µπορούν να αφαιρεθούν. Κάτω από τα βάρη αυτά σηµειώνουµε 0. Αφαιρούµε το βάρος 32 και σηµειώνουµε από κάτω 1, µε υπόλοιπο 16 κοκ.

31 1. ΕΙΣΑΓΩΓΗ Σελ Η πρόσθεση δύο ψηφίων του δυαδικού συστήµατος µπορεί να δώσει τους αριθµούς 0, 1 και 2, και στο δυαδικό τους 0, 1 και 10. Επειδή το 2 είναι διψήφιος αριθµός στο δυαδικό, λέµε στην περίπτωση αυτή ότι το άθροισµα είναι 0 µε κρατούµενο 1. Αν από την πρόσθεση τριών ψηφίων προκύψει άθροισµα 3 (στο δυαδικό 11) λέµε ότι έχουµε άθροισµα 1 µε κρατούµενο 1. Παράδειγµα: Κρατούµενα Το τελικό (αριστερό) κρατούµενο δείχνει ότι το αποτέλεσµα δε χωρά να παρασταθεί σε 8 bits Κώδικας συµπληρώµατος ως προς 2 εν υπάρχει ιδιαίτερο σύµβολο για το πρόσηµο. Τα µόνα σύµβολα που διαθέτει ο υπολογιστής είναι το 0 και το 1. Ας δούµε τη µέθοδο παράστασης προσηµασµένων αριθµών πρώτα στο δεκαδικό σύστηµα. Ας υποθέσουµε ότι έχουµε στη διάθεσή µας τα ψηφία 0 µέχρι 9 αλλά όχι τα πρόσηµα «+» και «-». Φανταστείτε το µετρητή ταινίας ενός κασετοφώνου. Χάριν απλότητας υποθέστε ότι µετράει µέτρα ταινίας και έχει µόνο δύο ψηφία. Μπορεί, δηλαδή, να µετράει από 00 µέχρι 99. Αν βάλουµε µία κασέτα ενώ είναι τυλιγµένη η µισή ταινία και πατήσουµε το play για να προχωρήσει µπροστά ένα µέτρο, θα δείχνει «01». Αν, όµως, πατήσουµε rewind και προχωρήσει πίσω κατά ένα µέτρο, θα δείχνει «99». Το «99» θα παριστάνει για µας ένα µέτρο πίσω, δηλαδή 1. Εάν προχωρήσει πίσω άλλο ένα µέτρο, θα δείχνει 98 που για µας είναι το 2. Εάν, δηλαδή, θέλουµε να βρούµε τον αρνητικό αριθµό που παριστάνεται σε δύο ψηφία πρέπει να αφαιρούµε το 100 (10 2, όπου 10 η βάση του συστήµατος αρίθµησης και 2 το πλήθος των ψηφίων). Οι προσηµασµένοι αριθµοί που µπορούν να παρασταθούν σε δύο ψηφία του δεκαδικού συστήµατος είναι από 49 µέχρι : 50 θετικοί αριθµοί από 0 µέχρι : 50 αρνητικοί από -50 µέχρι -1 Για παράδειγµα, ο αριθµός 35 παριστάνεται ως 65, ενώ ο αριθµός 58 παριστάνει τον 42. Η µέθοδος παράστασης αυτή ονοµάζεται συµπλήρωµα ως προς τη βάση του συστήµατος αρίθµησης και συγκεκριµένα συµπλήρωµα ως προς 10. Το πλεονέκτηµα της µεθόδου αυτής είναι ότι η πρόσθεση µεταξύ προσηµασµένων αριθµών δεν αλλάζει. Ο µηχανισµός είναι ακριβώς ίδιος. Η µόνη διαφορά είναι ότι το τελικό κρατούµενο δε µας δίνει καµία πληροφορία και αγνοείται ) )54 46 Στο δυαδικό σύστηµα προσθαφαιρούµε το 2 ν, όπου ν το πλήθος των ψηφίων. Για αριθµούς των 8 bits προσθαφαιρούµε το 256. Στη συνέχεια θα αναφερόµαστε µόνο σε αριθµούς των 8 bits (ένας οκταψήφιος δυαδικός αριθµός λέγεται byte) : 128 θετικοί αριθµοί από 0 µέχρι : 128 αρνητικοί από -128 µέχρι -1 Κατά ευτυχή σύµπτωση(;) στο δυαδικό σύστηµα όλοι οι θετικοί αριθµοί αρχίζουν από 0 (0 = , 127 = ) και όλοι οι αρνητικοί αρχίζουν από 1 (-128 = , -1 = ). Η µέθοδος παράστασης αυτή ονοµάζεται συµπλήρωµα ως προς 2.

32 1. ΕΙΣΑΓΩΓΗ Σελ. 32 Παραδείγµατα: 1. Οι αριθµοί 10d, 20, 50 και 100d να µετατραπούν στο δυαδικό σύστηµα στον κώδικα του συµπληρώµατος ως προς d = = = d = Οι αριθµοί του κώδικα του συµπληρώµατος ως προς , και να µετατραπούν στο δεκαδικό σύστηµα d Μνηµονικός κανόνας: για να αντιστρέψετε το πρόσηµο σε έναν αριθµό του κώδικα του συµπληρώµατος ως προς 2, γράφετε τα µηδενικά από δεξιά προς τα αριστερά µέχρι και τον πρώτο άσσο. Τα υπόλοιπα ψηφία τα αντιστρέφετε. Παραδείγµατα: = = = = = = +72 Η πρόσθεση γίνεται µε τον ίδιο µηχανισµό µε αυτόν της πρόσθεσης αριθµών του καθαρά δυαδικού συστήµατος (απροσήµαστων αριθµών). Παραδείγµατα: πρ ) πρ πρ )

33 1. ΕΙΣΑΓΩΓΗ Σελ. 33 πρ ) ! Η τελευταία πράξη δίνει λάθος αποτέλεσµα, επειδή ο αριθµός 150 δεν µπορεί να παρασταθεί σε 8 bits. Η κατάσταση αυτή λέγεται υπερχείλιση (overflow) και ανιχνεύεται από την αλλαγή προσήµου του αποτελέσµατος. Υπερχείλιση µπορεί να συµβεί από την πρόσθεση δύο µεγάλων θετικών ή δύο µεγάλων αρνητικών αριθµών. Στον υπολογιστή η υπερχείλιση ανιχνεύεται από το XOR µεταξύ των δύο τελευταίων (πιο αριστερά) κρατουµένων και έχει νόηµα, µόνον αν οι αριθµοί ερµηνεύονται από εµάς ως κωδικοποιηµένοι στο συµπλήρωµα ως προς 2. Ο υπολογιστής χειρίζεται τους αριθµούς µε τον ίδιο τρόπο είτε ερµηνεύονται από εµάς ως καθαρά δυαδικοί είτε ως αριθµοί του κώδικα του συµπληρώµατος ως προς 2. Για το λόγο αυτό δεν είναι ανάγκη να δηλώνουµε τον κώδικα στον οποίο θεωρούµε τους αριθµούς. Χάριν συντοµίας θα χρησιµοποιούµε στο βιβλίο αυτό τους όρους απροσήµαστοι και προσηµασµένοι αριθµοί αντί των καθαρά δυαδικοί και κωδικοποιηµένοι στο συµπλήρωµα ως προς 2 αντίστοιχα Το δεκαεξαδικό σύστηµα αρίθµησης Σε όλα τα συστήµατα µε βάση αρίθµησης δύναµη του 2, η µετατροπή από το δυαδικό γίνεται εύκολα επειδή µία οµάδα από bits του δυαδικού µετατρέπεται σε ένα ψηφίο. Στο δεκαεξαδικό σύστηµα, τέσσερα bits δίνουν ένα δεκαεξαδικό ψηφίο. Αντίστροφα, κάθε ψηφίο του δεκαεξαδικού µετατρέπεται σε 4 bits Α 7 Για την πρόσθεση δεκαεξαδικών αριθµών λαµβάνουµε υπόψη ότι κάθε φορά που το άθροισµα των ψηφίων υπερβαίνει το 16, προκύπτει ένα κρατούµενο. 3 C B E Για την αφαίρεση δεκαεξαδικών αριθµών λαµβάνουµε υπόψη ότι το δανειζόµενο είναι 16 µονάδες και όχι Ο κώδικας BCD 6 5 E B 2 3 C 3 5 Στον κώδικα BCD (binary coded decimal = δεκαδικός κωδικοποιηµένος σε δυαδικό) δε µετατρέπεται στο δυαδικό σύστηµα ολόκληρος ο αριθµός, αλλά ένα ένα τα ψηφία του σε τέσσερα bits. Επειδή τα 4 πρώτα βάρη του δυαδικού συστήµατος είναι τα 8, 4, 2 και 1, ο κώδικας BCD λέγεται και κώδικας Επειδή, αν εξαιρέσουµε τα ψηφία του, ο αριθµός παραµένει στο δεκαδικό σύστηµα, ο κώδικας BCD λέγεται και δεκαδικός (decimal). Ο µηχανισµός της πρόσθεσης στον κώδικα BCD είναι διαφορετικός από το µηχανισµό στο δυαδικό κώδικα. Για το λόγο αυτό πρέπει να δηλώνεται µε κάποιον τρόπο ότι οι αριθµοί είναι κωδικοποιηµένοι στον BCD. Στον 8051, µετά από κάθε πρόσθεση αριθµών (bytes) του κώδικα BCD, πρέπει να δίνουµε την εντολή DA A (Decimal Adjust after Addition). Σε άλλες CPU δίνουµε την εντολή SED (set decimal mode) στην αρχή των προσθέσεων και CLD (clear decimal) στο τέλος τους. Παράδειγµα: Ο αριθµός 2913 στον κώδικα BCD γράφεται:

34 1. ΕΙΣΑΓΩΓΗ Σελ. 34 Η πρόσθεση στον κώδικα BCD έχει την εξής ιδιαιτερότητα: από την πρόσθεση δύο ψηφίων του κώδικα υπάρχει περίπτωση να προκύψει άθροισµα µεγαλύτερο του 9, από 10 µέχρι 18. Σε περίπτωση ύπαρξης κρατουµένου από πρόσθεση ψηφίων µεγαλύτερης τάξης, το άθροισµα δύο ψηφίων µπορεί να φτάσει µέχρι 19. Σε τέτοια περίπτωση προσθέτουµε το ψηφίο 6 και επαναφέρουµε το άθροισµα στον κώδικα BCD. Παράδειγµα: Να µετατραπούν στον κώδικα BCD και να προστεθούν οι αριθµοί 853 και άθροισµα δύο πρώτων ψηφίων= άθροισµα 12 στο δυαδικό 0110 προσθέτουµε το άθροισµα 12 στον BCD άθροισµα στο δυαδικό 0110 προσθέτουµε το άθροισµα 18 στον BCD τελικό άθροισµα 1828 στον BCD Εάν σε ένα byte κωδικοποιούνται δύο ψηφία του κώδικα BCD, ο κώδικας λέγεται packed-bcd. Εάν τα 4 bits υψηλής τάξης είναι 0 και σε ένα byte κωδικοποιείται ένα δεκαδικό ψηφίο, ο κώδικας λέγεται unpacked- BCD.

35 ΜΕΡΟΣ Α Η ΣΥΜΒΟΛΙΚΗ ΓΛΩΣΣΑ ΤΟΥ 8051

36 1. ΕΙΣΑΓΩΓΗ Σελ.36

37 2. ΤΟ ΠΡΟΓΡΑΜΜΑ µvision2 Το µvision2 χρησιµοποιείται για: Τη συγγραφή και µετάφραση προγραµµάτων σε assembly και σε C. Να προσοµοιάζει τη CPU 8051 και να εκτελεί τον κώδικα µέσα στον υπολογιστή. Να µεταφέρει το πρόγραµµα σε διάφορες πλακέτες - στόχους (targets) και να τον εκτελεί µέσα σ' αυτές. Το µvision2 διατίθεται δωρεάν από την εταιρεία Keil για κώδικα µέχρι 2 KBytes, στη διεύθυνση Ακολουθεί µία σύντοµη περιγραφή του ΓΕΝΙΚΑ Φαντάζεστε ότι το να γράψουµε ένα πρόγραµµα σηµαίνει να ανοίξουµε ένα αρχείο κειµένου, να γράψουµε εκεί το πρόγραµµα και να το µεταφράσουµε παράγοντας το δυαδικό αρχείο. Το δυαδικό αυτό αρχείο πρόκειται να εκτελεστεί, είτε από τον προσοµοιωτή είτε από διάφορες πλακέτες - στόχους. Είναι και αυτός ένας τρόπος εργασίας, αλλά όχι πάντοτε σωστός. Σε µεγάλες εφαρµογές όλο το πρόγραµµα δεν είναι σε ένα αρχείο αλλά σε πολλά. Καθένα αρχείο περιέχει και µία δοκιµασµένη ρουτίνα. Πολλές φορές, οι ρουτίνες αυτές είναι και σε διαφορετικές γλώσσες, συνήθως συµβολική (assembly) και C. Μεταφράζεται ξεχωριστά η κάθε ρουτίνα και στο τέλος δηµιουργείται, µε τη βοήθεια του linker, το εκτελέσιµο αρχείο. Επειδή, λοιπόν, µία εφαρµογή περιέχει συνήθως πολλά αρχεία, το µvision2 δηµιουργεί ένα project για κάθε εφαρµογή και στο project αυτό εντάσσονται όλα τα αρχεία της σε οµάδες (groups). Το κακό στην όλη ιστορία είναι ότι πρέπει και εσείς να δηµιουργείτε projects, ακόµη και αν έχετε µόνο ένα αρχείο σε µία µόνο γλώσσα. Ας δούµε πώς γίνεται αυτό ΗΜΙΟΥΡΓΙΑ PROJECT Για να δηµιουργήσετε ένα project, ακολουθείστε τα επόµενα βήµατα. 1) Επιλέξτε <Project> και µετά <New Project>. Εικόνα 2-1. ηµιουργία νέου project Εµφανίζεται το γνωστό σας παράθυρο για να επιλέξετε φάκελο και να πληκτρολογήσετε το όνοµα του αρχείου (project). ηµιουργήστε µέσα στο φάκελο My Documents (Τα Έγγραφά µου) έναν κατάλογο µε όνοµα «My1stProj» και δώστε όνοµα «My1stProject». Εικόνα 2-2. Πληκτρολόγηση ονόµατος project

38 2. ΤΟ ΠΡΟΓΡΑΜΜΑ µvision2 Σελ.38 2) Επιλέξτε τον <T89C51RD2> της <Temic> (Temic και Atmel συγχωνεύτηκαν). Εικόνα 2-3. Επιλογή µικροελεγκτή για το project Μπορείτε να έχετε on-line το εγχειρίδιο του µικροελεγκτή (device data book), εάν αντιγράψετε το αρχείο pdf του εγχειριδίου µε κατάλληλο όνοµα στον κατάλληλο φάκελο. Το όνοµα και ο φάκελος θα σας υποδειχθούν σε µήνυµα σφάλµατος, αν επιλέξετε την καρτέλα Books στο παράθυρο Project Workspace και µετά Data Sheet, όπως δείχνει η Εικόνα 2-4. Το αρχείο αυτό µπορείτε να το κατεβάσετε από τη δικτυακή διεύθυνση Εικόνα 2-4. Ενσωµατωµένα εγχειρίδια στο πρόγραµµα (on-line documentation) Η αρχική οθόνη του προγράµµατος θα πρέπει να περιλαµβάνει τα παράθυρα που εµφανίζονται στην Εικόνα 2-5. Στην εικόνα αυτή σας υποδεικνύεται ο τρόπος εµφάνισης των παραθύρων.

39 2. ΤΟ ΠΡΟΓΡΑΜΜΑ µvision2 Σελ.39 Εικόνα 2-5. Η αρχική οθόνη του προγράµµατος µvision2 3) ώστε την επιθυµητή συχνότητα ρολογιού του µικροελεγκτή (Xtal 12 MHz) επιλέγοντας <Project> και <Options for Target Target1> (εικονίδιο ). Εικόνα 2-6. Επιλογή παραµέτρων στόχου (target options) 4) ηµιουργήστε ένα νέο αρχείο κειµένου πατώντας το εικονίδιο <New file>. Ανοίγει ένα νέο παράθυρο για να γράψετε το πρόγραµµα.

40 2. ΤΟ ΠΡΟΓΡΑΜΜΑ µvision2 Σελ.40 Εικόνα 2-7. ηµιουργία νέου αρχείου 5) Επιλέξτε <File> και <Save as> ή κάντε κλικ στο εικονίδιο της δισκέτας. Ανοίγει το παράθυρο αποθήκευσης του αρχείου. Επιλέξτε ένα όνοµα της προτίµησής σας µε επέκταση «.Α51», π.χ. My1stProgram.A51. Η επέκταση Α51 βοηθά το πρόγραµµα να επιλέξει αυτόµατα το συµβολοµεταφραστή (assembler) για την παραγωγή του αντικειµενικού κώδικα. Εάν η επέκταση είναι διαφορετική, τότε θα πρέπει να δηλώσετε εσείς ότι η µετάφραση θα γίνει µε τον assembler. Μόλις γίνει αντιστοίχιση του αρχείου µε τον assembler, είτε µέσω της επέκτασης Α51 είτε από τις επιλογές του προγράµµατος, αλλάζουν χρώµα στο παράθυρο του προγράµµατος όλες οι λέξεις που αναγνωρίζει ο µεταφραστής (καταχωρηµένες λέξεις = reserved words). 6) Στη συνέχεια, πρέπει να δηλώσετε ότι το αρχείο My1stProgram.Α51 είναι µέλος του Source Group 1. Κάντε δεξί κλικ στο <Source Group 1> και στο παράθυρο που εµφανίζεται, επιλέξτε <Add Files to Group Source Group 1 >. Εικόνα 2-8. Ένταξη ενός πηγαίου αρχείου στο source group Στο παράθυρο Add Files to Group που θα εµφανιστεί, επιλέξτε <Files of type: Asm Source file> και το αρχείο <My1stProgram.A51>. Αυτό ήταν. Προσοχή µόνο στο εξής: Επειδή το σώσιµο γίνεται αυτόµατα, δεν υπάρχει επιλογή Save Project, ενώ υπάρχουν Open και Close Project. Αυτό είναι, όµως, επικίνδυνο να σας µπερδέψει: οτιδήποτε αρχεία ανοίγετε, το πρόγραµµα θεωρεί ότι θέλει να τα περιλάβετε στο project και θα τα ανοίγει κάθε φορά που ανοίγετε το project. Φυσικά, δε θα συµµετέχουν στην παραγωγή του κώδικα, αν δεν τα εντάξετε στο Source Group.

41 2. ΤΟ ΠΡΟΓΡΑΜΜΑ µvision2 Σελ ΣΥΓΓΡΑΦΗ ΠΡΟΓΡΑΜΜΑΤΟΣ Ακολουθώντας τη διαδικασία που ήδη περιγράφηκε στην προηγούµενη παράγραφο, µπορεί να δηµιουργηθεί ένα project, που να περιέχει ένα αρχείο. Τα ονόµατα που δίδονται είναι συνήθως τέτοια, που να θυµίζουν την εργασία που εκτελεί το πρόγραµµα. Μένει τώρα να περιγραφεί ο τρόπος που συντάσσεται ένα πρόγραµµα. εν είναι απαραίτητο, στην παρούσα φάση, να καταλάβετε τα προγράµµατα που ακολουθούν, αλλά να δείτε τις γενικές αρχές, που πρέπει να τηρούνται στη συγγραφή τους. Στην αρχή µπαίνει µία σύντοµη περιγραφή της εργασίας που εκτελείται. Μην παραλείπετε αυτήν την περιγραφή, θεωρώντας ότι είναι κάτι περιττό. Θα σας φανεί πολύτιµη µετά από καιρό, που θα χρειαστεί να αντλήσετε ιδέες ή να µεταφέρετε το πρόγραµµα για τη σύνθεση ενός άλλου µεγαλύτερου. Στη συνέχεια µπαίνει η οδηγία cseg at 0 (ή org 0) προς τον assembler, για να δηλωθεί η αρχική διεύθυνση, όπου θα αρχίσει η τοποθέτηση του κώδικα που θα παραχθεί από το δικό σας πηγαίο πρόγραµµα. Αν παραλείψετε τη δήλωση αυτή, το µvision2 βάζει τον κώδικα στη διεύθυνση 0 και µετά. Είναι πολύ χρήσιµο να σχολιάζετε τα προγράµµατά σας, έτσι ώστε να φαίνεται το σκεπτικό σας κατά τη σύνταξη, αλλά και κατά την επιλογή των συγκεκριµένων εντολών. Αν µπορείτε, ίσως, να παραλείψετε τα αρχικά σχόλια, σε κάποια προγράµµατα που εκτελούν προφανή εργασία, δεν µπορείτε να παραλείψετε το σχολιασµό του σκεπτικού σας και των εντολών. Είναι αδύνατο να διορθώσετε τα λάθη ενός ασχολίαστου προγράµµατος µετά από λίγο καιρό από τη συγγραφή του. Προσέξτε όµως: δε θεωρείται σχολιασµός η επεξήγηση της λειτουργίας µιας εντολής, π.χ. MOV A,#12 ;φορτώνω στο συσσωρευτή τον αριθµό 12 Τέλος, η οδηγία end δηλώνει στον assembler να σταµατήσει τη µετάφραση. Η οδηγία end απευθύνεται στον µεταφραστή και δεν είναι εντολή προς τη CPU για να σταµατήσει την εκτέλεση του προγράµµατος. Η έννοια «τέλος του προγράµµατος» δεν υφίσταται στη CPU. Στη συνέχεια φαίνεται ένα τυπικό πρόγραµµα. ;Αρχείο My_First_Program.Α51 ; ; ;My1stProgram είναι ένα δοκιµαστικό πρόγραµµα. Προσθέ-; ;τει τους αριθµούς 12 & 34. Φυλάει το αποτέλεσµα στη ; ;θέση 30h. ; ; ; cseg at 0 MOV A,#12 ;Βάλε στον Α τον πρώτο αριθµό ADD A,#34 ;Πρόσθεσε στον Α τον δεύτερο αριθµό MOV 30h,A ;Φύλαξε το αποτέλεσµα στη θέση 30h HALT: JMP HALT end Πρόγραµµα 2-1. Τυπική δοµή ενός προγράµµατος. Εάν δε βλέπετε ελληνικούς χαρακτήρες στο παράθυρο των αρχείων assembly, επιλέξτε <View> <Options> <Colors & Fonts> <Editor Asm Files> <default text> <Courier New> ΜΕΤΑΦΡΑΣΗ ΠΡΟΓΡΑΜΜΑΤΟΣ Το πρόγραµµα που γράφετε σε µορφή κειµένου λέγεται πηγαίο πρόγραµµα (source program) ή συµβολικό πρόγραµµα (assembly program). Το πρόγραµµα αυτό είναι κατανοητό από εσάς, όχι όµως από τον υπολογιστή. Για να µπορέσει να εκτελεστεί από τη CPU, πρέπει να µεταφραστεί στη «γλώσσα» της, δηλαδή στο δυαδικό σύστηµα. Τη µετάφραση αυτή αναλαµβάνει ο συµβολοµεταφραστής (assembler), και παράγεται ο αντικειµενικός κώδικας (object code) ή εκτελέσιµος κώδικας (executable code).

42 2. ΤΟ ΠΡΟΓΡΑΜΜΑ µvision2 Σελ.42 MOV A,#12 MOV B,#0CEh MUL AB 74 0C 75 F0 CE A4 Πηγαίο πρόγραµµα (Source program) Αντικειµενικός κώδικας (Object code) Σχήµα 2-1. Συµβολοµεταφραστής (assembler) Για να παραχθεί ο κώδικας, κάντε κλικ στο εικονίδιο <Rebuild All Target Files>. Εικόνα 2-9. Μετάφραση του πηγαίου αρχείου Προσέχετε στο Παράθυρο Εξόδου (Output Window), µήπως εµφανιστεί κάποιο µήνυµα λάθους. Στην περίπτωση αυτή δεν παράγεται κώδικας. Πρέπει να διορθώσετε το λάθος και να ξαναµεταφράσετε (βλ. Εικόνα 2-10). Εικόνα Το παράθυρο εξόδου Output window Σε περίπτωση που ο συµβολοµεταφραστής συναντήσει συντακτικό λάθος, εµφανίζεται στο Output Window η περιγραφή του λάθους. Κάνοντας διπλό κλικ στην περιγραφή αυτή, τοποθετείται ο δροµέας (cursor) αυτόµατα στη γραµµή του πηγαίου προγράµµατος που περιέχει το λάθος. Μπορείτε να δείτε τον παραγόµενο κώδικα, στο αρχείο My1stProgram.lst, επιλέγοντας <File> <Open> <Files of type: Listing> <My1stProgram.LST>. Τα αρχεία που χειρίζεται το µvision2 είναι: 1).a51 Πηγαίο αρχείο µε το κείµενο του προγράµµατος που γράφει ο χρήστης. 2).lst Αρχείο λίστας (κείµενο) που περιέχει το αποτέλεσµα της µετάφρασης: πηγαίο πρόγραµµα, κώδικας, διευθύνσεις και λάθη. 3).bin Ο εκτελέσιµος κώδικας σε δυαδική µορφή. 4).obj Ο κώδικας σε δυαδική µορφή µαζί µε τις διευθύνσεις που πρέπει να τοποθετηθεί.

43 2. ΤΟ ΠΡΟΓΡΑΜΜΑ µvision2 Σελ.43 5).hex Ο κώδικας σε ASCII µορφή, µαζί µε τις διευθύνσεις που πρέπει να τοποθετηθεί, σε Intel hex format. 6) (omf) Ο κώδικας σε δυαδική µορφή µαζί µε πληροφορίες εκσφαλµάτωσης. Χωρίς επέκταση ονόµατος, object metafile format. Σηµειώστε τη χρήση των όρων πρόγραµµα και κώδικας στην παράγραφο αυτή: το πρόγραµµα περιέχει λέξεις (πηγαίο), ενώ ο κώδικας δεν µπορεί να διαβαστεί από εµάς Ο ΕΚΣΦΑΛΜΑΤΩΤΗΣ (DEBUGGER) Είναι το κοµµάτι του µvision2 που εκτελεί σε προσοµοιωτή ή σε πλακέτα στόχο το πρόγραµµά σας. Σας παρέχει εργαλεία εκσφαλµάτωσης, όπως βηµατική εκτέλεση, εξέταση των περιεχοµένων της µνήµης, σηµεία παύσης, κλπ. Καλείται από το εικονίδιο <Debug>, όπως δείχνει η Εικόνα Για να είναι ενεργό το εικονίδιο εκσφαλµάτωσης, πρέπει να έχετε φορτώσει ή µεταφράσει κάποιο πρόγραµµα. Εάν δεν εµφανίζεται το εικονίδιο <Debug>, επιλέξτε <View> - <Debug Toolbar>. Εικόνα Η οθόνη εκσφαλµάτωσης (debug) Πιέζοντας το εικονίδιο <Step into>, εκτελείτε το πρόγραµµα εντολή προς εντολή, ενώ παρακολουθείτε τα περιεχόµενα των καταχωρητών και της µνήµης. Εάν το παράθυρο της µνήµης δεν εµφανίζεται, επιλέξτε <View> <Memory Window>. Το βελάκι αριστερά από µία γραµµή δείχνει την εντολή που έχει σειρά να εκτελεστεί.

44 2. ΤΟ ΠΡΟΓΡΑΜΜΑ µvision2 Σελ.44 Εικόνα Βηµατική εκτέλεση του προγράµµατος

45 3. Η ΟΡΓΑΝΩΣΗ ΜΝΗΜΗΣ TOY 8051 Σελ Η ΟΡΓΑΝΩΣΗ ΜΝΗΜΗΣ TOY 8051 Ο 8051 είναι οκτάµπιτος, δηλαδή όλοι οι καταχωρητές του και η αριθµητική και λογική του µονάδα είναι οκτάµπιτοι. Από τους καταχωρητές που µπορεί να χειριστεί ο προγραµµατιστής µόνον ο DPTR (Data Pointer = δείκτης δεδοµένων) είναι δεκαεξάµπιτος. Μία δυνατότητα µοναδική στον 8051 είναι ότι µπορεί να χειρίζεται και µεταβλητές του 1 bit µε τη σηµαία του κρατούµενου σαν συσσωρευτή του 1 bit. Μία διαφορά από τους επεξεργαστές άλλων λογικών οικογενειών είναι η έλλειψη σηµαίας µηδενός, µία έλλειψη που, στην αρχή, δυσκολεύει όσους είναι συνηθισµένοι σε τέτοιους επεξεργαστές ΑΡΧΙΤΕΚΤΟΝΙΚΕΣ VON NEUMANN ΚΑΙ HARVARD Στην αρχιτεκτονική Von Neumann, η CPU αναφέρεται σε ένα συνεχόµενο χώρο διευθύνσεων. Το χώρο αυτό µοιράζονται πρόγραµµα και δεδοµένα. Η επιλογή µεταξύ ROM, RAM και περιφερειακών γίνεται αποκλειστικά και µόνον από τη διεύθυνση που εκπέµπει η CPU. Για την επιλογή αυτή χρησιµοποιείται ένα ειδικό κύκλωµα που παρακολουθεί τη διεύθυνση που εκπέµπει η CPU και ενεργοποιεί το κατάλληλο ολοκληρωµένο µε µία από τις εξόδους του. Το ειδικό αυτό κύκλωµα είναι ένας αποκωδικοποιητής που, εξαιτίας της συγκεκριµένης του χρήσης, λέγεται «αποκωδικοποιητής διευθύνσεων» (address decoder). Σχήµα 3-1. Παράδειγµα αρχιτεκτονικής Von Neumann Στην αρχιτεκτονική Harvard υπάρχουν ξεχωριστοί χώροι διευθύνσεων για το πρόγραµµα και τα δεδοµένα. Οι διευθύνσεις είναι οι ίδιες για τους δύο αυτούς χώρους, η επιλογή δε µεταξύ αυτών γίνεται µε τον τρόπο προσπέλασης ή την εντολή που χρησιµοποιεί η CPU. Ο 8051 ανήκει στην κατηγορία αυτή. Όταν ο 8051 κάνει προσπέλαση στη µνήµη, ενεργοποιεί τα εξής σήµατα: RD (not read), όταν κάνει ανάγνωση, και WR (not write), όταν κάνει εγγραφή. Όταν διαβάζει κώδικα, ενεργοποιεί το σήµα PSEN (not program storage enable). Τα περιφερειακά µοιράζονται το χώρο διευθύνσεων δεδοµένων, και για τη διάκρισή τους, απαιτείται αποκωδικοποιητής διευθύνσεων (βλέπε Σχήµα 3-2). υστυχώς ή ευτυχώς, η ιστορία µε τη µνήµη του 8051 δεν τελειώνει εδώ. Ο µικροελεγκτής έχει ενσωµατωµένες µνήµες RAM και ROM, αλλά µπορεί να δεχτεί και εξωτερικές, όπως δείχνει το Σχήµα 3-3. Με τη µνήµη ROM τα πράγµατα είναι απλά: µία ειδική είσοδος, η EA, επιλέγει, αν είναι 0, την εξωτερική ROM για να διαβαστεί ο κώδικας, ενώ αν είναι 1, επιλέγεται η ενσωµατωµένη ROM στον µικροελεγκτή. Ακόµη όµως και αν είναι επιλεγµένη η εσωτερική ROM, αν γίνει ανάκληση εντολής από διεύθυνση που δεν υπάρχει στην εσωτερική, αυτή γίνεται αυτόµατα από την εξωτερική ROM. Η ενσωµατωµένη, τώρα, µνήµη RAM έχει τις ίδιες διευθύνσεις µε την εξωτερική. Το πώς γίνεται η διάκριση, θα συζητηθεί σε λίγο.

46 3. Η ΟΡΓΑΝΩΣΗ ΜΝΗΜΗΣ TOY 8051 Σελ.46 Σχήµα 3-2.Παράδειγµα αρχιτεκτονικής Harvard Στη RAM αποθηκεύονται και ανακαλούνται δεδοµένα ενώ από τη ROM ανακαλείται ο προς εκτέλεση κώδικας. Εάν η χωρητικότητα των µνηµών αυτών δεν επαρκεί, κάτι σπάνιο στα τελευταία µοντέλα, τότε πρέπει να συνδεθεί εξωτερική ROM και / ή RAM. Στο Σχήµα 3-3 φαίνεται ο τρόπος µε τον οποίο συνδέονται εξωτερικές µνήµες ROM (προγράµµατος) και RAM (δεδοµένων) στον 8051.

47 3. Η ΟΡΓΑΝΩΣΗ ΜΝΗΜΗΣ TOY 8051 Σελ.47 C2 C1 DATA BUS Vcc 33p X1 12MHz + C3 1u SW1 33p EA/VP X1 X2 RESET INT0 INT1 T0 T1 P1.0 P1.1 P1.2 P1.3 P1.4 P1.5 P1.6 P / 8051 U1 P0.0 P0.1 P0.2 P0.3 P0.4 P0.5 P0.6 P0.7 P2.0 P2.1 P2.2 P2.3 P2.4 P2.5 P2.6 P RD 17 WR 16 PSEN ALE/P TXD 11 RXD 10 AD0 AD1 AD2 AD3 AD4 AD5 AD6 AD7 A8 A9 A10 A11 A12 A13 A14 A15 ALE ADDRESS LATCH AD D1 Q1 AD D2 Q2 AD D3 Q3 AD D4 Q4 AD D5 Q5 AD D6 Q6 AD D7 Q7 AD D8 Q8 U4 74HC C OC ADDRESS BUS WR RD PSEN A0 A1 A2 A3 A4 A5 A6 A7 VCC A0 10 A1 9 A2 8 A3 7 A4 6 A5 5 A6 4 A7 3 A8 25 A9 24 A10 21 A11 23 A12 2 A13 26 A A0 10 A1 9 A2 8 A3 7 A4 6 A5 5 A6 4 A7 3 A8 25 A9 24 A10 21 A11 23 A12 2 A13 26 A A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 A10 A11 A12 A13 A14 CS1 A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 A10 A11 A12 A13 A14 Εξωτερική RAM U OE FFF WE ROM U OE CE FFF VPP D0 D1 D2 D3 D4 D5 D6 D7 D0 D1 D2 D3 D4 D5 D6 D AD0 AD1 AD2 AD3 AD4 AD5 AD6 AD7 ( εδοµένα) AD0 AD1 AD2 AD3 AD4 AD5 AD6 AD7 (Πρόγραµµα) Σχήµα 3-3. ιασύνδεση εξωτερικών µνηµών ROM και RAM στον 8051 Παρατηρείστε ότι, όταν χρησιµοποιείται εξωτερική µνήµη, οι θύρες Ρ0 και Ρ2 χρησιµοποιούνται ως διάδροµοι. Έτσι, δεν µπορούν να χρησιµοποιηθούν ως θύρες. Η θύρα Ρ2 εκπέµπει το byte υψηλής τάξης της διεύθυνσης. Η θύρα Ρ0 χρησιµοποιείται, σε πολύπλεξη, για να εκπέµπει το byte χαµηλής τάξης της διεύθυνσης και για να στέλνει και να δέχεται δεδοµένα. Όταν ο 8051 εκπέµπει στη θύρα Ρ0 το byte χαµηλής τάξης της διεύθυνσης, ενεργοποιεί το σήµα ALE (ακροδέκτης 29) και το latch U4 (74HC573) κρατά αυτό το byte (βλέπε Σχήµα 3-3). Η διάκριση µεταξύ ROM και RAM γίνεται µε βάση τα σήµατα PSEN, RD και WR. Όταν το σήµα PSEN (not program storage enable) είναι ενεργό, ο 8051 διαβάζει εντολή από τη ROM. Όταν το σήµα RD (not read) είναι ενεργό, διαβάζει δεδοµένα. Τέλος, όταν το σήµα WR (not write) είναι ενεργό, γράφει δεδοµένα. Είναι, λοιπόν, προφανές ότι το σήµα PSEN ενεργοποιεί τη ROM ενώ τα σήµατα RD και WR ενεργοποιούν την ανάγνωση και την εγγραφή, αντίστοιχα, στη RAM. Είναι γνωστό ότι από τη µνήµη ROM η CPU µόνο διαβάζει εντολές. Η εγγραφή γίνεται µε ειδικές συσκευές ή ειδικές διαδικασίες. Στο µvision2 γίνεται προσοµοίωση της µνήµης ROM και εποµένως το πρόγραµµα «εγγράφεται» χωρίς πρόβληµα. Με κατάλληλο συνδυασµό των ακροδεκτών PSEN και RD, ο 8051 µπορεί να µετατραπεί από αρχιτεκτονική Harvard σε von Neumann. Οι έξοδοι RD και PSEN συνδυάζονται µε µία πύλη AND. Προκύπτει έτσι ένα σήµα VNRD που ενεργοποιεί τη RAM είτε σε διάβασµα µνήµης είτε σε ανάκληση κώδικα. Εφόσον, βέβαια, υλοποιείται η αρχιτεκτονική von Neumann, δεν είναι πλέον διαθέσιµα 64 KBytes κώδικα και 64 KBytes δεδοµένων, αλλά σύνολο 64 KBytes για πρόγραµµα και δεδοµένα.

48 3. Η ΟΡΓΑΝΩΣΗ ΜΝΗΜΗΣ TOY 8051 Σελ.48 C2 C1 DATA BUS Vcc 33p X1 12MHz + C3 1u SW1 33p EA/VP X1 X2 RESET INT0 INT1 T0 T1 P1.0 P1.1 P1.2 P1.3 P1.4 P1.5 P1.6 P / 8051 U1 P0.0 P0.1 P0.2 P0.3 P0.4 P0.5 P0.6 P0.7 P2.0 P2.1 P2.2 P2.3 P2.4 P2.5 P2.6 P RD 17 WR 16 PSEN 29 30ALE ALE/P TXD 11 RXD 10 AD0 AD1 AD2 AD3 AD4 AD5 AD6 AD7 A8 A9 A10 A11 A12 A13 A14 A15 AD0 AD1 AD2 AD3 AD4 AD5 AD6 AD7 ALE 1 2 ADDRESS LATCH 2 19 D1 Q D2 Q D3 Q D4 Q D5 Q D6 Q D7 Q D8 Q8 U4 74HC C OC ADDRESS BUS 3 WR A15 VNRD Αποκωδικοποιητής δ/νσεων A15 A0 A1 A2 A3 A4 A5 A6 A7 A15 PSEN VCC A0 10 A1 9 A2 8 A3 7 A4 6 A5 5 A6 4 A7 3 A8 25 A9 24 A10 21 A11 23 A12 2 A13 26 A A0 10 A1 9 A2 8 A3 7 A4 6 A5 5 A6 4 A7 3 A8 25 A9 24 A10 21 A11 23 A12 2 A13 26 A A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 A10 A11 A12 A13 A14 OE WE CS FFFF A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 A10 A11 A12 A13 A14 U U OE CE FFF VPP D0 D1 D2 D3 D4 D5 D6 D7 D0 D1 D2 D3 D4 D5 D6 D AD0 AD1 AD2 AD3 AD4 AD5 AD6 AD7 RAM ( εδοµένα και Πρόγραµµα) AD0 AD1 AD2 AD3 AD4 AD5 AD6 AD7 ROM (Πρόγραµµα) Σχήµα 3-4. Ενοποίηση των χώρων προγράµµατος και δεδοµένων µε πύλη AND Τα είδη µνήµης δεδοµένων γενικής χρήσης, µε τα οποία µπορεί να συνεργαστεί ο 8051 είναι: 1. Οι εσωτερικοί του καταχωρητές Α, Β και DPTR είναι η γρηγορότερη µνήµη, επειδή δεν απασχολούνται οι διάδροµοι δεδοµένων και διευθύνσεων. 2. Τέσσερις οµάδες καταχωρητών R0 - R7 (σύνολο 32 bytes) της εσωτερικής του µνήµης RAM (διευθύνσεις 00h 1Fh), στις οποίες µπορεί και αναφέρεται πιο εύκολα από τις άλλες διευθύνσεις, επειδή µπορεί και χρησιµοποιεί το όνοµα των καταχωρητών αντί για τη διεύθυνσή τους. 3. Απευθείας RAM, µεγέθους 128 bytes (διευθύνσεις 00h..7Fh), στην εσωτερική µνήµη RAM. 4. Έµµεση RAM, µεγέθους 128 bytes (διευθύνσεις 80h..0FFh) στην εσωτερική µνήµη RAM. Είναι πιο αργή από την απευθείας RAM, επειδή για την προσπέλασή της χρειάζεται ένας καταχωρητής δείκτη από τους R0 και R1. 5. Εξωτερική RAM, µεγέθους µέχρι 64 KBytes. Είναι η πιο αργή µνήµη και η προσπέλασή της γίνεται µόνον µέσω ειδικού καταχωρητή δείκτη (DPTR ή Ri) Η ΟΡΓΑΝΩΣΗ ΜΝΗΜΗΣ ΤΟΥ 8051 Ο 8051 µπορεί να κάνει προσπέλαση σε εσωτερική και εξωτερική µνήµη ROM και RAM. Ο τρόπος διευθυνσιοδότησης και η διεύθυνση προσδιορίζουν το είδος και τη θέση της µνήµης, όπου θα γίνει προσπέλαση. Η φυσική µνήµη που µπορεί να προσπελάσει ο 8051 φαίνεται στο Σχήµα 3-5. Προσέξτε ότι η φυσική µνήµη χωρίζεται σε τέσσερα τµήµατα. Η επιλογή ενός από τα τµήµατα αυτά γίνεται αυτόµατα από τον µικροελεγκτή, ανάλογα µε το είδος της εργασίας που εκτελείται. Η χρήση των τµηµάτων είναι η εξής. 1. Εσωτερική RAM: το µέγεθός της είναι 128 ή 256 bytes, ανάλογα µε το µοντέλο. Παρατηρήστε ότι, αν το µέγεθός της είναι 256 bytes, το επάνω µισό της έχει τις ίδιες διευθύνσεις µε το τµήµα sfr.

49 3. Η ΟΡΓΑΝΩΣΗ ΜΝΗΜΗΣ TOY 8051 Σελ sfr: καταχωρητές ειδικών λειτουργιών (special function registers, sfr), για τη ρύθµιση του τρόπου µε τον οποίο θα εργάζεται ο µικροελεγκτής. Κάποιες θέσεις είναι κενές για µελλοντικές επεκτάσεις και δεν πρέπει να χρησιµοποιούνται. Οι sfr θα περιγραφούν στα σηµεία στα οποία θα χρησιµοποιηθούν για πρώτη φορά. 3. Εξωτερική RAM (0-64 KBytes): η χρήση της είναι προαιρετική και προστίθεται µόνο όταν η εσωτερική RAM του µικροελεγκτή δεν επαρκεί. Η προσπέλασή της γίνεται µε ειδική εντολή (τη MOVX). 4. Εσωτερική (1-64 KBytes) ή εξωτερική (0-64 KBytes) ROM: για την αποθήκευση του κώδικα. Η εγγραφή γίνεται µε ειδικές συσκευές (EPROM programmers) ή ειδικές διαδικασίες (ISP). Κάποια µοντέλα µικροελεγκτών έχουν εσωτερική ROM και κάποια όχι, το δε µέγεθος κυµαίνεται από 1 µέχρι 64 KBytes. Όταν τελειώσει η εσωτερική ROM, ο 8051 γυρνάει αυτόµατα στην εξωτερική. Είναι δυνατή η απενεργοποίηση της εσωτερικής ROM (γειώνοντας τον ακροδέκτη EA ), ώστε ο 8051 να αναφέρεται στην εξωτερική για όλες τις διευθύνσεις, ακόµη και τις χαµηλές. Για το διάβασµα σταθερών από τη µνήµη ROM του κώδικα διατίθεται ιδιαίτερη εντολή (η MOVC). Σχήµα 3-5. Οργάνωση µνήµης του 8051 Πώς γίνεται διάκριση του τµήµατος µνήµης, αφού οι διευθύνσεις είναι ίδιες; Όταν η CPU εκτελεί κώδικα, διαβάζει από τη ROM, ενεργοποιώντας τον ακροδέκτη PSEN (not program storage enable). Όταν διαβάζονται σταθερές από τη µνήµη προγράµµατος (ROM), χρησιµοποιείται η εντολή MOVC. Ενεργοποιείται τότε και πάλι ο ακροδέκτης PSEN.

50 3. Η ΟΡΓΑΝΩΣΗ ΜΝΗΜΗΣ TOY 8051 Σελ.50 Όταν γίνεται προσπέλαση της εξωτερικής RAM χρησιµοποιείται η MOVX. Ενεργοποιείται τότε ο ακροδέκτης RD στο διάβασµα και ο WR στο γράψιµο (εντολές MOVX και αντίστοιχα). Όταν γίνεται προσπέλαση της εσωτερικής RAM, χρησιµοποιείται η MOV. Ο κανονικός 8051 έχει 128 bytes RAM. Τα περισσότερα, όµως, παράγωγά του έχουν 256 bytes. Τα επί πλέον 128 bytes έχουν, και πάλι, τις ίδιες διευθύνσεις µε τους sfr και η επιλογή µεταξύ sfr και άνω 128 bytes RAM γίνεται µε το χρησιµοποιούµενο τρόπο διευθυνσιοδότησης: ο απευθείας τρόπος οδηγεί στους sfr, ενώ ο έµµεσος στα πάνω 128 bytes της RAM (βλέπε Σχήµα 3-5). Περισσότερα για τους τρόπους διευθυνσιοδότησης στο επόµενο κεφάλαιο. Στη συνέχεια περιγράφονται αναλυτικά τα τέσσερα είδη µνήµης που µπορεί να προσπελάσει ο Η εσωτερική µνήµη RAM Στο Σχήµα 3-6 φαίνεται ότι οι διαθέσιµες θέσεις µνήµης γενικού σκοπού είναι από 30h µέχρι 7Fh. Οι θέσεις µε διευθύνσεις από 20h µέχρι 2Fh είναι επίσης διαθέσιµες ως θέσεις γενικού σκοπού, αλλά έχουν µία δυνατότητα πολύ χρήσιµη σε ειδικές περιπτώσεις: είναι προσπελάσιµες κατά bit. Αυτό σηµαίνει ότι κάποιες εντολές µπορούν να αναφερθούν σε ένα από τα bits των θέσεων αυτών. Οι 16 αυτές θέσεις µε προσπέλαση bit δίνουν 16x8=128 bits µε διευθύνσεις από 00h µέχρι 7Fh. Σηµειώστε, εδώ, ότι άλλα 128 bits µε διευθύνσεις από 80h µέχρι 0FFh βρίσκονται µέσα στους καταχωρητές ειδικής χρήσης (sfr). Περισσότερα γι αυτό σε επόµενη παράγραφο. Οι θέσεις µνήµης 00h µέχρι 1Fh µπορούν, φυσικά, να προσπελαθούν µε τη διεύθυνσή τους. Σχεδόν όλες οι εντολές, όµως, του 8051 µπορούν να αναφερθούν στις θέσεις αυτές και µε τα συµβολικά τους ονόµατα R0 µέχρι R7. Τα οκτώ αυτά ονόµατα αναφέρονται στις οκτώ θέσεις µιας από τέσσερις οµάδες (καταχωρητές οµάδας). Για να επιλεγεί η ενεργή οµάδα καταχωρητών, ρυθµίζονται κατάλληλα τα bits RS1 και RS0 του καταχωρητή κατάστασης PSW (σελ. 85). Περισσότερα για τις εντολές ρύθµισης των bits σε επόµενο κεφάλαιο.

51 3. Η ΟΡΓΑΝΩΣΗ ΜΝΗΜΗΣ TOY 8051 Σελ.51 Σχήµα 3-6. Λεπτοµερής χάρτης της εσωτερικής µνήµης RAM (κάτω 128 bytes) Παρατηρήστε στο σχήµα ότι, µετά τη διεύθυνση 1Fh ακολουθεί η 20h και µετά τη 2Fh, η 30h Οι sfr (καταχωρητές ειδικών λειτουργιών) Οι 128 διευθύνσεις από 80h µέχρι FFh αντιστοιχούν σε ειδικούς καταχωρητές (special function registers). Π.χ. η διεύθυνση Α0h αντιστοιχεί στη θύρα Ρ2.

52 3. Η ΟΡΓΑΝΩΣΗ ΜΝΗΜΗΣ TOY 8051 Σελ.52 - F8 B F E8 - ACC E D8 CCON 00x00000 D0 PSW C8 T2CON F9 CH F1 E9 CL E1 D9 CMOD 00xxx000 D1 FCON xxxx0000 C9 T2MOD xxxxxx00 FA CCAP0H xxxxxxxx - F2 EA CCAP0L xxxxxxxx - E2 DA CCAPM0 x D2 EEC0N xxxxxx00 CA RCAP2L FB CCAP1H xxxxxxxx - F3 EB CCAP1L xxxxxxxx - E3 DB CCAPM1 x D3 EETIM CB RCAP2H FC CCAP2H xxxxxxxx - F4 EC CCAP2L xxxxxxxx - E4 DC CCAPM2 x D4 CC TL FD CCAP3H xxxxxxxx - F5 ED CCAP3L xxxxxxxx - E5 DD CCAPM3 x D5 CD TH FE CCAP4H xxxxxxxx - F6 EE CCAP4L xxxxxxxx - E6 DE CCAPM4 x C0 - C1 - C2 - C3 - C4 - C5 - C6 - C7 B8 B9 BA BB BC BD BE BF IP SADEN x P3 B0 B1 B2 B3 B4 B5 B6 IPH B x A8 A9 AA AB AC AD AE AF IE SADDR A0 A1 A2 A3 A4 A5 A6 A7 P AUXR1 xxxx00x WDTRST xxxxxxxx WDTPRG xxxxx A 9B 9C 9D 9E 9F SCON SBUF xxxxxxxx P A 8B 8C 8D 8E 8F TCON TMOD TL TL TH TH AUXR xx0x1000 CKCON x P SP DPL DPH PCON 00x10000 Πίνακας 3-1. Οι καταχωρητές sfr και οι τιµές reset του T89C51RD2 Σε κάποιες διευθύνσεις δεν αντιστοιχεί κανείς sfr (σκουρόχρωµα κελιά µε άσπρα γράµµατα). Σε αυτές τις θέσεις δεν πρέπει να γράφετε επειδή µπορεί να προκύψουν απρόσµενα αποτελέσµατα. Οι καταχωρητές sfr σε άσπρα κελιά υπάρχουν σε όλους τους µικροελεγκτές µε πυρήνα τον Οι sfr σε γκρίζα κελιά µε τη διεύθυνσή τους σε µαύρο φόντο µπορεί να υπάρχουν ή όχι, ανάλογα µε το µοντέλο. Οι sfr µε υπογραµµισµένο το όνοµά τους υπάρχουν µόνο στον 89C51RD2. Όλοι οι καταχωρητές της πρώτης στήλης µε διευθύνσεις 80h, 88h, 90h,... 0F8h είναι προσπελάσιµοι κατά bit µε διευθύνσεις των bits από 80h µέχρι 0FFh. Για παράδειγµα, η διεύθυνση bit 89h αντιστοιχεί στο bit 1 του TCON. Οι 16 αυτοί καταχωρητές µαζί µε τους 16 καταχωρητές των διευθύνσεων από 20h µέχρι 2Fh (βλέπε Σχήµα 3-6) αποτελούν το σετ καταχωρητών µε δυνατότητα προσπέλασης bit. Οι καταχωρητές οι προσπελάσιµοι κατά bit στον T89C51RD2 είναι οι εξής. ACC: Accumulator = συσσωρευτής B: Καταχωρητής Β, κυρίως για πράξεις πολ/σµού και διαίρεσης. PSW: Processor status word = καταχωρητής κατάστασης ή σηµαιών. P0...P3: Θύρες εισόδου / εξόδου. IE: Interrupt enable register = καταχωρητής ενεργοποίησης διακοπών IP: Interrupt priority register = καταχωρητής προτεραιότητας διακοπών TCON: Καταχωρητής ελέγχου των χρονιστών 0 και 1. T2CON: Καταχωρητής ελέγχου του χρονιστή 2. CCON: Καταχωρητής ελέγχου του µετρητή PCA. SCON: Καταχωρητής ελέγχου της σειριακής θύρας. - - D6 CE FF F7 EF E7 DF D7 CF

53 3. Η ΟΡΓΑΝΩΣΗ ΜΝΗΜΗΣ TOY 8051 Σελ.53 Για να διαβάσετε ή να γράψετε στους sfr, πρέπει να χρησιµοποιείτε µόνο απευθείας διευθυνσιοδότηση. Με έµµεση διευθυνσιοδότηση οδηγείστε στο πάνω µισό της εσωτερικής RAM. Παράδειγµα: Η εντολή MOV 90h,#55h γράφει στη θύρα Ρ1 µε διεύθυνση 90h τον αριθµό 55, ενώ οι εντολές MOV R0,#90h είναι η δ/νση µνήµης που περιέχεται στον ;καταχωρητή R0 γράφουν στην εσωτερική RAM στη διεύθυνση 90h. Περισσότερα για τους τρόπους διευθυνσιοδότησης σε επόµενο κεφάλαιο Η εξωτερική RAM Είναι ξεχωριστό ολοκληρωµένο κύκλωµα µε διευθύνσεις που αρχίζουν και πάλι από το 0, αλλά αυτήν την φορά είναι των 16 bits. Ο 8051 δεν µπορεί να προσπελάσει µε άλλο τρόπο την εξωτερική µνήµη παρά µόνο µε έµµεσο, είτε µε διεύθυνση των 8 bits είτε µε διεύθυνση των 16 bits. Ο πιο συνηθισµένος τρόπος είναι ο δεύτερος. Για την προσπέλαση της εξωτερικής RAM µε διεύθυνση των 16 bits, χρησιµοποιείται ο καταχωρητής ειδικής λειτουργίας DPTR (Data Pointer, sfr 82h και 83h), όπου φορτώνεται η επιθυµητή διεύθυνση. Στο διάβασµα το περιεχόµενο πηγαίνει στον συσσωρευτή Α, ενώ στο γράψιµο το περιεχόµενο γράφεται από τον Α στη µνήµη. Η εντολή για ανάγνωση είναι MOVX ενώ για εγγραφή Παράδειγµα: Οι παρακάτω εντολές γράφουν στην εξωτερική RAM µε διεύθυνση 7000h τον αριθµό 5Ah. MOV DPTR,#7000h MOV A,#5Ah είναι η δ/νση µνήµης που δείχνει ο DPTR Η µνήµη ROM ή µνήµη προγράµµατος Μπορεί να περιέχεται εξολοκλήρου µέσα στον 8051, να είναι εξωτερικό ολοκληρωµένο κύκλωµα ή να είναι ένα αρχικό τµήµα της µέσα στον 8051 και το υπόλοιπο σε εξωτερικό ολοκληρωµένο. Η επιλογή της ROM γίνεται αυτόµατα στη φάση της ανάκλησης (fetch) της εντολής, άρα το πρόγραµµα που πρόκειται να εκτελεστεί πρέπει να φυλάγεται στη ROM. Εάν σε κάποιον ελεγκτή µε 8051 επαρκεί η εσωτερική του ROM, τότε είναι διαθέσιµες και οι τέσσερις θύρες εισόδου / εξόδου Ρ0 Ρ3. Εάν χρειαστεί και εξωτερική ROM, οι θύρες Ρ0 και Ρ2 χρησιµοποιούνται ως διάδροµοι διευθύνσεων και δεδοµένων µε πολύπλεξη. Από τις ίδιες θύρες εξάγονται οι γραµµές διευθύνσεων και δεδοµένων για την προσπέλαση και της εξωτερικής µνήµης RAM. Η πρώτη ανάκληση εντολής µετά το reset γίνεται από τον 8051, από τη θέση µνήµης µε διεύθυνση 0000h. Εκεί θα πρέπει να υπάρχει ROM, είτε εξωτερική είτε ενσωµατωµένη, ώστε να δώσει την πρώτη εντολή του προγράµµατος. Επειδή οι αµέσως επόµενες διευθύνσεις µετά την 0000h είναι απαραίτητες για τη φύλαξη των διανυσµάτων διακοπής, η πρώτη εντολή που µπαίνει στη ROM στη διεύθυνση 0000h είναι µία εντολή διακλάδωσης σε διεύθυνση µετά από τα διανύσµατα διακοπής. Αν δε χρησιµοποιούνται διακοπές, τότε το πρόγραµµα µπορεί να γραφεί από τη διεύθυνση 0 και µετά, συνεχόµενα. Εάν ο µικροελεγκτής έχει ενσωµατωµένα περισσότερα περιφερειακά, τότε τα διανύσµατα διακοπής καταλαµβάνουν περισσότερο χώρο και δεν τελειώνουν στη διεύθυνση 0033h ΕΜΦΑΝΙΣΗ / ΤΡΟΠΟΠΟΙΗΣΗ ΤΗΣ ΜΝΗΜΗΣ ΜΕ ΤΟ µvision2 Μπορείτε, µέσα από το µvision2, να διαχειρίζεστε τα περιεχόµενα της µνήµης, είτε πραγµατικής σε µία πλακέτα στόχο είτε σε προσοµοίωση. Για να δείτε το εσωτερικό της µνήµης µέσα από τον debugger του µvision2, ενεργοποιήστε ένα από τα 4 παράθυρα της µνήµης µε την επιλογή <View> <Memory Window> και δώστε τη διεύθυνση στη µορφή?:δ/νση. Στη θέση του? µπαίνει ένα από τα γράµµατα c, d, i, x ή b, όπως δείχνει ο Πίνακας 3-2.

54 3. Η ΟΡΓΑΝΩΣΗ ΜΝΗΜΗΣ TOY 8051 Σελ.54 c d i x b Code memory = µνήµη προγράµµατος Direct addressable internal RAM = εσωτερική απευθείας προσπελάσιµη µνήµη RAM Indirect addressable internal RAM = εσωτερική έµµεσα προσπελάσιµη µνήµη RAM External memory = εξωτερική µνήµη Bit addressable RAM = προσπελάσιµη κατά bit µνήµη RAM (20h... 2Fh) Πίνακας 3-2. Προσδιορισµός του τύπου της µνήµης στο µvision2 Στο κείµενο του βιβλίου υιοθετείται ο συµβολισµός του µvision2 για τον προσδιορισµό του τύπου της µνήµης. Όταν δεν προσδιορίζεται ο τύπος, θα εννοείται απευθείας µνήµη, αν η διεύθυνση είναι από 0 µέχρι 7Fh και έµµεση, αν η διεύθυνση είναι από 80h µέχρι FFh. Π.χ. 30h θα σηµαίνει d:30h και 90h θα σηµαίνει i:90h. Προβλήµατα 1. Περιγράψτε τα διαφορετικά είδη µνήµης που µπορεί να υπάρχουν σε ένα σύστηµα µε 8051 στη διεύθυνση 0. Επαναλάβετε για τις διευθύνσεις 80h και 0100h. 2. Η συνολική εσωτερική απευθείας RAM στον 8051 είναι 256 bytes. Η συνολική εσωτερική έµµεση RAM είναι 512 bytes. Η συνολική εσωτερική µνήµη (απευθείας και έµµεση) όµως είναι 512 bytes. Πώς το εξηγείτε; 3. Σχεδιάστε το κυκλωµατικό διάγραµµα ενός 8051 µε εσωτερική ROM που να µπορεί να εκτελεί κώδικα και από εξωτερική RAM. Ο κώδικας στην ενσωµατωµένη ROM θα γράφει τα bytes του κώδικα στην εξωτερική RAM και στη συνέχεια θα κάνει διακλάδωση εκεί.

55 4. ΤΡΟΠΟΙ ΙΕΥΘΥΝΣΙΟ ΟΤΗΣΗΣ. ΕΝΤΟΛΕΣ ΜΕΤΑΦΟΡΑΣ Ε ΟΜΕΝΩΝ ΤΡΟΠΟΙ ΙΕΥΘΥΝΣΙΟ ΟΤΗΣΗΣ (ADDRESSING MODES) ιευθυνσιοδότηση είναι ο προσδιορισµός από την εντολή της θέσης της πληροφορίας. Σαν θέση της πληροφορίας εννοείται η θέση των δεδοµένων που πρόκειται να επεξεργαστούν από την εντολή και, επίσης, η θέση των αποτελεσµάτων της. Προσπέλαση είναι το διάβασµα ή γράψιµο µιας από αυτές τις θέσεις και αναφέρεται ξεχωριστά στην προέλευση των δεδοµένων και στη θέση των αποτελεσµάτων. Ο 8051 είναι εφοδιασµένος µε τους εξής τρόπους διευθυνσιοδότησης (ή τρόπους προσπέλασης) Άµεση ιευθυνσιοδότηση (immediate addressing) Είναι ο πιο απλός τρόπος να προσδιοριστεί το δεδοµένο της εντολής. Το δεδοµένο βρίσκεται στη ROM και συνοδεύει τον κωδικό λειτουργίας της εντολής, είναι, δηλαδή, µέρος της. Το Σχήµα 4-1 επεξηγεί σχηµατικά την άµεση διευθυνσιοδότηση. Μνήµη προγράµµατος ΕΝΤΟΛΗ MOV A,# C A 0C Σχήµα 4-1. Άµεση διευθυνσιοδότηση Τα άµεσα δεδοµένα δηλώνονται µε το σύµβολο #. Προσέξτε: αν παραλείψετε το #, η εντολή είναι πάλι σωστή, αλλά έχει άλλον τρόπο διευθυνσιοδότησης, τον απευθείας (βλέπε επόµενη παράγραφο). Παράδειγµα: MOV A,#12 σηµαίνει να γραφεί στον Α ο αριθµός 12 (0Ch). Αντί των δεκαδικών σταθερών µπορεί να χρησιµοποιούνται και δεκαεξαδικές και δυαδικές. Οι δεκαεξαδικές δηλώνονται µε 0x στην αρχή ή µε h στο τέλος. Και µε τη µία και µε την άλλη δήλωση δεν επιτρέπεται µία δεκαεξαδική σταθερά να αρχίζει από γράµµα. Σε ένα δεκαεξαδικό αριθµό που αρχίζει από γράµµα πρέπει να προσθέτετε στην αρχή το ψηφίο 0, αλλιώς θα πάρετε λάθος από τον συµβολοµεταφραστή (π.χ. 0CC00h). Οι δυαδικοί αριθµοί δηλώνονται µε b στο τέλος (π.χ b). Εντολές µεταφοράς δεδοµένων µε άµεση διευθυνσιοδότηση Οι εντολές που φορτώνουν στους καταχωρητές ή στη µνήµη µία σταθερά που δίνεται µαζί µε την εντολή, είναι: MOV A,# b ;Βάλε στον Α τη σταθερά 12 MOV R7,#12 ;Βάλε στον καταχωρητή R7 τη σταθερά 12 MOV DPH,#0Ch ;Βάλε στο high byte του DPTR τη σταθερά 12 MOV DPL,#34 ;Βάλε στο low byte του DPTR τη σταθερά 34 MOV DPTR,#0CC00h ;Βάλε στον DPTR τη 16µπιτη σταθερά ;Βάλε στη µνήµη που δείχνει ο R0 τη σταθερά 12 MOV 12,#34 ;Βάλε στη µνήµη µε διεύθυνση 12 τη σταθερά 34 Σταθερές: 0x ή h = 16δικό, b = δυαδικό, τίποτε = 10δικό Απευθείας διευθυνσιοδότηση (Direct addressing) Το δεδοµένο βρίσκεται στη µνήµη RAM και στην εντολή προσδιορίζεται η διεύθυνσή του. Το Σχήµα 4-2 επεξηγεί σχηµατικά την απευθείας διευθυνσιοδότηση. Με τον τρόπο αυτόν, µπορεί να γίνει προσπέλαση στα κάτω 128 bytes της RAM και στους sfr. Οι διευθύνσεις από (00 7Fh) προσδιορίζουν το κάτω µισό της RAM, ενώ οι διευθύνσεις από (80h 0FFh) προσδιορίζουν τους sfr.

56 4. ΤΡΟΠΟΙ ΙΕΥΘΥΝΣΙΟ ΟΤΗΣΗΣ. ΕΝΤΟΛΕΣ ΜΕΤΑΦΟΡΑΣ Ε ΟΜΕΝΩΝ. Σελ.56 Μνήµη προγράµµατος Μνήµη δεδοµένων ΕΝΤΟΛΗ MOV A,12 E5 0C 0C A3 A A3 Ο κώδικας της εντολής MOV A,12 είναι: Σχήµα 4-2. Απευθείας διευθυνσιοδότηση Ε5h 0Ch Παράδειγµα: MOV A,12 σηµαίνει να τοποθετηθεί στον Α το περιεχόµενο της µνήµης µε διεύθυνση 12. Εντολές µεταφοράς δεδοµένων µε απευθείας διευθυνσιοδότηση Οι εντολές µεταφοράς δεδοµένων που δίνουν τη διεύθυνση του ενός δεδοµένου, είτε της προέλευσης είτε του προορισµού, είναι: MOV A,12 ;Βάλε στον Α το περιεχόµενο της θέσης µνήµης 12 MOV 12,A ;Βάλε στη µνήµη στη θέση 12 το περιεχόµενο του Α MOV R7,12 ;Βάλε στον R7 το περιεχόµενο της θέσης 12 MOV 12,R7 ;Βάλε στη θέση 12 το περιεχόµενο του καταχωρητή R7 XCH A,12 ;Αντάλλαξε το περιεχόµενο του Α µε αυτό της θέσης µνήµης 12 MOV 12,34 ;Βάλε στη µνήµη στη θέση 12 το περιεχόµενο της θέσης 34 PUSH 12 ;Βάλε στη στοίβα το περιεχόµενο της µνήµης µε διεύθυνση 12 POP 12 ;Βγάλε από τη στοίβα και γράψε στη µνήµη στη διεύθυνση ιευθυνσιοδότηση καταχωρητή (register addressing) Στα προηγούµενα παραδείγµατα χρησιµοποιήθηκε ως αποδέκτης της πληροφορίας ο συσσωρευτής (καταχωρητής Α). Ο 8051 διαθέτει πολλές εντολές, στις οποίες η προέλευση ή / και ο προορισµός των δεδοµένων είναι ένας από τους καταχωρητές Α και R0 µέχρι R7 της επιλεγµένης οµάδας καταχωρητών. Οι εντολές αυτές περιέχουν το όνοµα του καταχωρητή µέσα στον κωδικό λειτουργίας και είναι απλούστερες, δηλαδή δίνουν µικρότερο κώδικα και εκτελούνται ταχύτερα. Για παράδειγµα, η εντολή: MOV A,Rn όπου n=0 7 είναι εντολή του ενός byte και δίνει τον εξής κώδικα: όπου r r r r r r, η διεύθυνση του καταχωρητή R0 µέχρι R7 της ενεργής οµάδας καταχωρητών. Οι διευθύνσεις από 00 µέχρι 07 αναφέρονται στους καταχωρητές της οµάδας 0 R0 µέχρι R7 αντίστοιχα (βλέπε Σχήµα 3-6, σελ. 51). Οι διευθύνσεις από 08 µέχρι 1Fh αναφέρονται στους καταχωρητές των υπόλοιπων οµάδων. Παρά το γεγονός ότι οι διευθύνσεις αυτές οδηγούν στους καταχωρητές, προτιµάται η χρήση των ονοµάτων των καταχωρητών επειδή προκύπτουν µικρότερες εντολές. Πάντως, είτε µε εντολή απευθείας διευθυνσιοδότησης των 2 bytes είτε µε εντολή διευθυνσιοδότησης καταχωρητή του 1 byte, ο χρόνος προσπέλασης είναι ίδιος: 12 παλµοί ρολογιού. Η εργασία που εκτελεί η εντολή MOV A,0 είναι η ίδια µε την εργασία της εντολής MOV A,R0, µόνο αν είναι επιλεγµένη η οµάδα καταχωρητών 0. Μόνο µία από τις τέσσερις οµάδες καταχωρητών µπορεί να είναι ενεργή σε κάποια χρονική στιγµή. Τα bits RS1 και RS0 στον καταχωρητή των σηµαιών PSW προσδιορίζουν την ενεργή οµάδα. Στο reset αποκτούν τιµή 00 και, έτσι, επιλέγεται η πρώτη οµάδα καταχωρητών. Μπορείτε να επιλέξετε ως ενεργή κάποια από τις τέσσερις οµάδες (0 µέχρι 3), τροποποιώντας τα bits αυτά, µε τις εντολές SETB και CLR. Εντολές µεταφοράς δεδοµένων µε διευθυνσιοδότηση καταχωρητή Οι εντολές µεταφοράς δεδοµένων, στις οποίες και η προέλευση και ο προορισµός των δεδοµένων είναι καταχωρητές, είναι:

57 4. ΤΡΟΠΟΙ ΙΕΥΘΥΝΣΙΟ ΟΤΗΣΗΣ. ΕΝΤΟΛΕΣ ΜΕΤΑΦΟΡΑΣ Ε ΟΜΕΝΩΝ. Σελ.57 CLR A MOV A,R7 MOV R7,A XCH A,R7 ;Βάλε στον Α τη σταθερά 0 (µηδένισε το συσσωρευτή) ;Βάλε στον Α το περιεχόµενο του R7 ;Βάλε στον R7 το περιεχόµενο του Α ;Αντάλλαξε τα περιεχόµενα του Α και του R7 εν υπάρχει η διαταγή MOV Ri,Rj (βλέπε και Σχήµα 4-4) Έµµεση διευθυνσιοδότηση (indirect addressing) Με τον τρόπο αυτόν γίνεται προσπέλαση στη µνήµη, αλλά η διεύθυνσή της δε δίνεται από την εντολή. Η εντολή προσδιορίζει έναν καταχωρητή, που περιέχει τη διεύθυνση του δεδοµένου. Σχηµατική επεξήγηση δίδεται στο Σχήµα 4-3. Οι καταχωρητές που µπορούν να περιέχουν έναν αριθµό, τον οποίο οι εντολές αυτού του τύπου εκλαµβάνουν ως διεύθυνση, είναι οι R0 και R1 (καθώς και οι DPTR και A σε κάποιες ειδικές εντολές). Χαρακτηριστικό σύµβολο αυτού του τρόπου διευθυνσιοδότησης είναι Έτσι, η εντολή MOV σηµαίνει να φορτωθεί ο συσσωρευτής µε το περιεχόµενο της µνήµης, της οποίας η διεύθυνση περιέχεται στον καταχωρητή R0 της ενεργής οµάδας καταχωρητών. είκτης στην εντολή αυτή µπορεί να είναι ο R0 ή ο R1. ΕΝΤΟΛΗ Μνήµη προγράµµατος MOV E6 R0 0C Μνήµη δεδοµένων 0C A3 A A3 Σχήµα 4-3. Έµµεση διευθυνσιοδότηση Με την έµµεση διευθυνσιοδότηση, µπορεί να γίνει προσπέλαση και στα 256 bytes της εσωτερικής µνήµης RAM. Ενώ οι διευθύνσεις από 0 µέχρι 127 οδηγούν στο κάτω µισό της RAM, όπως και µε την απευθείας διευθυνσιοδότηση, οι διευθύνσεις από 128 µέχρι 255 οδηγούν στο πάνω µισό της RAM, σε αντίθεση µε την απευθείας προσπέλαση που οδηγεί στους sfr. Στις εντολές PUSH και POP, η διεύθυνση του δεδοµένου δίδεται µε απευθείας διευθυνσιοδότηση. Η διεύθυνση µνήµης, όµως, όπου θα γίνει προσπέλαση περιέχεται στο δείκτη της στοίβας SP. Άρα, στις εργασίες ανάγνωσης και εγγραφής στη στοίβα η προσπέλαση της µνήµης γίνεται µε έµµεση διευθυνσιοδότηση. Έτσι, το πάνω µισό της RAM µπορεί να χρησιµοποιηθεί ως χώρος για τη στοίβα. Περισσότερα γι αυτό αργότερα. Ο αριθµός που εκλαµβάνεται ως διεύθυνση λέγεται δείκτης ή διάνυσµα δεδοµένων (data pointer ή data vector). Εντολές µεταφοράς δεδοµένων µε έµµεση διευθυνσιοδότηση Οι εντολές µεταφοράς δεδοµένων που προσδιορίζουν έναν καταχωρητή, που περιέχει τη διεύθυνση του ενός δεδοµένου, είναι οι εξής. Στη θέση του καταχωρητή δείκτη R0 µπορεί να χρησιµοποιηθεί ο R1, αλλά όχι οι υπόλοιποι καταχωρητές R2... R7. MOV ;Βάλε στον Α το περιεχόµενο της µνήµης που δείχνει ο R0. ;Βάλε στη µνήµη που δείχνει ο R0 το περιεχόµενο του Α. ;Βάλε στη µνήµη που δείχνει ο R0 το περιεχόµενο της θέσης ;µνήµης 12. MOV ;Βάλε στη µνήµη µε δ/νση 12 το περιεχόµενο της µνήµης που ;δείχνει ο R0. XCH ;Αντάλλαξε το περιεχόµενο του Α και της µνήµης που δείχνει ο R0.

58 4. ΤΡΟΠΟΙ ΙΕΥΘΥΝΣΙΟ ΟΤΗΣΗΣ. ΕΝΤΟΛΕΣ ΜΕΤΑΦΟΡΑΣ Ε ΟΜΕΝΩΝ. Σελ.58 XCHD ;Αντάλλαξε τα nibbles χαµηλής τάξης (low nibbles) του Α και της ;µνήµης που δείχνει ο R0. Σηµείωση: nibble είναι το ένα από τα δύο µισά του ενός byte (π.χ. low nibble είναι τα bits 0, 1, 2 και 3). Εντολές µεταφοράς προς και από την εξωτερική µνήµη RAM Για να µπορεί να γίνει διάκριση µεταξύ εξωτερικής και εσωτερικής RAM, µια που οι διευθύνσεις είναι ίδιες, χρησιµοποιείται ιδιαίτερη εντολή, η MOVX. Μόνο έµµεση διευθυνσιοδότηση επιτρέπεται µε την MOVX. MOVX ;Βάλε στον Α το περιεχόµενο της εξωτερικής µνήµης που δείχνει ο ;R0 (το high byte της διεύθυνσης παραµένει αναλλοίωτο) MOVX ;Βάλε στον Α το περιεχόµενο της εξωτερικής µνήµης που δείχνει ο ;DPTR ;Βάλε στην εξ. µνήµη που δείχνει ο R0 το περιεχόµενο του Α (το ;high byte της διεύθυνσης παραµένει αναλλοίωτο) ;Βάλε στην εξ. µνήµη που δείχνει ο DPTR το περιεχόµενο του Α. Στη θέση του καταχωρητή δείκτη R0 µπορεί να χρησιµοποιηθεί και ο R1. Ο πιο συνηθισµένος τρόπος για να γράψουµε στην εξωτερική RAM, είναι να βάλουµε στον Α το επιθυµητό περιεχόµενο, στον DPTR τη διεύθυνση και να δώσουµε την εντολή MOVX: MOV A,#12 ;Βάλε τα δεδοµένα στον Α MOV DPTR,#0CC00h ;Βάλε τη διεύθυνση στον DPTR ;Γράψε στην εξωτερική µνήµη Εντολές ανάγνωσης δεδοµένων από τη µνήµη προγράµµατος Στη µνήµη ROM περιέχεται όχι µόνο ο κώδικας, αλλά και τα σταθερά δεδοµένα του προγράµµατος, όπως π.χ. το πλήθος των ηµερών κάθε µήνα του έτους. Για να διαβάσουµε δεδοµένα από τη ROM, πρέπει να χρησιµοποιήσουµε την εντολή MOVC. MOVC ;Βάλε στον Α από τη µνήµη προγράµµατος που δεί;χνει το άθροισµα του Α και του DPTR. MOVC ;Βάλε στον Α από τη µνήµη προγράµµατος που δεί;χνει το άθροισµα του Α και του PC ΕΝΤΟΛΕΣ ΜΕΤΑΦΟΡΑΣ Ε ΟΜΕΝΩΝ Παρά το γεγονός ότι οι εντολές αυτές αντιγράφουν δεδοµένα από µία θέση σε άλλη, έχει επικρατήσει ο όρος µεταφορά. Οι εντολές µεταφοράς δεδοµένων είναι οι MOV, MOVX, MOVC, XCH, PUSH και POP. Στο Σχήµα 4-4 φαίνεται το είδος της µεταφοράς που εκτελεί η κάθε µία από αυτές τις εντολές. Μελετήστε προσεκτικά το σχήµα αυτό.

59 4. ΤΡΟΠΟΙ ΙΕΥΘΥΝΣΙΟ ΟΤΗΣΗΣ. ΕΝΤΟΛΕΣ ΜΕΤΑΦΟΡΑΣ Ε ΟΜΕΝΩΝ. Σελ.59 Σχήµα 4-4. Οι εντολές µεταφοράς δεδοµένων του 8051 Οι εντολές µεταφοράς δεδοµένων δεν επηρεάζουν τις σηµαίες, εκτός, βέβαια, αν ο προορισµός είναι ο PSW. Για παράδειγµα, η εντολή MOV PSW,#0 µηδενίζει όλες τις σηµαίες. Οι εντολές µεταφοράς δεδοµένων έχουν ήδη περιγραφεί. Η κατάταξή τους έγινε µε βάση το βασικό τρόπο προσπέλασής τους. Οι περισσότερες από αυτές έχουν συνδυασµό από δύο τρόπους προσπέλασης, όπως η εντολή MOV µε προσπέλαση καταχωρητή - έµµεση. Να επιλυθούν οι επόµενες ασκήσεις, γράφοντας και δοκιµάζοντας κατάλληλα προγράµµατα. Άσκηση 4-1 (Κυκλική µετάθεση 3 αριθµών) Γράψτε ένα πρόγραµµα που να µεταθέτει κυκλικά και δεξιόστροφα τα περιεχόµενα των θέσεων d:30h, d:31h και d:32h (30h 31h, 31h 32h, 32h 30h). Λύση α Χρειάζεται µία προσωρινή θέση όπου θα γίνει η πρώτη µεταφορά h Α 31h 4 1) MOV A,30h 2) MOV 30h,32h 3) MOV 32h,31h 4) MOV 31h,A 32h 3 Λύση β XCH A,30h XCH A,31h XCH A,32h XCH A,30h

60 4. ΤΡΟΠΟΙ ΙΕΥΘΥΝΣΙΟ ΟΤΗΣΗΣ. ΕΝΤΟΛΕΣ ΜΕΤΑΦΟΡΑΣ Ε ΟΜΕΝΩΝ. Σελ.60 Άσκηση 4-2 (Μετακίνηση µπλοκ µνήµης) Γράψτε ένα πρόγραµµα που να µεταθέτει τα περιεχόµενα των θέσεων µνήµης d:30h, d:31h και d:32h κατά µία θέση προς τα πάνω, στις θέσεις δηλαδή d:31h, d:32h και d:33h αντίστοιχα. Λύση α Επειδή η µεταφορά γίνεται προς τα πάνω, θα πρέπει να ξεκινήσουν οι µεταφορές από τις µεγάλες διευθύνσεις. ιαφορετικά, θα προκληθεί επικάλυψη και απώλεια δεδοµένων. Λύση β MOV A,30h XCH A,31h XCH A,32h XCH A,33h MOV 33h,32h MOV 32h,31h MOV 31h,30h Άσκηση 4-3 (Αντιµετάθεση δύο αριθµών µε έµµεση προσπέλαση) Γράψτε ένα πρόγραµµα που να αντιµεταθέτει το περιεχόµενο της θέσης µνήµης µε διεύθυνση που περιέχεται στη θέση µνήµης d:30h, µε το περιεχόµενο της θέσης µε διεύθυνση που περιέχεται στη θέση µνήµης d:31h. Για παράδειγµα: 7A F BC D 7A 7E 7B Σχήµα 4-5. Αντιµετάθεση δύο έµµεσων αριθµών Λύση α MOV R0,30h ;Ο R0 αποκτά περιεχόµενο 7Αh (ο 1ος δείκτης) MOV R1,31h ;Ο R1 αποκτά περιεχόµενο 78h (ο 2ος δείκτης) MOV ;Ο Α αποκτά περιεχόµενο 6Dh MOV R2,A ;Προσωρινή θέση φύλαξης του ενός δεδοµένου MOV ;Ο Α αποκτά περιεχόµενο 11h ;Η θέση 7Αh αποκτά περιεχόµενο 11h MOV A,R2 ;Ο Α αποκτά περιεχόµενο 6Dh ;Η θέση 78h αποκτά περιεχόµενο 6Dh Λύση β MOV R0,30h MOV R1,31h XCH XCH XCH Άσκηση 4-4 (Αντιγραφή αριθµού µε έµµεση προσπέλαση) Γράψτε ένα πρόγραµµα που να αντιγράφει το περιεχόµενο της θέσης µνήµης µε διεύθυνση, αυτήν που περιέχεται στον καταχωρητή R2, στη θέση µνήµης d:30h.

61 4. ΤΡΟΠΟΙ ΙΕΥΘΥΝΣΙΟ ΟΤΗΣΗΣ. ΕΝΤΟΛΕΣ ΜΕΤΑΦΟΡΑΣ Ε ΟΜΕΝΩΝ. Σελ.61 Λύση Επειδή ο R2 δεν µπορεί να χρησιµοποιηθεί ως δείκτης µνήµης, πρέπει το περιεχόµενό του να αντιγραφεί είτε στον R0 είτε στον R1. Εάν π.χ. τα περιεχόµενα της µνήµης είναι αυτά που φαίνονται στο Σχήµα 4-6, πρέπει να γίνει η µεταφορά του δεδοµένου 11h. R0 78 0E A2 31 F BC D 7A 7E 7B Σχήµα 4-6. Έµµεση διευθυνσιοδότηση µε δείκτη το R0 MOV R0,R2 MOV Οι εντολές µεταφοράς δεδοµένων είναι οι εξής: DATA TRANSFER ΜΕΤΑΦΟΡΑ Ε ΟΜΕΝΩΝ MNEMONIC Περιγραφή Bytes Clock CLR A MOV A,Rn 3 MOV A,direct MOV MOV A,#data MOV Rn,A MOV Rn,direct MOV Rn,#data MOV direct,a MOV direct,rn MOV direct,direct MOV MOV direct,#data Clear Accumulator Μηδένισε τον συσσωρευτή Move register to Accumulator Μετάφερε τον καταχωρητή στο συσσωρευτή Move direct byte to Accumulator Μετάφερε το απευθείας byte στο συσσωρευτή Move indirect RAM to Accumulator Μετάφερε την έµµεση RAM στο συσσωρευτή Move immediate data to Accumulator Μετάφερε το άµεσο δεδοµένο στον συσσωρευτή Move Accumulator to register Μετάφερε το συσσωρευτή στον καταχωρητή Move direct byte to register Μετάφερε το άµεσο byte στον καταχωρητή Move immediate data to register Μετάφερε το άµεσο δεδοµένο στον καταχωρητή Move Accumulator to direct byte Μετάφερε το συσσωρευτή στο άµεσο byte Move register to direct byte Μετάφερε τον καταχωρητή στο άµεσο byte Move direct byte to direct Μετάφερε το άµεσο byte στο άµεσο byte Move indirect RAM to direct byte Μετάφερε την έµµεση RAM στο άµεσο byte Move immediate data to direct byte Μετάφερε το άµεσο δεδοµένο στο άµεσο byte Move Accumulator to indirect RAM Μετάφερε το συσσωρευτή στην έµµεση RAM Move direct byte to indirect RAM Μετάφερε το άµεσο byte στην έµµεση RAM Move immediate data to indirect RAM Μετάφερε το άµεσο δεδοµένο στην έµµεση RAM Rn = R0... R7, Ri = R0 ή R1

62 4. ΤΡΟΠΟΙ ΙΕΥΘΥΝΣΙΟ ΟΤΗΣΗΣ. ΕΝΤΟΛΕΣ ΜΕΤΑΦΟΡΑΣ Ε ΟΜΕΝΩΝ. Σελ.62 MOV DPTR,#data16 MOVC MOVC MOVX MOVX XCH A,Rn XCH A,direct XCH XCHD Load Data Pointer with a 16-bit constant Φόρτωσε τον δείκτη δεδ. µε τη σταθ. των 16 bits Move Code byte relative to DPTR to A Μετάφερε το byte του κώδικα (DPTR) στον Α Move Code byte relative to PC to A Μετάφερε το byte του κώδικα (PC) στον Α Move external RAM (8-bit addr) to A Μετάφερε από την εξ.ram (δ/νση 8 bits) στον Α Move external RAM (16-bit addr) to A Μετάφερε από την εξ.ram (δ/νση 16 bits) στον Α Move A to external RAM (8-bit addr) Μετάφερε τον Α στην εξωτ.ram (δ/νση 8 bits) Move A to external RAM (16-bit addr) Μετάφερε τον Α στην εξωτ. RAM (δ/νση 16 bits) Exchange register with Accumulator Αντάλλαξε τον καταχωρητή µε το συσσωρευτή Exchange direct byte with Accumulator Αντάλλαξε το απευθείας byte µε το συσσωρευτή Exchange indirect RAM with Accumulator Αντάλλαξε την έµµεση RAM µε το συσσωρευτή Exchange low-order digit indirect RAM with A Αντάλλαξε τα low nibble της έµµεσης RAM και Α Προβλήµατα 1. Γράψτε ένα πρόγραµµα που να µεταθέτει κυκλικά και αριστερόστροφα τα περιεχόµενα των θέσεων της απευθείας µνήµης 30h, 31h και 32h (30h 31h, 31h 32h, 32h 30h). 2. Γράψτε ένα πρόγραµµα που να αντιµεταθέτει (swap) τα περιεχόµενα των θέσεων µνήµης d:30h και d:31h. Στο τέλος, ο συσσωρευτής θα πρέπει να έχει το αρχικό του περιεχόµενο. 3. Γράψτε ένα πρόγραµµα που να αντιµεταθέτει το περιεχόµενο της θέσης µνήµης i:90h µε το περιεχόµενο της εξωτερικής µνήµης µε διεύθυνση x:2000h. Στο τέλος ο συσσωρευτής θα πρέπει να έχει το αρχικό του περιεχόµενο. Όλες οι θέσεις µνήµης και όλοι οι καταχωρητές που δεν προσδιορίζονται στην άσκηση θεωρούνται ελεύθεροι. 4. Γράψτε ένα πρόγραµµα που να µεταθέτει τα περιεχόµενα των θέσεων µνήµης d:30h, d:31h και d:32h κατά µία θέση προς τα κάτω, στις θέσεις δηλαδή d:2fh, d:30h και d:31h αντίστοιχα. 5. Γράψτε ένα πρόγραµµα που να αντιµεταθέτει το περιεχόµενο της θέσης µνήµης µε διεύθυνση που περιέχεται στη θέση µνήµης i:90h, µε το περιεχόµενο της θέσης µε διεύθυνση που περιέχεται στη θέση µνήµης i:91h.

63 5. ΑΡΙΘΜΗΤΙΚΕΣ ΠΡΑΞΕΙΣ Ο 8051 είναι εφοδιασµένος µε τα απαραίτητα κυκλώµατα, για την εκτέλεση πρόσθεσης και αφαίρεσης αριθµών του ενός byte, απροσήµαστων (unsigned char) ή προσηµασµένων (signed char). Επίσης µπορεί και εκτελεί πολλαπλασιασµό και διαίρεση σε απροσήµαστους αριθµούς του 1 byte. Και οι τέσσερις αυτές πράξεις µπορούν να εκτελεστούν µόνο στον Α. Η διαδικασία είναι η εξής. - Ο πρώτος αριθµός τοποθετείται στο συσσωρευτή Α. - Εκτελείται η πράξη µεταξύ του Α και µιας θέσης µνήµης ή ενός καταχωρητή. Το αποτέλεσµα µένει στον Α. - Γράφεται το περιεχόµενο του Α στη θέση, όπου πρέπει να φυλαχτεί το αποτέλεσµα. Ο πολλαπλασιασµός και η διαίρεση εκτελούνται µόνο µεταξύ του συσσωρευτή Α και του καταχωρητή Β. Ο 8051 µπορεί: Να προσθέτει και να αφαιρεί αριθµούς καθαρά δυαδικούς. Να προσθέτει και να αφαιρεί αριθµούς κωδικοποιηµένους στο συµπλήρωµα ως προς 2. Να προσθέτει αριθµούς του κώδικα BCD. Να πολλαπλασιάζει και να διαιρεί καθαρά δυαδικούς αριθµούς. Κάθε µία από τις πράξεις που προαναφέρθηκαν εκτελείται µε µία µόνο εντολή του Εννοείται, βέβαια, ότι µε συγγραφή του κατάλληλου προγράµµατος µπορεί να γίνει οποιαδήποτε πράξη σε οτιδήποτε αριθµούς. Οι εντολές για την πρόσθεση είναι οι ADD και ADDC, για την αφαίρεση η SUBB, για τον πολλαπλασιασµό η MUL και για τη διαίρεση η DIV. Σχετικές µε την εκτέλεση των πράξεων είναι και οι εντολές CLR C και SETB C που κάνουν τη σηµαία του κρατούµενου αντίστοιχα 0 ή 1. Τέλος οι εντολές INC για αύξηση κατά 1, DEC για µείωση κατά 1 και η DA A για δεκαδική ρύθµιση του συσσωρευτή, µετά από πρόσθεση ΠΡΟΣΘΕΣΗ ΑΡΙΘΜΩΝ ΤΟΥ 1 BYTE Η πρόσθεση γίνεται µεταξύ του συσσωρευτή και µιας των εξής τριών προελεύσεων. - µιας σταθεράς (ADD A,#12) - του περιεχόµενου ενός καταχωρητή οµάδος (ADD A,R7) - του περιεχόµενου µιας θέσης µνήµης µε απευθείας ή έµµεση διευθυνσιοδότηση (ADD A,12 ή ADD Στη συνέχεια φαίνεται ο µηχανισµός της πρόσθεσης µε το χέρι, σε τέσσερις πράξεις πρόσθεσης. Στην πρώτη σειρά φαίνονται τα κρατούµενα από την πρόσθεση των ψηφίων Κάνοντας τις πράξεις µε το χέρι, λέµε ότι οι δύο πρώτες πράξεις δε βγάζουν κρατούµενο. Η τρίτη και η τέταρτη πράξη βγάζουν τελικό κρατούµενο, που είναι το ένατο bit του αποτελέσµατος. Κάνοντας τις πράξεις σε µία CPU των 8 bits, λέµε ότι το αποτέλεσµα των δύο πρώτων πράξεων χωρά στα 8 bits, ενώ δε χωρά στον Α το αποτέλεσµα της τρίτης και τέταρτης πράξης. Το κρατούµενο φυλάγεται σε ένα F/F, εφόσον δε χωρά στον οκτάµπιτο διάδροµο δεδοµένων. Το F/F αυτό λέγεται σηµαία κρατούµενου (Carry flag) και έχει πάντοτε τιµή, είτε 0 είτε 1. Η σηµαία του κρατούµενου βρίσκεται, µαζί µε άλλες σηµαίες που θα συζητηθούν αργότερα, σε ειδικό καταχωρητή που λέγεται καταχωρητής σηµαιών ή καταχωρητής κατάστασης PSW (Processor Status Word). Τη σηµασία και τη θέση των bits του καταχωρητή αυτού εµφανίζει ο Πίνακας 7-1 στη σελ. 85. Οι δύο πρώτες πράξεις δίνουν κρατούµενο 0, ενώ οι δύο τελευταίες δίνουν κρατούµενο 1. Εφόσον, τώρα, το αποτέλεσµα των 9 bits δε χωρά στον Α, λέµε ότι το αποτέλεσµα είναι λάθος. Ένδειξη ότι συνέβη λάθος είναι η σηµαία του κρατούµενου. Όταν είναι 0, το αποτέλεσµα είναι σωστό. Όταν είναι 1, το αποτέλεσµα χρειάζεται εννέα bits για να παρασταθεί. Η σηµαία του κρατούµενου ενηµερώνεται σε κάθε πρόσθεση, χάνοντας το παλιό της περιεχόµενο. Μπορεί και ο χρήστης να τροποποιεί τη σηµαία αυτή µε τις εντολές SETB C, για να την κάνει 1, και CLR C, για να την κάνει 0. Θα δούµε πιο κάτω ότι αυτό χρειάζεται στην αφαίρεση. Εάν, τώρα, ερµηνευθούν οι αριθµοί των προηγούµενων παραδειγµάτων πρόσθεσης ως προσηµασµένοι (κωδικοποιηµένοι στο συµπλήρωµα ως προς 2), θα ερµηνευθούν τα αποτελέσµατα διαφορετικά. Θυµόσαστε, ίσως, ότι το επί πλέον ψηφίο (η σηµαία του κρατούµενου) δε σηµαίνει τίποτε, αν οι αριθµοί είναι προσηµασµένοι. Αντίθετα, κριτήριο για την ορθότητα ή όχι του αποτελέσµατος είναι η αλλαγή προσήµου: αν δε συνέβη

64 5. ΑΡΙΘΜΗΤΙΚΕΣ ΠΡΑΞΕΙΣ Σελ.64 αλλαγή προσήµου, το αποτέλεσµα της πρόσθεσης των προσηµασµένων αριθµών είναι σωστό, ενώ, αν συνέβη, είναι λάθος. Έτσι, σωστές στα προηγούµενα παραδείγµατα είναι η 1 η και η 4 η πράξη, λάθος η 2 η και η 3 η. Για τον έλεγχο της ορθότητας του αποτελέσµατος, οι επεξεργαστές διαθέτουν µία επιπλέον σηµαία, τη σηµαία υπερχείλισης (Overflow flag, PSW.2), που ενηµερώνεται σε κάθε πρόσθεση. Αν OV=0, τότε το αποτέλεσµα της πρόσθεσης των προσηµασµένων αριθµών είναι σωστό, ενώ, αν OV=1, το αποτέλεσµα χρειάζεται 9 bits για να παρασταθεί. Η σηµαία της υπερχείλισης υπολογίζεται από το XOR µεταξύ του τελικού κρατούµενου, που προκύπτει από την πρόσθεση των high bits (bit no.7) και του αµέσως προηγούµενου κρατούµενου, που προκύπτει από την πρόσθεση των bits no (OV=0, αποτέλεσµα σωστό) Κρατούµενα Οι απροσήµαστοι αριθµοί που µπορούν να παρασταθούν σε 8 bits είναι από , ενώ οι προσηµασµένοι από Προσοχή: Και στις δύο περιπτώσεις, και στην πρόσθεση, δηλαδή, των απροσήµαστων και στην πρόσθεση των προσηµασµένων αριθµών, όταν το αποτέλεσµα δε χωρά να παρασταθεί σε 8 bits, λέµε ότι έχουµε υπερχείλιση. Μόνο που η υπερχείλιση των απροσήµαστων αριθµών ανιχνεύεται από τη σηµαία του κρατούµενου, ενώ η υπερχείλιση των προσηµασµένων ανιχνεύεται από τη σηµαία της υπερχείλισης. Με άλλα λόγια: Tη σηµαία του κρατούµενου C την ελέγχουµε, για να δούµε αν έχουµε υπερχείλιση στους απροσήµαστους αριθµούς, ενώ τη σηµαία της υπερχείλισης OV την ελέγχουµε, για να δούµε αν έχουµε υπερχείλιση στους προσηµασµένους αριθµούς. Οι σηµαίες του κρατούµενου και της υπερχείλισης είναι η µόνη διαφορά στο χειρισµό προσηµασµένων και απροσήµαστων αριθµών. Για το λόγο αυτό, εξάλλου, υιοθετήθηκε το συµπλήρωµα ως προς 2: τα ίδια κυκλώµατα που χειρίζονται τους απροσήµαστους αριθµούς µπορούν και χειρίζονται και τους προσηµασµένους. Σε κάθε πράξη η CPU ενηµερώνει και τις δύο σηµαίες, και τη σηµαία του κρατούµενου και τη σηµαία της υπερχείλισης, διαγράφοντας το παλιό τους περιεχόµενο. εν ενδιαφέρουν, όµως, ποτέ και οι δύο σηµαίες ταυτόχρονα. Οι αριθµοί είναι είτε απροσήµαστοι, οπότε ελέγχεται η σηµαία του κρατούµενου, είτε προσηµασµένοι, οπότε ελέγχεται η σηµαία της υπερχείλισης 4. Στο Σχήµα 5-1 φαίνεται ο τρόπος που ενηµερώνονται οι σηµαίες C και OV κατά την αύξηση και µείωση απροσήµαστων και προσηµασµένων αριθµών. εν έχει νόηµα όµως, να ελέγχετε τη σηµαία της υπερχείλισης OV στην πρόσθεση ετερόσηµων ή στην αφαίρεση οµόσηµων αριθµών. Το αποτέλεσµα είναι πάντοτε σωστό. Σχήµα 5-1. Ο κύκλος των σηµαιών C και OV 4 Στο βιβλίο αυτό ως απροσήµαστοι αναφέρονται οι αριθµοί του καθαρά δυαδικού κώδικα και προσηµασµένοι, οι αριθµοί του κώδικα συµπληρώµατος ως προς 2.

65 5. ΑΡΙΘΜΗΤΙΚΕΣ ΠΡΑΞΕΙΣ Σελ.65 Η µετάβαση από 00 σε FF και αντίστροφα έχει το νόηµα της υπερχείλισης στους απροσήµαστους αριθµούς, οπότε C=1. Η µετάβαση από 7F σε 80 και αντίστροφα έχει το νόηµα της υπερχείλισης (αλλαγή πρόσηµου) στους προσηµασµένους αριθµούς. Η µετάβαση από το σηµείο αυτό, είτε στην αύξηση είτε στην µείωση, δίνει OV=1. Σε αριθµούς µε πολλά bytes, οι σηµαίες ελέγχονται µόνο στο high byte. Η µείωση ενός απροσήµαστου αριθµού κάτω από το 0 ή ενός προσηµασµένου κάτω από 128, δηλαδή η αριστερόστροφη υπέρβαση των ορίων στον κύκλο των σηµαιών, λέγεται πολλές φορές αρνητική υπερχείλιση (negative overflow) ή υπο-χείλιση (underflow). Για να εκτελέσει η CPU µία πρόσθεση, όπως ήδη αναφέρθηκε, πρέπει να χρησιµοποιηθεί ο συσσωρευτής. εν υπάρχει δηλαδή η εντολή: πρόσθεσε τον αριθµό α µε τον αριθµό β και φύλαξε το αποτέλεσµα στη θέση µνήµης γ. Για το λόγο αυτό πρέπει να γίνει πρόγραµµα µε το οποίο θα µεταφέρεται ο πρώτος αριθµός στον Α, θα προστίθεται εκεί ο δεύτερος αριθµός και τέλος, θα µεταφέρεται το αποτέλεσµα από τον Α στην επιθυµητή θέση µνήµης ΠΡΟΣΘΕΣΗ ΑΡΙΘΜΩΝ 2 Ή ΠΕΡΙΣΣΟΤΕΡΩΝ BYTES Σε 2 bytes µπορούν να παρασταθούν οι απροσήµαστοι αριθµοί από 0 µέχρι (unsigned int) και οι προσηµασµένοι από µέχρι (signed int). Οι αριθµοί αυτοί φυλάγονται στη µνήµη, µε το byte υψηλής τάξης στη χαµηλή διεύθυνση και το byte χαµηλής τάξης στην αµέσως µεγαλύτερη. Για να βρείτε τα bytes χαµηλής και υψηλής τάξης ενός αριθµού, µετατρέψτε τον στο δεκαεξαδικό ή στο δυαδικό σύστηµα και πάρτε το αριστερό µισό για high byte και το δεξί µισό για low. Από το δεκαδικό σύστηµα µπορείτε να διαιρέσετε δια 256 και να πάρετε το πηλίκο ως high byte και το υπόλοιπο ως low. Οι περισσότεροι συµβολοµεταφραστές έχουν ειδική οδηγία (assembler directive), για να δίνουν έτοιµα, το high και low byte, π.χ. high(label) και low(1000). Οι αριθµοί των 2 bytes πρέπει να προστεθούν σε δύο «δόσεις», µια και ο 8051 δεν µπορεί να χειριστεί αριθµούς των 16 bits. Στην αρχή προστίθενται τα bytes χαµηλής τάξης των δύο αριθµών και µετά τα bytes υψηλής τάξης. Στη δεύτερη αυτή πρόσθεση πρέπει να προστεθούν, όχι µόνο τα bytes υψηλής τάξης, αλλά και το κρατούµενο από την πρώτη πρόσθεση των bytes χαµηλής τάξης. Για την περίπτωση αυτή, ο 8051 διαθέτει ξεχωριστή εντολή, την ADDC. Η εντολή αυτή προσθέτει τρεις αριθµούς: - το περιεχόµενο του Α - το περιεχόµενο της προσδιοριζόµενης από την εντολή θέσης και - το κρατούµενο Για την πρόσθεση, λοιπόν, των low bytes χρησιµοποιείται η εντολή ADD, ενώ για την πρόσθεση των high bytes η ADDC. 9A BC MOV A,#0BCh ADD A,#78h ;Πρόσθεση (δίνει κρατούµενο) MOV R1,A R0 R1 MOV A,#9Ah ADDC A,#56h ;Πρόσθεση µε κρατούµενο (δί- MOV R0,A ;νει κρατούµενο) Πρόγραµµα 5-1. Πρόγραµµα πρόσθεσης δύο 16µπιτων αριθµών σε 16µπιτο αποτέλεσµα Εάν έχετε αριθµούς πάνω από 2 bytes, δηλαδή απροσήµαστους µεγαλύτερους από ή προσηµασµένους έξω από την περιοχή , τους προσθέτετε µε τον ίδιο τρόπο, δηλ. µε ADD τα bytes χαµηλής τάξης και ADDC τα bytes υψηλότερων τάξεων. Άσκηση 5-1 (Πρόσθεση δύο 24µπιτων αριθµών) Γράψτε ένα πρόγραµµα που να προσθέτει στον αριθµό των 24 bits, που περιέχεται στη µνήµη στις θέσεις d:30h (high byte), d:31h (medium byte) και d:32h (low byte), τη σταθερά Τρέξτε µερικές φορές το πρόγραµµα και καταγράψτε και ερµηνεύστε τις σηµαίες κρατούµενου και υπερχείλισης. Λύση Αν µετατρέψετε στο δεκαεξαδικό σύστηµα, µε τη βοήθεια του Calculator (Start Programs Accessories Calculator) τη σταθερά , βρίσκετε ότι γράφεται σε 3 bytes σαν 4C4B40h. Πρέπει, εποµένως, να γίνει η εξής πρόσθεση.

66 5. ΑΡΙΘΜΗΤΙΚΕΣ ΠΡΑΞΕΙΣ Σελ.66 d:30h d:31h d:32h + 4Ch 4Bh 40h d:30h d:31h d:32h MOV A,32h ADD A,#40h MOV 32h,A MOV A,31h ADDC A,#4Bh MOV 31h,A MOV A,30h ADDC A,#4Ch MOV 30h,A ;Προστίθενται τα bytes χαµηλής τάξης ;Προστίθενται τα bytes µεσαίας τάξης και το ;τυχόν κρατούµενο από την πρόσθεση των ;bytes χαµηλής τάξης ;Προστίθενται τα bytes υψηλής τάξης και το ;τυχόν κρατούµενο από την πρόσθεση των ;bytes µεσαίας τάξης Εφόσον δεν προσδιορίζεται στην άσκηση, αγνοούµε το επιπλέον κρατούµενο που µπορεί να προκύψει από την τελευταία πρόσθεση, των high bytes. Τρέχοντας το πρόγραµµα και ερµηνεύοντας τους αριθµούς ως απροσήµαστους (δηλαδή καθαρά δυαδικούς) και ως προσηµασµένους (δηλαδή κωδικοποιηµένους στο συµπλήρωµα ως προς 2), παίρνετε τις εξής τιµές για το άθροισµα, το κρατούµενο και την υπερχείλιση. Επανάληψη HEX Άθροισµα Απροσήµαστος C Άθροισµα Προσηµασµένος OV C 4B E4 E1 C D D C9 C E C A Σηµειώστε ότι, ο µεγαλύτερος απροσήµαστος αριθµός που µπορεί να παρασταθεί σε 3 bytes είναι ο FFFFFFh = , ο µικρότερος αρνητικός αριθµός που µπορεί να παρασταθεί είναι ο h = και ο µεγαλύτερος θετικός είναι ο 7FFFFFh = Άσκηση 5-2 (Πρόσθεση 4 αριθµών των 8 bits) Γράψτε ένα πρόγραµµα που να προσθέτει τους 4 αριθµούς των 8 bits, που περιέχονται στη µνήµη στις θέσεις d:30h και µετά. Το αποτέλεσµα να µένει στον Α. Να γίνει δηλαδή η εξής πρόσθεση. d:30h d:31h d:32h + d:33h A Λύση Στην προηγούµενη άσκηση χρησιµοποιήθηκε η ADDC, επειδή συνεχιζόταν η πρόσθεση των δύο αριθµών, σε bytes υψηλότερων τάξεων. Τώρα, γίνεται πρόσθεση διαφορετικών αριθµών, άρα όλες οι προσθέσεις πρέπει να είναι χωρίς κρατούµενο. MOV A,30h ADD A,31h ADD A,32h ADD A,33h

67 5. ΑΡΙΘΜΗΤΙΚΕΣ ΠΡΑΞΕΙΣ Σελ.67 Άσκηση 5-3 (Πρόσθεση 4 αριθµών των 16 bits) Γράψτε ένα πρόγραµµα που να προσθέτει τους 4 αριθµούς των 16 bits, που περιέχονται στη µνήµη στις θέσεις 30h και µετά. Το αποτέλεσµα να φυλάγεται στις θέσεις µνήµης 38h και 39h. Να γίνει, δηλαδή, η εξής πρόσθεση. d:30h 31h d:32h 33h d:34h 35h + d:36h 37h d:38h 39h Λύση Κάντε τρεις 16µπιτες προσθέσεις. Η άσκηση δεν προσδιορίζει την τύχη των κρατούµενων και, έτσι, αυτά αγνοούνται. ;Πρόσθεση των 2 πρώτων αριθµών ; MOV A,31h ADD A,33h MOV 39h,A MOV A,30h ADDC A,32h ; Ένα κρατούµενο χάνεται MOV 38h,A ;Πρόσθεση του τρίτου αριθµού ; MOV A,35h ADD A,39h MOV 39h,A MOV A,34h ADDC A,38h ; Ένα κρατούµενο χάνεται MOV 38h,A ;Πρόσθεση του τέταρτου αριθµού ; MOV A,37h ADD A,39h MOV 39h,A MOV A,36h ADDC A,38h ; Ένα κρατούµενο χάνεται MOV 38h,A 5.3. ΑΦΑΙΡΕΣΗ Για την αφαίρεση χρησιµοποιείται η εντολή SUBB. ιαβάζεται SUBtract with Borrow, δηλαδή αφαίρεσε µε δανειζόµενο. Η ίδια σηµαία C, που χρησιµοποιείται ως κρατούµενο στην πρόσθεση, χρησιµοποιείται ως δανειζόµενο στην αφαίρεση. Ενώ για την πρόσθεση διατίθενται δύο εντολές, ADD και ADDC, για την αφαίρεση ο 8051 έχει µόνο µία. Του λείπει η εντολή SUB, αντί αυτής, όµως, µπορεί να χρησιµοποιηθεί ο συνδυασµός εντολών: CLR C SUBB A,MEM ;Αφαιρεί από τον Α το περιεχόµενο της MEM Με την πρώτη εντολή µηδενίζεται το δανειζόµενο, ενώ µε τη δεύτερη γίνεται η αφαίρεση µε δανειζόµενο. Έτσι, όταν γίνεται αφαίρεση αριθµών των 2 ή περισσότερων bytes, γράφεται στην αρχή η εντολή CLR C και µετά γίνονται όλες οι αφαιρέσεις µε SUBB. Κατά τα άλλα, ισχύουν όλα όσα αναφέρθηκαν στην πρόσθεση.

68 5. ΑΡΙΘΜΗΤΙΚΕΣ ΠΡΑΞΕΙΣ Σελ.68 Άσκηση 5-4 (Αφαίρεση 24µπιτων αριθµών) Γράψτε ένα πρόγραµµα, που να αφαιρεί από τον αριθµό των 24 bits, που περιέχεται στη µνήµη στις θέσεις d:30h (high byte), d:31h (medium byte) και d:32h (low byte), τη σταθερά Τρέξτε µερικές φορές το πρόγραµµα και καταγράψτε και ερµηνεύστε τις σηµαίες κρατούµενου και υπερχείλισης. Λύση Η σταθερά , όπως και στην προηγούµενη άσκηση, γράφεται: 4C4B40h. Πρέπει, εποµένως, να γίνει η εξής αφαίρεση. d:30h d:31h d:32h - 4Ch 4Bh 40h d:30h d:31h d:32h MOV A,32h CLR C SUBB A,#40h MOV 32h,A MOV A,31h SUBB A,#4Bh MOV 31h,A MOV A,30h SUBB A,#4Ch MOV 30h,A ;Αφαιρούνται τα bytes χαµηλής τάξης ;Αφαιρούνται τα bytes µεσαίας τάξης και το ;τυχόν δανειζόµενο από την αφαίρεση των ;bytes χαµηλής τάξης ;Αφαιρούνται τα bytes υψηλής τάξης και το ;τυχόν δανειζόµενο από την αφαίρεση των ;bytes µεσαίας τάξης Επανάληψη HEX Αποτέλεσµα Απροσήµαστος C Αποτέλεσµα Προσηµασµένος OV B3 B4 C B 1E CE D C C E9 F D A ΠΟΛΛΑΠΛΑΣΙΑΣΜΟΣ ΚΑΙ ΙΑΙΡΕΣΗ Στον πολλαπλασιασµό και τη διαίρεση, οι καταχωρητές Α και Β κρατούν τους δύο αρχικούς αριθµούς, αλλά και το αποτέλεσµα. Στον πολλαπλασιασµό, ο Α κρατά το low και ο Β το high byte του αποτελέσµατος. Στη διαίρεση, ο Α κρατά το πηλίκο και ο Β το υπόλοιπο. Οι εντολές είναι MUL AB, για τον πολλαπλασιασµό, και DIV AB, για τη διαίρεση. εν υπάρχει άλλος τρόπος διευθυνσιοδότησης. Και ο πολλαπλασιασµός και η διαίρεση είναι πράξεις µεταξύ απροσήµαστων αριθµών. Εάν το γινόµενο στον πολλαπλασιασµό µε τη MUL είναι µεγαλύτερο από 255, η σηµαία υπερχείλισης γίνεται 1. Εάν καλέσετε τη DIV µε Β=0 (διαίρεση µε το 0), τότε τα περιεχόµενα των Α και Β είναι τυχαία και η σηµαία υπερχείλισης γίνεται 1. Μετά τον πολλαπλασιασµό και τη διαίρεση, η σηµαία του κρατούµενου µηδενίζεται πάντοτε. Άσκηση 5-5 (Πολλαπλασιασµός και διαίρεση 8µπιτων απροσήµαστων) Γράψτε ένα πρόγραµµα που να πολλαπλασιάζει και να διαιρεί τους αριθµούς 100 και 15. Τρέξτε το πρόγραµµα σε πλήρη ταχύτητα (χωρίς step into) και επαληθεύστε τα αποτελέσµατά του.

69 5. ΑΡΙΘΜΗΤΙΚΕΣ ΠΡΑΞΕΙΣ Σελ.69 Λύση Αφού το πρόγραµµα θα είναι ένα, πρέπει να φυλαχτεί το αποτέλεσµα του πολλαπλασιασµού των καταχωρητών Α και Β, ώστε αυτοί να χρησιµοποιηθούν στη διαίρεση. Η φύλαξη του αποτελέσµατος της διαίρεσης δεν είναι υποχρεωτική. MOV A,#100 MOV B,#15 MUL AB MOV 30h,B MOV 31h,A MOV A,#100 MOV B,#15 DIV AB MOV 32h,A MOV 33h,B ;High byte του γινοµένου ;Low byte του γινοµένου ;Πηλίκο ;Υπόλοιπο Προσοχή: µην µπερδεύετε την εµφάνιση ενός αριθµού της µνήµης του µικροελεγκτή µε την ερµηνεία του. Για παράδειγµα: Εµφάνιση υαδική: εκαδική: 146 ή 110 εκαεξαδική: 92 Απροσήµαστος: 146 Κώδικας BCD: 92 Ερµηνεία Προσηµασµένος: -110 Κώδικας ASCII: Τ Οι εντολές αριθµητικής που περιγράφηκαν στο κεφάλαιο αυτό είναι οι εξής. ARITHMETIC OPERATIONS ΑΡΙΘΜΗΤΙΚΕΣ ΠΡΑΞΕΙΣ MNEMONIC Περιγραφή Bytes Clock ADD A,Rn ADD A,direct ADD ADD A,#data ADDC A,Rn ADDC A,direct ADDC ADDC A,#data DA A DEC A DEC Rn DEC direct Add register to Accumulator Πρόσθεσε τον καταχωρητή στο συσσωρευτή Add direct byte to Accumulator Πρόσθεσε το απευθείας byte στο συσσωρευτή Add indirect RAM to Accumulator Πρόσθεσε την έµµεση RAM στο συσσωρευτή Add immediate data to Accumulator Πρόσθεσε το άµεσο δεδοµένο στο συσσωρευτή Add register to Accumulator with carry Πρόσθεσε µε κρατούµενο τον καταχωρητή στον Α Add direct byte to Accumulator with carry Πρόσθεσε µε κρατούµενο το απευθείας byte στον Α Add indirect RAM to Accumulator with carry Πρόσθεσε µε κρατούµενο την έµµεση RAM στον Α Add immediate data to A with carry Πρόσθεσε το άµεσο δεδοµένο στον Α µε κρατούµενο Decimal Adjust after Addition εκαδική ρύθµιση µετά από πρόσθεση Decrement Accumulator Μείωσε τον συσσωρευτή Decrement Register Μείωσε τον καταχωρητή Decrement direct byte Μείωσε το απευθείας byte Decrement indirect RAM Μείωσε την έµµεση RAM

70 5. ΑΡΙΘΜΗΤΙΚΕΣ ΠΡΑΞΕΙΣ Σελ.70 DIV AB INC A INC Rn INC direct INC DPTR MUL AB SUBB A,Rn SUBB A,direct SUBB SUBB A,#data Divide A by B ιαίρεσε τον Α µε τον Β Increment Accumulator Αύξησε τον συσσωρευτή Increment register Αύξησε τον καταχωρητή Increment direct byte Αύξησε το απευθείας byte Increment Data Pointer Αύξησε τον δείκτη δεδοµ. Increment indirect RAM Αύξησε την έµµεση RAM Multiply A and B Πολλαπλασίασε τους Α και Β Subtract Register from A with borrow Αφαίρεσε τον καταχωρητή από τον A µε δανειζόµενο Subtract direct byte from A with borrow Αφαίρεσε το απευθείας byte από τον A µε δανειζόµ. Subtract indirect RAM from A with borrow Αφαίρεσε την έµµεση RAM από τον Α µε δανειζόµ. Subtract immediate data from A with borrow Αφαίρεσε το άµεσο δεδοµένο από τον Α µε δανειζόµ Προβλήµατα 1. Γράψτε ένα πρόγραµµα που να διπλασιάζει το περιεχόµενο της θέσης µνήµης 30h. 2. Γράψτε ένα πρόγραµµα που να προσθέτει τις εξής θέσεις της απευθείας RAM. 30h 31h 32h 33h 34h + 35h 36h 37h 38h 39h 3. ίδονται δύο πίνακες τεσσάρων θέσεων του δύο bytes. Ο πρώτος βρίσκεται στις θέσεις d:30h... d:37h και ο δεύτερος στις θέσεις i:90h... i:97h. Να γραφεί πρόγραµµα που να δηµιουργεί έναν τρίτο πίνακα στις θέσεις x:1000h µέχρι x:1007h, ο οποίος να περιέχει σε κάθε του θέση τη διαφορά των αντίστοιχων θέσεων του πρώτου και του δεύτερου πίνακα (x = d i). 4. Γράψτε ένα πρόγραµµα που να προσθέτει στον αριθµό των 24 bits που περιέχεται στις θέσεις x:1000h, x:1001h και x:1002h τον αριθµό των 24 bits που περιέχεται στις θέσεις x:2000h, x:2001h και x:2002h. Να γίνει, δηλαδή, η εξής πρόσθεση. x:1000h x:1001h x:1002h + x:2000h x:2001h x:2002h x:1000h x:1001h x:1002h 5. Γράψτε ένα πρόγραµµα που να προσθέτει στον αριθµό των 24 bits που περιέχεται στις θέσεις i:80h, i:81h και i:82h τον αριθµό των 24 bits που περιέχεται στις θέσεις i:90h, i:91h και i:92h. Να γίνει, δηλαδή, η εξής πρόσθεση. i:80h i:81h i:82h + i:90h i:91h i:92h i:80h i:81h i:82h

71 6. ΕΝΤΟΛΕΣ ΙΑΚΛΑ ΩΣΗΣ. ΣΥΓΚΡΙΣΕΙΣ. Η CPU εκτελεί πρόγραµµα από τη µνήµη προγράµµατος (συνήθως ROM), ανακαλώντας bytes από διαδοχικές θέσεις µνήµης. Για το σκοπό αυτό έχει έναν 16µπιτο καταχωρητή, τον απαριθµητή προγράµµατος (PC=Program Counter). O PC αυξάνεται κατά 1 αυτόµατα, αµέσως µετά την ανάκληση κάθε byte προγράµµατος, και έτσι δείχνει, κάθε φορά, τη διεύθυνση του επόµενου byte, που έχει σειρά να ανακληθεί από τη µνήµη. Κατά την εκτέλεση µιας εντολής ο PC δείχνει τη διεύθυνση της επόµενης εντολής. Εάν τροποποιήσετε, εκείνη τη στιγµή, το περιεχόµενό του, η επόµενη εντολή δε θα είναι αυτή που είναι γραµµένη αµέσως µετά, αλλά αυτή που βρίσκεται στη διεύθυνση που δείχνει το τροποποιηµένο περιεχόµενο του PC. Για την τροποποίηση του περιεχοµένου του απαριθµητή προγράµµατος, δεν υπάρχει η εντολή MOV PC,δ/νση, αν και αυτή θα προκαλούσε διακλάδωση στην εντολή, που βρίσκεται στη δηλούµενη διεύθυνση. Όλες οι εντολές διακλάδωσης στον 8051 εκτελούνται σε 24 παλµούς ρολογιού (12 καταστάσεις) ΙΑΚΛΑ ΩΣΕΙΣ ΧΩΡΙΣ ΣΥΝΘΗΚΗ Οι διακλαδώσεις του τύπου αυτού εκτελούνται πάντοτε, χωρίς να κάνουν κάποιον έλεγχο. Ο 8051 έχει τριών ειδών διακλαδώσεις χωρίς συνθήκη: µακρινή (Long Jump), απόλυτη (Absolute Jump) και κοντινή διακλάδωση (Short Jump) Μακρινή διακλάδωση Μπορεί να γίνει οπουδήποτε στη µνήµη, επειδή η δηλούµενη διεύθυνση είναι των 16 bits. Υπάρχουν δύο ειδών µακρινές διακλαδώσεις: η άµεση (LJMP addr16) και η έµµεση Άµεση µακρινή διακλάδωση Η διακλάδωση γίνεται στη διεύθυνση των 16 bits, που ακολουθεί τον κωδικό λειτουργίας της εντολής. Η εντολή LJMP addr16 είναι των τριών bytes. Έµµεση µακρινή διακλάδωση Η διακλάδωση γίνεται στη δ/νση των 16 bits, που σχηµατίζεται από την πρόσθεση των περιεχοµένων του Α και του DPTR. Η εντολή είναι του ενός byte και είναι η µοναδική εντολή διακλάδωσης µε έµµεση διευθυνσιοδότηση Απόλυτη διακλάδωση Είναι εντολή των 2 bytes και, εποµένως, καταλαµβάνει λιγότερο χώρο στη µνήµη. Η διεύθυνση διακλάδωσης στην AJMP addr11 υπολογίζεται από τη συγχώνευση των 5 bits υψηλής τάξης του (αυξηµένου) περιεχοµένου του PC, των bits 7,6 και 5 του κωδικού λειτουργίας της εντολής και των 8 bits του δεύτερου byte της εντολής. a10 a9 a a7 a6 a5 a4 a3 a2 a1 a0 Εφόσον τα bits a11 µέχρι a15 δεν αλλάζουν, η διακλάδωση µπορεί να εκτελεστεί µόνο µέσα στο ίδιο µπλοκ, µεγέθους 2 ΚBytes (64 KBytes / 2 5 = 2 11 = 2 KBytes) Κοντινή διακλάδωση Τον κωδικό λειτουργίας της εντολής κοντινής (ή σχετικής) διακλάδωσης ακολουθεί ένας προσηµασµένος αριθµός του 1 byte. Είναι, εποµένως, µία εντολή των 2 bytes. Ο προσηµασµένος αυτός αριθµός προστίθεται στο (αυξηµένο) περιεχόµενο του απαριθµητή προγράµµατος, δίνοντας τη διεύθυνση της επόµενης προς εκτέλεση εντολής. Η εντολή SJMP offset έχει τον περιορισµό ότι δεν µπορεί να κάνει διακλάδωση πέρα από 128 µέχρι +127 από τη διεύθυνση της εντολής που ακολουθεί την SJMP. Μπορεί όµως να ξεπεράσει το φράγµα των 2Κ, που θέτει η απόλυτη διακλάδωση. Στην πράξη, δε χρειάζεται να υπολογίζετε διευθύνσεις και να επιλέγετε µία από τις εντολές AJMP, LJMP και SJMP. Γράφετε, απλά, JMP label, όπου label η ετικέτα της εντολής στην οποία θέλετε να κάνετε διακλάδωση. Την κατάλληλη εντολή θα τη βρει ο συµβολοµεταφραστής, ανάλογα µε τη σχετική θέση των δύο εντολών, αυτής που κάνει τη διακλάδωση και αυτής που βρίσκεται στην ετικέτα label.

72 6. ΕΝΤΟΛΕΣ ΙΑΚΛΑ ΩΣΗΣ. ΣΥΓΚΡΙΣΕΙΣ. Σελ.72 Ετικέτα (label) είναι µία λέξη που ορίζεται από το χρήστη, αλλά αποκτά περιεχόµενο από τον ίδιο το συµβολοµεταφραστή. Στο τέλος του ορισµού της ετικέτας µπαίνει πάντοτε το σύµβολο «:». Όταν µία ετικέτα τοποθετείται στην αρχή µιας εντολής, αποκτά περιεχόµενο, κατά τη διάρκεια του πρώτου περάσµατος του συµβολοµεταφραστή, τη διεύθυνση του πρώτου byte της εντολής ΙΑΚΛΑ ΩΣΕΙΣ ΥΠΟ ΣΥΝΘΗΚΗ Οι διακλαδώσεις υπό συνθήκη (conditional jumps) εκτελούνται, αν κάποια συνθήκη είναι αληθής, ενώ, αν η συνθήκη είναι ψευδής, εκτελείται η επόµενη εντολή. Σε µορφή λογικού διαγράµµατος υλοποιούν το εξής. Σχήµα 6-1. ιακλάδωση υπό συνθήκη Ο 8051 διαθέτει µόνο εντολές σχετικής διακλάδωσης υπό συνθήκη. Αυτό σηµαίνει ότι, αν η εντολή όπου θέλετε να κάνετε διακλάδωση υπό συνθήκη είναι µακριά, έξω, δηλαδή, από τα όρια bytes από την επόµενη εντολή, θα πρέπει να κάνετε διακλάδωση υπό συνθήκη σε µία άλλη εντολή απόλυτης ή µακρινής διακλάδωσης. Ο 8051 είναι εφοδιασµένος µε δύο είδη ελέγχων: σε byte και σε bit ιακλάδωση υπό συνθήκη µε έλεγχο byte Η διακλάδωση εκτελείται, αν το byte έχει κάποια τιµή, που προσδιορίζει η εντολή. Οι εντολές της κατηγορίας αυτής είναι οι εξής: JZ offset, JNZ offset: οι εντολές jump if zero και jump if non zero ελέγχουν το περιεχόµενο του συσσωρευτή (και µόνον αυτού) και εκτελούν τη διακλάδωση, αν ο Α είναι 0 ή διάφορος του 0 αντίστοιχα. CJNE A,dir,offset: διακλάδωση, αν ο Α δεν είναι ίσος µε το περιεχόµενο της µνήµης µε διεύθυνση dir (compare and jump if not equal). CJNE A,#n,offset: διακλάδωση, αν ο Α δεν είναι ίσος µε τη σταθερά n. CJNE Rn,#n,offset: διακλάδωση, αν ο καταχωρητής οµάδας δεν είναι ίσος µε τη σταθερά n. διακλάδωση, αν το περιεχόµενο της θέσης µνήµης που δείχνει ο καταχωρητής δείκτη R0 ή R1 δεν είναι ίσος µε τη σταθερά n. DJNZ Rn,offset: µείωσε τον καταχωρητή οµάδας κατά 1 και διακλαδώσου, αν το αποτέλεσµα δεν είναι 0 (decrement and jump if non zero). DJNZ dir,offset: µείωσε το περιεχόµενο της µνήµης dir κατά 1 και διακλαδώσου, αν το αποτέλεσµα δεν είναι 0. Στην πράξη δε χρειάζεται να υπολογίζετε offset. Γράφετε απλώς την ετικέτα της εντολής στην οποία θέλετε να κάνετε τη διακλάδωση και ο συµβολοµεταφραστής υπολογίζει το offset κατά τη µετάφραση του προγράµ- µατος. Οι εντολές JZ, JNZ και DJNZ δεν επηρεάζουν καµία σηµαία. Η εντολή όµως CJNE επηρεάζει τη σηµαία του C µε έναν τρόπο που θα αποδειχτεί πιο κάτω πολύ χρήσιµος. Κάνει τη σηµαία του κρατούµενου ένα, αν ο πρώτος από τους συγκρινόµενους αριθµούς είναι µικρότερος από το δεύτερο. Αν ο πρώτος αριθµός είναι µεγαλύτερος ή ίσος από το δεύτερο, η σηµαία C µηδενίζεται ιακλάδωση υπό συνθήκη µε έλεγχο bit Η διακλάδωση εκτελείται, αν το bit έχει κάποια συγκεκριµένη τιµή, που προσδιορίζει η εντολή. Το bit µπορεί να είναι ή το κρατούµενο (C) ή οποιοδήποτε bit από την περιοχή µνήµης µε δυνατότητα προσπέλασης bit (b).

73 6. ΕΝΤΟΛΕΣ ΙΑΚΛΑ ΩΣΗΣ. ΣΥΓΚΡΙΣΕΙΣ. Σελ.73 Ο Πίνακας 6-1 δείχνει τις διευθύνσεις b των bits και προκύπτει από το Σχήµα 3-6 στη σελίδα 51 και από την παράγραφο Η πρώτη στήλη από καθένα από τα 8 ζεύγη στηλών δείχνει τη διεύθυνση b του bit, ενώ η δεύτερη τη συµβολική ονοµασία του bit στο οποίο αντιστοιχεί αυτή η διεύθυνση. Ο πίνακας αυτός παρατίθεται για µελέτη και όχι για αναφορά ή αποµνηµόνευση. Ο συµβολοµεταφραστής επιτρέπει να χρησιµοποιείτε τη συµβολική ονοµασία του bit. Στη µετάφραση τη µετατρέπει σε διεύθυνση bit. 0 20h h h Ch SCON IP C0h ACC h h h Ch SCON IP C0h ACC h h h Ch SCON IP C0h ACC h h h Ch SCON IP C0h ACC h h h Ch SCON IP C0h ACC h h h Ch SCON IP C0h ACC h h h Ch SCON IP C0h ACC h h h Ch SCON IP C0h ACC h h h Dh P P T2CON E h h h Dh P P T2CON E h h h Dh P P T2CON E h h h Dh P P T2CON E h h h Dh P P T2CON E h h h Dh P P T2CON E h h h Dh P P T2CON E h h h Dh P P T2CON E h h Ah Eh TCON I E PSW B h h Ah Eh TCON I E PSW B h h Ah Eh TCON I E PSW B h h Ah Eh TCON I E PSW B h h Ah Eh TCON I E PSW B h h Ah Eh TCON I E PSW B h h Ah Eh TCON I E PSW B h h Ah Eh TCON I E PSW B h h Bh Fh P P CCON F h h Bh Fh P P CCON F h h Bh Fh P P CCON F h h Bh Fh P P CCON F h h Bh Fh P P CCON F h h Bh Fh P P CCON F h h Bh Fh P P CCON F h h Bh Fh P P CCON F8.7 Πίνακας 6-1. Οι διευθύνσεις των bits Οι εντολές µε έλεγχο bit είναι: JC offset: Η διακλάδωση εκτελείται, αν η σηµαία του κρατούµενου είναι 1 (jump if carry). JNC offset: Η διακλάδωση εκτελείται, αν η σηµαία του κρατούµενου είναι 0 (jump if not carry). JB b,offset: Η διακλάδωση εκτελείται, αν το bit b είναι 1 (jump if bit). JNB b,offset: Η διακλάδωση εκτελείται, αν το bit b είναι 0 (jump if not bit). JBC b,offset: Η διακλάδωση εκτελείται, αν το bit b είναι 1 (όπως στην JB) αλλά το bit b µηδενίζεται (jump if bit and clear). Άσκηση 6-1 (Σύγκριση εντολών διακλάδωσης µε έλεγχο bit) Τι διαφέρει και τι κοινό έχει η εντολή JC offset από την JB PSW.7,offset; (Πίνακας 7-1, σελ. 85). Λύση Και οι δύο εντολές εκτελούν την ίδια εργασία, κάνουν διακλάδωση στην εντολή µε ετικέτα offset, αν η σηµαία του κρατούµενου είναι 1. Όπως φαίνεται από τον πίνακα της σελίδας 82, ο χρόνος εκτέλεσης των δύο εντολών είναι ίδιος, 24 κύκλοι, αλλά η εντολή JC είναι εντολή των 2 bytes, ενώ η JB των 3.

74 6. ΕΝΤΟΛΕΣ ΙΑΚΛΑ ΩΣΗΣ. ΣΥΓΚΡΙΣΕΙΣ. Σελ.74 Άσκηση 6-2 (Πρόσθεση δύο 16µπιτων αριθµών σε 24 bits) Γράψτε ένα πρόγραµµα που να προσθέτει τα περιεχόµενα των αριθµών των 16 bits που περιέχονται στη µνήµη, ο πρώτος στις θέσεις d:30h (high) και d:31h (low) και ο δεύτερος στις θέσεις d:32h (high) και d:33h (low byte). Το αποτέλεσµα να φυλάγεται στις θέσεις d:34h (high), d:35h (medium) και d:36h (low byte). Να γίνει δηλαδή η πρόσθεση: d:30h d:31h + d:32h d:33h d:34h d:35h d:36h Υπόδειξη: αν από την πρόσθεση των high bytes των θέσεων d:30h και d:32h προκύψει κρατούµενο, βάλε 1 στη θέση d:34h. Λύση MOV A,31h ADD A,33h MOV 36h,A MOV A,30h ADDC A,32h MOV 35h,A MOV 34h,#0 JNC HALT MOV 34h,#1 HALT: JMP HALT end Μία παρατήρηση για την τελευταία εντολή στο προηγούµενο πρόγραµµα (HALT: JMP HALT). Η CPU δεν µπορεί να σταµατήσει να εκτελεί κώδικα. Η έννοια του τέλους του προγράµµατος δεν υφίσταται στη CPU. Στη λύση των ασκήσεων, όταν δεν έχετε να κάνετε άλλη εργασία, θα βάζετε έναν αέναο βρόχο επανάληψης. Για να ελέγχετε τα αποτελέσµατα του προγράµµατος, θα διακόπτετε την εκτέλεση του αέναου βρόχου (endless loop). Η διακοπή της εκτέλεσης του προγράµµατος µπορεί να γίνει µόνο σε προσοµοίωση. Σε εκτέλεση του προγράµµατος από την ίδια τη CPU δεν έχει νόηµα ούτε η διακοπή της εκτέλεσης του προγράµµατος. Άσκηση 6-3 (Απόλυτη τιµή) Γράψτε ένα πρόγραµµα που να αντικαθιστά µε την απόλυτη τιµή του τον προσηµασµένο αριθµό των 16 bits, ο οποίος περιέχεται στη µνήµη στις θέσεις d:37h (high) και d:38h (low byte). Υπόδειξη: αν το πρόσηµο (high bit) είναι 1, κάνε την αφαίρεση 0 µείον αριθµός. Λύση Επειδή η διεύθυνση d:37h δεν είναι προσπελάσιµη κατά bit, πρέπει το περιεχόµενό της να µεταφερθεί στο συσσωρευτή. MOV A,37h JNB ACC.7,HALT ;ACC είναι η διεύθυνση του Α (0Ε0h) MOV A,#0 ;Αριθµός αρνητικός, αφαίρεσε από το 0 CLR C SUBB A,38h ;Low byte, πρώτο MOV 38h,A MOV A,#0 SUBB A,37h MOV 37h,A ;High byte, δεύτερο HALT: JMP HALT end

75 6. ΕΝΤΟΛΕΣ ΙΑΚΛΑ ΩΣΗΣ. ΣΥΓΚΡΙΣΕΙΣ. Σελ ΣΥΓΚΡΙΣΕΙΣ Οι συγκρίσεις που συνήθως χρειάζονται στον προγραµµατισµό είναι οι εξής. ACTION1 όχι Σύγκριση ναι ACTION2 Σύγκριση 1) Γ = 2) Γ <> 3) Γ < 4) Γ >= 5) Γ > 6) Γ <= όπου Γ, : θέσεις µνήµης ή σταθερές 1) Σύγκριση Γ = MOV A,Γ CJNE A,,ACTION1 ACTION2: JMP EXIT ACTION1: EXIT: 3) Σύγκριση Γ < MOV A,Γ CJNE A,, NEXT NEXT: JC ACTION2 ACTION1: JMP EXIT ACTION2: EXIT: 5) Σύγκριση Γ > ( < Γ) MOV A, CJNE A, Γ, NEXT NEXT: JC ACTION2 ACTION1: JMP EXIT ACTION2: EXIT: Σχήµα 6-2. Συνήθεις συγκρίσεις 2) Σύγκριση Γ MOV A,Γ CJNE A,,ACTION2 ACTION1: JMP EXIT ACTION2: EXIT: 4) Σύγκριση Γ MOV Α, Γ CJNE A,, NEXT NEXT: JNC ACTION2 ACTION1: JMP EXIT ACTION2: EXIT: 6) Σύγκριση Γ ( Γ) MOV Α, CJNE A, Γ, NEXT NEXT: ACTION1: JMP EXIT ACTION2: EXIT: Πίνακας 6-2. Οι συγκρίσεις στην assembly JNC ACTION2 Στις συγκρίσεις 3 µέχρι 6 γίνεται εκµετάλλευση του γεγονότος ότι η εντολή CJNE ενηµερώνει τη σηµαία του κρατούµενου (βλέπε παράγραφο σελίδα 72). Έτσι, γίνεται χρήση της CJNE, για να ενηµερωθεί το C και όχι για να γίνει η διακλάδωση. Όπως βλέπετε, η διακλάδωση γίνεται στην αµέσως επόµενη εντολή, που, ούτως ή άλλως, θα εκτελεστεί, είτε είναι ίσα τα Γ και είτε όχι. Για τις συγκρίσεις 5 και 6 αρκεί να αντιστραφούν τα Γ και των συγκρίσεων 3 και 4 αντίστοιχα. Παράδειγµα 1: Να διαβαστεί στο συσσωρευτή ο µεγαλύτερος από τους δύο αριθµούς των θέσεων µνήµης d:30h και d:31h. MOV A,31h

76 6. ΕΝΤΟΛΕΣ ΙΑΚΛΑ ΩΣΗΣ. ΣΥΓΚΡΙΣΕΙΣ. Σελ.76 CJNE A,30h,NEXT NEXT: JNC EXIT ;όχι δανειζόµενο, άρα 1 ο 2 ο (31h 30h) MOV A,30h ;δανειζόµ., άρα αντίστροφη συνθήκη: 31h<30h EXIT: Παράδειγµα 2: Να αντικατασταθεί το περιεχόµενο της θέσης µνήµης d:30h µε 15h, αν είναι µικρότερο από 16h. MOV A,30h CJNE A,#16h,NEXT NEXT: JNC EXIT ;όχι δανειζόµενο, άρα 1 ο 2 ο (d:30h #16) MOV 30h,#15h ;δανειζόµενο σηµαίνει 1 ο <2 ο (d:30h < #16) EXIT: Παράδειγµα 3: Αν ο αριθµός που περιέχεται στη θέση d:30h είναι µεγαλύτερος από 7, να αυξάνεται κατά 1 η θέση d:31h, αλλιώς να µειώνεται κατά 1. MOV A,#7 CJNE A,30h,NEXT NEXT: JNC ACT INC 31h ;δανειζόµενο, άρα 1 ο < 2 ο (#7 < d:30h) JMP TELOS ACT: DEC 31h ;όχι δανειζόµενο, άρα 1 ο 2 ο (#7 d:30h) TELOS: Ένας άλλος τρόπος να θυµάστε τις συγκρίσεις είναι ο εξής. Οι συγκρίσεις που µπορούν να γίνουν στον 8051 είναι: 1) µε την εντολή CJNE 2) µε την εντολή CJNE και µετά JΝC 3) < µε την εντολή CJNE και µετά JC Όλες οι άλλες συγκρίσεις πρέπει να αναχθούν στις παραπάνω 3, επιλέγοντας κατάλληλα το δεδοµένο που θα φορτωθεί στον Α και το δεδοµένο µε το οποίο θα συγκριθεί ο Α, µε χρήση της εντολής CJNE. Άσκηση 6-4 ( ιπλό παράθυρο) Γράψτε ένα πρόγραµµα που να κάνει 1 τη σηµαία του κρατούµενου, αν το περιεχόµενο του συσσωρευτή είναι από 12 µέχρι 24 ή από 36 µέχρι 48. Σε αντίθετη περίπτωση η σηµαία του κρατούµενου να µηδενίζεται. Λύση ΑΡΧΗ ναι Α<12 όχι Α<25 ναι ναι Α<36 όχι όχι C 0 όχι Α<49 ναι C 1 ΤΕΛΟΣ

77 6. ΕΝΤΟΛΕΣ ΙΑΚΛΑ ΩΣΗΣ. ΣΥΓΚΡΙΣΕΙΣ. Σελ.77 CJNE A,#12,NEXT1 NEXT1: JC CLR_C CJNE A,#25,NEXT2 NEXT2: JC SET_C CJNE A,#36,NEXT3 NEXT3: JC CLR_C CJNE A,#49,NEXT4 NEXT4: JC SET_C CLR_C: CLR C JMP HALT SET_C: SETB C ;Η εντολή αυτή δεν είναι απαραίτητη, αφού εδώ ;διακλαδίζεται µόνον αν C = 1. HALT: JMP HALT end Άσκηση 6-5 (Τριπλή σύγκριση) Γράψτε ένα τµήµα προγράµµατος που να κάνει διακλάδωση στις ετικέτες MIKROTERO, ISO και MEGALYTERO, αν η ποσότητα alfa είναι αντίστοιχα µικρότερη, ίση ή µεγαλύτερη από την ποσότητα beta. Λύση Το πρόγραµµα καλείται να υλοποιήσει το επόµενο λογικό διάγραµµα. < alfa ; beta > = mikrotero iso megalutero MOV A,alfa CJNE A,beta,ANISA ISO: ANISA: JC MIKROTERO MEGALYTERO: MIKROTERO: Οι συγκρίσεις αριθµών µεγαλύτερων του 1 byte θα περιγραφούν σε επόµενο κεφάλαιο.

78 6. ΕΝΤΟΛΕΣ ΙΑΚΛΑ ΩΣΗΣ. ΣΥΓΚΡΙΣΕΙΣ. Σελ ΒΡΟΧΟΙ Βρόχος (loop) είναι ένα τµήµα προγράµµατος που εκτελείται πάνω από µία φορές. Υπάρχουν δύο ειδών βρόχοι: αυτοί που εκτελούνται ορισµένες φορές και αυτοί που εκτελούνται όσο ισχύει µία συνθήκη. Η υλοποίηση των βρόχων που εκτελούνται υπό συνθήκη γίνεται µε τις εντολές διακλάδωσης υπό συνθήκη CJNE, JC, JNC, JB, JNB, JZ και JNZ, που έχουν ήδη περιγραφεί. Η υλοποίηση των βρόχων που εκτελούνται ορισµένες φορές γίνεται µε τη βοήθεια ενός µετρητή βρόχου. Ο µετρητής αποκτά τιµή 0 πριν την έναρξη του βρόχου, σε κάθε πέρασµα του βρόχου αυξάνεται κατά 1 και, τέλος, συγκρίνεται µε το πλήθος των επαναλήψεων. Εναλλακτικά, µπορεί να αποκτά αρχική τιµή ίση µε το πλήθος των επαναλήψεων, σε κάθε πέρασµα του βρόχου να µειώνεται και να συγκρίνεται µε το 0. Στις περισσότερες περιπτώσεις εφαρµόζεται η δεύτερη λύση: µπαίνει ένας µετρητής βρόχου που µετρά προς τα κάτω, µέχρι να µηδενιστεί. Για την περίπτωση αυτή ο 8051 διαθέτει ειδική εντολή, την DJNZ. Το ρόλο του µετρητή µπορεί να παίξει ένας καταχωρητής ή µία απευθείας θέση µνήµης. MOV LOOPCNTR,#πλήθος_επαναλήψεων LOOP: DJNZ LOOPCNTR,LOOP Οι εντολές που περιέχονται µεταξύ της ετικέτας LOOP και της εντολής DJNZ θα εκτελεστούν πλήθος_επαναλήψεων φορές. Με µετρητή ενός byte µπορεί να γίνει επανάληψη µέχρι 256 φορές, αν µπει αρχική τιµή 0 στη LOOPCNTR. Μεγαλύτεροι βρόχοι θα περιγραφούν σε επόµενο κεφάλαιο. Αν θέλετε να χρησιµοποιήσετε µέσα στο σώµα του βρόχου το µετρητή, αλλά σε αύξουσα αρίθµηση, θα πρέπει να βάλετε ως αρχική τιµή στον µετρητή το 0, να αυξάνετε το µετρητή και να το συγκρίνετε µε το πλήθος επαναλήψεων. MOV R1,#0 LOOP: MOV INC R1 CJNE R1,#πλήθος_επαναλήψεων,loop Άσκηση 6-6 (Απλός βρόχος µε DJNZ) Γράψτε ένα πρόγραµµα που να προσθέτει τα περιεχόµενα των θέσεων µνήµης από d:40h µέχρι d:4fh στο συσσωρευτή. Αγνοήστε τα κρατούµενα που θα προκύψουν από τις προσθέσεις. Υπόδειξη: χρησιµοποιήστε τον R0 ως καταχωρητή δείκτη, για να δείχνει τις θέσεις απευθείας µνήµης 40h µέχρι 4Fh, και τον R2 ως δείκτη του βρόχου, για να µετράει από 16 µέχρι 1 µε DJNZ R2,LOOP. Χρησιµοποιήστε την εντολή INC R0, για να αυξάνετε κατά 1 τον R0. Λύση MOV R2,#16 MOV R0,#40h CLR A LOOP: ADD INC R0 DJNZ R2,LOOP HALT: JMP HALT end Άσκηση 6-7 (Απλός βρόχος µε CJNE) ίνεται ένας πίνακας µε 32 απροσήµαστους αριθµούς των 8 bits που βρίσκεται στις θέσεις d:30h και µετά. Να δηµιουργηθεί ένας δεύτερος πίνακας στην έµµεση RAM που να περιέχει σε κάθε του θέση το διπλάσιο της αντίστοιχης θέσης του πρώτου πίνακα. Αγνοήστε την περίπτωση της υπερχείλισης.

79 6. ΕΝΤΟΛΕΣ ΙΑΚΛΑ ΩΣΗΣ. ΣΥΓΚΡΙΣΕΙΣ. Σελ.79 Λύση MOV R0,#30h MOV R1,#90h LOOP: MOV ADD INC R0 INC R1 CJNE R0,#50h,LOOP HALT: JMP HALT end Άσκηση 6-8. (Ταξινόµηση φυσαλίδας - bubble-sort) Να γραφεί πρόγραµµα που να ταξινοµεί κατά αύξουσα σειρά µεγέθους τα bytes που περιέχονται στις θέσεις d:30h... d:4fh. Να εφαρµοστεί ο αλγόριθµος φυσαλίδας. Λύση Το λογικό διάγραµµα του αλγόριθµου φαίνεται στο αριστερό µισό, στο Σχήµα 6-3. Στο δεξί µισό φαίνεται η προσαρµογή του αλγόριθµου στη συµβολική γλώσσα του ΑΡΧΗ ΑΡΧΗ i 1 R0 #30h LOOP1 LOOP1 j N R1 #4Fh LOOP2 LOOP2 A(i)>A(j) ναι A(i) όχι όχι NEXT NEXT j j - 1 R1 R1-1 όχι j= i ναι όχι R1= R0 ναι i i + 1 R0 R0 + 1 όχι i = N ναι όχι R0= #4Fh ναι ΤΕΛΟΣ ΤΕΛΟΣ Σχήµα 6-3 Ο αλγόριθµος bubble-sort

80 6. ΕΝΤΟΛΕΣ ΙΑΚΛΑ ΩΣΗΣ. ΣΥΓΚΡΙΣΕΙΣ. Σελ.80 Ο δείκτης i δείχνει τα στοιχεία του πίνακα, από το πρώτο (1) µέχρι το προτελευταίο (Ν-1). Κάθε στοιχείο Α(i) το συγκρίνουµε µε όλα τα υπόλοιπα µε βάση ένα δείκτη j που παίρνει τιµές από το τελευταίο στοιχείο µέχρι το επόµενο του i, δηλαδή από Ν µέχρι i+1. Κάθε φορά που το στοιχείο της θέσης i βρίσκεται µεγαλύτερο από αυτό της θέσης j ανταλλάσσονται τα περιεχόµενα των θέσεων i και j. Το ρόλο των δεικτών i και j αναλαµβάνουν, στη συµβολική γλώσσα του 8051, οι καταχωρητές δείκτη R0 και R1. Επειδή δε ο πίνακας υλοποιείται σε διαδοχικές θέσεις µνήµης, τα όρια 1 και Ν του πίνακα είναι τώρα η πρώτη και η τελευταία διεύθυνση αντίστοιχα. using 0 MOV R0,#30h LOOP1: MOV R1,#4Fh LOOP2: MOV CLR C SUBB JNC NEXT ;1ος δείκτης = 1ος αριθµός ;2ος δείκτης = τελευταίος αριθµός ;Σύγκρινε τον αριθµό του 2ου δείκτη ;µε τον αριθµό του 1ου δείκτη ;Αν είναι µεγαλύτερος, µην ανταλλάσσεις NEXT: MOV ;Αλλιώς, αντάλλαξε τους αριθµούς XCH ;και κράτα στη θέση του 1ου δείκτη ;τον µικρότερο DEC R1 ;Μείωσε το 2ο δείκτη MOV A,R1 ;και σύγκρινέ τον µε τον 1ο CJNE A,ar0,LOOP2 ;Αν δεν είναι ίσοι, επανάληψη INC R0 CJNE R0,#4Fh,LOOP1 ;Αλλιώς, αύξησε τον 1ο δείκτη ;και σύγκρινέ τον για τέλος HALT: JMP HALT end Προσέξτε τη χρήση της οδηγίας using 0 και των εντολών MOV A,R1 και CJNE A,ar0,LOOP2. Πρέπει να γίνει σύγκριση των καταχωρητών δείκτη R0 και R1. Για το σκοπό αυτό φορτώνεται ο Α µε το περιεχόµενο του ενός δείκτη και συγκρίνεται µε το περιεχόµενο της διεύθυνσης του άλλου, µια και δεν υπάρχει εντολή CJNE A,R0,LOOP2. Θα µπορούσε, τώρα, να µπει η εντολή CJNE A,0,LOOP2 που θα έκανε την επιθυµητή σύγκριση. Το πρόγραµµα γίνεται πιο σαφές όµως, αν χρησιµοποιηθεί το σύµβολο ar0 στο οποίο ο assembler αντιστοιχίζει αυτόµατα την τιµή 0, εάν είναι επιλεγµένη η οµάδα καταχωρητών 0. Στο πιο πάνω πρόγραµµα δε γίνεται αλλαγή οµάδας καταχωρητών. Με την οδηγία using 0, ειδοποιείται ο assembler ότι είναι επιλεγµένη η οµάδα καταχωρητών 0, ώστε κατά τη µετάφραση να αντικαταστήσει το σύµβολο ar0 µε την τιµή 0. Η χρήση της οδηγίας using και του συµβόλου ar0 έχει ένα ακόµη πλεονέκτηµα. Εάν σε µία ρουτίνα αλλάξετε ενεργή οµάδα καταχωρητών, αρκεί να το δηλώσετε στην οδηγία using και θα τροποποιηθούν αυτόµατα όλες οι διευθύνσεις των καταχωρητών. Περισσότερα για τις οδηγίες σε επόµενο κεφάλαιο. Άσκηση 6-9 (Συγχώνευση ταξινοµηµένων πινάκων) ίδονται δύο ταξινοµηµένοι πίνακες Γ και µε 16 bytes ο καθένας. Ο πρώτος βρίσκεται στις θέσεις i:80h... i:8fh και ο δεύτερος στις θέσεις i:90h... i:9fh. Να δηµιουργηθεί ένας τρίτος ταξινοµηµένος πίνακας Ζ στις θέσεις i:a0h... i:bfh που να περιέχει τα στοιχεία και των δύο πινάκων. Λύση Η δυσκολία που παρουσιάζει η άσκηση αυτή είναι ότι απαιτούνται τρεις δείκτες, ένας για κάθε πίνακα. Για να ξεπεραστεί η δυσκολία, θα χρησιµοποιηθεί ο καταχωρητής R0 να δείχνει στον πίνακα Ζ και δύο θέσεις µνήµης 30h και 31h ως δείκτες στους πίνακες Γ και αντίστοιχα. Κάθε φορά που θα πρέπει να γίνει προσπέλαση σε έναν από τους πίνακες Γ ή, θα φορτώνεται ο καταχωρητής R1 από την κατάλληλη θέση µνήµης. Το λογικό διάγραµµα της λύσης φαίνεται στο Σχήµα 6-4.

81 6. ΕΝΤΟΛΕΣ ΙΑΚΛΑ ΩΣΗΣ. ΣΥΓΚΡΙΣΕΙΣ. Σελ.81 ΑΡΧΗ i 1 j 1 k 1 LOOP ναι j = N + 1 ναι i = N + 1 ΤΕΛΟΣ όχι όχι j = N + 1 ναι Ζ(k) (j) j j + 1 όχι όχι Γ(i) < (j) ναι Ζ(k) Γ(i) i i + 1 k k + 1 Σχήµα 6-4 Λογικό διάγραµµα table merging Εφαρµόζοντας το σκεπτικό που αναπτύχθηκε πιο πάνω, προκύπτει το εξειδικευµένο λογικό διάγραµµα για τον 8051 που φαίνεται στο Σχήµα 6-5. ΑΡΧΗ 30h #80h 31h #90h R0 #A0h LOOP ναι ΤΕΛΟΣ 31h= #9Fh+1 όχι ναι 30h= #8Fh+1 όχι NOTI 31h= #9F+1 ναι όχι INCJ 31h @30h 30h 30h+1 INCK R0 R0+1 Σχήµα 6-5 Λογικό διάγραµµα 8051 table merging

82 6. ΕΝΤΟΛΕΣ ΙΑΚΛΑ ΩΣΗΣ. ΣΥΓΚΡΙΣΕΙΣ. Σελ.82 Το πρόγραµµα που προκύπτει από την κωδικοποίηση αυτού του λογικού διαγράµµατος είναι το εξής. ;Συγχώνευση δύο ταξινοµηµένων πινάκων ; MOV 30h,#80h ; είκτης του 1ου πίνακα MOV 31h,#90h ; είκτης του 2ου πίνακα MOV R0,#0A0h ; είκτης του 3ου πίνακα LOOP: MOV R1,30h CJNE R1,#8Fh+1,NOTI ;Τελείωσε ο 1ος Πίνακας? MOV R1,31h CJNE R1,#9Fh+1,INCJ ;Τελείωσε και ο 2ος Πίνακας? HALT: JMP HALT ;Αν τελείωσαν και οι 2 πίνακες, τέλος NOTI: MOV R1,31h CJNE R1,#9Fh+1,NOTJ ;Ο 1ος Πίνακας δεν τελείωσε. Ο 2ος ;τελείωσε? INCI: MOV R1,30h MOV INC 30h JMP INCK NOTJ: MOV R1,31h MOV CLR C MOV R1,30h SUBB JNC INCI INCJ: MOV R1,31h MOV INC 31h INCK: INC R0 JMP LOOP ;Μετάφερε από τον 1ο πίνακα στον 3ο ;και αύξησε το δείκτη του 1ου ;Σύγκρινε το στοιχείο του 2ου πίνακα ;µε το στοιχείο του 1ου πίνακα ;Μετάφερε από τον 2ο πίνακα στον 3ο ;και αύξησε το δείκτη του 2ου ;Αύξησε και το δείκτη του 3ου πίνακα end Οι εντολές διακλάδωσης και σύγκρισης που εξετάστηκαν στο κεφάλαιο αυτό είναι οι εξής. PROGRAM BRANCHING ΕΝΤΟΛΕΣ ΙΑΚΛΑ ΩΣΗ Σ MNEMONIC Περιγραφή Byte Clock AJMP addr11 CJNE A,direct,rel CJNE A,#data,rel Absolute jump Απόλυτη διακλάδωση Compare direct byte to A and jump if not equal Σύγκρινε το απευθείας byte µε τον Α και διακλαδώσου αν δεν είναι ίσα Compare immediate to A and jump if not equal Σύγκρινε το άµεσο byte µε τον Α και διακλαδώσου αν δεν είναι ίσα

83 6. ΕΝΤΟΛΕΣ ΙΑΚΛΑ ΩΣΗΣ. ΣΥΓΚΡΙΣΕΙΣ. Σελ.83 CJNE Rn,#data,rel DJNZ Rn,rel DJNZ direct,rel JC rel JNC rel JB bit,rel JNB bit,rel JBC bit,rel JZ rel JNZ rel LJMP addr16 NOP SJMP rel Compare immediate to reg. and jump if not equal Σύγκρινε το άµεσο byte µε τον καταχωρητή και διακλαδώσου αν δεν είναι ίσα Compare immediate to indirect & jump if not equal Σύγκρινε το άµεσο µε το έµµεσο byte και διακλαδώσου αν δεν είναι ίσα Decrement register and jump if not zero Μείωσε τον καταχ. και διακλαδώσου αν δεν είναι 0 Decrement direct byte and jump if not zero Μείωσε το άµεσο byte και διακλαδ.αν δεν είναι 0 Jump if carry is set ιακλαδώσου αν το κρατούµενο είναι ένα Jump if carry not set ιακλαδώσου αν το κρατούµενο δεν είναι ένα Jump if direct bit is set ιακλαδώσου αν το απευθείας bit είναι ένα Jump if direct bit is not set ιακλαδώσου αν το απευθείας bit δεν είναι ένα Jump if direct bit is set and clear bit ιακλαδ. αν το απευθείας bit είναι 1 και µηδένισέ το Jump indirect relative to the DPTR Σχετική διακλάδωση σχετικά µε τον DPTR Jump if Accumulator is zero ιακλαδώσου αν ο συσσωρευτής είναι µηδέν Jump if Accumulator is not zero ιακλαδώσου αν ο συσσωρευτής δεν είναι µηδέν Long jump Μακρά διακλάδωση No Operation Καµία εργασία Short jump (relative addr) Κοντή διακλάδωση (σχετική διεύθυνση) Προβλήµατα 1. Να γραφεί πρόγραµµα που να αυξάνει τον αριθµό των 16 bits των θέσεων 30h και 31h. Επίσης, να µειώνει τον αριθµό των 16 bits των θέσεων 32h και 33h. Χρησιµοποιήστε εντολές σύγκρισης και διακλάδωσης και όχι πρόσθεσης και αφαίρεσης. 2. Στο ρεπερτόριο εντολών του 8051 υπάρχει η εντολή INC DPTR αλλά όχι η DEC DPTR. Υλοποιήστε τη µείωση του DPTR µε πρόγραµµα. Καµία σηµαία και κανείς άλλος καταχωρητής ή θέση µνήµης δεν πρέπει να τροποποιείται. 3. ίνονται δύο πίνακες µε 32 απροσήµαστους αριθµούς των 16 bits (unsigned int) ο καθένας. Ο πρώτος βρίσκεται στις θέσεις d:30h και µετά και ο δεύτερος στις θέσεις από i:80h και µετά. Να δηµιουργηθεί ένας τρίτος πίνακας στην έµµεση RAM που να περιέχει το άθροισµα των αντίστοιχων θέσεων των δύο πρώτων πινάκων. 4. ίνονται δύο πίνακες µε 32 απροσήµαστους αριθµούς των 16 bits ο καθένας. Ο πρώτος βρίσκεται στις θέσεις d:30h και µετά και ο δεύτερος στις θέσεις από i:80h και µετά. Να δηµιουργηθεί ένας τρίτος πίνακας στην έµµεση RAM που να περιέχει την απόλυτη τιµή της διαφοράς των αντίστοιχων θέσεων των δύο πρώτων πινάκων. 5. Υλοποιήστε µία κυκλική ουρά στις διευθύνσεις µνήµης από 30h µέχρι 4Fh. Βάλτε τους καταχωρητές R0 και R1 σαν δείκτες αρχής και τέλους της ουράς. Αν R0=R1, η ουρά είναι άδεια. Γράψτε δύο προγράµµατα, ένα queue_in για εγγραφή και ένα queue_out για διάβασµα. Για να διαβάσετε από την ουρά, ελέγξτε αν R0<R1, ώστε να υπάρχουν δεδοµένα, διαβάστε µε δείκτη τον R0 και αυξήστε τον. Για να γράψετε στην ουρά, ελέγξτε αν R1+1 R0, ώστε να υπάρχει χώρος, γράψτε µε δείκτη τον R1 και αυξήστε τον. Αρχικά, οι δύο δείκτες πρέπει να έχουν περιεχόµενο την αρχική διεύθυνση, δηλαδή 30h. Σε

84 6. ΕΝΤΟΛΕΣ ΙΑΚΛΑ ΩΣΗΣ. ΣΥΓΚΡΙΣΕΙΣ. Σελ.84 κάθε αύξηση δείκτη, αν αυτός γίνει ίσος µε 50h, να ξαναπαίρνει τιµή 30h, ώστε να συνεχίζει στην αρχή της διαθέσιµης περιοχής µνήµης και να κάνει κύκλο.

85 7. ΛΟΓΙΚΕΣ ΠΡΑΞΕΙΣ. ΕΝΤΟΛΕΣ ΙΑΧΕΙΡΙΣΗΣ BITS. Ο 8051 µπορεί και εκτελεί λογικές πράξεις AND, OR και NOT, µεταξύ του κρατούµενου και ενός από τα bits της περιοχής της προσπελάσιµης κατά bit. Επίσης, µπορεί και εκτελεί τις λογικές πράξεις AND, OR και XOR, αφενός µεταξύ του συσσωρευτή ή της απευθείας RAM και αφετέρου ενός byte µε 4 τρόπους διευθυνσιοδότησης. Στη δεύτερη αυτή περίπτωση η λογική πράξη γίνεται σε ένα προς ένα τα αντίστοιχα bits των δύο bytes. Αντιστροφή (NOT) µπορεί να κάνει µόνο στο συσσωρευτή µε την εντολή CPL A (Complement Accumulator). Τα µνηµονικά που χρησιµοποιούνται στις εντολές αυτές είναι τα ANL (ANd Logical), ORL (OR Logical), CPL (ComPLement) και XRL (XoR Logical). Οι εντολές των λογικών πράξεων δεν επηρεάζουν καµία σηµαία, εκτός αν ο προορισµός της εντολής είναι ο PSW. Ο PSW είναι καταχωρητής ειδικής λειτουργίας (sfr) όπου είναι συγκεντρωµένες οι σηµαίες. εν έχει νόηµα να βάζετε περιεχόµενο στον PSW για φύλαξη. Μετά από κάθε εντολή το περιεχόµενό του τροποποιείται ανάλογα µε το αποτέλεσµα της εντολής. CY AC F0 RS1 RS0 OV F1 P bit ΣΥΜ- ΒΟΛΟ ΛΕΙΤΟΥΡΓΙΑ PSW.7 CY Carry flag = Σηµαία κρατούµενου. PSW.6 AC Auxiliary Carry flag = Βοηθητική σηµαία κρατούµενου για πράξεις BCD. PSW.5 F0 Flag 0. Γενικής χρήσης, διαθέσιµη στο χρήστη. PSW.4 RS1 Bit 1 επιλογής οµάδας καταχωρητών. PSW.3 RS0 Bit 0 επιλογής οµάδας καταχωρητών. PSW.2 OV Overflow flag = Σηµαία υπερχείλισης. PSW.1 F1 Flag 1. Γενικής χρήσης, διαθέσιµη στο χρήστη. Χρησιµοποιείται από τους compilers. PSW.0 P Parity flag = Σηµαία άρτιας ισοτιµίας. Γίνεται 1 / 0 σε κάθε κύκλο εντολής για να δείξει περιττό / άρτιο πλήθος 1 στο συσσωρευτή. Πίνακας 7-1. Τα bits του καταχωρητή κατάστασης PSW (sfr d:0d0h) 7.1. ΕΝΤΟΛΕΣ ΜΕΤΑΦΟΡΑΣ BITS Οι εντολές αυτές αντιγράφουν ένα bit. Η µία θέση bit είναι το κρατούµενο και η άλλη ένα από τα προσπελάσιµα bits, όπως δείχνει ο Πίνακας 6-1, στη σελίδα 73. MOV C,b ;Αντιγράφει το bit b στο κρατούµενο MOV b,c ;Αντιγράφει το κρατούµενο στο bit b 7.2. ΛΟΓΙΚΕΣ ΠΡΑΞΕΙΣ ΣΕ BITS Η σηµαία του κρατούµενου χρησιµεύει στις πράξεις αυτές ως συσσωρευτής του ενός bit, δηλαδή δίνει τη µία είσοδο και κρατάει και το αποτέλεσµα. Η λογική πράξη µπορεί να γίνει µεταξύ του C και είτε της κατάφασης είτε της άρνησης του άλλου bit. Εντολή Ενέργεια / Παράδειγµα ANL C,b C C. b ANL C,ACC.3 ANL C,/b C C.!b ANL C,/ACC.3 ORL C,b C C + b ORL C,20h.7 ORL C,/b C C +!b ORL C,/F0 Περιγραφή AND µεταξύ του C και του b, το αποτέλεσµα στο C AND µεταξύ του C και της άρνησης του b. Το αποτέλεσµα στο C. Το bit b δεν αλλάζει. OR µεταξύ του C και του b, το αποτέλεσµα στο C. OR µεταξύ του C και της άρνησης του b. Το αποτέλεσµα στο C. Το bit b δεν αλλάζει.

86 7. ΛΟΓΙΚΕΣ ΠΡΑΞΕΙΣ. ΕΝΤΟΛΕΣ ΙΑΧΕΙΡΙΣΗΣ BITS. Σελ.86 CPL C CPL b C!C CPL C b!b CPL 20h.3 Αντιστροφή (NOT) του κρατούµενου. Αντιστροφή του bit b. Πίνακας 7-2. Οι εντολές των λογικών πράξεων σε bits 7.3. ΛΟΓΙΚΕΣ ΠΡΑΞΕΙΣ ΣΕ BYTES Ο προορισµός των εντολών αυτών είναι, ως συνήθως, ο A. Στις λογικές πράξεις όµως, προορισµός µπορεί να είναι και µία θέση στην απευθείας RAM, όταν εκτελείται η λογική πράξη µεταξύ της απευθείας RAM και του Α ή µιας σταθεράς. Οι εντολές των λογικών πράξεων σε bytes είναι οι ANL, ORL, XRL και CPL. Οι πράξεις αυτές, εκτός βέβαια από τη CPL, εκτελούνται bit προς bit µεταξύ των δύο bytes. A πριν A µετά ANL A,Byte Byte Σχήµα 7-1. Σχηµατική παράσταση εκτέλεσης της εντολής ANL A,Byte 7.4. ΕΝΤΟΛΕΣ ΠΕΡΙΣΤΡΟΦΗΣ Οι εντολές αυτές ολισθαίνουν όλα τα bits του Α κατά µία θέση δεξιά ή αριστερά. Εάν το bit που περισσεύει συµπληρώσει το κενό που δηµιουργείται, πρόκειται για τις εντολές RL A (Rotate Left Accumulator) και RR A (Rotate Right Accumulator). Εάν το κενό που δηµιουργείται συµπληρωθεί από τη σηµαία του κρατούµενου και το bit που περισσεύει τοποθετηθεί στο κρατούµενο, διαγράφοντας την τιµή που ήδη µπήκε στο κενό, πρόκειται για τις εντολές RLC A και RRC A (Rotate Left / Right through Carry Accumulator). Οι εντολές RL και RR περιστρέφουν 8 bits, ενώ οι RLC και RRC, 9. C Συσσωρευτής Συσσωρευτής C RL A RR A C Συσσωρευτής Συσσωρευτής C RLC A RRC A Σχήµα 7-2. Εντολές περιστροφής

87 7. ΛΟΓΙΚΕΣ ΠΡΑΞΕΙΣ. ΕΝΤΟΛΕΣ ΙΑΧΕΙΡΙΣΗΣ BITS. Σελ.87 Τέλος, η εντολή SWAP A ανταλλάσσει τα nibbles χαµηλής και υψηλής τάξης του συσσωρευτή. Εάν π.χ. ο Α περιέχει 0F3h, µετά την εντολή SWAP A θα περιέχει 3Fh. Θα θυµάστε από το δυαδικό σύστηµα ότι αριστερή ολίσθηση κατά 1 ενός αριθµού σηµαίνει πολλαπλασιασµό επί 2, αφού όλα τα βάρη των ψηφίων διπλασιάζονται. Επίσης, δεξιά ολίσθηση κατά 1 bit σηµαίνει διαίρεση του αριθµού δια 2. Άσκηση 7-1 (Κυλιόµενος 1 σε µία θύρα) Γράψτε ένα πρόγραµµα που να ταξιδεύει συνεχώς, από δεξιά προς τα αριστερά, έναν 1 στα 8 bits της θύρας Ρ1. Ενεργοποιήστε τον debugger και τοποθετήστε τον δείκτη σε µία από τις εντολές του προγράµµατος. Εµφανίστε τη θύρα Ρ1 και τρέξτε το πρόγραµµά σας µε το εικονίδιο Run to Cursor line { }. Λύση MOV A,#1 LOOP: RL A MOV P1,A JMP LOOP end Άσκηση 7-2 (Πολλαπλασιασµός επί 2) Γράψτε ένα πρόγραµµα που να πολλαπλασιάζει επί 2 τα περιεχόµενα των θέσεων µνήµης από d:50h µέχρι d:52h. Λύση MOV A,50h CLR C ;Προσοχή:είναι λάθος να βάλετε την RL A, RLC A ;αντί για CLR C, RLC A, γιατί θα φέρει MOV 50h,A ;το high bit σαν low bit MOV A,51h CLR C RLC A MOV 51h,A MOV A,52h CLR C RLC A MOV 52h,A HALT: JMP HALT end Άσκηση 7-3 (Bit swapping) Γράψτε ένα πρόγραµµα που να ανταλλάσσει τη θέση των bits της θέσης µνήµης 30h (b7<->b0, b6<->b1,b5<- >b2 και b4<->b3). Αν π.χ. το περιεχόµενο της 30h είναι να γίνει Λύση Γίνεται χρήση µιας βοηθητικής θέσης µνήµης 31h, όπου ολισθαίνουν µέσα της µε αντίστροφη σειρά τα bits που ολισθαίνουν έξω από τη θέση 30h. Στο τέλος, µεταφέρεται το περιεχόµενο της βοηθητικής θέσης στην αρχική. MOV R7,#8

88 7. ΛΟΓΙΚΕΣ ΠΡΑΞΕΙΣ. ΕΝΤΟΛΕΣ ΙΑΧΕΙΡΙΣΗΣ BITS. Σελ.88 LOOP: MOV A,30h RRC A MOV 30h,A RRC A MOV A,31h RLC A MOV 31h,A DJNZ R7,LOOP MOV 30h,A x x x x x x x x 1 RLC A 1 C HALT: JMP HALT end 7.5. ΕΝΤΟΛΕΣ ΡΥΘΜΙΣΗΣ BITS Οι εντολές αυτές ρυθµίζουν τη σηµαία του κρατούµενου ή τα bits της περιοχής της προσπελάσιµης κατά bit. Μπορούν δηλ. να τα κάνουν 1, 0 ή να τα αντιστρέψουν. CLR C ;Μηδένισε τη σηµαία του κρατούµενου. CLR b ;Μηδένισε το bit b. SETB C ;Κάνε ένα τη σηµαία του κρατούµενου. SETB b ;Κάνε ένα το bit b. CPL C ;Αντέστρεψε τη σηµαία του κρατούµενου. CPL b ;Αντέστρεψε το bit b. Παράδειγµα Οι εντολές SETB RS1, CLR RS0 κάνουν ενεργή την οµάδα καταχωρητών 2. Άσκηση 7-4 (Εύρεση πρόσηµου γινοµένου δύο αριθµών) Στις θέσεις µνήµης d:30h και d:31h περιέχεται ο προσηµασµένος αριθµός NUMA των δύο bytes (signed int) και στις θέσεις d:32h και d:33h ο προσηµασµένος NUMB, επίσης των 2 bytes. Γράψτε ένα πρόγραµµα που να βρίσκει στη σηµαία F0, το πρόσηµο του γινοµένου τους NUMA. NUMB. Λύση Το πρόσηµο του γινοµένου τους είναι το XOR των πρόσηµων τους, δηλαδή των bits 7 των θέσεων µνήµης d:30h και d:32h. MOV A,30h XRL A,32h MOV C,ACC.7 MOV F0,C HALT: JMP HALT end Οι εντολές λογικών πράξεων και διαχείρισης bits είναι οι εξής.

89 7. ΛΟΓΙΚΕΣ ΠΡΑΞΕΙΣ. ΕΝΤΟΛΕΣ ΙΑΧΕΙΡΙΣΗΣ BITS. Σελ.89 BIT MANIPULATION AND LOGICAL OPERATIONS ΙΑΧΕΙΡΙΣΗ BITS ΚΑΙ ΛΟΓΙΚΕΣ ΠΡΑΞΕΙΣ MNEMONIC Περιγραφή Byte Clock ANL A,Rn ANL A,direct ANL ANL A,#data ANL direct,a ANL direct,#data ANL C,bit ANL C,/bit CPL A CLR C CLR bit CPL C CPL bit MOV C,bit MOV bit,c ORL A,Rn ORL A,direct ORL ORL A,#data ORL direct,a ORL direct,#data ORL C,bit ORL C,/bit RL A RLCA RR A RRC A AND Register to Accumulator AND του καταχωρητή στον συσσωρευτή AND direct byte to Accumulator AND του απευθείας byte στον Α AND indirect RAM to Accumulator AND της έµµεσης RAM στον Α AND immediate data to Accumulator AND του άµεσου δεδοµένου στον Α AND Accumulator to direct byte AND του A στο απευθείας byte AND immediate data to direct byte AND του άµεσου δεδοµένου στο απευθείας byte AND direct bit to carry AND του απευθείας bit στο κρατούµενο AND complement of direct bit to carry AND του συµπληρώµατος του απευθείας bit στο C Complement Accumulator Αντίστρεψε τον A Clear carry Μηδένισε το κρατούµενο Clear direct bit Μηδένισε το απευθείας bit Complement carry Αντίστρεψε το κρατούµενο Complement direct bit Αντίστρεψε το απευθείας bit Move direct bit to carry Μετάφερε το απευθείας bit στο κρατούµενο Move carry to direct bit Μετάφερε το κρατούµενο στο απευθείας bit OR register to Accumulator OR του καταχωρητή στον συσσωρευτή OR direct byte to Accumulator OR του απευθείας byte στον Α OR indirect RAM to Accumulator OR της έµµεσης RAM στον Α OR immediate data to Accumulator OR του άµεσου δεδοµένου στον Α OR Accumulator to direct byte OR του A στο απευθείας byte OR immediate data to direct byte OR του άµεσου δεδοµένου στο απευθείας byte OR direct bit to carry OR του απευθείας bit στο κρατούµενο OR complement of direct bit to carry OR του συµπληρώµατος του απευθείας bit στο C Rotate Accumulator left Περίστρεψε τον συσσωρευτή αριστερά Rotate Accumulator left through the carry Περίστρεψε τον Α αριστερά µέσω του κρατούµενου Rotate Accumulator right Περίστρεψε τον συσσωρευτή δεξιά Rotate Accumulator right through the carry Περίστρεψε τον Α δεξιά µέσω του κρατούµενου

90 7. ΛΟΓΙΚΕΣ ΠΡΑΞΕΙΣ. ΕΝΤΟΛΕΣ ΙΑΧΕΙΡΙΣΗΣ BITS. Σελ.90 SWAP A SETB C SETB bit XRL A,Rn XRL A,direct XRL XRL A,#data XRL direct,a XRL direct,#data Swap nibbles within the Accumulator Αντάλλαξε το nibbles στον συσσωρευτή Set carry Κάνε ένα το κρατούµενο Set direct bit Κάνε ένα το απευθείας bit X-OR register to Accumulator X-OR του καταχωρητή στον συσσωρευτή X-OR direct byte to Accumulator X-OR του απευθείας byte στον Α X-OR indirect RAM to Accumulator X-OR της έµµεσης RAM στον Α X-OR immediate data to Accumulator X-OR του άµεσου δεδοµένου στον Α X-OR Accumulator to direct byte X-OR του A στο απευθείας byte X-OR immediate data to direct byte X-OR του άµεσου δεδοµένου στο απευθείας byte Προβλήµατα 1. Γράψτε ένα πρόγραµµα που να γράφει στις θέσεις µνήµης 22h και 23h την απόλυτη τιµή του αριθµού των 16 bits των θέσεων 20h και 21h. Χρησιµοποιήστε εντολές λογικών πράξεων. 2. Γράψτε ένα πρόγραµµα που να µετράει το πλήθος των «1» του byte που περιέχεται στη θέση d:30h. Το αποτέλεσµα να φυλάγεται στον Α. 3. ίνεται ένας πίνακας 32 προσηµασµένων αριθµών των δύο bytes από τη διεύθυνση 30h και µετά. Να γραφεί πρόγραµµα που να απαριθµεί στον Α το πλήθος των αρνητικών αριθµών του πίνακα. 4. Υλοποιήστε έναν πλήρη αθροιστή στη θύρα P1. Θυµίζουµε ότι οι λογικές του εξισώσεις είναι: Σ = A (B C) και Κ = AB + BC + AC. Επιλέξτε γραµµές της θύρας Ρ1 για τις εισόδους A, B, C και τις εξόδους Σ, Κ. Το πρόγραµµα θα πρέπει να εκτελείται συνεχώς, σε αέναη επανάληψη. 5. Στη θύρα Ρ1 εφαρµόζονται δύο αριθµοί των 4 bits, ο πρώτος στα bits Ρ1.3 µέχρι Ρ1.0 και ο δεύτερος στα bits Ρ1.7 µέχρι Ρ1.4. Να γραφεί πρόγραµµα που να εµφανίζει στη θύρα Ρ2 το γινόµενο των δύο αριθµών.

91 8. ΣΤΟΙΒΑ ΚΑΙ ΥΠΟΡΟΥΤΙΝΕΣ 8.1. ΣΤΟΙΒΑ Στοίβα ή σωρός είναι µία µέθοδος οργάνωσης µνήµης, όπου η προσπέλαση, διάβασµα ή γράψιµο, γίνεται, χωρίς να προσδιορίζεται η διεύθυνση. ύο µόνο εργασίες επιτρέπονται στη στοίβα: η φύλαξη (PUSH) και η ανάκληση (POP). Αφού δεν προσδιορίζεται η διεύθυνση, δεν µπορεί να ζητηθεί από τη στοίβα κάποιο συγκεκριµένο στοιχείο. Η CPU, σε απάντηση της εντολής POP, δίνει κάθε φορά το τελευταίο στοιχείο που φυλάχτηκε (δοµή LIFO = Last In First Out). Η στοίβα πραγµατοποιείται αποκλειστικά στην εσωτερική έµµεση RAM. Για να µπορεί η CPU να χειρίζεται τη στοίβα, αρκεί να γνωρίζει τη διεύθυνση της κορυφής της. Κορυφή της στοίβας είναι η θέση που έχει σειρά να ανακληθεί, η θέση δηλαδή που φυλάχτηκε τελευταία. Ο 8051 είναι εφοδιασµένος µε τον οκτάµπιτο δείκτη στοίβας SP (Stack Pointer) στη διεύθυνση sfr d:81h. Ο SP δείχνει την κορυφή της στοίβας και αυξάνεται αυτόµατα κατά ένα πριν από κάθε φύλαξη, ενώ µειώνεται κατά ένα µετά από κάθε ανάκληση. Στο reset (ξεκίνηµα της CPU), ο SP αποκτά την τιµή 7, επειδή όµως εκεί είναι η αρχή της οµάδας καταχωρητών 1, συνήθως δίδεται µία άλλη αρχική τιµή στον SP. Η τιµή αυτή, αν δε θέλετε να πέσει η στοίβα πάνω σε χρήσιµα δεδοµένα, πρέπει να είναι µεγαλύτερη ή ίση από τη µεγαλύτερη διεύθυνση µνήµης που χρησιµοποιήθηκε. Μία τιµή που συνήθως δε δηµιουργεί πρόβληµα είναι η 7Fh, η αρχή δηλαδή (µείον 1) του πάνω µισού της εσωτερικής RAM, που, έτσι κι αλλιώς, είναι µόνο έµµεσα προσπελάσιµη. Εκτός από τα διδακτικά προγράµµατα, όλα τα άλλα χρησιµοποιούν τη στοίβα. Γι αυτό βλέπετε, συνήθως, ως πρώτη εντολή τη MOV SP,#7Fh. Παρακάτω, θα µάθετε τον τρόπο να αναθέτετε αυτόµατα στο µvision2 να τοποθετεί στο δείκτη της στοίβας τη διεύθυνση της τελευταίας θέσης µνήµης που έχει χρησιµοποιηθεί. Ανακεφαλαιώνοντας λοιπόν: Η στοίβα στον 8051 πραγµατοποιείται στην εσωτερική έµµεση RAM. Η στοίβα ξεκινά από χαµηλές διευθύνσεις και επεκτείνεται προς τις υψηλές. Ο SP δείχνει την κορυφή της στοίβας, και συγκεκριµένα τη διεύθυνση της θέσης που γράφτηκε τελευταία και έχει σειρά να διαβαστεί. Έτσι, ο 8051, πριν από κάθε φύλαξη στη στοίβα, αυξάνει κατά ένα τον SP, ενώ, µετά από κάθε ανάκληση, τον µειώνει κατά 1. Στον SP δίνουµε αρχική τιµή ΜΟΝΟ στην αρχή του προγράµµατος. Στη συνέχεια, ΑΠΑΓΟΡΕΥΕΤΑΙ να πειράξουµε τον SP, αλλιώς η CPU θα χάσει την κορυφή της στοίβας. Η στοίβα µπορεί να χρησιµοποιηθεί ως πρόχειρη και γρήγορη µνήµη, επειδή δεν είναι ανάγκη να ορίζονται θέσεις µνήµης. Ο βασικός λόγος όµως που υπάρχει η στοίβα είναι για να µπορούν οι CPU να χειρίζονται υπορουτίνες. Ο 8051 δεν µπορεί να γράψει στη στοίβα τίποτε άλλο, εκτός από απευθείας RAM. Έτσι, αν θέλετε να γράψετε στη στοίβα κάποιον sfr, πρέπει να γράψετε PUSH και τη διεύθυνσή του. Ο συµβολοµεταφραστής που συνοδεύει το πρόγραµµα µvision2 µπορεί να βρει τη διεύθυνση του sfr και να την αντικαταστήσει στις εντολές PUSH και POP µε τις εξής εξαιρέσεις. Για το συσσωρευτή πρέπει να γράψετε PUSH ACC, όπου ACC είναι η διεύθυνση του συσσωρευτή, δηλαδή 0E0h. Για τους καταχωρητές οµάδας R0 έως R7 πρέπει να δώσετε τη διεύθυνση ανάλογα µε την οµάδα στην οποία αναφέρεστε. Π.χ. για να φυλάξετε στη στοίβα τον καταχωρητή R0 της οµάδας 0, πρέπει να δώσετε την εντολή PUSH 0 και, για να ανακαλέσετε από την κορυφή της στοίβας στον καταχωρητή R7 της οµάδας 3, πρέπει να δώσετε την εντολή POP 1Fh. Εναλλακτικά, µπορείτε να δώσετε την εντολή PUSH ar0, όπου ar0 είναι η διεύθυνση του καταχωρητή R0 της τρέχουσας οµάδας καταχωρητών. Επειδή ο συµβολοµεταφραστής (assembler) δεν µπορεί να προσδιορίσει αυτόµατα ποια οµάδα καταχωρητών έχετε ενεργοποιήσει, πρέπει να του το δηλώνετε µε την οδηγία using N, όπου Ν = 0, 1, 2 ή 3, η οµάδα καταχωρητών που έχετε ενεργή τη στιγµή εκείνη. Τονίζεται ότι µε την εντολή PUSH γίνεται αντιγραφή του περιεχοµένου της µνήµης στη στοίβα. Με την εντολή POP γίνεται αντιγραφή από την κορυφή της στοίβας στη µνήµη, αλλά επειδή ο δείκτης της στοίβας δε δείχνει πια στα δεδοµένα που διαβάστηκαν, µπορείτε να θεωρείτε το διάβασµα αυτό σαν µεταφορά. Όταν θα ξαναγράψετε στη στοίβα, τότε θα γράψετε πάνω στα διαβασµένα δεδοµένα και θα τα διαγράψετε οριστικά.

92 8. ΣΤΟΙΒΑ ΚΑΙ ΥΠΟΡΟΥΤΙΝΕΣ Σελ.92 Σχήµα 8-1. Σχηµατική επεξήγηση της εντολής PUSH ACC Άσκηση 8-1 (Swap µε τη χρήση της στοίβας) Το επόµενο πρόγραµµα ανταλλάσσει (swap) τα περιεχόµενα των καταχωρητών R0 και R1 της οµάδας 0. Γράψτε, τρέξτε και επαληθεύστε τη λειτουργία του. HALT: using 0 PUSH ar0 ; PUSH ar1 ; POP ar0 ; POP ar1 ; JMP HALT Άσκηση 8-2 (Μη καταστροφικό διάβασµα της κορυφής της στοίβας) Γράψτε ένα πρόγραµµα, που να ανακαλεί στον Α το περιεχόµενο της κορυφής της στοίβας, χωρίς, όµως, να χαλά η στοίβα, ούτε ο SP. Λύση POP ACC ; ιάβασε από την κορυφή της στοίβας στον Α PUSH ACC ;Γράψε το περιεχόµενο του Α πίσω στη στοίβα HALT: JMP HALT 8.2. ΥΠΟΡΟΥΤΙΝΕΣ Υπορουτίνα είναι ένα τµήµα προγράµµατος, που µπορεί να καλείται µε ειδικές εντολές από ένα κυρίως πρόγραµµα. Το κέρδος από τη χρήση των υπορουτινών είναι πολλαπλό. Εάν σε µία εφαρµογή χρειάζεται ένα κοµµάτι προγράµµατος να εκτελείται το ίδιο πολλές φορές, δε χρειάζεται να το ξαναγράψουµε. Ασχολούµαστε κάθε φορά µε τη συγγραφή και εκσφαλµάτωση µικρών και αυτοτελών προγραµµάτων. Ως αποτέλεσµα, είµαστε πιο αποδοτικοί. Μπορεί να γραφεί ένα πρόγραµµα από περισσότερους του ενός προγραµµατιστές, αν αναλάβει ο καθένας και µερικές υπορουτίνες. Στο τέλος θα γίνει η «συρραφή» των υπορουτινών αυτών µέσα σε ένα κυρίως πρόγραµµα. ηµιουργούµε σιγά σιγά µια βιβλιοθήκη από υπορουτίνες, µε αποτέλεσµα να χρειάζεται να γράφουµε όλο και λιγότερο κώδικα, για την ολοκλήρωση των προγραµµάτων µας. Το πρόγραµµα γίνεται πιο ευανάγνωστο. Για τη χρήση των υπορουτινών ο 8051 διαθέτει τις εξής εντολές. ACALL addr11: Κλήση σε υπορουτίνα που βρίσκεται στο ίδιο µπλοκ µνήµης των 2 KBytes, µε την εντολή ACALL που την καλεί. Είναι εντολή των 2 bytes. O κώδικας µηχανής είναι: a10 a9 a a7 a6 a5 a4 a3 a2 a1 a0

93 8. ΣΤΟΙΒΑ ΚΑΙ ΥΠΟΡΟΥΤΙΝΕΣ Σελ.93 LCALL addr16: Μακρινή κλήση σε υπορουτίνα µε ολόκληρη τη διεύθυνση. Είναι εντολή των 3 bytes. RET: Επιστροφή από την υπορουτίνα στο κυρίως πρόγραµµα, στην αµέσως επόµενη εντολή από την CALL. Και εδώ, όπως και µε τις εντολές απόλυτης και µακρινής διακλάδωσης, δε χρειάζεται να υπολογίζετε διευθύνσεις και αποστάσεις. Γράφετε, απλά, CALL label και ο συµβολοµεταφραστής αναλαµβάνει να επιλέξει την κατάλληλη εντολή κλήσης της υπορουτίνας, ανάλογα µε τη σχετική θέση της πρώτης εντολής της υπορουτίνας και της CALL. Για να µπορείτε να καλείτε µία υπορουτίνα µε αυτόν τον τρόπο, πρέπει να βάλετε µία ετικέτα στην πρώτη εντολή της. Επίσης, στο τέλος της δεν πρέπει να ξεχνάτε την εντολή RET. Η τυπική δοµή ενός προγράµµατος που χρησιµοποιεί υπορουτίνα είναι η εξής. ;Αρχικές δηλώσεις ;Κυρίως πρόγραµµα MOV SP,#7Fh ;Εντολή απαραίτητη όταν χρησιµο-... ;ποιείται η στοίβα... CALL SUBR HALT: JMP HALT ;ή JMP $ ;Τέλος του κυρίως προγράµµατος SUBR1: RET ;Υπορουτίνα end Για να µπορεί να επιστρέψει η CPU στο κυρίως πρόγραµµα, µετά το τέλος της υπορουτίνας, φυλάει στη στοίβα τη διεύθυνση επιστροφής. Στο Σχήµα 8-2 φαίνεται η κατάσταση, µόλις έχει ανακληθεί από τη µνήµη η εντολή LCALL 023Eh και πριν ακόµη εκτελεστεί. Σχήµα 8-2. Η εντολή LCALL 023Eh µόλις ανακλήθηκε Ο PC δείχνει τη διεύθυνση της επόµενης προς εκτέλεση εντολής. Για να µπορεί να γίνει επιστροφή, το περιεχόµενο του PC φυλάγεται στη στοίβα. Πρώτα το low (PCL) και µετά το high byte (PCH) φυλάγονται στην κορυφή της στοίβας (ανάποδα από ό,τι ίσως θα περιµένατε). Μετά την εκτέλεση της εντολής LCALL (βλ. Σχήµα 8-3) ο απαριθµητής προγράµµατος PC δείχνει τη διεύθυνση της αρχής της υπορουτίνας, ενώ ο SP είναι αυξηµένος κατά 2, αφού δύο bytes φυλάχτηκαν στη στοίβα.

94 8. ΣΤΟΙΒΑ ΚΑΙ ΥΠΟΡΟΥΤΙΝΕΣ Σελ.94 Για να µπορεί να γίνει επιστροφή από την υπορουτίνα, πρέπει προφανώς να µην πειραχτεί καθόλου η στοίβα. αλλιώς θα χαθεί η διεύθυνση επιστροφής στο κυρίως πρόγραµµα. Μπορούν να χρησιµοποιηθούν εντολές PUSH και POP, αλλά, για να έρθει η στοίβα στην ίδια κατάσταση, θα πρέπει να εκτελεστούν τόσες εντολές POP, όσες PUSH. Μπορεί µία υπορουτίνα να καλεί µία άλλη. Αν, στο Σχήµα 8-3, στη διεύθυνση 023Εh, που ανήκει στην υπορουτίνα, υπάρχει η εντολή LCALL 034Fh, τότε, µόλις εκτελεστεί, στη στοίβα θα προστεθεί και η νέα διεύθυνση επιστροφής, η 0241h (41h στην i:84h και 02h στην i:85h). Σχήµα 8-3. Η εντολή LCALL 023Eh µόλις εκτελέστηκε Άσκηση 8-3 (Συγγραφή προγρ/τος µε υπορουτίνα) Γράψτε µία υπορουτίνα ADD16 που να προσθέτει τον αριθµό των 16 bits που δείχνει ο R0 στις 2 θέσεις µνήµης που δείχνει ο R1. Φροντίστε ώστε η υπορουτίνα να µην χαλάει το περιεχόµενο του R1 και να αφήνει κατά 2 αυξηµένο το περιεχόµενο του R0. Έτσι, θα µπορεί να χρησιµοποιηθεί επαναληπτικά, πιο εύκολα. Στη συνέχεια γράψτε ένα κυρίως πρόγραµµα που να καλεί την υπορουτίνα, για να προσθέτει στις θέσεις µνήµης d:08h και d:09h τους 4 αριθµούς των 16 bits που περιέχονται σε συνεχόµενες θέσεις µνήµης µε διευθύνσεις από d:30h µέχρι d:37h. Να γίνει δηλαδή η 30h 31h 32h 33h 34h 35h + 36h 37h 08h 09h ιευκρίνιση: Οι R0 και R1 θα δείχνουν τα high bytes. Τα low bytes θα βρίσκονται στην αµέσως µεγαλύτερη διεύθυνση. Υπενθυµίσεις: 1) Βάλτε αρχικές τιµές στις θέσεις µνήµης από d:30h µέχρι d:37h. 2) Προσπαθείτε να λύνετε τις ασκήσεις µόνοι σας και να συγκρίνετε τις λύσεις σας µε αυτές που παρατίθενται. Λύση MOV SP,#7Fh MOV R0,#30h MOV R1,#8 CALL ADD16 CALL ADD16 CALL ADD16 CALL ADD16 ;Ο αριθµός που θα προστεθεί ;Η θέση όπου βρίσκεται το άθροισµα

95 8. ΣΤΟΙΒΑ ΚΑΙ ΥΠΟΡΟΥΤΙΝΕΣ Σελ.95 HALT: JMP HALT ADD16: INC R0 INC R1 MOV ADD DEC R0 DEC R1 MOV ADDC INC R0 INC R0 RET ;Πρόσθεσε τα low bytes των δύο αριθµών ;Ο R1 επανέρχεται στην αρχική τιµή ;Πρόσθεσε µε κρατούµενο τα high bytes ;Βάλε τον R0 στην ;επιθυµητή τιµή end Άσκηση 8-4 (Παρακολούθηση σφάλµατος χειρισµού στοίβας σε υπορουτίνα) Το επόµενο πρόγραµµα παρουσιάζει το σφάλµα, να σώζει στη στοίβα µέσα από υπορουτίνα και να µην ανακαλεί. Ως αποτέλεσµα, όταν θα συναντηθεί η εντολή RET, να έχει χαλάσει η διεύθυνση επιστροφής. ε θα επιστρέψει, λοιπόν, από την υπορουτίνα στο κυρίως πρόγραµµα, αλλά θα βρεθεί σε άλλη διεύθυνση της µνήµης προγράµµατος. Σε ποια; Η οδηγία org 3454h οδηγεί το µεταφραστή στο να τοποθετήσει τον παραγόµενο κώδικα από τη διεύθυνση c:3454h και µετά. JMP MAIN MAIN: HALT: org 3454h ACALL SUBR1 JMP HALT SUBR1: MOV R0,#12h PUSH 0 ; Push χωρίς Pop στην υπορουτίνα NOP RET end Λύση Η εντολή ACALL είναι εντολή των δύο bytes και βρίσκεται στη διεύθυνση c:3454h. Την ώρα που εκτελείται, ο απαριθµητής προγράµµατος έχει ήδη αυξηθεί και δείχνει τη διεύθυνση της επόµενης εντολής (της JMP HALT), δηλαδή c:3456h. Μόλις µπει στην υπορουτίνα, η κορυφή της στοίβας θα περιέχει αυτή τη διεύθυνση: 56h, 34h. Η εντολή PUSH θα βάλει ακόµη 1 byte στη στοίβα, έτσι η κορυφή της θα περιέχει τώρα: 56h, 34h, 12h. H εντολή RET θα διαβάσει δύο bytes, για να βρει τη διεύθυνση επιστροφής, άρα θα επιστρέψει στη διεύθυνση c:1234h. Οι εντολές διαχείρισης στοίβας και κλήσης υπορουτινών είναι οι εξής.

96 8. ΣΤΟΙΒΑ ΚΑΙ ΥΠΟΡΟΥΤΙΝΕΣ Σελ.96 STACK AND SUBROUTINES ΣΤΟΙΒΑ ΚΑΙ ΥΠΟΡΟΥΤΙΝΕΣ MNEMONIC Περιγραφή Byte Clock ACALL addr11 LCALL addr16 POP direct PUSH direct RET RETI Absolute subroutine call Απόλυτη κλήση υπορουτίνας Long subroutine call Μακρά κλήση υπορουτίνας Pop direct byte from stack Τράβηξε το απευθείας byte από τη στοίβα Push direct byte onto stack Ώθησε το απευθείας byte στη στοίβα Return from subroutine Επιστροφή από υπορουτίνα Return from interrupt Επιστροφή από διακοπή Προβλήµατα 1. Γράψτε ένα πρόγραµµα που να ανταλλάσσει (swap) τα 2 bytes της κορυφής της στοίβας. 2. Από µία υπορουτίνα δε θέλουµε να επιστρέψουµε στο πρόγραµµα που την κάλεσε, αλλά στη διεύθυνση c:1234h. Πώς θα γίνει αυτό; 3. Γράψτε µία υπορουτίνα NEGATE που να αντιστρέφει το πρόσηµο του αριθµού, του οποίου η διεύθυνση περιέχεται στην κορυφή της στοίβας. Στη συνέχεια γράψτε ένα κυρίως πρόγραµµα που να καλεί την υπορουτίνα µε τις εντολές MOV A,δ/νση, PUSH ACC, CALL NEGATE. οκιµάστε το πρόγραµµα στον debugger του µvision2. 4. Γράψτε µία υπορουτίνα NEGATE που να αντιστρέφει το πρόσηµο του Α και να επιστρέφει µε το αποτέλεσµα στην κορυφή της στοίβας. Το αποτέλεσµα θα διαβαστεί από το κυρίως πρόγραµµα µε POP ACC. 5. Υλοποιήστε µία στοίβα αριθµών των 16 bits στην εξωτερική RAM στις θέσεις από 1000h και µετά. Γράψτε 2 υπορουτίνες, XPUSH και XPOP και, για δοκιµή, ένα κυρίως πρόγραµµα που να τις καλεί. Χρησιµοποιήστε δύο θέσεις απευθείας RAM για δείκτη του εξωτερικού σωρού.

97 9. ΟΜΗΜΕΝΗ ΣΥΜΒΟΛΟΜΕΤΑΦΡΑΣΗ Σκοπός αυτού του κεφαλαίου είναι η εξοικείωση µε τη χρήση του συµβολοµεταφραστή και των ρυθµίσεών του, για την ανάπτυξη µεγαλύτερης κλίµακας προγραµµάτων και εφαρµογών. Περιγράφονται οι βασικές έννοιες των δοµικών µονάδων (modules) και των τµηµάτων (segments), εξηγείται η λειτουργία του συµβολοµεταφραστή (assembler) και του διασυνδέτη (linker) και γίνεται σύντοµη αναφορά µε παραδείγµατα στις οδηγίες (assembler directives) του συµβολοµεταφραστή ΕΙΣΑΓΩΓΗ Όλες οι ασκήσεις µέχρι τώρα είχαν ως σκοπό την εκµάθηση του σετ εντολών του Αναπτύχθηκαν προγράµµατα µικρής κλίµακας µόνο και δε δόθηκε βαρύτητα στην εκµάθηση των δυνατοτήτων που παρέχει ο assembler για την οργάνωση µεγαλύτερων προγραµµάτων. Έως τώρα, τα προγράµµατα αποτελούνταν από µια σειρά εντολών σε συµβολική γλώσσα και ολοκληρώνονταν µε την οδηγία end. Μάθατε, επίσης, πώς να δηµιουργείτε και να καλείτε µια υπορουτίνα (subroutine). Στην πιο γενική του όµως µορφή, ένα πρόγραµµα σε assembly περιλαµβάνει τα παρακάτω τµήµατα: Ορισµούς θέσεων δεδοµένων στη µνήµη RAM µε την οδηγία ds Οδηγίες εξισώσεων (equates) Ορισµούς σταθερών δεδοµένων (data constants) µε τις οδηγίες db και dw Εντολές αρχικοποίησης Το βασικό κορµό του προγράµµατος Υπορουτίνες Όλα τα τµήµατα, εκτός από το πρώτο, αποτελούν το «τµήµα κώδικα», ενώ το πρώτο καλείται «τµήµα δεδοµένων». Τα τµήµατα κώδικα και δεδοµένων αποτελούν πάντοτε δύο ξεχωριστά τµήµατα, λόγω του ότι ο κώδικας προορίζεται για την µνήµη ROM ή EPROM, ενώ τα δεδοµένα προορίζονται για τη µνήµη RAM. Πρέπει να σηµειωθεί ότι τα σταθερά δεδοµένα και οι συµβολοσειρές, που ορίζονται µε τις οδηγίες db και dw, θεωρούνται ότι ανήκουν στο τµήµα κώδικα και όχι στο τµήµα δεδοµένων, όπως θα περίµενε κανείς. Αυτό συµβαίνει, γιατί πρόκειται για αµετάβλητα δεδοµένα, που αποθηκεύονται ως τµήµα του προγράµµατος. Για την ανάπτυξη µεγάλων προγραµµάτων είναι απαραίτητο να γνωρίζετε τα παρακάτω : Ο συµβολοµεταφραστής (assembler) είναι ένα πρόγραµµα που µεταφράζει ένα δικό µας πρόγραµµα από συµβολική γλώσσα (assembly) σε κώδικα µηχανής (machine code). Ο κώδικας µηχανής (αλλιώς ο αντικειµενικός κώδικας ή object code) µπορεί να είναι σε «απόλυτη» (absolute) µορφή ή σε «επανατοποθετήσιµη» (relocatable) µορφή. Στην τελευταία περίπτωση απαιτείται η διαδικασία της διασύνδεσης (linking) για τον καθορισµό της απόλυτης διεύθυνσης εκτέλεσης. Ο διασυνδέτης (linker) είναι ένα πρόγραµµα που συνδέει relocatable object προγράµµατα (modules) και παράγει ένα απόλυτο object πρόγραµµα, που είναι εκτελέσιµο. Πολλές φορές αναφέρεται και ως linker / locator, για να γίνει η διάκριση ανάµεσα στις δύο ξεχωριστές λειτουργίες του, της σύνδεσης πολλών relocatable modules (linking) και του καθορισµού της τελικής διεύθυνσης εκτέλεσης (locating). Ένα τµήµα (segment) είναι ένα κοµµάτι της µνήµης κώδικα ή της µνήµης δεδοµένων. Μπορεί να είναι relocatable (επανατοποθετήσιµο) ή absolute (απόλυτο). Αν είναι relocatable, περιέχει εκείνες τις πληροφορίες που είναι απαραίτητες στον linker, για την σύνδεσή του µε άλλα segments. Μία δοµική µονάδα (module) περιέχει ένα ή περισσότερα segments και έχει ένα όνοµα, καθορισµένο από το χρήστη. Ένα object αρχείο περιέχει ένα ή περισσότερα modules. Συνήθως, κάθε module αντιστοιχεί και σε ένα ξεχωριστό αρχείο. Ένα εκτελέσιµο πρόγραµµα αποτελείται από ένα και µοναδικό absolute module, που είναι το προϊόν της συνένωσης όλων των absolute και relocatable segments από όλα τα υπάρχοντα modules. Περιέχει, βέβαια, µόνο τους δυαδικούς κώδικες όλων των εντολών που είναι κατανοητοί από τον επεξεργαστή.

98 9. ΟΜΗΜΕΝΗ ΣΥΜΒΟΛΟΜΕΤΑΦΡΑΣΗ Σελ.98 SOURCE1.A51 SOURCE2.A51 Assembler Assembler SOURCE1.LST SOURCE1.OBJ SOURCE2.OBJ SOURCE2.LST Linker PROJECT.M51 PROJECT.HEX PROJECT (omf) Σχήµα 9-1. Η διαδικασία µετάφρασης και σύνδεσης προγραµµάτων 9.2. ΠΩΣ ΛΕΙΤΟΥΡΓΕΙ Ο ASSEMBLER Oι περισσότεροι συµβολοµεταφραστές χαρακτηρίζονται ως διπλής σάρωσης (two-pass assemblers). Αυτό συµβαίνει, γιατί σαρώνουν δύο φορές το πηγαίο πρόγραµµα κατά τη διάρκεια της µετάφρασης. Ο assembler χρησιµοποιεί ένα µετρητή θέσης (location counter), για να κρατά τη διεύθυνση των εντολών. Κατά το πρώτο πέρασµα, το πηγαίο αρχείο σαρώνεται γραµµή προς γραµµή και δηµιουργείται ένας πίνακας συµβόλων (symbol table). Ο µετρητής θέσης παίρνει αρχικά την τιµή 0, εκτός εάν έχει δοθεί µια διαφορετική τιµή µε την οδηγία org ή cseg at. Καθώς το αρχείο σαρώνεται, η τιµή του µετρητή αυξάνεται, κατά το µήκος της εκάστοτε εντολής. Όταν συναντιέται µία ετικέτα εντολής, αυτή τοποθετείται στον πίνακα συµβόλων µε την τρέχουσα τιµή του µετρητή θέσης. Ο πίνακας συµβόλων σώζεται, για να χρησιµοποιηθεί στη συνέχεια, κατά το δεύτερο πέρασµα. Το δεύτερο πέρασµα δηµιουργεί δύο αρχεία, το object και το listing. Στο object αρχείο, όλες οι εντολές αντικαθίστανται από τους δυαδικούς τους κώδικες και όλα τα σύµβολα από τις τιµές τους, όπως ορίζει ο πίνακας συµβόλων. Το τελικό object αρχείο, αν είναι absolute, περιέχει όλους τους δυαδικούς κώδικες της γλώσσας µηχανής (00h-FFh), ενώ, αν είναι relocatable, περιέχει, επίσης, έναν πίνακα συµβόλων και άλλες πληροφορίες, απαραίτητες για το linking και το locating. Το αρχείο listing είναι ένα αρχείο κειµένου, αποτελείται, δηλαδή, µόνο από εκτυπώσιµους χαρακτήρες (ASCII 20h 7Eh). Έτσι, αν επιχειρήσετε να διαβάσετε τα δύο αρχεία σε έναν editor, το listing αρχείο θα εµφανιστεί κανονικά, ενώ το object αρχείο θα εµφανίσει ακατανόητα σύµβολα. Άσκηση 9-1 (Επισκόπηση των object και listing αρχείων) Γράψτε στο µvision2 και µεταφράστε µε την επιλογή <Build All> το παρακάτω πρόγραµµα. Ανοίξτε, µε την επιλογή <File> <Open>, τα αρχεία list και map που δηµιουργούνται και παρατηρήστε τα περιεχόµενά τους. Πώς εµφανίζεται το object αρχείο; Εξηγήστε τα περιεχόµενα του πίνακα συµβόλων στο listing αρχείο. Αλλάξτε την παράµετρο της οδηγίας org από 0 σε 20 και µεταφράστε ξανά. Τι αλλαγές παρατηρούνται και σε ποια αρχεία; Προσθέστε στην αρχή του προγράµµατος (και πριν την οδηγία org), την οδηγία VAR1 equ 30h και αλλάξτε την εντολή MOV 30h,A σε MOV VAR1,A. Μεταφράστε ξανά. Εξηγήστε τις αλλαγές που παρατηρούνται. ;Αρχείο ΕΧ2_1.Α51 ;Πρόγραµµα για έλεγχο του assembler. Γράφει στη θέση ;30h το άθροισµα των αριθµών 30h και 8Ch org 0 MOV A,#30h ADD A,#8Ch MOV 30h,A HALT: JMP HALT end

99 9. ΟΜΗΜΕΝΗ ΣΥΜΒΟΛΟΜΕΤΑΦΡΑΣΗ Σελ.99 Λύση Το αρχείο listing είναι το εξής. A51 MACRO ASSEMBLER EX2_1 03/14/ :38:07 PAGE 1 MACRO ASSEMBLER A51 V6.01 OBJECT MODULE PLACED IN.\ex2-1.OBJ ASSEMBLER INVOKED BY: C:\Archimedes\C51\BIN\A51.EXE.\ex2-1.A51 SET(SMALL) DEBUG EP LOC OBJ LINE SOURCE 1 ;Αρχείο ΕΧ2_1.Α51 2 ;Πρόγραµµα για έλεγχο του... 3 ;30h το άθροισµα των org MOV A,#30h C 7 ADD A,#8Ch 0004 F530 8 MOV 30h,A FE 9 HALT: JMP HALT end A51 MACRO ASSEMBLER EX2_1 03/14/ :38:07 PAGE 2 SYMBOL TABLE LISTING N A M E T Y P E V A L U E ATTRIBUTES HALT C ADDR 0006H A REGISTER BANK(S) USED: 0 ASSEMBLY COMPLETE. 0 WARNING(S), 0 ERROR(S) Το µόνο σύµβολο που ορίστηκε είναι η ετικέτα της εντολής HALT µε περιεχόµενο 0006h. Είναι η διεύθυνση που βρίσκεται η εντολή JMP HALT. Το αρχείο map είναι το εξής. BL51 BANKED LINKER/LOCATER V /14/ :38:07 PAGE 1 BL51 BANKED LINKER/LOCATER V4.01, INVOKED BY: C:\ARCHIMEDES\C51\BIN\BL51.EXE ex2-1.obj TO ex2-1 RAMSIZE (256) INPUT MODULES INCLUDED: ex2-1.obj (EX2_1) LINK MAP OF MODULE: ex2-1 (EX2_1) TYPE BASE LENGTH RELOCATION SEGMENT NAME * * * * * * * D A T A M E M O R Y * * * * * * * REG 0000H 0008H ABSOLUTE "REG BANK 0" * * * * * * * C O D E M E M O R Y * * * * * * * CODE 0000H 0008H ABSOLUTE SYMBOL TABLE OF MODULE: ex2-1 (EX2_1)

100 9. ΟΜΗΜΕΝΗ ΣΥΜΒΟΛΟΜΕΤΑΦΡΑΣΗ Σελ.100 VALUE TYPE NAME MODULE EX2_1 C:0006H SYMBOL HALT C:0000H LINE# 6 C:0002H LINE# 7 C:0004H LINE# 8 C:0006H LINE# ENDMOD EX2_1 ************************************************************ * RESTRICTED VERSION WITH 0800H BYTE CODE SIZE LIMIT; USED: * 0008H BYTE ( 0%) ************************************************************ LINK/LOCATE RUN COMPLETE. 0 WARNING(S), 0 ERROR(S) To object αρχείο είναι δυαδικό αρχείο και δεν µπορεί να εµφανιστεί µε τον editor. Αλλάζοντας την οδηγία «org 0» σε «org 20», φαίνεται στο αρχείο listing ότι ο κώδικας τοποθετείται από τη διεύθυνση 0014h και µετά. Επίσης, στα αρχεία list και map φαίνεται ότι η ετικέτα HALT ορίζεται στη διεύθυνση 001Αh. Προσθέτοντας την οδηγία VAR1 equ 30h και αλλάζοντας την εντολή MOV 30h,A σε MOV VAR1,A δεν παρατηρείται αλλαγή στον παραγόµενο κώδικα. Στον πίνακα συµβόλων, όµως, στο αρχείο listing και στο αρχείο map φαίνεται ότι έχει προστεθεί µία γραµµή ορισµού της ετικέτας VAR1 στην τιµή 30h OΙ Ο ΗΓΙΕΣ (ASSEMBLER DIRECTIVES) Οι οδηγίες προσδιορίζουν τον τρόπο λειτουργίας του συµβολοµεταφραστή και δεν παράγουν εκτελέσιµο κώδικα. Εκτός από τις db και dw, οι υπόλοιπες οδηγίες δεν επιδρούν στα περιεχόµενα της µνήµης. Ο assembler A51 του µvision2 παρέχει τις ακόλουθες κατηγορίες οδηγιών. Ελέγχου κατάστασης του assembler org, end, using Ορισµού συµβόλων segment, equ, set, data, idata, xdata, bit, code Επιλογής τµήµατος (segment) rseg, cseg, dseg, iseg, bseg, xseg Κράτησης / αρχικοποίησης χώρου µνήµης ds, dbit, db, dw ιασύνδεσης προγράµµατος public, extrn, name Για να διακρίνονται οι οδηγίες από τις εντολές, γράφονται οι εντολές µε κεφαλαία και οι οδηγίες µε πεζά γράµµατα. Ο συµβολισµός αυτός ισχύει στο βιβλίο, δεν είναι κανόνας για τον assembler. Ο assembler δέχεται για τις οδηγίες και τις εντολές, και πεζά και κεφαλαία γράµµατα Σύµβολα και ετικέτες Σύµβολα (symbols) είναι ονόµατα στα οποία αναθέτετε εσείς κάποιες τιµές. Ετικέτες (label) είναι ονόµατα στα οποία αναθέτει ο assembler κάποιες τιµές. Τα σύµβολα αποκτούν τιµές κατά τη διάρκεια του πρώτου περάσµατος του assembler, επειδή εσείς αναθέτετε κάποιες τιµές σ αυτές µε οδηγίες ορισµού συµβόλων.

101 9. ΟΜΗΜΕΝΗ ΣΥΜΒΟΛΟΜΕΤΑΦΡΑΣΗ Σελ.101 Οι ετικέτες αποκτούν τιµές κατά τη διάρκεια του πρώτου περάσµατος επειδή ο assembler αναθέτει σ αυτές την τρέχουσα τιµή του µετρητή θέσης (location counter). Έχει σηµασία, δηλαδή, η θέση της ετικέτας µέσα στο segment. Παράδειγµα. CR equ 13 ;ορισµός συµβόλου CR µε τιµή 13 org 0 MOV R0,#1Fh ;εντολή των 2 bytes στη δ/νση 0000 LOOP: MOV ;ορισµός ετικέτας LOOP µε τιµή Μετά τον τελευταίο χαρακτήρα της ετικέτας, όταν αυτή ορίζεται, µπαίνει το σύµβολο «:». Η άνω-κάτω τελεία δεν µπαίνει στον ορισµό του συµβόλου. Ο ορισµός των όρων «σύµβολο» και «ετικέτα» δεν είναι γενικός. Σε άλλες περιπτώσεις, χρησιµοποιούνται οι όροι «ετικέτα που ορίζεται από το χρήστη» και «ετικέτα που ορίζεται από το συµβολοµεταφραστή», ενώ σύµβολο και ετικέτα είναι συνώνυµα Οδηγίες ελέγχου κατάστασης Oι οδηγίες org και end είναι ήδη γνωστές. Η end πρέπει να είναι πάντα η τελευταία οδηγία ενός προγράµµατος, γιατί ό,τι ακολουθεί αγνοείται από τον assembler. Η org δίνει αρχική τιµή στον µετρητή θέσης και, εποµένως, θέτει την αρχική τιµή διεύθυνσης στη µνήµη, για τις εντολές και οδηγίες που ακολουθούν. Μπορεί να χρησιµοποιηθεί µε κάθε τύπο segment. Αν πρόκειται για absolute segment, η τιµή της org θα είναι µια απόλυτη τιµή διεύθυνσης. Προσοχή όµως: αν το τρέχον segment είναι relocatable, η τιµή της org ερµηνεύεται ως µια τιµή µετατόπισης (offset) από την διεύθυνση βάσης του segment. Η οδηγία using καθορίζει την ενεργή οµάδα καταχωρητών, π.χ. η using 3 ειδοποιεί τον linker ότι θα ενεργοποιήσετε την τέταρτη οµάδα καταχωρητών. Η ευθύνη για την ενεργοποίηση µε την εντολή ORL PSW,#18h ανήκει σε σας. Για τη χρήση της using βλέπε και την Άσκηση Οδηγίες ορισµού συµβόλων Oι οδηγίες ορισµού συµβόλων δηµιουργούν νέα σύµβολα, που παριστάνουν segments, καταχωρητές, αριθµούς και διευθύνσεις. Με τις οδηγίες αυτές δεν επιτρέπεται η χρήση ετικετών (labels). Σύµβολα που ορίζονται δεν µπορούν να οριστούν δεύτερη φορά, µε εξαίρεση την οδηγία set. Η οδηγία equ είναι αρκετά συνηθισµένη για την εκχώρηση µιας αριθµητικής τιµής σε ένα συγκεκριµένο συµβολικό όνοµα, όπως δείχνουν και τα παρακάτω παραδείγµατα. N35 equ 35 ;θέτει την τιµή 35 στο όνοµα N35 HERE equ $ ;θέτει την τιµή του µετρητή θέσης ; στο συµβολικό όνοµα HERE CR equ 0Dh ;θέτει την τιµή 0Dh (carriage ; return) στο όνοµα CR. VAR1 equ 30h ;θέτει την τιµή 30h στο όνοµα VAR1 Η οδηγία set είναι παρόµοια µε την equ, µε τη διαφορά ότι µπορεί ένα σύµβολο να οριστεί αργότερα και πάλι, αν χρησιµοποιηθεί µια νέα οδηγία set. Οι οδηγίες equ και set απλά ορίζουν συνώνυµα. Για παράδειγµα, η INDEX1 set R1 επιτρέπει να δώσουµε στη συνέχεια την εντολή MOV και αργότερα την οδηγία INDEX1 set R0. Και µε τις δύο οδηγίες, equ και set, το σύµβολο αποκτά τύπο αριθµού (number) και µπορεί να χρησιµοποιηθεί παντού. Ο assembler δεν κάνει έλεγχο της χρήσης του. Οι οδηγίες data, idata, xdata, bit και code είναι παρόµοιες µε την equ, µε τη διαφορά ότι ορίζουν τον τύπο του συµβόλου. Έτσι, ο assembler κάνει έλεγχο της χρήσης του συµβόλου και µπορεί να σας ειδοποιήσει για λάθη.

102 9. ΟΜΗΜΕΝΗ ΣΥΜΒΟΛΟΜΕΤΑΦΡΑΣΗ Σελ.102 Άσκηση 9-2 (Αντικατάσταση της bit από την equ) Γράψτε στο µvision2 και µεταφράστε το παρακάτω πρόγραµµα. Ανακαλύψτε το λάθος που υπάρχει. Μπορεί, στο παράδειγµα αυτό, η οδηγία equ να αντικαταστήσει την bit αποτελεσµατικά; FLAG1 equ 05h FLAG2 bit 06h SETB FLAG1 SETB FLAG2 MOV FLAG1,#0 MOV FLAG2,#0 HALT: JMP HALT end Λύση Ο συµβολοµεταφραστής εµφανίζει λάθος στη γραµµή 6, δηλαδή στην εντολή MOV FLAG2,#0. Πράγµατι, η σηµαία FLAG2 είναι µεταβλητή bit και θα έπρεπε να µηδενιστεί µε την εντολή CLR FLAG2. Η σηµαία FLAG1 είναι ορισµένη λάθος µε την οδηγία equ. Και πάλι παράγεται κώδικας, αλλά δεν ανιχνεύεται το λάθος που κάνουµε στην εντολή MOV FLAG1,#0 όπου µηδενίζουµε τη θέση µνήµης 5 (d:05h ή R5 της ο.κ. 0) και όχι το bit 5 (20h.5). Άρα, δεν µπορεί να αντικατασταθεί αποτελεσµατικά η bit από την equ. Όπως εύκολα µπορεί κανείς να αντιληφθεί, η data καλύπτει την εσωτερική µνήµη δεδοµένων απευθείας προσπέλασης (d:00h d:ffh), η idata όλη την εσωτερική µνήµη δεδοµένων έµµεσης προσπέλασης (i:00h i:ffh), η xdata την εξωτερική µνήµη δεδοµένων (x:0000h x:ffffh), η bit τα bits µε δυνατότητα προσπέλασης κατά bit (b:00h b:ffh) και η code το τµήµα κώδικα (c:0000h c:ffffh). Ακολουθούν µερικά παραδείγµατα. EPROM segment code ONCHIP segment data FLAG1 bit 05h ;Ορίζει το σύµβολο EPROM ως ένα ; relocatable code segment. ;Ορίζει το σύµβολο ONCHIP ως ένα ; relocatable data segment. ;Ορίζει το σύµβολο FLAG1 ως µία ; bit address. Άσκηση 9-3 (Έλεγχοι της χρήσης των συµβόλων) Το επόµενο πρόγραµµα ορίζει πέντε σύµβολα και χρησιµοποιεί 4 τρόπους διευθυνσιοδότησης για να δίνει τιµές σ' αυτά. Εντοπίστε τους σωστούς και τους λανθασµένους τρόπους διευθυνσιοδότησης. T2CON data 0C8h ;sfr TR2 bit T2CON.2 ;Bit σε sfr VAR data 30h ;Γενικής χρήσης απευθείας RAM IVAR idata 0C8h ;Έµµεση εσωτερική RAM XVAR xdata 090h ;Εξωτερική RAM ; MOV T2CON,#0 ; άµεση ; MOV R0,#T2CON ;T έµµεση µε δείκτη R0 ;2 ;C

103 9. ΟΜΗΜΕΝΗ ΣΥΜΒΟΛΟΜΕΤΑΦΡΑΣΗ Σελ.103 MOV DPTR,#T2CON ;O έµµεση εξωτ.µε δείκτη DPTR ;N ; CLR T2CON ; προσπέλαση bit ; MOV TR2,#0 ; άµεση ; MOV R0,#TR2 ; έµµεση µε δείκτη R0 ;T ;R MOV DPTR,#TR2 ;2 έµµεση εξωτ.µε δείκτη DPTR ; ; CLR TR2 ; προσπέλαση bit ; MOV VAR,#0 ; άµεση ; MOV R0,#VAR ; έµµεση µε δείκτη R0 ;V ;A MOV DPTR,#VAR ;R έµµεση εξωτ.µε δείκτη DPTR ; ; CLR VAR ; προσπέλαση bit ; MOV IVAR,#0 ; άµεση ; MOV R0,#IVAR ;I έµµεση µε δείκτη R0 ;V ;A MOV DPTR,#IVAR ;R έµµεση εξωτ.µε δείκτη DPTR ; ; CLR IVAR ; προσπέλαση bit ; MOV XVAR,#0 ; άµεση ; MOV R0,#XVAR ;X έµµεση µε δείκτη R0 ;V ;A MOV DPTR,#XVAR ;R έµµεση εξωτ.µε δείκτη DPTR ; ; CLR XVAR ; προσπέλαση bit ; end Γράψτε το πρόγραµµα και µεταφράστε το. Ποια λάθη εντοπίζει ο assembler; Τι συµπεραίνετε; Λύση Εκτός από τις εντολές που σηµειώνονται σωστές, όλες οι άλλες χρησιµοποιούν λάθος τρόπο διευθυνσιοδότησης. Για παράδειγµα, οι εντολές MOV R0,#T2CON και γράφουν στην έµµεση και όχι στην απευθείας RAM. T2CON data 0C8h ;sfr TR2 bit T2CON.2 ;Bit σε sfr VAR data 30h ;Γενικής χρήσης απευθείας RAM IVAR idata 0C8h ;Έµµεση εσωτερική RAM XVAR xdata 090h ;Εξωτερική RAM ; MOV T2CON,#0 ; Σωστή

104 9. ΟΜΗΜΕΝΗ ΣΥΜΒΟΛΟΜΕΤΑΦΡΑΣΗ Σελ.104 MOV R0,#T2CON MOV DPTR,#T2CON ;Γράφουν στην i:c8h και όχι ;στην d:c8h ;Γράφουν στην x:00c8h και όχι ;στην d:c8h CLR T2CON ;Μηδενίζει το bit T2CON.0 ; MOV TR2,#0 ;Μηδενίζει την d:cah MOV R0,#TR2 MOV DPTR,#TR2 CLR TR2 ; MOV VAR,#0 MOV R0,#VAR MOV DPTR,#VAR ;Γράφουν στην i:cah ;Γράφουν στην x:00cah ; Σωστή ; Σωστή ; Σωστή ;Γράφουν στην x:0030h CLR VAR ;Μηδενίζει το bit d:26h.0 ; MOV IVAR,#0 ;Μηδενίζει τον T2CON MOV R0,#IVAR MOV DPTR,#IVAR ; Σωστή ;Γράφει στην x:00c8h CLR IVAR ;Μηδενίζει το bit T2CON.0 ; MOV XVAR,#0 ;Μηδενίζει τη θύρα Ρ1 MOV R0,#XVAR MOV DPTR,#XVAR ;Μηδενίζει τη διεύθυνση i:90h ; Σωστή CLR XVAR ;Μηδενίζει το bit TCON.0 ; end Ο συµβολοµεταφραστής εντοπίζει τις εσφαλµένες προσπελάσεις που σηµειώνονται µε. Άρα: Ο assembler δεν εντοπίζει εσφαλµένη διευθυνσιοδότηση σε σύµβολο, όταν χρησιµοποιείται έµµεση διευθυνσιοδότηση, µέσω του Ri ή του DPTR. Ορίζοντας όλα τα σύµβολα µε την equ, ο assembler εντοπίζει µόνο το λάθος προσπέλασης της MOV TR2,#0. Η οδηγία segment χρησιµοποιείται για να ορίσει ένα τµήµα. Οι οδηγίες data, idata, xdata, bit, code χρησιµοποιούνται, µαζί µε την οδηγία segment, για τον ορισµό του τύπου ενός relocatable segment.

105 9. ΟΜΗΜΕΝΗ ΣΥΜΒΟΛΟΜΕΤΑΦΡΑΣΗ Σελ.105 Παρατηρήστε τη διπλή χρήση των οδηγιών αυτών. Ορίζουν τον τύπο ενός segment, είδαµε, όµως, στην αρχή της παραγράφου αυτής ότι ορίζουν και σύµβολα. Περισσότερα για την οδηγία segment, αργότερα Προκαθορισµένα σύµβολα (predefined symbols) Στα προγράµµατα, µέχρι τώρα έχετε χρησιµοποιήσει τα σύµβολα ACC, B, PSW, P0... P3, SP, F0, RS1, RS0 και OV χωρίς να τα έχετε ορίσει. Ο assembler του µvision2 έχει ορίσει για σας αυτούς τους sfr, εφόσον είναι επιλεγµένο το πεδίο <Define 8051 sfr Names>, όπως φαίνεται στην Εικόνα 9-1. Εικόνα 9-1. Το πεδίο ορισµού των sfr του 8051 Τα σύµβολα που ορίζονται, είναι οι sfr που περιέχονται στον στάνταρ 8051 και δείχνει σε άσπρα κελιά ο Πίνακας 3-1 στη σελ. 52. Εάν απενεργοποιήσετε το πεδίο αυτό, θα πρέπει σε κάθε πρόγραµµα που γράφετε να ορίζετε µε κατάλληλες οδηγίες όλα τα σύµβολα που θα χρησιµοποιήσετε. Κατά την εγκατάσταση του προγράµµατος µvision2, αντιγράφονται στον κατάλογο Directory_εγκατάστασης\C51\Asm αρχεία *.inc που περιέχουν ορισµούς των sfr και άλλων µικροελεγκτών µε πυρήνα τον Για τον T89C51RD2 που θα µας απασχολήσει στο δεύτερο µέρος του βιβλίου (Εφαρµογές), το αρχείο είναι το reg51rx2.inc. Είναι αρχείο κειµένου και µπορείτε να το επεξεργαστείτε µε το Notepad. Μπορείτε να συµπεριλάβετε τους ορισµούς sfr του αρχείου αυτού, αν γράψετε στις πρώτες γραµµές στο πρόγραµµά σας τις οδηγίες: $nomod51 ;Μην ορίζεις τους sfr του στάνταρ 8051 $include(reg51rx2.inc) ;Όρισε τους sfr του 8xC51Rx2 Εάν θελήσετε να δηµιουργήσετε ένα αρχείο «inc» για κάποιο νέο µικροελεγκτή δεν έχετε παρά να αντιγράψτε το αρχείο reg51rx2.inc µε νέο όνοµα, να προσθέστε τους ορισµούς των νέων συµβόλων και να αφαιρέσετε τους ορισµούς των συµβόλων που δεν υπάρχουν στο νέο µικροελεγκτή Οδηγίες επιλογής τµήµατος Όταν ο assembler συναντήσει µια οδηγία επιλογής τµήµατος (segment), µεταφέρει τον κώδικα ή τα δεδοµένα που ακολουθούν, στο επιλεγόµενο τµήµα, έως ότου επιλεγεί ένα καινούργιο τµήµα µε µια νέα οδηγία. Μια τέτοια οδηγία µπορεί να επιλέξει ένα relocatable segment (που έχει οριστεί προηγουµένως) ή να δηµιουργήσει και να επιλέξει ένα absolute segment. Η οδηγία rseg, ακολουθούµενη από το όνοµα ενός relocatable segment, µεταφέρει τον κώδικα και τα δεδοµένα, που ακολουθούν, στο επιλεγµένο segment, έως ότου δοθεί µια νέα οδηγία. Περισσότερα για την rseg, αργότερα. Οι οδηγίες cseg, dseg, iseg, bseg και xseg χρησιµοποιούνται για τον ορισµό ή την επιλογή ενός absolute segment (τύπου κώδικα, απευθείας δεδοµένων, έµµεσων δεδοµένων, bit, και εξωτερικών δεδοµένων αντίστοιχα). Αν µια τέτοια οδηγία ακολουθείται από την επιλογή at και από µια διεύθυνση, ο assembler τερµατίζει το προηγούµενο segment του ίδιου τύπου (αν είχε οριστεί προηγουµένως) και δηµιουργεί ένα καινούργιο, που ξεκινά από αυτήν την απόλυτη διεύθυνση. Αν δε δίνεται διεύθυνση, συνεχίζεται το τελευταίο segment ίδιου τύπου, που είχε οριστεί προηγουµένως στο ίδιο αρχείο.

106 9. ΟΜΗΜΕΝΗ ΣΥΜΒΟΛΟΜΕΤΑΦΡΑΣΗ Σελ.106 Οι οδηγίες επιλογής τµήµατος χρησιµοποιούνται πάντοτε σε συνδυασµό µε τις οδηγίες κράτησης και αρχικοποίησης µνήµης της επόµενης παραγράφου. Παραδείγµατα και ασκήσεις, λοιπόν, θα δοθούν στην επόµενη παράγραφο Οδηγίες κράτησης και αρχικοποίησης χώρου µνήµης Οι οδηγίες dbit, db, ds και dw αρχικοποιούν και κρατούν χώρο µνήµης σε µονάδες bit, byte ή word. Ο χώρος που θα κρατηθεί ξεκινά από την τρέχουσα διεύθυνση που δείχνει ο µετρητής θέσης του segment που είναι ενεργό. Με τις οδηγίες αυτές επιτρέπεται η χρήση ετικετών (labels). Για να χρησιµοποιήσετε µία από τις οδηγίες αυτές, θα πρέπει να ορίσετε πρώτα ένα segment µε τις οδηγίες της προηγούµενης παραγράφου. Η οδηγία ds (Define Storage) είναι η πιο σηµαντική από τις οδηγίες. Κρατά χώρο σε bytes και µπορεί να χρησιµοποιηθεί µε κάθε τύπο segment, εκτός από bit. Μετά από κάθε χρήση της οδηγίας ds ο µετρητής θέσης του τρέχοντος segment αυξάνεται κατά το µέγεθος της έκφρασης που χρησιµοποιείται. Άσκηση 9-4 (Βασική χρήση των οδηγιών cseg, dseg και ds) Το επόµενο πρόγραµµα αυξάνει ένα µετρητή COUNTER των δύο bytes και καλεί µία υπορουτίνα καθυστέρησης. Μεταφράστε το και εντοπίστε το λάθος που προκαλεί την εµφάνιση της προειδοποίησης (warning) «DATA SPACE MEMORY OVERLAP». ιορθώστε το λάθος και ξαναµεταφράστε. Πόσα διαφορετικά τµήµατα ορίζονται; Σε ποιες διευθύνσεις ορίζονται οι µεταβλητές COUNTER, DELV1 και DELV2; ; MAIN PROGRAM COUNTER:ds 2 dseg ;Ορισµός τµήµατος δεδοµένων (data segment) cseg ;Ορισµός τµήµατος κώδικα (code segment) MOV COUNTER,#0 MOV COUNTER+1,#0 LOOP: INC COUNTER+1 JNC NEXT INC COUNTER NEXT: CALL DELAY JMP LOOP ; SUBROUTINE DELV1: ds 1 DELV2: ds 1 dseg ;Συνέχιση τµήµατος δεδοµένων (data segment) cseg ;Συνέχιση τµήµατος κώδικα (code segment) DELAY: MOV DELV1,#0FFh DELAY2: MOV DELV2,#0FFh DJNZ DELV2,$ DJNZ DELV1,DELAY2 RET end Λύση Με την οδηγία dseg ξεκινάει ο ορισµός ενός data segment από τη διεύθυνση 0 και µετά. Στις διευθύνσεις αυτές βρίσκονται οι καταχωρητές της οµάδας 0. Ο assembler ορίζει αυτόµατα ένα τµήµα data για τους καταχωρητές αυτούς και σας προειδοποιεί ότι το δικό σας τµήµα data επικαλύπτει το δικό του. Για να διορθώσετε το λάθος αυτό, πρέπει να αντικαταστήσετε την πρώτη οδηγία dseg µε την dseg at 30h. Η επόµενη οδηγία dseg θα συνεχίσει το ίδιο data segment από τη διεύθυνση όπου σταµάτησε.

107 9. ΟΜΗΜΕΝΗ ΣΥΜΒΟΛΟΜΕΤΑΦΡΑΣΗ Σελ.107 Στο αρχείο map φαίνεται ότι ορίζεται ένα data segment για την οµάδα καταχωρητών 0 από τη διεύθυνση d:0 και µετά, και ένα data segment από τη διεύθυνση 30h και µετά για τις µεταβλητές του κυρίως προγράµµατος και της υπορουτίνας. Στο ίδιο αρχείο (map) φαίνεται ότι η µεταβλητή COUNTER ορίζεται στη θέση µνήµης d:30h ενώ οι µεταβλητές DELV1 και DELV2 στις θέσεις d:32h και d:33h αντίστοιχα. Άσκηση 9-5 (Χρήση της οδηγίας ds) - Το παρακάτω τµήµα προγράµµατος δηµιουργεί έναν buffer, µεγέθους 40 bytes, σε ένα εσωτερικό data segment. dseg at 30h ; ορισµός absolute data segment BUFFER: ds 40 ; κράτηση χώρου 40 bytes Χρησιµοποιώντας όσα µάθαµε για τα σύµβολα, ξαναγράφουµε το τµήµα προγράµµατος, ως εξής. LENGTH equ 40 dseg at 30h ; ορισµός absolute data segment BUFFER: ds LENGTH ; κράτηση χώρου 40 bytes - Με παρόµοιο τρόπο, µπορούµε να δηµιουργήσουµε έναν buffer των 1000 bytes στην εξωτερική RAM, που να ξεκινά από την x:5000h, µε τις εξής εντολές. xseg at 5000h ;Ορισµός εξωτ. absolute data segment XBUFFER: ds 1000 ή ορθότερα: XSTART equ 5000h XLENGTH equ 1000 xseg at XSTART ;Ορισµός εξωτ. absolute data segment XBUFFER: ds XLENGTH - Με παρόµοιο τρόπο δηµιουργούµε έναν buffer των 50 bytes στην εσωτερική RAM, στις διευθύνσεις από 90h και µετά. ISTART equ 90h ILENGTH equ 50 iseg at ISTART ; ορισµός absolute data segment IBUFFER: ds ILENGTH ; κράτηση χώρου 50 bytes α) Γράψτε στο µvision2 ένα πρόγραµµα που να µηδενίζει όλες τις θέσεις µνήµης των τριών buffer και µεταφράστε το. β) Παρατηρήστε και εξηγήστε τα περιεχόµενα του αρχείου listing. γ) Μπορείτε, µε παρόµοιο τρόπο, να ορίσετε έναν buffer σε code segment και να τον µηδενίσετε; Λύση α) Το πρόγραµµα µηδενισµού των τριών buffer είναι το εξής. LENGTH equ 40 dseg at 30h BUFFER: ds LENGTH ; ορισµός absolute data segment ; κράτηση χώρου 40 bytes XSTART equ 5000h XLENGTH equ 1000 xseg at XSTART ;Ορισµός εξωτ. absolute data segment XBUFFER: ds XLENGTH

108 9. ΟΜΗΜΕΝΗ ΣΥΜΒΟΛΟΜΕΤΑΦΡΑΣΗ Σελ.108 ISTART equ 90h ILENGTH equ 50 iseg at ISTART ; ορισµός absolute data segment IBUFFER: ds ILENGTH ; κράτηση χώρου 50 bytes cseg ;Ορισµός τµήµατος κώδικα CLR A ;Το περιεχόµενο του Α θα εγγράφεται στη µνήµη MOV R0,#BUFFER ;R0=δείκτης προορισµού LOOP1: ;Γράψε στη µνήµη INC R0 ; είξε στην επόµενη θέση CJNE R0,#BUFFER+LENGTH,LOOP1 ;Έλεγξε για τέλος ;και διακλαδώσου MOV DPTR,#XSTART ;DPTR=δείκτης προορισµού LOOP2: ;Γράψε στη µνήµη INC DPTR ; είξε στην επόµενη θέση MOV R1,DPH ;Έλεγξε για τέλος και διακλαδώσου CJNE R1,#HIGH(XBUFFER+XLENGTH),LOOP2 MOV R1,DPL CJNE R1,#LOW(XBUFFER+XLENGTH),LOOP2 MOV R0,#IBUFFER ;R0=δείκτης προορισµού LOOP3: ;Γράψε στη µνήµη INC R0 ; είξε στην επόµενη θέση CJNE R0,#IBUFFER+ILENGTH,LOOP3 ;Έλεγξε για τέλος ;και διακλαδώσου HALT: JMP HALT end β) Το αρχείο listing είναι το εξής. A51 MACRO ASSEMBLER EX9_4 03/19/ :01:48 PAGE 1 MACRO ASSEMBLER A51 V6.01 OBJECT MODULE PLACED IN.\ex9-3.OBJ ASSEMBLER INVOKED BY: C:\Archimedes\C51\BIN\A51.EXE.\ex9-4.A51 SET(SMALL) DEBUG EP LOC OBJ LINE SOURCE LENGTH equ dseg at 30h BUFFER: ds LENGTH XSTART equ 5000h 03E8 6 XLENGTH equ xseg at XSTART XBUFFER:ds XLENGTH ISTART equ 90h ILENGTH equ iseg at ISTAR IBUFFER:ds ILENGTH cseg E4 17 CLR A MOV R0,#BUFFER 0003 F6 20 LOOP1: INC R0

109 9. ΟΜΗΜΕΝΗ ΣΥΜΒΟΛΟΜΕΤΑΦΡΑΣΗ Σελ B858FB 22 CJNE R0,#BUFFER+LENGTH MOV DPTR,#XSTART 000B F0 25 LOOP2: 000C A3 26 INC DPTR 000D A MOV R1,DPH 000F B953F9 28 CJNE R1,#HIGH(XBUFFER A MOV R1,DPL 0014 B9E8F4 30 CJNE R1,#LOW(XBUFFER MOV R0,#IBUFFER 0019 F6 33 LOOP3: 001A INC R0 001B B8C2FB 35 CJNE R0,#IBUFFER E 80FE 37 HALT: JMP HALT end,loop1 XLENGTH),LOOP2 XLENGTH),LOOP2 ILENGTH,LOOP3 A51 MACRO ASSEMBLER EX9_3 03/19/ :01:48 PAGE 2 SYMBOL TABLE LISTING N A M E T Y P E V A L U E ATTRIBUTES BUFFER D ADDR 0030h A DPH D ADDR 0083H A DPL D ADDR 0082H A HALT C ADDR 001EH A IBUFFER I ADDR 0090H A ILENGTH N NUMB 0032H A ISTART N NUMB 0090H A LENGTH N NUMB 0028H A LOOP C ADDR 0003H A LOOP C ADDR 000BH A LOOP C ADDR 0019H A XBUFFER X ADDR 5000H A XLENGTH N NUMB 03E8H A XSTART N NUMB 5000H A REGISTER BANK(S) USED: 0 ASSEMBLY COMPLETE. 0 WARNING(S), 0 ERROR(S) Παρατηρούµε ότι οι ετικέτες BUFFER, XBUFFER και IBUFFER, αποκτούν περιεχόµενο τη διεύθυνση του πρώτου byte του buffer. Στο αρχείο listing, στη µετάφραση της γραµµής 22, παρατηρούµε ότι η ποσότητα BUFFER+LENGTH είναι 58h και προκύπτει από την άθροιση: 30h+40 = 30h+28h = 58h. Επίσης, στη µετάφραση των γραµµών 28 και 30, παρατηρούµε ότι η ποσότητα XBUFFER+XLENGTH είναι 53E8h και προκύπτει από την άθροιση 5000h+1000 = 5000h+03E8h = 53E8h. γ) Μπορούµε να ορίσουµε έναν κενό χώρο στη µνήµη του προγράµµατος (cseg) µε την οδηγία ds, αλλά δεν µπορούµε να γράψουµε σ αυτόν. Με την εντολή MOVC µπορούµε µόνο να διαβάσουµε από τη ROM του προγράµµατος. Την εργασία που εκτελεί η ds σε bytes, εκτελεί η dbit σε bits. Ορίζει µεταβλητές bit σε τµήµατα bit.

110 9. ΟΜΗΜΕΝΗ ΣΥΜΒΟΛΟΜΕΤΑΦΡΑΣΗ Σελ.110 Άσκηση 9-6 (Χρήση της οδηγίας dbit) Το παρακάτω τµήµα προγράµµατος δηµιουργεί τρεις σηµαίες (µεταβλητές bit), σε ένα absolute bit segment. bseg ;Ορισµός absolute bit segment KBFLAG: dbit 1 ;Keyboard PRFLAG: dbit 1 ;Printer DKFLAG: dbit 1 ;Disk Γράψτε ένα πρόγραµµα που να δίνει τιµές στις σηµαίες αυτές και µεταφράστε το. Παρατηρήστε και εξηγήστε τα περιεχόµενα του αρχείου map. Ποιες είναι οι πραγµατικές διευθύνσεις των σηµαιών στο µεταφρασµένο πρόγραµµα; Λύση bseg KBFLAG: dbit 1 PRFLAG: dbit 1 DKFLAG: dbit 1 cseg ;Ορισµός absolute bit segment ;Keyboard ;Printer ;Disk ;Ορισµός absolute code segment SETB KBFLAG CLR PRFLAG SETB DKFLAG HALT: JMP HALT end Το αρχείο map θα είναι το εξής. BL51 BANKED LINKER/LOCATER V /19/ :41:38 PAGE 1 BL51 BANKED LINKER/LOCATER V4.01, INVOKED BY: C:\ARCHIMEDES\C51\BIN\BL51.EXE ex9_6.obj TO ex9_6 RAMSIZE (256) CODE (0X0000-0XFFFF) XDATA (0X0000-0XFFFF) INPUT MODULES INCLUDED: ex9_6.obj (ex9_6) LINK MAP OF MODULE: ex9_6 (ex9_6) TYPE BASE LENGTH RELOCATION SEGMENT NAME * * * * * * * D A T A M E M O R Y * * * * * * * REG 0000H 0008H ABSOLUTE "REG BANK 0" 0008H 0018H *** GAP *** BIT 0020H H.3 ABSOLUTE * * * * * * * C O D E M E M O R Y * * * * * * * CODE 0000H 0008H ABSOLUTE SYMBOL TABLE OF MODULE: ex9_6 (ex9_6) VALUE TYPE NAME MODULE ex9_6 B:0020H.2 SYMBOL DKFLAG C:0006H SYMBOL HALT B:0020H.0 SYMBOL KBFLAG B:0020H.1 SYMBOL PRFLAG C:0000H LINE# 8 C:0002H LINE# 9 C:0004H LINE# 10

111 9. ΟΜΗΜΕΝΗ ΣΥΜΒΟΛΟΜΕΤΑΦΡΑΣΗ Σελ.111 C:0006H LINE# ENDMOD ex9_6 ************************************************************ * RESTRICTED VERSION WITH 0800H BYTE CODE SIZE LIMIT; USED: * 0008H BYTE ( 0%) * ************************************************************ LINK/LOCATE RUN COMPLETE. 0 WARNING(S), 0 ERROR(S) Από το αρχείο map προκύπτει ότι: - Έχει οριστεί, αυτόµατα, ένα segment τύπου Reg για τη δέσµευση του χώρου των καταχωρητών της οµάδας 0. - Σε απόκριση της οδηγίας bseg, έχει οριστεί ένα absolute bit segment, στην αρχή της περιοχής της προσπελάσιµης κατά bit. - Σε απόκριση της οδηγίας cseg, έχει οριστεί ένα absolute code segment, στην αρχή της ROM. - Η πραγµατική τιµή των ετικετών KBFLAG, PRFLAG και DKFLAG είναι αντίστοιχα 20h.0, 20h.1 και 20h.2. Οι οδηγίες db (Define Byte) και dw (Define Word) τοποθετούν σταθερά δεδοµένα σε τµήµα κώδικα. Άσκηση 9-7 (Χρήση των οδηγιών db και dw) Η οδηγία db αρχικοποιεί τη µνήµη προγράµµατος σε επίπεδο bytes. Χρησιµοποιείται για την τοποθέτηση σταθερών δεδοµένων στην µνήµη προγράµµατος και έτσι, κατά τη χρήση της, πρέπει να υπάρχει ένα ενεργό code segment. cseg at 0400h SQUARES: db 0,1,4,9,16,25 ;Τετράγωνα των αριθµών 0-5 MESSAGE: db Login:,0 ;String που τελειώνει σε 0 TEL_NO: db Η οδηγία dw είναι ίδια µε την db, µε µόνη διαφορά ότι ενεργεί σε δύο θέσεις µνήµης (16 bits). cseg at 0410h WORDS: dw $, A,1234h,2, BC Γράψτε στο µvision2 ένα πρόγραµµα που να περιέχει τις παραπάνω οδηγίες και µεταφράστε το. Ελέγξτε αν έχουν τοποθετηθεί τα δεδοµένα στις κατάλληλες θέσεις µνήµης. Παρατηρήστε και εξηγήστε τα περιεχόµενα των αρχείων listing και map. Λύση Ο πίνακας συµβόλων, όπως προκύπτει από το αρχείο map, είναι ο εξής. MESSAGE =C:0406H SQUARES =C:0400H TEL_NO =C:040DH WORDS =C:0420H Όπως φαίνεται στον πίνακα συµβόλων, οι ετικέτες πήραν τιµή, τη διεύθυνση του πρώτου byte του δεδοµένου που γράφει στη µνήµη η οδηγία. Στο αρχείο listing φαίνεται ο τρόπος που τοποθετούνται οι σταθερές στο τµήµα του κώδικα. LOC OBJ LINE SOURCE cseg at 0400h SQUARES:db 0,1,4,9,16, C6F MESSAGE:db 'Login:',0 040A 6E3A00

112 9. ΟΜΗΜΕΝΗ ΣΥΜΒΟΛΟΜΕΤΑΦΡΑΣΗ Σελ D TEL_NO: db '876543' cseg at 0420h WORDS: dw $,'A',1234h,2,'BC' end Στη µνήµη ROM τοποθετούνται οι ASCII κωδικοί των χαρακτήρων που περικλείονται σε τόνους ( ) Σταθερές και µεταβλητές Εάν γράφετε προγράµµατα σε γλώσσα ανωτέρου επιπέδου, θα έχετε συνηθίσει στους όρους σταθερά και µεταβλητή. Πώς υλοποιούνται οι σταθερές και οι µεταβλητές στη συµβολική γλώσσα; α) Σταθερές bit δεν ορίζονται στην assembly. Οι εντολές SETB και CLR χρησιµοποιούνται για να αναθέτουν τις τιµές 1 και 0 αντίστοιχα. β) Σταθερές byte δηλώνονται µε #. Οποιοδήποτε σύµβολο µπορεί να χρησιµοποιηθεί ως σταθερά, αν πριν από το σύµβολο βάλετε το #, όπως θα έχετε διαπιστώσει στην Άσκηση 9-3. Επίσης, σταθερές byte µπορούν να τοποθετηθούν στο τµήµα του κώδικα µε την οδηγία db και να διαβαστούν µε την εντολή MOVC. γ) Σταθερές word δηλώνονται µε #, αλλά µόνον η εντολή MOV DPTR,#word χρησιµοποιεί σταθερά των 16 bits. Επίσης, σταθερές word µπορούν να τοποθετηθούν στο τµήµα του κώδικα µε την οδηγία dw, αλλά διαβάζονται byte προς byte µε την εντολή MOVC. Μεταβλητή, στην assembly, είναι µία ή περισσότερες θέσεις µνήµης. Το περιεχόµενο των θέσεων µνήµης µπορεί να µεταβάλλεται. Εάν ορίσετε ένα σύµβολο ή µία ετικέτα για να δείξετε σε θέσεις µνήµης και να χειρίζεστε το περιεχόµενό τους, τότε µπορείτε να θεωρήσετε ότι ορίζετε µία µεταβλητή. Εάν ορίζετε ένα σύµβολο ή µία ετικέτα για να το χρησιµοποιήσετε µε #, τότε µπορείτε να θεωρήσετε ότι ορίζετε µία σταθερά. Μη συγχέετε τις σταθερές και τις µεταβλητές µε το γεγονός ότι κάποιες διευθύνσεις πρέπει να είναι στάνταρ και ορίζονται σαν σύµβολα, ενώ άλλες τις αφήνουµε να ορίζονται από τον assembler σαν ετικέτες. Άσκηση 9-8 (Χρήση της MOVC για διάβασµα πίνακα σταθερών) ηµιουργήστε µε τη χρήση της οδηγίας db έναν πίνακα στη µνήµη προγράµµατος, µε τις τιµές του ηµίτονου των γωνιών από 0 µέχρι 90, πολλαπλασιασµένες επί 100. Στη συνέχεια, γράψτε µία υπορουτίνα GETSIN µε χρήση της εντολής MOVC που να διαβάζει στον Α την τιµή του ηµιτόνου. Λύση Για την εύρεση των τιµών του πίνακα, δηµιουργήστε το επόµενο αρχείο Excel. Α1=0, Α2=Α1+1, Α3...Α91:επέκταση του Α2, Β1=INT(100*(SIN(A2*3,14159/180))+0,5), Β2...Β91=επέκταση του Β1. Μεταφέρετε τις τιµές από το Excel στο µvision2 και δηµιουργήστε τον πίνακα. GETSIN: INC A MOVC RET SIN: db 0, 2, 3, 5, 7, 9,10,12,14,16 db 17,19,21,22,24,26,28,29,31,33 db 34,36,37,39,41,42,44,45,47,48 db 50,52,53,54,56,57,59,60,62,63 db 64,66,67,68,69,71,72,73,74,75

113 9. ΟΜΗΜΕΝΗ ΣΥΜΒΟΛΟΜΕΤΑΦΡΑΣΗ Σελ.113 db 77,78,79,80,81,82,83,84,85,86 db 87,87,88,89,90,91,91,92,93,93 db 94,95,95,96,96,97,97,97,98,98 db 98,99,99,99,99,100,100,100,100,100 db 100 Η ρουτίνα GETSIN καλείται µε τον Α να περιέχει την τιµή από 0 µέχρι 90 της γωνίας. Αυτή επιστρέφει, πάλι στον Α, την τιµή [100*sin(A)]. Η εντολή MOVC διαβάζει από τη µνήµη προγράµµατος από τη διεύθυνση που σχηµατίζεται προσθέτοντας τα περιεχόµενα του απαριθµητή προγράµµατος PC και του Α. Ο πίνακας πρέπει να µπει κάτω από τη RET. Για να υπερπηδηθεί η RET, πρέπει το περιεχόµενο του Α να αυξηθεί κατά 1. Για να πάρετε την τιµή του ηµιτόνου από το κυρίως πρόγραµµα, πρέπει να δώσετε τις εντολές MOV A,γωνία και CALL GETSIN Οδηγίες διασύνδεσης προγράµµατος Οι οδηγίες αυτές είναι απαραίτητες, όταν χρησιµοποιούνται διαφορετικά modules και κατ επέκταση, αρχεία για να δηµιουργήσουν ένα εκτελέσιµο πρόγραµµα. Η οδηγία name χρησιµοποιείται, για να δίνει όνοµα σε ένα module. Αν δεν υπάρχει, το module κληρονοµεί ως όνοµα το όνοµα του αρχείου. Οι οδηγίες public και extrn (external) είναι απαραίτητες, για να µπορούµε, µέσα σε ένα αρχείο, να χρησιµοποιούµε σύµβολα που ορίστηκαν σε άλλα αρχεία. Οι οδηγίες αυτές χρησιµοποιούνται πάντοτε σε συνδυασµό. Στο Σχήµα 9-2 φαίνεται σχηµατικά ο τρόπος συνεργασίας των οδηγιών public και extrn σε δύο αρχεία source1.a51 και source2.a51 που θα παράγουν µε τη βοήθεια του linker ένα εκτελέσιµο κώδικα. Βλέπε και Σχήµα 9-1 στη σελ. 98. Σχήµα 9-2. Χρήση των οδηγιών public και extrn Άσκηση 9-9 (Χρήση των οδηγιών public και extrn) Το παρακάτω πρόγραµµα (MulDivMain.A51) πολλαπλασιάζει και διαιρεί δύο αριθµούς, µε χρήση δύο ρουτινών, MULTIPLY και DIVIDE, που αποθηκεύονται σε 2o αρχείο, το MulDivRout.A51. Έχουµε, έτσι, δύο modules σε δύο ξεχωριστά αρχεία. Αρχείο MulDivMain.A51 extrn code(multiply, DIVIDE) extrn data(mem1, MEM2) MOV MEM1,#10 MOV MEM2,#2 CALL MULTIPLY CALL DIVIDE

114 9. ΟΜΗΜΕΝΗ ΣΥΜΒΟΛΟΜΕΤΑΦΡΑΣΗ Σελ.114 HALT: JMP HALT end Αρχείο MulDivRout.A51 MEM1: ds 1 MEM2: ds 1 MEM3: ds 1 MEM4: ds 1 MEM5: ds 1 MEM6: ds 1 public MULTIPLY, DIVIDE dseg at 30h cseg at 20h MULTIPLY: MOV A,MEM1 MOV B,MEM2 MUL AB MOV MEM3,Β MOV MEM4,Α RET DIVIDE: MOV A,MEM1 MOV B,MEM2 DIV AB MOV MEM5,Β MOV MEM6,Α RET end α) Ελέγξτε τα προγράµµατα για λάθη. ηµιουργήστε ένα καινούργιο project MulDiv µε τα δύο αρχεία, µεταφράστε τα και συνδέστε τα. Τρέξτε το πρόγραµµα στον debugger. Μη λησµονήσετε να εντάξετε στο Source Group 1 και το αρχείο MulDivMain.A51 και το MulDivRout.A51. β) Μελετήστε τα δύο αρχεία listing και το αρχείο map. Σε ποια κατηγορία ανήκουν τα segments, πώς ονοµάζονται, ποιο χώρο καταλαµβάνουν και σε ποια µνήµη; γ) Αφαιρέστε τον προσδιορισµό at 20h από το δεύτερο αρχείο, αφήνοντας µόνο την οδηγία cseg και µεταφράστε ξανά. Ποιο είναι το πρόβληµα; Αφαιρέστε όλη την οδηγία cseg at 20h και επαναλάβετε. δ) Τι πλεονέκτηµα θα είχαµε, αν δηλώναµε τις θέσεις µνήµης στο MulDivMain.A51 και τις παίρναµε extrn στο MulDivRout.A51; Λύση α) Το δεύτερο πρόγραµµα έχει το λάθος ότι δε δηλώνει public τις δύο µεταβλητές ΜΕΜ1 και ΜΕΜ2, που δηλώνει extrn το πρώτο. β) Το αρχείο MulDivMain.lst θα είναι το εξής. A51 MACRO ASSEMBLER MULDIVMAIN 03/21/ :03:19 PAGE 1 MACRO ASSEMBLER A51 V6.01 OBJECT MODULE PLACED IN.\MulDivMain.OBJ ASSEMBLER INVOKED BY: C:\Archimedes\C51\BIN\A51.EXE.\MulDivMain.A51 SET(SMALL) DEBUG EP

115 9. ΟΜΗΜΕΝΗ ΣΥΜΒΟΛΟΜΕΤΑΦΡΑΣΗ Σελ.115 LOC OBJ LINE SOURCE 1 extrn code(multiply, DIVIDE) 2 extrn data(mem1, MEM2) A F 4 MOV MEM1,# F 5 MOV MEM2,# F 7 CALL MULTIPLY F 8 CALL DIVIDE 9 000C 80FE 10 HALT: JMP HALT end A51 MACRO ASSEMBLER MULDIVMAIN 03/21/ :03:19 PAGE 2 SYMBOL TABLE LISTING N A M E T Y P E V A L U E ATTRIBUTES DIVIDE C ADDR HALT C ADDR 000CH MEM D ADDR MEM D ADDR MULTIPLY..... C ADDR EXT A EXT EXT EXT REGISTER BANK(S) USED: 0 ASSEMBLY COMPLETE. 0 WARNING(S), 0 ERROR(S) Το αρχείο MulDivRout.lst θα είναι το εξής. A51 MACRO ASSEMBLER MULDIVROUT 03/21/ :03:19 PAGE 1 MACRO ASSEMBLER A51 V6.01 OBJECT MODULE PLACED IN.\MulDivRout.OBJ ASSEMBLER INVOKED BY: C:\Archimedes\C51\BIN\A51.EXE.\MulDivRout.A51 SET(SMALL) DEBUG EP LOC OBJ LINE SOURCE 1 public MULTIPLY,DIVIDE,MEM1,MEM dseg at 30h MEM1: ds MEM2: ds MEM3: ds MEM4: ds MEM5: ds MEM6: ds cseg at 20h MULTIPLY: 0020 E MOV A,MEM F0 16 MOV B,MEM A4 17 MUL AB F MOV MEM3,B

116 9. ΟΜΗΜΕΝΗ ΣΥΜΒΟΛΟΜΕΤΑΦΡΑΣΗ Σελ F MOV MEM4,A 002B RET C E DIVIDE: MOV A,MEM1 002E 8531F0 23 MOV B,MEM DIV AB F MOV MEM5,B 0035 F MOV MEM6,A RET end A51 MACRO ASSEMBLER MULDIVROUT 03/21/ :03:19 PAGE 2 SYMBOL TABLE LISTING N A M E T Y P E V A L U E ATTRIBUTES B D ADDR 00F0H A DIVIDE C ADDR 002CH A MEM D ADDR 0030H A MEM D ADDR 0031H A MEM D ADDR 0032H A MEM D ADDR 0033H A MEM D ADDR 0034H A MEM D ADDR 0035H A MULTIPLY..... C ADDR 0020H A REGISTER BANK(S) USED: 0 ASSEMBLY COMPLETE. 0 WARNING(S), 0 ERROR(S) Το αρχείο MulDiv.M51 θα είναι το εξής. BL51 BANKED LINKER/LOCATER V /21/ :03:20 PAGE 1 BL51 BANKED LINKER/LOCATER V4.01, INVOKED BY: C:\ARCHIMEDES\C51\BIN\BL51.EXE MulDivMain.obj, MulDivRout.obj TO MulDiv RAMSIZE (256) INPUT MODULES INCLUDED: MulDivMain.obj (MULDIVMAIN) MulDivRout.obj (MULDIVROUT) LINK MAP OF MODULE: MulDiv (MULDIVMAIN) TYPE BASE LENGTH RELOCATION SEGMENT NAME * * * * * * * D A T A M E M O R Y * * * * * * * REG 0000H 0008H ABSOLUTE "REG BANK 0" 0008H 0028H *** GAP *** DATA 0030H 0006H ABSOLUTE * * * * * * * C O D E M E M O R Y * * * * * * * CODE 0000H 000EH ABSOLUTE 000EH 0012H *** GAP *** CODE 0020H 0018H ABSOLUTE SYMBOL TABLE OF MODULE: MulDiv (MULDIVMAIN) VALUE TYPE NAME

117 9. ΟΜΗΜΕΝΗ ΣΥΜΒΟΛΟΜΕΤΑΦΡΑΣΗ Σελ MODULE MULDIVMAIN C:000CH SYMBOL HALT C:0000H LINE# 4 C:0003H LINE# 5 C:0006H LINE# 7 C:0009H LINE# 8 C:000CH LINE# ENDMOD MULDIVMAIN MODULE MULDIVROUT C:002CH PUBLIC DIVIDE D:0030H PUBLIC MEM1 D:0031H PUBLIC MEM2 C:0020H PUBLIC MULTIPLY D:00F0H SYMBOL B D:0032H SYMBOL MEM3 D:0033H SYMBOL MEM4 D:0034H SYMBOL MEM5 D:0035H SYMBOL MEM6 C:0020H LINE# 15 C:0022H LINE# 16 C:0025H LINE# 17 C:0026H LINE# 18 C:0029H LINE# 19 C:002BH LINE# 20 C:002CH LINE# 22 C:002EH LINE# 23 C:0031H LINE# 24 C:0032H LINE# 25 C:0035H LINE# 26 C:0037H LINE# ENDMOD MULDIVROUT ************************************************************ * RESTRICTED VERSION WITH 0800H BYTE CODE SIZE LIMIT; USED: * 0026H BYTE ( 1%) * ************************************************************ LINK/LOCATE RUN COMPLETE. 0 WARNING(S), 0 ERROR(S) ηµιουργούνται τρία absolute segments χωρίς όνοµα: ένα data από d:30h µέχρι d:35h, ένα code από c:0 µέχρι c:0dh και ένα ακόµη code από c:20h µέχρι c:37h. γ) Αφαιρώντας τον προσδιορισµό at 20h από την οδηγία cseg στο δεύτερο αρχείο, εµφανίζεται η προειδοποίηση (warning) «code space memory overlap», δηλαδή «επικάλυψη του χώρου της µνήµης κώδικα». Αυτό συµβαίνει επειδή ο κώδικας στο δεύτερο αρχείο τοποθετείται πάλι από τη διεύθυνση 0 και µετά, επικαλύπτοντας τον κώδικα που είχε παραχθεί στις ίδιες διευθύνσεις από το ίδιο αρχείο. Αφαιρώντας τελείως την οδηγία cseg στο δεύτερο αρχείο, εµφανίζει λάθος σε όλες τις εντολές που έπονται. Αυτό συµβαίνει, επειδή θεωρεί το µvision2 ότι συνεχίζει το data segment που ορίσατε πιο πάνω, µε την οδηγία dseg. δ) Αν δηλώναµε τις θέσεις µνήµης στο κυρίως πρόγραµµα και τις παίρναµε extrn στις υπορουτίνες, το δεύτερο αρχείο θα ήταν ως εξής. public MULTIPLY,DIVIDE extrn MEM1,MEM2,MEM3,MEM4,MEM5,MEM6 cseg at 20h MULTIPLY: MOV A,MEM1 MOV B,MEM2

118 9. ΟΜΗΜΕΝΗ ΣΥΜΒΟΛΟΜΕΤΑΦΡΑΣΗ Σελ.118 MUL AB MOV MEM3,B MOV MEM4,A RET DIVIDE: MOV A,MEM1 MOV B,MEM2 DIV AB MOV MEM5,B MOV MEM6,A RET end Οι υπορουτίνες είναι τώρα πιο γενικές, επειδή µπορούν να χειριστούν οποιεσδήποτε θέσεις µνήµης ήθελε να δηλώσει ένα κυρίως πρόγραµµα σαν ΜΕΜ1, ΜΕΜ2, κλπ. Άσκηση 9-10 ( ιασύνδεση absolute modules) Ένα πρόγραµµα πρόκειται να σχηµατιστεί από τη σύνδεση τριών modules: 1. Το κυρίως πρόγραµµα θα περιέχεται στο αρχείο MulDiv_abs.A51. Θα ορίζει τις µεταβλητές NUMA, NUMB του ενός byte και τις RES_MUL και RES_DIV των 2 bytes. Επίσης, 8α καλεί τις υπορουτίνες MULTIPLY και DIVIDE που πολλαπλασιάζουν και διαιρούν τα περιεχόµενα των NUMA και NUMB. 2. Η υπορουτίνα MULTIPLY θα περιέχεται στο αρχείο Mul_abs.A51. Θα πολλαπλασιάζει τα περιεχόµενα των NUMA και NUMB και θα γράφει το αποτέλεσµα στις θέσεις RESMUL και RESMUL Η υπορουτίνα DIVIDE θα περιέχεται στο αρχείο Div_abs.A51. Θα διαιρεί το περιεχόµενο του NUMA δια του NUMB και θα γράφει το αποτέλεσµα στις θέσεις RESDIV και RESDIV+1. ηµιουργήστε το project MulDiv_abs, γράψτε τα τρία προγράµµατα, παράγετε τον κώδικα και δοκιµάστε τον στον προσοµοιωτή του µvision2. Λύση Τα τρία αρχεία θα είναι τα εξής. ;1. Αρχείο MulDiv_abs.A51 ; extrn code(multiply,divide) public NUMA,NUMB,RES_MUL,RES_DIV NUMA: ds 1 NUMB: ds 1 RES_MUL:ds 2 RES_DIV:ds 2 dseg at 30h cseg at 0 MOV NUMA,#10 MOV NUMB,#2 CALL MULTIPLY CALL DIVIDE HALT: JMP HALT end

119 9. ΟΜΗΜΕΝΗ ΣΥΜΒΟΛΟΜΕΤΑΦΡΑΣΗ Σελ.119 ;2. Αρχείο Mul_abs.A51 ; extrn data(numa,numb,res_mul) public MULTIPLY cseg at 20h MULTIPLY: MOV A,NUMA MOV B,NUMB MUL AB MOV RES_MUL,B MOV RES_MUL+1,A RET end ;3. Αρχείο Div_abs.A51 ; extrn data(numa,numb,res_div) public DIVIDE cseg at 40h DIVIDE: MOV A,NUMA MOV B,NUMB DIV AB MOV RES_DIV,A MOV RES_DIV+1,B RET end Υπάρχει πρόβληµα στη διαχείριση των modules, στην άσκηση αυτή, που εύκολα µπορείτε να εντοπίσετε. Θα πρέπει, όταν ακόµη γράφουµε το πρόγραµµα, να δηλώνουµε τις διευθύνσεις στις οποίες θέλουµε να τοποθετηθεί ο κώδικας. Όταν, όµως, γράφουµε ρουτίνες γενικής χρήσης (που θέλουµε, δηλαδή, να τις καλούµε από διάφορα προγράµµατα), δεν µπορούµε να ξέρουµε τη διεύθυνση στην οποία θα βρεθεί ο κώδικας. Είναι αδύνατο να προσδιοριστεί η διεύθυνση στην οποία θα τοποθετηθούν οι υπορουτίνες γενικής χρήσης. Γι αυτό, πρέπει οι υπορουτίνες αυτές να είναι relocatable. Έτσι, θα µπορεί ο linker να διευθετήσει στη µνήµη µόνος του τα modules. Άσκηση 9-11 ( ιασύνδεση relocatable modules) Επαναλάβετε την προηγούµενη άσκηση, κάνοντας relocatable τα modules των υπορουτινών. ηµιουργήστε ένα νέο project µε όνοµα MulDiv_rel που να περιέχει τα modules MulDiv_rel.A51, Mul_rel.A51 και Div_rel.A51. Μελετήστε το αρχείο map και εντοπίστε τις διευθύνσεις όπου τελικά τοποθετήθηκαν τα δύο relocatable modules. Λύση Το κυρίως πρόγραµµα MulDiv_rel.A51 θα είναι το ίδιο µε το MulDiv_abs.A51 της προηγούµενης άσκησης. Η υπορουτίνα πολλαπλασιασµού θα είναι: ;2. Αρχείο Mul_rel.A51 ; extrn data(numa,numb,res_mul) public MULTIPLY

120 9. ΟΜΗΜΕΝΗ ΣΥΜΒΟΛΟΜΕΤΑΦΡΑΣΗ Σελ.120 MULTSEG segment code rseg MULTSEG MULTIPLY: MOV A,NUMA MOV B,NUMB MUL AB MOV RES_MUL,B MOV RES_MUL+1,A RET end Η υπορουτίνα διαίρεσης θα είναι: ;3. Αρχείο Div_rel.A51 ; extrn data(numa,numb,res_div) public DIVIDE DIVSEG segment code rseg DIVSEG DIVIDE: MOV A,NUMA MOV B,NUMB DIV AB MOV RES_DIV,A MOV RES_DIV+1,B RET end Από το αρχείο MulDiv_rel.M51 παρατηρούµε ότι το segment MULTSEG έχει τοποθετηθεί στις διευθύνσεις 4000h µέχρι 400Bh και το segment DIVSEG στις 400Ch µέχρι 400Ch+0Ch-1. Η τοποθέτηση στις υψηλές αυτές διευθύνσεις είναι ένας από τους περιορισµούς που θέτει η demo version του προγράµµατος µvision2. Το πρόβληµα που λύθηκε στην προηγούµενη άσκηση ήταν να συνδεθούν χωρίς επικάλυψη τα code segments των υπορουτινών χωρίς, να δηλώσουµε εµείς τις διευθύνσεις τους. Το ίδιο πρόβληµα µπορεί όµως να προκύψει και σε data segment. Όταν µία υπορουτίνα πρέπει να δηλώσει δικές της µεταβλητές, τότε εύκολα καταλααίνετε ότι θα πρέπει να δηλωθούν οι µεταβλητές σε relocatable data segments. Άσκηση 9-12 ( ιασύνδεση relocatable modules µε relocatable data segments) Επαναλάβετε την προηγούµενη άσκηση µε την εξής αλλαγή. Οι δύο θέσεις µνήµης RES_MUL να ορίζονται στο αρχείο Mul_relD.A51 και οι δύο θέσεις µνήµης RES_DIV να ορίζονται στο αρχείο Div_relD.A51. ηµιουργήστε ένα νέο project MulDiv_relD. Τρέξτε, βηµατικά και πολύ προσεκτικά, το πρόγραµµα στο µvision2. Λύση Τα τρία modules θα είναι τα εξής. ;1. Αρχείο MulDiv_relD.A51 ; extrn code(multiply,divide) extrn data(res_mul,res_div) public NUMA,NUMB dseg at 30h NUMA: ds 1 NUMB: ds 1

121 9. ΟΜΗΜΕΝΗ ΣΥΜΒΟΛΟΜΕΤΑΦΡΑΣΗ Σελ.121 cseg at 0 MOV NUMA,#10 MOV NUMB,#2 CALL MULTIPLY CALL DIVIDE HALT: JMP HALT end ;2. Αρχείο Mul_relD.A51 ; public MULTIPLY,RES_MUL extrn data(numa,numb) MDATSEG segment data rseg MDATSEG RES_MUL:ds 2 MULTSEG segment code rseg MULTSEG MULTIPLY: MOV A,NUMA MOV B,NUMB MUL AB MOV RES_MUL,B MOV RES_MUL+1,A RET end ;3. Αρχείο Div_relD.A51 ; public DIVIDE,RES_DIV extrn data(numa,numb) VDATSEG segment data rseg VDATSEG RES_DIV:ds 2 DIVSEG segment code rseg DIVSEG DIVIDE: MOV A,NUMA MOV B,NUMB DIV AB MOV RES_DIV,A MOV RES_DIV+1,B RET end Τρέχοντας το πρόγραµµα βηµατικά στον debugger, παρατηρούµε ότι µετά την εντολή RET δεν επιστρέφει στο κυρίως πρόγραµµα, αλλά «χάνεται» σε λάθος διευθύνσεις στη µνήµη κώδικα. Αυτό συµβαίνει, επειδή «ξεχάστηκε» η τιµή reset 07h στο δείκτη του σωρού. Παρατηρώντας, όµως, τα relocatable data segments, βλέπουµε ότι στις ίδιες διευθύνσεις έχουν τοποθετηθεί οι µεταβλητές του προγράµµατός µας. Γράφοντας στην πρώτη µεταβλητή του MDATSEG, γράφουµε στο σωρό, χαλώντας τη διεύθυνση επιστροφής.

122 9. ΟΜΗΜΕΝΗ ΣΥΜΒΟΛΟΜΕΤΑΦΡΑΣΗ Σελ.122 TYPE BASE LENGTH RELOCATION SEGMENT NAME * * * * * * * D A T A M E M O R Y * * * * * * * REG 0000H 0008H ABSOLUTE "REG BANK 0" DATA 0008H 0002H UNIT MDATSEG DATA 000AH 0002H UNIT VDATSEG 000CH 0024H *** GAP *** DATA 0030H 0002H ABSOLUTE * * * * * * * C O D E M E M O R Y * * * * * * * CODE 0000H 000EH ABSOLUTE 000EH 3FF2H *** GAP *** CODE 4000H 000CH UNIT MULTSEG CODE 400CH 000CH UNIT DIVSEG Για να αντιµετωπίσουµε το πρόβληµα αυτό, πρέπει να ορίσουµε και το σωρό σε ένα relocatable segment, αυτή τη φορά τύπου idata. Το βασικό πρόγραµµα λοιπόν, πρέπει να είναι ως εξής. ;1. Αρχείο MulDiv_relD.A51 ; extrn code(multiply,divide) extrn data(res_mul, RES_DIV) public NUMA,NUMB STOIBA segment idata rseg STOIBA ds 16 dseg at 30h NUMA: ds 1 NUMB: ds 1 cseg at 0 MOV NUMA,#10 MOV NUMB,#2 CALL MULTIPLY CALL DIVIDE HALT: JMP HALT end Ο νέος χάρτης διασύνδεσης (link map) στο αρχείο MulDiv_relD.M51 θα είναι: TYPE BASE LENGTH RELOCATION SEGMENT NAME * * * * * * * D A T A M E M O R Y * * * * * * * REG 0000H 0008H ABSOLUTE "REG BANK 0" DATA 0008H 0002H UNIT MDATSEG DATA 000AH 0002H UNIT VDATSEG 000CH 0024H *** GAP *** DATA 0030H 0002H ABSOLUTE IDATA 0032H 0010H UNIT STOIBA * * * * * * * C O D E M E M O R Y * * * * * * * CODE 0000H 000EH ABSOLUTE 000EH 3FF2H *** GAP *** CODE 4000H 000CH UNIT MULTSEG CODE 400CH 000CH UNIT DIVSEG

123 9. ΟΜΗΜΕΝΗ ΣΥΜΒΟΛΟΜΕΤΑΦΡΑΣΗ Σελ.123 Προσέξτε τον τρόπο που ορίζεται η περιοχή της στοίβας STOIBA σαν επανατοποθετήσιµο τµήµα των 16 bytes στην έµµεση RAM (i:00h... i:0ffh). Το µvision2 έχει τη δυνατότητα να ρυθµιστεί, ώστε το τµήµα της στοίβας να µπαίνει τελευταίο, µετά από όλα τα δεδοµένα. Έτσι, περιορίζεται ο κίνδυνος να µεγαλώσει η στοίβα πάνω από τον προϋπολογισµένο χώρο (16 bytes στο παράδειγµα) και να αρχίσει να σβήνει χρήσιµα δεδοµένα. Για να µπαίνει το τµήµα της στοίβας πάντοτε τελευταίο, αρκεί να δηλώσετε το όνοµα του τµήµατος (π.χ. STOIBA) στην επιλογή του linker: <Debug>, <Options for Target>, <L51 Locate>, <Stack>. Για τον υπολογισµό του µεγέθους της στοίβας, το µvision2 διαθέτει την ένδειξη sp_max στο παράθυρο Regs. Μερικές φορές πρέπει να οριστεί µία µεταβλητή που να είναι προσπελάσιµη κατά bit, στην περιοχή, δηλαδή, από d:20h... d:2fh. Προστίθεται τότε στην οδηγία ορισµού segment ο προσδιορισµός bitaddressable, όπως φαίνεται στο επόµενο παράδειγµα. BITADDRVARS segment data bitaddressable rseg BITADDRVARS VAR1: ds 1 ;Η VAR1 θα οριστεί στην περιοχή d:20h-2fh Τέλος, µε τον προσδιορισµό inpage στην οδηγία segment, ορίζεται ένα segment που να βρίσκεται ολόκληρο σε µία σελίδα µνήµης. Η οδηγία αυτή χρησιµοποιείται κυρίως σε segments τύπου xdata, όταν θέλουµε να προσπελάσουµε τα δεδοµένα τους µε τις εντολές MOVX ή Η διεύθυνση των 16 bits που σχηµατίζει η εντολή αυτή αποτελείται από το όποιο περιεχόµενο έχουµε γράψει, µε προηγούµενη εντολή, στη θύρα Ρ2 σαν high byte και το περιεχόµενο του R0 σαν low byte. Για να µπορούµε να προσπελάσουµε εύκολα µία περιοχή µνήµης µε τις εντολές θα πρέπει όλη η περιοχή να βρίσκεται στην ίδια σελίδα µνήµης. Σελίδα µνήµης είναι 256 συνεχόµενες θέσεις µνήµης που έχουν ίδιο το high byte της διεύθυνσης. Π.χ. η σελίδα 0 περιλαµβάνει τις θέσεις από 0000h µέχρι 00FFh. Η σελίδα 18h περιλαµβάνει τις θέσεις µνήµης από 1800h µέχρι 18FFh. Ένα block µνήµης 64 KBytes αποτελείται από 256 σελίδες των 256 θέσεων. Κατά την εγκατάσταση του προγράµµατος µvision2, αντιγράφεται στον κατάλογο Directory_εγκατάστασης\C51\Asm το αρχείο Template.a51. Μπορείτε να χρησιµοποιείτε το αρχείο αυτό σαν οδηγό στα δικά σας προγράµµατα.

124 9. ΟΜΗΜΕΝΗ ΣΥΜΒΟΛΟΜΕΤΑΦΡΑΣΗ Σελ.124 Περιληπτικά, οι κυριότερες οδηγίες είναι οι εξής. Οδηγίες ορισµού συµβόλων (symbol definition directives) equ αναθέτει όνοµα σε αριθµό. set όπως η equ, αλλά µπορεί να οριστεί αργότερα µε διαφορετική τιµή. bit όπως η equ, αλλά ο αριθµός πρέπει να είναι ισχύουσα διεύθυνση bit και η ετικέτα αποκτά τύπο bit. data όπως η equ, αλλά ο αριθµός πρέπει να είναι ισχύουσα διεύθυνση εσωτερικής απευθείας RAM και η ετικέτα αποκτά τύπο data. idata όπως η equ, αλλά ο αριθµός πρέπει να είναι ισχύουσα διεύθυνση εσωτερικής έµµεσης RAM και η ετικέτα αποκτά τύπο idata. xdata όπως η equ, αλλά ο αριθµός πρέπει να είναι ισχύουσα διεύθυνση εξωτερικής RAM και η ετικέτα αποκτά τύπο xdata. code όπως η equ, αλλά ο αριθµός πρέπει να είναι ισχύουσα διεύθυνση ROM και η ετικέτα αποκτά τύπο code. Οδηγίες ελέγχου τµηµάτων µνήµης (memory segment control directives) cseg [at 100h] Οδηγεί τον assembler στο να γράφει στο τµήµα κώδικα. db Ορίζει bytes. Ισχύει µόνο στο τµήµα του κώδικα. dw Ορίζει words. Ισχύει µόνο στο τµήµα του κώδικα. ds εσµεύει χώρο. Χρησιµοποιείται σπάνια στο τµήµα του κώδικα. dseg iseg [at 30h] Ορίζει ένα τµήµα στην απευθείας RAM. ds εσµεύει χώρο από bytes στο τµήµα που χρησιµοποιείται. [at 80h] Ορίζει ένα τµήµα στην έµµεση RAM. ds εσµεύει χώρο από bytes στο τµήµα που χρησιµοποιείται. xseg [at 0] Ορίζει ένα τµήµα στην εξωτερική RAM. ds εσµεύει χώρο από bytes στο τµήµα που χρησιµοποιείται. bseg [at 0] Ορίζει ένα τµήµα στην κατά bit προσπελάσιµη RAM. dbit εσµεύει χώρο από bits. Χρησιµοποιείται µόνο σε bseg. Οδηγίες επανατοποθετούµενων τµηµάτων (relocatable module directives) segment bit / data / idata / xdata / code Ορίζει ένα τµήµα. rseg Ενεργοποιεί ένα τµήµα. public extrn bit / data / idata / xdata / code ιαθέτει ετικέτες και σύµβολα σε άλλα modules. Χρησιµοποιεί ετικέτες και σύµβολα που ορίστηκαν σε άλλα modules.

125 9. ΟΜΗΜΕΝΗ ΣΥΜΒΟΛΟΜΕΤΑΦΡΑΣΗ Σελ.125 Προβλήµατα 1. Το επόµενο πρόγραµµα χρησιµοποιεί όλους τους τρόπους ορισµού µιας µεταβλητής του ενός byte (τύπου character) στη συµβολική γλώσσα. Περιγράψτε τα πλεονεκτήµατα και τα µειονεκτήµατα του κάθε τρόπου. Τρέξτε το πρόγραµµα και εντοπίστε τις εγγραφόµενες σταθερές στη µνήµη. VAR1 VAR2 equ 31h data 32h dseg at 30h VAR3: ds 1 METABL segment data rseg METABL VAR4: ds 1 cseg at 0 MOV 30h,#0 ;Με χρήση της απόλυτης διεύθυνσης MOV VAR1,#1 ;Ορισµός µε equ (τύπος number) MOV VAR2,#2 ;Τύπος data µε απόλυτη διεύθυνση MOV VAR3,#3 ;Τύπος data σε απόλυτο data segment MOV VAR4,#4 ;Τύπος data σε relocatable data segment JMP $ end 2. α) Τι κοινό έχουν και τι διαφέρουν οι bit και dbit; β) Σε ένα code segment, τι κοινό έχει και τι διαφέρει η χρήση της ds από την db; 3. α) Τι πλεονεκτήµατα παρουσιάζει η χρήση της οδηγίας ds για τον ορισµό µεταβλητών έναντι της equ, σε προγράµµατα του ενός module; β) Τι κοινό έχουν και τι διαφέρουν οι οδηγίες org 100h και cseg at 100h; 4. Πώς θα µπορούσαµε να ορίσουµε έναν πίνακα στη συµβολική γλώσσα του 8051 µε πάνω από 256 θέσεις; Πώς θα µπορούσαµε να ορίσουµε έναν πίνακα του οποίου κάθε θέση θα περιέχει έναν αριθµό των 2 bytes; 5. Γράψτε µία υπορουτίνα γενικής χρήσης MUL8S που να πολλαπλασιάζει δύο προσηµασµένους αριθµούς NUMA και NUMB του 1 byte (signed char). Το αποτέλεσµα να φυλάγεται στις θέσεις RESULT. Γράψτε, στη συνέχεια, ένα κυρίως πρόγραµµα που να ορίζει τις µεταβλητές και να καλεί τη MUL8S. Γράψτε όλα τα τµήµατα, που θα δηµιουργηθούν κατά τη µετάφραση, τα ονόµατά τους και τις διευθύνσεις τους. Επαληθεύστε, µεταφράζοντας. 6. Με βάση την Άσκηση 6-7, γράψτε µία υπορουτίνα που να αντιστρέφει τη σειρά των bits της θέσης µνήµης που δείχνει ο R0. Στη συνέχεια, γράψτε ένα κυρίως πρόγραµµα που να καλεί την υπορουτίνα και να αντιστρέφει τη σειρά των bits των θέσεων µνήµης 08h µέχρι 0Fh.

126 9. ΟΜΗΜΕΝΗ ΣΥΜΒΟΛΟΜΕΤΑΦΡΑΣΗ Σελ.126

127 10. ΕΚΣΦΑΛΜΑΤΩΣΗ (DEBUGGING) Μέχρις εδώ, εξαντλήθηκε το ρεπερτόριο εντολών του Στο κεφάλαιο αυτό θα αναπτυχθούν τα εργαλεία που διαθέτει ο debugger του µvision2 για την εκσφαλµάτωση των προγραµµάτων. Κανένα πρόγραµµα δεν τρέχει χωρίς λάθη αµέσως µετά τη συγγραφή του. Την πρώτη φορά που θα µεταφραστεί, θα εµφανιστούν συντακτικά λάθη, που είναι εύκολο να διορθωθούν, επειδή υποδεικνύονται από τον ίδιο τον assembler. Τα δυσκολότερα όµως λάθη στην ανίχνευση και στη διόρθωση είναι τα λογικά. Για τα λάθη αυτά χρειάζονται επί πλέον εργαλεία. Η διαδικασία διόρθωσης των σφαλµάτων σε ένα πρόγραµµα λέγεται εκσφαλµάτωση. Για την εκσφαλµάτωση ενός προγράµµατος είναι απαραίτητο: Να µπορείτε να διακόψετε το πρόγραµµα, για να ελέγξετε τα περιεχόµενα των καταχωρητών και της µνήµης. Να παρακολουθείτε τη ροή του προγράµµατος, δηλαδή από ποιες εντολές πέρασε το πρόγραµµα. Να παρακολουθείτε τις µεταβλητές του προγράµµατος ΕΚΤΕΛΕΣΗ ΣΕ ΠΛΗΡΗ ΤΑΧΥΤΗΤΑ Υπάρχουν τρεις τρόποι εκτέλεσης του προγράµµατος σε πλήρη ταχύτητα. 1) <Run> Εκτελείται το πρόγραµµα σε πλήρη ταχύτητα. 2) <Run to cursor line> Εκτελείται το πρόγραµµα σε πλήρη ταχύτητα, µέχρι να φτάσει στην εντολή που έχετε βάλει τον cursor, µε απλό κλικ. 3) <StepOut> Εκτελείται η ρουτίνα µετά από παύση της εκτέλεσής της, µέχρι να συναντηθεί στο κυρίως πρόγραµµα η εντολή η επόµενη της κλήσης της ρουτίνας. Εάν δεν είστε µέσα σε ρουτίνα, το µπουτόν αυτό δεν κάνει τίποτε. Άσκηση 10-1 (Εκσφαλµάτωση µε εκτέλεση σε πλήρη ταχύτητα) Το επόµενο πρόγραµµα παρουσιάζει λογικό σφάλµα. Θα έπρεπε να αυξάνει δεκαδικά τη θέση µνήµης 30h, να εκτελεί τη ρουτίνα χρονικής καθυστέρησης DELAY και να επαναλαµβάνεται. Βάλτε σε ένα από τα παράθυρα µνήµης να εµφανίζεται η διεύθυνση d:30h και επιλέξτε <View>, <Periodic Window Update>, ώστε να ενηµερώνονται τα παράθυρα, όταν το πρόγραµµά σας εκτελείται. Εκτελέστε το, καταρχήν, σε πλήρη ταχύτητα και βεβαιωθείτε ότι το περιεχόµενο της θέσης µνήµης 30h µένει αµετάβλητο. Χρησιµοποιήστε τα εργαλεία reset ( ), παύσης εκτέλεσης ( ) καθώς και τα τρία εργαλεία εκτέλεσης σε πλήρη ταχύτητα που περιγράφηκαν, για να εντοπίσετε το λάθος. LOOP: MOV A,30h ;Πρόγραµµα για εκσφαλµάτωση ADD A,#1 DA A MOV 30h,A CALL DELAY JMP LOOP DELAY: MOV 31h,#03h MOV 32h,#04h DELAY2: DJNZ 32h,DELAY2 DJNZ 31h,DELAY RET end

128 10. ΕΚΣΦΑΛΜΑΤΩΣΗ (DEBUGGING) Σελ.128 Λύση Κάνουµε κλικ στο εικονίδιο και το πρόγραµµα εκτελείται σε πλήρη ταχύτητα. Παρατηρούµε στο παράθυρο της µνήµης ότι µεταβάλλονται τα περιεχόµενα των θέσεων 31h και 32h που χρησιµοποιούνται ως µετρητές του βρόχου DELA