ΚΕΦΑΛΑΙΟ 1dima/wp-content/uploads/... · 1 ΚΕΦΑΛΑΙΟ 1 Ο ... διαιρέσεις....

130
1 ΚΕΦΑΛΑΙΟ 1 Ο ΜΙΚΡΟΕΠΕΞΕΡΓΑΣΤΗΣ 8086 Με την ανάπτυξη του μικροεπεξεργαστή 8086 της Intel, έχουμε (από το 1978) την εμφάνιση της γενιάς των υπολογιστών των 16-bit. Στις επόμενες παραγράφους θα εξεταστεί η δομή του, καθώς και μερικές από τις ιδιαιτερότητες του. 1.ΕΣΩΤΕΡΙΚΗ ΟΡΓΑΝΩΣΗ ΤΟΥ 8086 Ο 8086 μπορεί να θεωρηθεί ότι αποτελείται από δύο τμήματα επεξεργαστές”, όπως φαίνεται και στο σχήμα 1, οι οποίοι είναι: Σχήμα 1 - Η μονάδα εκτέλεσης (EU, Execution Unit), όπου γίνεται η επεξεργασία των στοιχείων. Η μονάδα αυτής περιέχει καταχωρητές δεδομένων, καταχωρητές δείκτες, τον καταχωρητή κατάστασης, την αριθμητική λογική μονάδα και την μονάδα ελέγχου. - Η μονάδα διασύνδεσης (BIU, Bus Interface Unit) μέσω της οποίας επικοινωνεί ο μ/ε με το περιβάλλον του νήμη και περιφερειακές συσκευές). Η μονάδα διασύνδεσης διαχειρίζεται όλες τις επικοινωνίες των διαύλων με την μνήμη και Ι/Ο. Η μονάδα αυτή περιέχει τους καταχωρητές τμημάτων, τον καταχωρητή δείκτη εντολής (Instruction Pointer, IP), ένα ειδικό αθροιστή για τον σχηματισμό διευθύνσεων, μια ούρα αναμονής των επόμενων προς εκτέλεση εντολών μεγέθους έξη bytes και μια λογική μονάδα ελέγχου των αγωγών επικοινωνίας. Οι δύο αυτές μονάδες εργάζονται ασύγχρονα και παράλληλα σε "pipeline", όπως λέγεται, δηλαδή η EU όταν είναι ελεύθερη μεταφέρει μια εντολή από την κεφαλή της

Transcript of ΚΕΦΑΛΑΙΟ 1dima/wp-content/uploads/... · 1 ΚΕΦΑΛΑΙΟ 1 Ο ... διαιρέσεις....

Page 1: ΚΕΦΑΛΑΙΟ 1dima/wp-content/uploads/... · 1 ΚΕΦΑΛΑΙΟ 1 Ο ... διαιρέσεις. BX ∆είκτης για έµµεσο τρόπο προσδιορισµού διευθύνσεων

1

ΚΕΦΑΛΑΙΟ 1 Ο ΜΙΚΡΟΕΠΕΞΕΡΓΑΣΤΗΣ 8086 Με την ανάπτυξη του µικροεπεξεργαστή 8086 της Intel, έχουµε (από το 1978) την εµφάνιση της γενιάς των υπολογιστών των 16-bit. Στις επόµενες παραγράφους θα εξεταστεί η δοµή του, καθώς και µερικές από τις ιδιαιτερότητες του. 1.ΕΣΩΤΕΡΙΚΗ ΟΡΓΑΝΩΣΗ ΤΟΥ 8086 Ο 8086 µπορεί να θεωρηθεί ότι αποτελείται από δύο τµήµατα “επεξεργαστές”, όπως φαίνεται και στο σχήµα 1, οι οποίοι είναι:

Σχήµα 1

- Η µονάδα εκτέλεσης (EU, Execution Unit), όπου γίνεται η επεξεργασία των στοιχείων. Η µονάδα αυτής περιέχει καταχωρητές δεδοµένων, καταχωρητές δείκτες, τον καταχωρητή κατάστασης, την αριθµητική λογική µονάδα και την µονάδα ελέγχου.

- Η µονάδα διασύνδεσης (BIU, Bus Interface Unit) µέσω της οποίας

επικοινωνεί ο µ/ε µε το περιβάλλον του (µνήµη και περιφερειακές συσκευές). Η µονάδα διασύνδεσης διαχειρίζεται όλες τις επικοινωνίες των διαύλων µε την µνήµη και Ι/Ο. Η µονάδα αυτή περιέχει τους καταχωρητές τµηµάτων, τον καταχωρητή δείκτη εντολής (Instruction Pointer, IP), ένα ειδικό αθροιστή για τον σχηµατισµό διευθύνσεων, µια ούρα αναµονής των επόµενων προς εκτέλεση εντολών µεγέθους έξη bytes και µια λογική µονάδα ελέγχου των αγωγών επικοινωνίας.

Οι δύο αυτές µονάδες εργάζονται ασύγχρονα και παράλληλα σε "pipeline", όπως λέγεται, δηλαδή η EU όταν είναι ελεύθερη µεταφέρει µια εντολή από την κεφαλή της

Page 2: ΚΕΦΑΛΑΙΟ 1dima/wp-content/uploads/... · 1 ΚΕΦΑΛΑΙΟ 1 Ο ... διαιρέσεις. BX ∆είκτης για έµµεσο τρόπο προσδιορισµού διευθύνσεων

2

ουράς αναµονής και ενώ την εκτελεί η BIU καλεί την επόµενη και την αποθηκεύει στο τέλος της ουράς αναµονής (queue) της BIU. Όταν η ουρά αδειάζει (π.χ. ύστερα από εντολές διακλάδωσης) η BIU εκτελεί ένα κύκλο µεταφοράς εντολής κατά τον οποίο ο µ/ε αναµένει την επόµενη προς εκτέλεση εντολή. Γενικά όµως η ουρά δεν είναι άδεια και εποµένως η EU δεν περιµένει κατά το κύκλο µεταφοράς. Οι αγωγοί επικοινωνίας (bus), για µεν το εσωτερικό του µ/ε έχουν εύρος 16 bits, ενώ για την επικοινωνία του µε τα υπόλοιπα κυκλώµατα του συστήµατος έχουν εύρος 20 bits. 2.ΚΑΤΑΧΩΡΗΤΕΣ 2.1 Καταχωρητές γενικής χρήσης και δεδοµένων (Data Registers). Οι καταχωρητές αυτοί είναι τέσσερις: AX (συσσωρευτής = accumulator), BX (βάσης = base), CX (µετρητής = counter), DX (δεδοµένων = data ). Καθένας από αυτούς µπορεί να χρησιµοποιηθεί σαν ένας 16-bit καταχωρητής ή σαν δύο ξεχωριστοί 8-bit καταχωρητές. Στην δεύτερη περίπτωση οι δύο οκτάδες δυαδικών ψηφίων που δηµιουργούνται ανά καταχωρητή συµβολίζονται µε τα γράµµατα H (High) και L (Low). Έτσι διακρίνουµε τους 8-bit καταχωρητές : AH, AL, BH, BL, CH, CL, DH, DL. Όλοι τους µπορούν να χρησιµοποιηθούν σε αριθµητικές πράξεις, περιστροφές µεταφορές από την µνήµη κ.α. , αλλά και ο καθένας από αυτούς παρουσιάζει και ορισµένες ιδιαιτερότητες οι οποίες είναι: ΑΧ Εργασίες εισόδου / εξόδου, διορθώσεις δεκαδικών, πολλαπλασιασµοί, διαιρέσεις. BX ∆είκτης για έµµεσο τρόπο προσδιορισµού διευθύνσεων µνήµης (indirect addressing). CX Μετρητής είτε εντολών επαναλήψεων είτε εντολών περιστροφών µεταφοράς. DX Επέκταση του AX από 16 bits σε 32 bits για πολλαπλασιασµούς και διαιρέσεις, έµµεσο τρόπο προσδιορισµού διεύθυνσης εισόδου εξόδου. 2.2 Καταχωρητές δείκτες. Πρόκειται για τέσσερις καταχωρητές των 16 bits, οι οποίοι χρησιµοποιούνται σαν δείκτες (pointer, index) για έµµεσο υπολογισµό διευθύνσεων µνήµης, αλλά και για αριθµητικές, λογικές πράξεις, περιστροφές. Αυτοί είναι οι: SP (δείκτης σωρού = Stack Pointer), BP (δείκτης βάσης = Base Pointer), SI (δείκτης προέλευσης = Source Index), DI (δείκτης προορισµού = Destination Index), Και έχουν τις εξής ιδιαιτερότητες :

Page 3: ΚΕΦΑΛΑΙΟ 1dima/wp-content/uploads/... · 1 ΚΕΦΑΛΑΙΟ 1 Ο ... διαιρέσεις. BX ∆είκτης για έµµεσο τρόπο προσδιορισµού διευθύνσεων

3

SP ∆είχνει την πρώτη ελεύθερη θέση στο σωρό. BP Χρησιµοποιείται για προσπέλαση δεδοµένων στο σωρό (τοπικές µεταβλητές, παράµετροι υποπρογραµµάτων). SI ∆είκτης προέλευσης για µεταφορά χαρακτήρων από µια περιοχή µνήµης. DI ∆είκτης προορισµού για µεταφορά χαρακτήρων σε µια περιοχή µνήµης. 2.3 ∆είκτης εντολών Ο καταχωρητής IP (δείκτης εντολών = Instruction Pointer) δείχνει την απόκλιση (offset) της διευθύνσεως της επόµενης προς εκτέλεση εντολής µέσα στο τµήµα του κώδικα. Ενηµερώνεται από την BIU. Ο µετρητής προγράµµατος (Program Counter) της µηχανής von Neumann έχει αντικατασταθεί εδώ από το δίδυµο : CS : IP 2.4 Καταχωρητής κατάστασης ή σηµαιών.

Σχήµα 2. Ο καταχωρητής σηµαιών ή κατάστασης SR είναι ένας καταχωρητής µεµονωµένων 16 bits, από τα οποία µόνο 9 χρησιµοποιούνται σαν σηµαίες κατάστασης ή ελέγχου. 2.4.1 ∆είκτες κατάστασης.(6 bits) Τίθενται σε µια κατάσταση ( ON , OFF ) ανάλογα µε το αποτέλεσµα της προηγούµενης αριθµητικής, λογικής εντολής, εντολής σύγκρισης. Χρησιµοποιούνται (από άλλες εντολές) για την εκτέλεση διακλαδώσεων µέσα στο πρόγραµµα. Είναι : CF (Carry Flag)

Page 4: ΚΕΦΑΛΑΙΟ 1dima/wp-content/uploads/... · 1 ΚΕΦΑΛΑΙΟ 1 Ο ... διαιρέσεις. BX ∆είκτης για έµµεσο τρόπο προσδιορισµού διευθύνσεων

4

Χρησιµοποιείται σαν ένα επιπλέον δυαδικό ψηφίο σε αριθµητικές εντολές (ADD, SUB, ADC, SBC). Εάν προκύψει ένα κρατούµενο (πρόσθεση) ή απαιτηθεί δανεισµός (αφαίρεση) έξω από το Msbit , παίρνει τιµή 1 αλλιώς 0. Επίσης επηρεάζεται από ορισµένες εντολές ολίσθησης και περιστροφής (RCR, RCL). Msbit είναι το πιο σηµαντικό bit δηλαδή το 7ο όταν πρόκειται για πράξεις 1ος byte ή 15ο πρόκειται για πράξεις 1ας word = 2bytes. AF (Auxiliary Flag) Εάν µετά από αριθµητική πράξη προκύψει µεταφορά κρατούµενου από το 3ο προς το 4ο bit του byte, παίρνει την τιµή 1 αλλιώς 0. Χρησιµοποιείται σε πράξεις BCD (DAA, AAA). SF (Sign Flag) Χρησιµοποιείται από αριθµητικές ή λογικές πράξεις. Παίρνει την ίδια τιµή µε το Msbit (7 ή 15) του αποτελέσµατος. Εάν το αποτέλεσµα είναι θετικό γίνεται 0 , εάν είναι αρνητικό γίνεται 1. ZF (Zero Flag) Γίνεται 1 αν το αποτέλεσµα µιας αριθµητικής ή λογικής πράξης είναι 0, αλλιώς µένει 0. OF (Overflow Flag) Γίνεται 1 όταν το προσηµασµένο αποτέλεσµα µιας πράξης (σε συµπλήρωµα του δύο) είναι πολύ µεγάλο ή πολύ µικρό για να χωρέσει στον τελεστή του αποδέκτη. Προκύπτει από µια αποκλειστική λογική πρόσθεση (eXclusive-OR) της µεταφοράς κρατούµενου από και προς το Msbit του αποτελέσµατος. PF (Parity Flag) Ψηφίο ισοτιµίας. Γίνεται 1 όταν το πλήθος των 1 του χαµηλού byte ενός αποτελέσµατος είναι περιττό. Να σηµειωθεί εδώ ότι τη κατάσταση αυτών των δεικτών εξαρτάται από το αποτέλεσµα µιας πράξεως και χρησιµεύουν για να γίνονται οι απαραίτητες διορθώσεις ή οι αλλαγές της ροής του προγράµµατος. 2.4.2 ∆είκτες Ελέγχου.(3 bits) Χρησιµοποιούνται για τον έλεγχο του µικροεπεξεργαστή (διακοπές προγράµµατος, εκτέλεση βήµα προς βήµα, σειρές χαρακτήρων). IF (Interrupt Flag)

Page 5: ΚΕΦΑΛΑΙΟ 1dima/wp-content/uploads/... · 1 ΚΕΦΑΛΑΙΟ 1 Ο ... διαιρέσεις. BX ∆είκτης για έµµεσο τρόπο προσδιορισµού διευθύνσεων

5

Τοποθετούµενος σε τιµή 1 ο δείκτης IF, ο µΕ αναγνωρίζει τις εξωτερικές διακοπές µε µάσκα, αλλιώς δεν λαµβάνονται υπόψη. Καµία επίδραση στις άλλες διακοπές (εσωτερικές και χωρίς µάσκα). DF (Direction Flag) Αναφέρεται µόνο στις εντολές σειράς χαρακτήρων. Εφόσον είναι 1 ο καταχωρητής δείκτης (SI ή DI) ελαττώνεται κατά ένα ή δύο και η επεξεργασία των σειρών χαρακτήρων γίνεται από την µεγαλύτερη προς την µικρότερη δ/νση, αλλιώς αυξάνεται κατά ένα η δύο. TF (Trap Flag) Σε κατάσταση 1 δηµιουργεί µια εσωτερική διακοπή µετά από την εκτέλεση κάθε εντολής και το πρόγραµµα εκτελείται βήµα βήµα. Προσφέρει πολύτιµη βοήθεια στην εκσφαλµάτωση του προγράµµατος. Στο σχήµα 2 φαίνονται οι θέσεις όλων των δεικτών µέσα στον καταχωρητή κατάστασης. Οι δείκτες εµφανίζονται µε τον αρχικό χαρακτήρα τους π.χ. T σηµαίνει Trap Flag. 2.5 Καταχωρητές τµηµάτων. Οι τέσσερις καταχωρητές τµηµάτων (segments) περιέχουν την διεύθυνση στην οποία βρίσκεται η αρχή του τµήµατος στο οποίο αναφέρονται µέσα στην µνήµη του υπολογιστή και είναι οι εξής:

- Καταχωρητής CS (τµήµατος κώδικα = Code Segment). - Καταχωρητής DS (τµήµατος δεδοµένων = Data Segment).

- Καταχωρητής SS (τµήµατος σωρού = Stack Segment).

- Καταχωρητής ES (extra τµήµατος δεδοµένων = Extra Segment).

3. ΠΕΡΙΓΡΑΦΗ ΑΚΡΟ∆ΕΚΤΩΝ – ΤΡΟΠΟΙ ΛΕΙΤΟΥΡΓΙΑΣ. Ο µ/ε 8086 παρουσιάζεται µε την µορφή ολοκληρωµένου κυκλώµατος DIL (Dual In Line) 40 ακροδεκτών (pins) και είναι σχεδιασµένος να λειτουργεί µε δύο τρόπους. Ελάχιστο (Minimum) και Μέγιστο (Maximum). Η επιλογή του τρόπου λειτουργίας γίνεται θέτοντας σε τάση 5V ή 0V τον ακροδέκτη ΜΝ/ΜΧ. Η διαφορά βρίσκεται στο ότι στην περίπτωση Minimum τα απαραίτητα σήµατα ελέγχου του διαύλου δίνονται απευθείας από τον µ/ε , ενώ στην περίπτωση Maximum δηµιουργούνται από το ολοκληρωµένο υποστήριξης 8288. Ακόµη στη Μέγιστη λειτουργία έχει την δυνατότητα παράλληλης επεξεργασίας µε την συνεργασία συνεπεξεργαστών 8087 και 8089. Ο 8086 πολυπλέκει (Multiplex) τα σήµατα διεύθυνσης και δεδοµένων. ∆ιαθέτει 20 ακροδέκτες διευθύνσεων , µε τα σήµατα διευθύνσεων και δεδοµένων (Address –

Page 6: ΚΕΦΑΛΑΙΟ 1dima/wp-content/uploads/... · 1 ΚΕΦΑΛΑΙΟ 1 Ο ... διαιρέσεις. BX ∆είκτης για έµµεσο τρόπο προσδιορισµού διευθύνσεων

6

Data) να πολυπλέκονται στους δεκαέξι (από AD0 έως και AD15) και µε τα σήµατα ελέγχου και διευθύνσεων (System – Address) να πολυπλέκονται στους υπόλοιπους τέσσερις (από A16 ή S3 έως και A19 ή S6). Επειδή τα δεδοµένα και οι διευθύνσεις υπάρχουν στους ίδιους ακροδέκτες, αλλά σε διαφορετικές χρονικές στιγµές, υπάρχει ένα σήµα ελέγχου ( Το ALE – Address Latch Enable ) που ξεχωρίζει τι από τα δύο υπάρχει κάθε φορά στους ακροδέκτες. Η διαδικασία αυτή ελέγχεται από την BIU.

Σχήµα 3 Άλλοι ακροδέκτες είναι:

- GND ∆ύο ακροδέκτες γείωσης. - NMI Αίτησης διακοπής χωρίς µάσκα.

- INTR Αίτησης διακοπής µε µάσκα.

- CLK Παρέχει τον παλµό του ρολογιού ο οποίος συγχρονίζει την

δραστηριότητα µέσα στην CPU.

- RESET Παρέχει σήµα διακοπής του προγράµµατος. Το σύστηµα περνάει σε κατάσταση επανέναρξης της λειτουργίας , και αρχίζει να εκτελείται το πρόγραµµα που βρίσκεται στην διεύθυνση 0FFFF0h (IP=0000,CS=0FFFFh). Κανονικά η δ/νση αυτή βρίσκεται στην ROM και περιέχει µια εντολή JMP

Page 7: ΚΕΦΑΛΑΙΟ 1dima/wp-content/uploads/... · 1 ΚΕΦΑΛΑΙΟ 1 Ο ... διαιρέσεις. BX ∆είκτης για έµµεσο τρόπο προσδιορισµού διευθύνσεων

7

στην δ/νση του προγράµµατος εκκίνησης του συστήµατος. Το πρόγραµµα αυτό αναφέρεται σαν bootstrap loader.

- READY ∆έχεται σήµα αποδοχής από την µνήµη ή από µια διασύνδεση

εισόδου/εξόδου, που σηµαίνει ότι δεδοµένα θα τοποθετηθούν στον δίαυλο δεδοµένων στον αµέσως επόµενο παλµό ρολογιού.

- TEST Σε συνδυασµό µε την εντολή WAIT χρησιµοποιείται κυρίως σε

περιπτώσεις πολυεπεξεργασίας.

- RD Φανερώνει ότι λειτουργία εισόδου πρόκειται να εκτελεστεί λειτουργία εισόδου.

- VCC Τροφοδοσία του συστήµατος +5V µε απόκλιση 10%.

- S3, S4 ∆είχνουν τον καταχωρητή τµήµατος που χρησιµοποιείται για τον

σχηµατισµό δ/νσης.

- S5 ∆είχνει το περιεχόµενο του καταχωρητή σηµαιών (IF).

- S6 Είναι πάντοτε µηδέν και δείχνει ότι ο µικροεπεξεργαστής ελέγχει τον δίαυλο του συστήµατος.

- QS0 (ALE), QS1 (INTA) ∆είχνει την κατάσταση της ουράς των εντολών. Η

κατάσταση αυτή φανερώνει την κατάσταση της ουράς κατά την διάρκεια του προηγούµενου κύκλου ρολογιού.

- S0, S1, S2 Φανερώνουν τον τύπο της µεταφοράς κατά την διάρκεια του

τρέχοντα κύκλου µηχανής (Bus Cycle).

- LOCK ∆είχνει ότι ο έλεγχος διαχείρισης του διαύλου δεν είναι δυνατόν να αποκτηθεί από άλλο διαχειριστή διαύλου.

- RQ/GT0 (HOLD) RQ/GT1 (HLDA) Χρησιµοποιούνται για είσοδο αιτήσεων

αποδόσεως διαύλου σε άλλους διαχειριστές διαύλου και έξοδο αποδόσεων διαύλου.

4.ΟΡΓΑΝΩΣΗ ΜΝΗΜΗΣ Το εύρος του διαύλου δ/νσεων είναι 20 bit. Εποµένως ο 8086 έχει δυνατότητα προσπέλασης 1 Megabyte θέσεων µνήµης. Το σύνολο των δ/νσεων είναι από 00000h έως 0FFFFFh. Το περιεχόµενο κάθε θέσης µνήµης είναι 1 byte. Στην µνήµη του µπορούµε να θεωρήσουµε τµήµατα (segments) µνήµης καθένα από τα οποία είναι µεγέθους 64 kbytes. Η αρχή κάθε τµήµατος από το επόµενο απέχει 16 bytes, δηλαδή τα τµήµατα αρχίζουν από δ/νσεις µνήµης που διαιρούνται µε το 16 και ονοµάζονται παράγραφοι. Εποµένως έχουµε 64 kbytes παραγράφους µνήµης. Ο χωρισµός της µνήµης σε τµήµατα (segmentation) προήλθε κύρια από το γεγονός ότι είναι αδύνατη η διευθυνσιοποίηση της διαθέσιµης µνήµης εσωτερικά µε µόνον ένα από τους

Page 8: ΚΕΦΑΛΑΙΟ 1dima/wp-content/uploads/... · 1 ΚΕΦΑΛΑΙΟ 1 Ο ... διαιρέσεις. BX ∆είκτης για έµµεσο τρόπο προσδιορισµού διευθύνσεων

8

διαθέσιµους καταχωρητές των 16 bits του 8086. Το πρόβληµα της διευθυνσιοποίησης εσωτερικά επιλύεται ως εξής: Για την προσπέλαση σε µια θέση µνήµης πρέπει να τεθεί η φυσική διεύθυνση (physical address) των 20 bits στο δίαυλο των διευθύνσεων. Με τον όρο φυσική δ/νση εννοούµε την πραγµατική δ/νση µνήµης που υπάρχει έξω από τον µ/ε και προκύπτει από αποκωδικοποίηση των σηµάτων στο δίαυλο δ/νσεων. Για τον σχηµατισµό της δ/νσης αυτής εσωτερικά στον 8086 χρησιµοποιούνται δύο καταχωρητές ως εξής: Σε έναν από τους καταχωρητές τµηµάτων τοποθετείται ο αύξων αριθµός της παραγράφου αρχής ενός τµήµατος µνήµης. Η φυσική δ/νση που ξεκινάει το αντίστοιχο τµήµα προκύπτει από πολλαπλασιασµό του περιεχοµένου του καταχωρητή τµήµατος επί 16. Ο δεύτερος καταχωρητής ο οποίος ονοµάζεται κατά περίπτωση pointer ή index (δείκτης) περιέχει την απόσταση από την αρχή του τµήµατος , η οποία ονοµάζεται λογική διεύθυνση ή µετατόπιση ή ενεργός διεύθυνση (logical address, offset, effective address). Ο τελικός προσδιορισµός της φυσικής διεύθυνσης προκύπτει από την πρόσθεση της λογικής δ/νσης στην δ/νση αρχής του τµήµατος σύµφωνα µε την απλή σχέση: < φυσική διεύθυνση > = < τµήµα > * 16 + < µετατόπιση > Μια πραγµατική δ/νση εσωτερικά στον µ/ε την αναπαριστούµε µε την σχέση: segment:offset όπου segment και offset δυο 4ψήφιοι δεκαεξαδικοί αριθµοί ή ένας καταχωρητής τµήµατος και ένας καταχωρητής δείκτης αντίστοιχα π.χ 987Ah:0100h, CS:IP , DS:9987H κ.α. Μέσω ενός καταχωρητή δείκτη υπάρχει η δυνατότητα προσπέλασης σε µια περιοχή µνήµης µήκους 64 kbytes από την αρχή του τµήµατος. ∆εδοµένου ότι οι καταχωρητές τµηµάτων είναι τέσσερις έχουµε την δυνατότητα αρχικής επιλογής τεσσάρων βασικών τµηµάτων µε την ιδιαιτερότητα του το καθένα από αυτά, ανάλογα µε τον χρησιµοποιούµενο καταχωρητή τµήµατος: Ο καταχωρητής CS περιέχει την δ/νση αρχής του τµήµατος όπου έχουν αποθηκευτεί οι κωδικοί των εντολών του προγράµµατος (CODE). Η µετατόπιση στο τµήµα αυτό καθορίζεται αποκλειστικά και µόνο από τον καταχωρητή IP. Το δίδυµο δηλ. CS:IP αντικαθιστά τον µετρητή προγράµµατος (PC) των άλλων επεξεργαστών Π.χ αν CS = 345Ah και IP = 712Ch, τότε η φυσική δ/νση της επόµενης εντολής είναι: CS*10h + IP = 345Ah * 10h + 712Ch = 345A0h + 712Ch = 3B6CCh Ο καταχωρητής SS περιέχει την δ/νση από όπου αρχίζει το τµήµα µνήµης της σωρού (STACK). Στην περίπτωση αυτή η λογική δ/νση της κορυφής της σωρού δίνεται αποκλειστικά και µόνο από τον καταχωρητή BP. Π.χ. αν SS = 1ABCh και SP = 100h, τότε η φυσική δ/νση της κορυφής του σωρού είναι: SS * 10h + SP = 1ABCh * 10h + 100h = 1ABC0h + 100h = 1ACC0h Οι καταχωρητές DS και ES περιέχουν την δ/νση στην οποία αρχίζει κάποιο τµήµα δεδοµένων ( DATA ) απαραίτητων για την εκτέλεση του προγράµµατος , και παρέχουν ένα επιπλέον χώρο (EXTRA) που µπορεί να χρησιµοποιηθεί για αποθήκη δεδοµένων.

Page 9: ΚΕΦΑΛΑΙΟ 1dima/wp-content/uploads/... · 1 ΚΕΦΑΛΑΙΟ 1 Ο ... διαιρέσεις. BX ∆είκτης για έµµεσο τρόπο προσδιορισµού διευθύνσεων

9

Σε κάθε ένα από τους 4 αυτούς καταχωρητές των 16 bits, αρκεί να προστεθούν από δεξιά (στα χαµηλά βάρη) 4 µηδενικά bits για σχηµατιστεί µια δ/νση 20 bits. Αυτή η δ/νση είναι η αρχή του αντίστοιχου τµήµατος (segment).

Ανεξάρτητα τµήµατα

Αλληλοεπικαλυπτόµενα τµήµατα

Ταυτιζόµενα τµήµατα

Σχήµα 4. Τα τέσσερα αυτά τµήµατα µπορεί να είναι τοποθετηµένα στην µνήµη κατά διαφόρους δυνατούς τρόπους δηλαδή είτε να ταυτίζονται είτε να αλληλοεπικαλύπτονται είτε να είναι συνεχόµενα στην µνήµη είτε τέλος και να καταλαµβάνουν ανεξάρτητες µη συνεχόµενες θέσεις στην µνήµη. Η πιο απλή και συµβατική προσέγγιση σε ένα πρόγραµµα είναι ο κώδικας και τα δεδοµένα να βρίσκονται σε γειτονικές περιοχές µνήµης, ενώ ο σωρός να τοποθετείται σε µια άλλη καθορισµένη περιοχή. 5.ΤΟΠΟΘΕΤΗΣΗ - ΠΡΟΣΠΕΛΑΣΗ ΤΩΝ ΛΕΞΕΩΝ ΣΤΗΝ ΜΝΗΜΗ Το περιεχόµενο κάθε θέσης µνήµης είναι 1 byte. Οι λέξεις ( word = 2 bytes ) δεδοµένα αποθηκεύονται µε το περισσότερο σηµαντικό byte στην χαµηλότερη δ/νση. Έτσι π.χ. ο αριθµός 3456h θα αποθηκευτεί, στις διαδοχικές δ/νσεις 678h και 679h σαν 5634h σύµφωνα µε το σχήµα: ∆/νσεις

Page 10: ΚΕΦΑΛΑΙΟ 1dima/wp-content/uploads/... · 1 ΚΕΦΑΛΑΙΟ 1 Ο ... διαιρέσεις. BX ∆είκτης για έµµεσο τρόπο προσδιορισµού διευθύνσεων

10

Οι διπλές λέξεις δεδοµένων όπως αυτές που αφορούν πραγµατικές δ/νσεις (segment:offset) αποθηκεύονται σε διαδοχικές θέσεις µνήµης αντίστροφα. Π.χ αν DS=1234h και SI=5678h η πραγµατική δ/νση (pointer) DS:SI αποθηκεύεται στις διαδοχικές θέσεις µνήµης 0300h έως και 0303h ως εξής: ∆/νσεις

Ο δίαυλος δεδοµένων του 8086 είναι 16 bits. Αν δούµε την µνήµη σε µορφή λέξεων, τότε καταλήγουµε σε ένα σύστηµα µνήµης 512 kbytes δ/νσεων των 16 bits η κάθε µια. Ο 8086 είναι σε θέση να προσπελάσει αυτά τα 16 bits δεδοµένων σε ένα κύκλο µηχανής ή και συγκεκριµένο byte από τα δύο από αυτά, ανάλογα µε τις τιµές των σηµάτων AD0 και BHE. ∆ιακρίνονται οι εξής περιπτώσεις: Α. Προσπέλαση ενός byte σε άρτια δ/νση. AD0 = 0 και BHE = 1 (Ένας κύκλος µηχανής). Β. Προσπέλαση ενός byte σε περιττή δ/νση. AD0 = 1 και BHE = 0 (Ένας κύκλος µηχανής). Γ. Προσπέλαση δύο byte σε άρτια δ/νση. AD0 = 0 και BHE = 0 (Ένας κύκλος µηχανής). ∆. Προσπέλαση δύο byte σε περιττή δ/νση. Χρειάζονται δύο κύκλοι µηχανής που αντιστοιχούν στις περιπτώσεις Β και Α. Στο πρόγραµµα που ακολουθεί, τοποθετούµε στο High τµήµα του καταχωρητή AX τον χαρακτήρα ’A’ και στο Low τµήµα του τον χαρακτήρα ’B’. Ακολούθως µεταφέρουµε το περιεχόµενο στην µνήµη και τυπώνουµε το περιεχόµενο µνήµης byte byte. Όταν τρέξουµε το πρόγραµµα (αφού το µεταφράσουµε προηγουµένως) θα διαπιστώσουµε ότι οι χαρακτήρες τυπώνονται ανάστροφα δηλαδή BA Αυτό συµβαίνει βέβαια επειδή και τοποθετήθηκαν ανάστροφα στην µνήµη. ;Το πρόγραµµα αυτό δείχνει τον τρόπο αποθήκευσης των λέξεων στην µνήµη ;είναι γραµµένο µε απλοποιηµένες οδηγίες τµηµάτων Παράδειγµα προγράµµατος υπ’ αριθµόν 1 : TITLE word__test; Οδηγία που ονοµάζει ένα πρόγραµµα DOSSEG .MODEL SMALL .CODE

Page 11: ΚΕΦΑΛΑΙΟ 1dima/wp-content/uploads/... · 1 ΚΕΦΑΛΑΙΟ 1 Ο ... διαιρέσεις. BX ∆είκτης για έµµεσο τρόπο προσδιορισµού διευθύνσεων

11

MAIN proc far PUSH DS; προετοιµασία για έξοδο στο DOS, σώζουµε στο σωρό το XOR AX,AX; τµήµα (SEGMENT) του PSP PUSH AX; και την µηδενική µετατόπιση του PSP MOV AX,@DATA MOV DS, AX MOV Ah,'A' MOV AL,'B' MOV WORD__LOW__HI,AX; µεταφορά στην µνήµη MOV DL,CHAR__low; εµφάνιση του πρώτου χαρακτήρα MOV AH,2 INT 21H MOV DL,CHAR__hi; εµφάνιση του επόµενου χαρακτήρα MOV AH,2; 2η κλήση του DOS που εµφανίζει χαρακτήρα INT 21H; DOS RET; επιστροφή στο DOS µέσω INT 20h του PSP MAIN endp .DATA WORD__LOW__HI label word Char__low db 0 Char__hi db 0 .STACK 100H END MAIN 6.ΕΙΣΟ∆ΟΙ ΕΞΟ∆ΟΙ Μια άλλη κατηγορία δ/νσεων τελείως ανεξάρτητη από τις δ/νσεις µνήµης αφορά τα περιφερειακά και είναι γνωστός σαν χώρος Ε/Ε µε µέγεθος 64 kbytes. Κάθε µια από τις δ/νσεις αυτές είναι γνωστή σαν θύρα (port) και η διευθυνσιοποίηση τους γίνεται µε την βοήθεια ενός µόνο καταχωρητή (DX) ή και ενός µόνο byte (σταθερά) για τις θύρες µε δ/νση µικρότερη του 256. Η επικοινωνία µε τις θύρες επιτυγχάνεται µε την χρήση ειδικών εντολών (IN και OUT). Οι καταχωρητές τµηµάτων δεν χρησιµοποιούνται στην διευθυνσιοποίηση των θυρών.

Page 12: ΚΕΦΑΛΑΙΟ 1dima/wp-content/uploads/... · 1 ΚΕΦΑΛΑΙΟ 1 Ο ... διαιρέσεις. BX ∆είκτης για έµµεσο τρόπο προσδιορισµού διευθύνσεων

12

ΚΕΦΑΛΑΙΟ 2 ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ ΤΟΥ 8086 ΜΕ ΣΥΜΒΟΛΙΚΗ ΓΛΩΣΣΑ. 1.ΕΙΣΑΓΩΓΗ Η ASSEMBLY είναι συµβολική γλώσσα της γλώσσας µηχανής του µ/ε. Για την κατανόηση της λειτουργίας της γλώσσας µηχανής µπορούµε να θεωρήσουµε τον υπολογιστή σαν ένα σύστηµα που αποτελείται από πέντε υποσυστήµατα (είσοδος, έξοδος, αριθµητική λογική µονάδα, µνήµη) λειτουργικά συνδεµένα µεταξύ τους σύµφωνα µε το σχήµα παρακάτω:

Είσοδοιπληκτρολόγιο, Ποντίκιδίσκος

Αριθµητικό υποσύστηµα(πρόσθεση, αφαίρεση,πολλαπλασιασµός,διαίρεση,λογικές πράξεις ολίσθηση κ.α.)

-Υποσύστηµα ελέγχουΈλεγχος διαύλων

ΈξοδοιΕκτυπωτής, δίσκοςΟθόνη

Υποσύστηµα µνήµης(Έως 1Mbyte RAM και ROM)

Ο µ/ε διευθύνει τις δραστηριότητες του συστήµατος µε τον εξής απλό τρόπο: Μεταφέρει δεδοµένα από την µνήµη του τα οποία αποκωδικοποιούνται και εκτελούνται ακολούθως. Τα δεδοµένα που µπορούν να αποκωδικοποιηθούν και να εκτελεστούν λέγονται εντολές το δε σύνολο τους (instruction set) περιέχει όλες τις δυνατές ενέργειες που µπορεί το λογισµικό να απαιτήσει από τον επεξεργαστή. Ο µ/ε διαθέτει ένα σύνολο από εντολές σε δυαδική µορφή, γνωστό σαν γλώσσα µηχανής (machine language). Η συµβολική γλώσσα ASSEMBLY είναι µια προσανατολισµένη προς τον άνθρωπο µορφή της γλώσσας µηχανής και η χρήση της επιβλήθηκε γιατί είναι πιο εύκολος ο προγραµµατισµός σε συµβολική γλώσσα. Π.Χ είναι πιο ευκολοκατανόητη µια εντολή της µορφής : add a1,1

Page 13: ΚΕΦΑΛΑΙΟ 1dima/wp-content/uploads/... · 1 ΚΕΦΑΛΑΙΟ 1 Ο ... διαιρέσεις. BX ∆είκτης για έµµεσο τρόπο προσδιορισµού διευθύνσεων

13

αντί της ισοδύναµης της σε γλώσσα µηχανής : 4 1 Τα πλεονεκτήµατα τους προγραµµατισµού σε συµβολική γλώσσα είναι:

- Μπορείς και ελέγχεις όλες τις ενέργειες του επεξεργαστή µια προς µια. - Μπορείς και έχεις προσπέλαση απευθείας σε όλη την µνήµη και σε όλες

τις συσκευές εισόδου εξόδου.

- Ο κώδικας που παράγει είναι ο γρηγορότερος δυνατός γιατί οι εντολές µεταφράζονται µια προς µια στις αντίστοιχες της γλώσσας µηχανής.

Ο συµβολοµεταφραστής (Assembler) είναι το πρόγραµµα που µεταφράζει προγράµµατα συµβολικής γλώσσας σε γλώσσα µηχανής. Αντικαθιστά τους τελεστές µε κωδικούς εντολών και τους τελεστέους µε διευθύνσεις µέσα σε λέξεις του υπολογιστή. Από τους συµβολοµεταφραστές (TASM.EXE ή MASM.EXE) παράγεται ένα ενδιάµεσο αρχείο µε κατάληξη .OBJ γνωστό σαν object module , το οποίο ακολούθως µε το πρόγραµµα συνδέτη (TLINK.EXE ή LINK.EXE) συνδέεται µε άλλα object modules και παράγεται το τελικό εκτελέσιµο πρόγραµµα σε γλώσσα µηχανής µε κατάληξη .EXE ή .COM.

Παράδειγµα µε ένα κειµενογράφο γράφουµε το παρακάτω πρόγραµµα το οποίο τυπώνει ένα µήνυµα στην οθόνη:

Παράδειγµα προγράµµατος υπ’ αριθµόν 2 :

INTDOS EQU 21h TITLE MHNHMA KVDIKAS SEGMENT PUBLIC ASSUME CS:KVDIKAS,DS:DEDOMENA MAIN PROC NEAR mov ax,DEDOMENA ; Ο ds πρέπει να περιέχει την δ/νση αρχής του mov ds,ax ; του τµήµατος των δεδοµένων lea dx,mhnhma ; Ενεργός δ/νση του αλφαριθµητικό στο dx mov ah,9 ; Αριθµός κλήσης του DOS για εµφάνιση string int INTDOS MAIN ENDP KVDIKAS ENDS DEDOMENA SEGMENT PUBLIC Mhnhma db “WELLCOME TO ASSEMBLY “,13,10,”$” DEDOMENA ENDS SOROS SEGMENT PARA STACK ‘SOROS’ Db 100h dup(0) ; Μέγεθος σωρού 256 bytes SOROS ENDS END MAIN

Page 14: ΚΕΦΑΛΑΙΟ 1dima/wp-content/uploads/... · 1 ΚΕΦΑΛΑΙΟ 1 Ο ... διαιρέσεις. BX ∆είκτης για έµµεσο τρόπο προσδιορισµού διευθύνσεων

14

Αφού σώσουµε το πρόγραµµα στο δίσκο µε την ονοµασία MHNHMA.ASM, καλούµε τον συµβολοµεταφραστή µε την εντολή :

TASM MHNHMA

Εφόσον δεν προκύψουν λάθη, από την µετάφραση θα προκύψει αρχείο MHNHMA.OBJ. Τέλος για την παραγωγή του εκτελέσιµου αρχείου καλούµε το πρόγραµµα συνδέτη µε την εντολή :

TLINK MHNHMA

Από τον οποίο και προκύπτει το εκτελέσιµο αρχείο MHNHMA.EXE. Εφόσον όµως από τον κώδικα προβλέπεται να προκύψει εκτελέσιµο .COM αρχείο, καλούµε τον συνδέτη µε την επιλογή /t (π.χ. TLINK /t ).

Το πηγαίο πρόγραµµα ASSEMBLY αποτελείται από γραµµές οι οποίες µεταφράζονται η µια µετά την άλλη. Η σύνταξη κάθε γραµµής προγράµµατος έχει την µορφή:

< Ετικέτα > < εντολή/οδηγία > < τελεστές > ; < σχόλια >

Ετικέτες ( labels ) είναι ονοµασίες που αναφέρονται σε δ/νσεις µνήµης είτε στο τµήµα του κώδικα είτε µέσα στα δεδοµένα, όπου µπορούν να θεωρηθούν και σαν µεταβλητές ή ονοµασίες σταθερών τιµών. Στο προηγούµενο πρόγραµµα υπάρχουν οι ετικέτες :

INDOS, KVDIKAS, MAIN, DEDOMENA, MHNHMA, SOROS.

Εφόσον µετά την ετικέτα ακολουθεί εντολή και όχι οδηγία µπαίνει το σύµβολο ‘:’ π.χ. στην ετικέτα again όπως φαίνεται στο παρακάτω παράδειγµα.

again: add a1,5 ……. jmp again

Εντολές (instructions) προγράµµατος είναι οι συµβολικές λέξεις που µεταφράζονται σε γλώσσα µηχανής και παράγουν κώδικα, ενώ οι οδηγίες (directives) δεν παράγουν κώδικα µηχανής αλλά απλά καθοδηγούν τον µεταφραστή µε πιο τρόπο θα µεταφράσει τις επόµενες εντολές του προγράµµατος. Παραδείγµατα εντολών είναι mov, add, int, sub, mul, div κ.α. Το παράδειγµα παραπάνω χρησιµοποιεί τις οδηγίες EQU, SEGMENT, ENDS, PROC, ENDP, ASSUME, END.

Τέλος κάθε οδηγία ή εντολή συντάσσεται µε κανένα, ένα , δύο και σπάνια µε τρεις τελεστές οι οποίοι γράφονται στην ίδια γραµµή µε την εντολή. Έχουµε τις εξής περιπτώσεις τελεστών:

- Σταθερές αριθµητικές ( π.χ. 14, 35d, 21h, 10101000b, 0abcdh) ή

αλφαριθµητικά και χαρακτήρες ( π.χ ‘a’). Σηµειώνουµε ότι το σύµβολο d

Page 15: ΚΕΦΑΛΑΙΟ 1dima/wp-content/uploads/... · 1 ΚΕΦΑΛΑΙΟ 1 Ο ... διαιρέσεις. BX ∆είκτης για έµµεσο τρόπο προσδιορισµού διευθύνσεων

15

µετά τον αριθµό σηµαίνει δεκαδικό σύστηµα, το h δεκαεξαδικό και το b δυαδικό.

- Καταχωρητές (π.χ ax, bx). - Ετικέτες (π.χ jmp again). - Εκφράσεις όπως LENGTH, OFFSET,:,SEG κ.α.

Ένα πρόγραµµα assembly (χωρίς να είναι υποχρεωτικό βέβαια) είναι χωρισµένο σε ανεξάρτητα τµήµατα (segments), άλλα από τα οποία χρησιµοποιούνται για κώδικα και άλλα για δεδοµένα. Σηµειώνουµε εδώ την υποχρεωτική δήλωση του τµήµατος σωρού µε την έκφραση STACK. Τα παραπάνω ισχύουν βέβαια για προγράµµατα .EXE.

Τα προγράµµατα .COM παρουσιάζουν τις εξής διάφορες:

- Είναι προγράµµατα ενός τµήµατος (κώδικας και δεδοµένα στο ίδιο

τµήµα). Όλα τα τµήµατα που δηλώνονται πρέπει να θεωρούνται ότι ταυτίζονται.

- Το πρόγραµµα αρχίζει 256 bytes µετά την αρχή του τµήµατος. Ο χώρος

των 256 bytes χρησιµοποιείται σαν πρόθεµα του προγράµµατος (PSP Program Segment Prefix).

- ∆εν δηλώνεται σωρός. Σαν χώρος σωρού διατίθενται 256 τελευταία bytes

του τµήµατος χωρίς αυτό να δηλώνεται µέσα στο πρόγραµµα. Παράδειγµα να γράφει πρόγραµµα ενός προγράµµατος .COM που προσθέτει δυο µονοψήφιους αριθµούς και τυπώνει το αποτέλεσµα στην οθόνη: Παράδειγµα προγράµµατος υπ’ αριθµόν 3 : TITLE ΑΘΡΟΙΣΗ ; Τίτλος του προγράµµατος CGROUP GROUP KVDIKAS,DEDOMENA ; Ταύτιση των δύο τµηµάτων κώδικα ;και δεδοµένων KVDIKAS SEGMENT PUBLIC ASSUME CS:CGROUP,DS:CGROUP ORG 100h ; Το πρόγραµµα αρχίζει 256 µετά την αρχή του τµήµατος. MAIN PROC NEAR mov al,aritmos1 ;Ο πρώτος αριθµός στον καταχωρητή AL add al,aritmos2 ; Πρόσθεση και αποθήκευση του αποτελέσµατος στον AL mov dl,al ; Μεταφορά του αποτελέσµατος στον DL προκειµένου να εµφανιστεί add dl,30h ; Μετατροπή του αριθµού στην ASCII τιµή του χαρακτήρα mov ah,2 ; Αριθµός κλήσης του DOS για εµφάνιση χαρακτήρα στην οθόνη int 21h ; ∆ιακοπή του DOS int 20h ; ∆ιακοπή του DOS για έξοδο από το πρόγραµµα σε .COM προγράµµατα

Page 16: ΚΕΦΑΛΑΙΟ 1dima/wp-content/uploads/... · 1 ΚΕΦΑΛΑΙΟ 1 Ο ... διαιρέσεις. BX ∆είκτης για έµµεσο τρόπο προσδιορισµού διευθύνσεων

16

MAIN ENDP KVDIKAS ENDS DEDOMENA SEGMENT PUBLIC aritmos1 db 4 aritmos2 db 5 DEDOMENA ENDS END MAIN Υπεµθυµίζουµε ότι η κλήση του συνδέτη γίνεται µε την παράµετρο /t π.χ αν το πηγαίο ρχείο ονοµασθεί atroisi.asm, ο συνδέτης θα κληθεί ως εξής: Tlink /t atroisi.obj 2.ΒΑΣΙΚΕΣ Ο∆ΗΓΙΕΣ ΤΟΥ ΜΕΤΑΦΡΑΣΤΗ 2.1 Οδηγία END. Κάθε πρόγραµµα πρέπει να περιέχει την οδηγία END για να δηλώνει το τέλος του πηγαίου κώδικα. Στα .EXE προγράµµατα η ετικέτα µετά την END δηλώνει την δ/νση της πρώτης εντολής του προγράµµατος. Π.χ στο παρακάτω παράδειγµα αφαιρέσεις, εκτελείται πρώτα η παράγραφος ARXH η οποία καλεί την παράγραφο PRAXH : Παράδειγµα προγράµµατος υπ’ αριθµόν 4 : TITLE AFAIRESH; Τίτλος προγράµµατος KVDIKAS SEGMENT PUBLIC ASSUME CS:KVDIKAS,DS:DEDOMENA PRAXH PROC NEAR mov ax,dedomena mov ds,ax mov al,aritmos1; Ο αριθµός 1 στον καταχωρητή AL sub al,aritmos2; Πρόσθεση και αποθήκευση του αποτελέσµατος στον AL mov apotelesma,al; Αποθήκευση του αποτελέσµατος στην µνήµη mov dl,apotelesma; αποθήκευση του αποτελεσµατος στον DL σύµφωνα µε την 2η

;κλήση του DOS add dl,30h ; Μετατροπή του αριθµού στην ASCII τιµή του χαρακτήρα mov ah,2 ; Αριθµός κλήσης του DOS για εµφάνιση του χαρακτήρα στην οθόνη int 21h ret; Επιστροφή πίσω στο υποπρόγραµµα που κάλεσε παρούσα υπορουτίνα. PRAXH ENDP ARXH PROC NEAR call praxh ; Κλήση του υποπρογράµµατος praxh mov ah,4ch ; Κλήση του DOS για έξοδο από το πρόγραµµα int 21h ; ∆ιακοπή του DOS ARXH ENDP KVDIKAS ENDS

Page 17: ΚΕΦΑΛΑΙΟ 1dima/wp-content/uploads/... · 1 ΚΕΦΑΛΑΙΟ 1 Ο ... διαιρέσεις. BX ∆είκτης για έµµεσο τρόπο προσδιορισµού διευθύνσεων

17

DEDOMENA SEGMENT PUBLIC aritmos1 db 4 aritmos2 db 3 apotelesma db 0 DEDOMENA ENDS SOROS SEGMENT PARA STACK 'SOROS' db 256 dup (0) SOROS ENDS END ARXH 2.2 Οδηγίες τµηµάτων , διαδικασιών Οι οδηγίες SEGMENT και ENDS καθορίζουν µια οµάδα από δεδοµένα ή εντολές που θέλουµε να τοποθετηθούν µαζί σε ένα τµήµα. Το αναγνωριστικό που προηγείται δηλώνει το όνοµα του τµήµατος. Τα δεδοµένα ή οι εντολές που περιλαµβάνονται µεταξύ SEGMENT και ENDS καλούνται λογικό τµήµα (logical segment). Αντίστοιχα οι οδηγίες PROC και ENDP ορίζουν την αρχή και το πέρας ενός υποπρογράµµατος. Βέβαια οι οδηγίες των υποπρογραµµάτων δεν λύνουν από µόνες το πρόβληµα, αλλά απαιτείται και η χρήση των αντίστοιχων εντολών στον κώδικα (Calls, Ret) για την γραφή δοµηµένων προγραµµάτων. Η οδηγία ASSUME πληροφορεί τον µεταφραστή σε ποιο τµήµα αναφέρονται οι καταχωρητές που χρησιµοποιούµε. Η οδηγία ASSUME CS: είναι απαραίτητη σε κάθε πρόγραµµα .EXE για να πληροφορεί τον µεταφραστή ποιο είναι το τµήµα του κώδικα. Οι ASSUME DS: και ASSUME ES είναι απαραίτητες πριν από την χρήση εντολών που έχουν σχέση µε µεταφορά δεδοµένων από και προς δ/νσεις µνήµης, για να πληροφορούν τον µεταφραστή σε πιο φυσικό τµήµα (DATA ή EXTRA) αναφέρεται κάθε λογικό τµήµα. Προσοχή η ASSUME πριν από εντολές που χρησιµοποιούν ετικέτες ( labels ) των τµηµάτων αυτών. Παράδειγµα προγράµµατος υπ’ αριθµόν 5 : TITLE POLLAPLASIAMOS; Τίτλος του προγράµµατος KVDIKAS SEGMENT PUBLIC ASSUME CS:KVDIKAS,DS:DEDOMENA1 PRAXH PROC NEAR ASSUME DS:DEDOMENA2 ;***** ΠΡΟΣΟΧΗ ΑΠΑΡΑΙΤΗΤΗ Ο∆ΗΓΙΑ ***** ;για την µετάφραση των δυο παρακάτω mov ax,dedomena2 mov ds,ax mov al,aritmos1; Ο αριθµός 1 στον καταχωρητή AL mov dl,aritmos2; Πρόσθεση και αποθήκευση του αποτελέσµατος στον AL mul dl; Πολλαπλασιασµός AL * DL , αποτέλεσµα στον AX mov apotelesma,al; Αποθήκευση του αποτελέσµατος στην µνήµη mov dl,apotelesma; Μεταφορά του αποτελέσµατος στον DL προκείµενου να εµφανιστεί add dl,30h ; Μετατροπή του αριθµού στην ASCII τιµή του χαρακτήρα mov ah,2 ; Αριθµός κλήσης του DOS για εµφάνιση χαρακτήρα στην οθόνη

Page 18: ΚΕΦΑΛΑΙΟ 1dima/wp-content/uploads/... · 1 ΚΕΦΑΛΑΙΟ 1 Ο ... διαιρέσεις. BX ∆είκτης για έµµεσο τρόπο προσδιορισµού διευθύνσεων

18

int 21h ret PRAXH ENDP ARXH PROC NEAR ; Από εδώ αρχίζει η εκτέλεση του προγράµµατος call praxh ASSUME DS:DEDOMENA1 mov ax,dedomena1 mov ds,ax lea dx,mhnhma mov ah,09h int 21h mov ah,4ch ; Κλήση του DOS για έξοδο από το πρόγραµµα int 21h ; ∆ιακοπή του DOS ARXH ENDP KVDIKAS ENDS DEDOMENA1 SEGMENT PUBLIC mhnhma db 10,13, "END of PROGRAM",10,13,"$" DEDOMENA1 ENDS DEDOMENA2 SEGMENT PUBLIC aritmos1 db 4 aritmos2 db 2 apotelesma db 0 DEDOMENA2 ENDS SOROS SEGMENT PARA STACK "SOROS" Db 256 dup (0) SOROS ENDS END ARXH ; Το πρόγραµµα αρχίζει να εκτελείται από την δ/νσh ARXH 2.3 Οδηγίες δεδοµένων Η DB ορίζει ότι κάθε ένα από τα δεδοµένα που ακολουθούν καταλαµβάνει χώρο ενός byte, η DW δύο , η DD τέσσερα , η DQ οκτώ και η DT δέκα bytes αντίστοιχα. Η εντολή DUP συνοδεύει µια από τις προηγούµενες και επαναλαµβάνει στην µνήµη το δεδοµένο που ακολουθεί σε παρένθεση τόσες φορές όσο και ο αριθµός που προηγείται. Σηµειώνεται ότι τα δεδοµένα µπορεί να είναι αριθµοί η χαρακτήρες. Η ετικέτα που προηγείται χρησιµεύει σαν µεταβλητή µνήµης. Παράδειγµα µε τις δηλώσεις : ARITMOI DW 10,13,29 MHNHMA DB ‘HELLO’ PINAK DB 10 DUP (0) ∆εσµεύουµε χώρο 21 bytes στην µνήµη σε τρεις δ/νσεις µνήµης µε συµβολικά ονόµατα : ARITMOI , MHNHMA , PINAK και δίνουµε αρχικές τιµές στις θέσεις µνήµης αυτές. Προφανώς µπορούµε να αλλάξουµε το περιεχόµενο των θέσεων αυτών µέσα στο πρόγραµµα.

Page 19: ΚΕΦΑΛΑΙΟ 1dima/wp-content/uploads/... · 1 ΚΕΦΑΛΑΙΟ 1 Ο ... διαιρέσεις. BX ∆είκτης για έµµεσο τρόπο προσδιορισµού διευθύνσεων

19

Με την οδηγία LABEL όµως µπορούµε να ορίσουµε ένα σύµβολο (ετικέτα) µε το οποίο και έχουµε διαφορετική προσπέλαση στην ίδια περιοχή µνήµης, από την προκαθορισµένη . Μετά την οδηγία αυτή ακολουθεί ο τύπος του σύµβολου ο οποίος µπορεί να είναι BYTE , WORD, DWORD κ.λτ. Ο τύπος περιγράφει και το µέγεθος του. Παράδειγµα µε την δήλωση : NUM LABEL WORD CHARS DB 10,0 Ορίζουµε µια περιοχή στην µνήµη µεγέθους 2 χαρακτήρων και την ονοµάζουµε CHARS. Στην ίδια περιοχή όµως µπορούµε και έχουµε πρόσβαση µε την ετικέτα NUM σαν WORD όµως. Π.Χ µε την εντολή mov ax,num µεταφέρονται και οι δυο χαρακτήρες στον καταχωρητή AX. 2.4 Οδηγίες για σταθερές Με την οδηγία EQU ορίζουµε ένα σύµβολο µια σταθεράς, ενός αλφαριθµητικού ή ακόµη και εναλλακτικό όνοµα µιας δεσµευµένης λέξης π.χ µιας εντολής. Ο µεταφραστής όπου συναντήσει το σύµβολο πριν από την EQU το αντικαθιστά µε την σταθερά, αλφαριθµητικό ή την λέξη που ακολουθεί την EQU. Χρησιµοποιείται κυρίως για αριθµητικές σταθερές για να είναι το πρόγραµµα πιο ευανάγνωστο και τεκµηριωµένο. Παραδείγµατα: Blocksize EQU 512 BLOCKS EQU 4 Bufsize EQU Blocksize * BLOCKS Mhnhma EQU ‘Τέλος προγράµµατος’ Τέλος αναφέρουµε το σύµβολο $ που δηλώνει την τρέχουσα θέση και είναι χρήσιµο για να υπολογίζει ο µεταφραστής το µήκος αλφαριθµητικών. Παράδειγµα: mhnhma DB ‘Τέλος προγράµµατος’ mhkos__mhnhma EQU (mhnhma - $) 2.5 Απλοποιηµένες οδηγίες τµηµάτων. 2.5.1 Εισαγωγή Αντί των κανονικών οδηγιών των τµηµάτων (SEGMENT, ENDS, ASSUME), οι εταιρείες Borland και Microsoft µας παρέχουν την ευχέρεια µε τους σύγχρονους συµβολοµεταφραστές, να χρησιµοποιούµε απλοποιηµένες οδηγίες τµηµάτων (Simplified Directives), µε τις οποίες δίνονται εξ ορισµού ονοµασίες σε τµήµατα, και είναι ευκολότερη η σύνδεση (linking) µε αντικείµενα αρχεία (object modulus) προγραµµάτων γραµµένα σε γλώσσες 3ης γενιάς.

Page 20: ΚΕΦΑΛΑΙΟ 1dima/wp-content/uploads/... · 1 ΚΕΦΑΛΑΙΟ 1 Ο ... διαιρέσεις. BX ∆είκτης για έµµεσο τρόπο προσδιορισµού διευθύνσεων

20

Γενικά η χρήση απλοποιηµένων οδηγιών είναι προτιµότερη όταν γράφουµε κώδικα ASSEMBLY, που θα συνδεθεί µε κώδικα γραµµένο σε C, PASCAL, PROLOC, BASIC και άλλη υψηλού επιπέδου γλώσσα, ή όταν γράφουµε προγράµµατα ASSEMBLY µικρού ή µεσαίου µεγέθους. Αντίθετα αν πρόκειται για πρόγραµµα µεγάλου µεγέθους, γραµµένα αποκλειστικά σε assembly, µε πολλά τµήµατα κώδικα και δεδοµένων, µε κλήσεις υποπρογραµµάτων και ενδοτµηµατικές και εξωτµηµατικές (δες τις εντολές CALL και RET), τότε επιβάλλεται η χρήση των κανονικών οδηγιών τµηµάτων. Οι απλοποιηµένες οδηγίες τµηµάτων είναι : DOSSEG, .MODEL, .STACK, .DATA, .CODE. 2.5.2 Οδηγίες .STACK, .DATA, .CODE. Οι παραπάνω οδηγίες ορίζουν τα τµήµατα σωρού, δεδοµένων και κώδικα αντίστοιχα. Η οδηγία .STACK καθορίζει το µέγεθος του σωρού του προγράµµατος και είναι απαραίτητη σε ένα πρόγραµµα .EXE . Π.χ µε την δήλωση .STACK 200h Ορίζουµε τµήµα σωρού µεγέθους 512 bytes. Με την οδηγία .CODE ορίζουµε την αρχή του τµήµατος κώδικα. Μετά την οδηγία αυτή ακολουθούν οι εντολές του προγράµµατος ή οι διάφορες διαδικασίες. Με την οδηγία .DATA ορίζουµε την αρχή του τµήµατος των δεδοµένων. Μετά την οδηγία αυτή ακολουθούν οι δηλώσεις των µεταβλητών µνήµης του προγράµµατος. Βέβαια µε την οδηγία αυτή δεν έχουµε µέσα στο πρόγραµµα µας και αυτόµατη αποκατάσταση του καταχωρητή DS, ούτως ώστε ο DS να έχει την διεύθυνση του τµήµατος των δεδοµένων. Η αποκατάσταση αυτή πρέπει να γίνεται µέσα από το πρόγραµµα µε τις εντολές: mov ax,@DATA ; @DATA συµβολίζει την ονοµασία του τµήµατος των δεδοµένων, ;και @CODE του κώδικα mov ds,ax ; µε έµµεσο τρόπο ds <--- @data 2.5.3 Η οδηγία DOSSEG Η οδηγία αυτή συνήθως είναι και η πρώτη οδηγία του προγράµµατος. Η οδηγία αυτή οµαδοποιεί και τακτοποιεί τα τµήµατα του προγράµµατος assembly στο εκτελέσιµο αρχείο, σύµφωνα µε την σειρά που προβλέπεται από το MS-DOS λειτουργικό σύστηµα. Σύµφωνα µε την σειρά αυτή ο κώδικας προηγείται, ακολουθούν διάφορα αλλά τµήµατα εκτός του DGROUP και τέλος µπαίνει το DGROUP. Για περισσότερες λεπτοµέρειες να ανατρέξετε στο τεχνικό εγχειρίδιο του MS-DOS. 2.5.4 Η οδηγία .MODEL

Page 21: ΚΕΦΑΛΑΙΟ 1dima/wp-content/uploads/... · 1 ΚΕΦΑΛΑΙΟ 1 Ο ... διαιρέσεις. BX ∆είκτης για έµµεσο τρόπο προσδιορισµού διευθύνσεων

21

Με την οδηγία αυτή καθορίζουµε τον µοντέλο της µνήµης του προγράµµατος. Η έννοια µοντέλο σηµαίνει ο τρόπος µε τον οποίο χειρίζεται το πρόγραµµα τον κώδικα και τα δεδοµένα. Όταν λέµε κώδικα εννοούµε ένα σύνολο από υποπρογράµµατα τα οποία συνδέονται µεταξύ τους µε την εντολή κλήσης CALL και την εντολή επιστροφής RET. Τα υποπρογράµµατα αυτά µπορεί να είναι όλα στο ίδιο τµήµα όποτε η κλήσεις αυτές γίνονται µόνο µε την αλλαγή τιµής του καταχωρητή IP ( µόνο µε αλλαγή της µετατόπισης), ή σε άλλο τµήµα (εξωτµηµατικές) οπότε κλήσεις γίνονται µε αλλαγή των τιµών των καταχωρητών CS:IP (των δύο καταχωρητών που καθορίζουν την πλήρη δ/νση της επόµενης προς εκτέλεση εντολής¨). Στις ενδοτµηµατικές κλήσεις οι εντολές call και ret είναι near, ένα στις εξωτµηµατικές είναι far.

Με όµοιο τρόπο µπορούµε να ξεχωρίσουµε τα δεδοµένα σε ενδοτµηµατικά δεδοµένα και εξωτµηµατικά δεδοµένα. Τα ενδοτµηµατικά δεδοµένα βρίσκονται όλα στο ίδιο τµήµα και µπορούµε να τα προσπελάσουµε µόνο µε την µετατόπιση τους (offset). Τα εξωτµηµατικά δεδοµένα βρίσκονται σε διαφορετικά τµήµατα και για να τα προσπελάσουµε χρειάζεται η πλήρης δ/νσής τους segment:offset.

Πρέπει να διευκρινίσουµε εδώ ότι σαν δεδοµένα στην παράγραφο αυτή, θεωρούµε τα δεδοµένα (κυρίως δυναµικής καταχώρησης µνήµης, αλλά και στατικά), τα οποία επεξεργαζόµαστε µε µεταβλητές δείκτες µνήµης (pointers). Στα ενδοτµηµατικά δεδοµένα οι δείκτες αυτοί είναι µεγέθους 2 byte (µόνο µετατόπιση), ενώ στα εξωτµηµατικά δεδοµένα είναι 4 bytes.

Τα διαθέσιµα µοντέλα µνήµης είναι τα εξής έξη:

Tiny. Πρόκειται για πρόγραµµα .com όλο ενός τµήµατος 65k.

Small. Ο κώδικας του προγράµµατος είναι σε ένα τµήµα, και τα δεδοµένα σε ένα άλλο τµήµα. Κλήσεις υποπρογραµµάτων ενδοτµηµατικές και δείκτες µνήµης των 2 bytes.

Compact. Ο κώδικας του προγράµµατος σε ένα τµήµα, ενώ τα δεδοµένα σε περισσότερα του ενός τµήµατα. Κλήσεις υποπρογραµµάτων ενδοτµηµατικές και δείκτες µνήµης των 4 bytes.

Medium. Ο κώδικας σε περισσότερα του ενός τµήµατα ενώ τα δεδοµένα σε ένα τµήµα. Κλήσεις υποπρογραµµάτων εξωτµηµατικές και δείκτες µνήµης των 2 bytes.

Large. Τόσο ο κώδικας όσο και τα δεδοµένα σε περισσότερα του ενός τµήµατα. Κλήσεις υποπρογραµµάτων εξωτµηµατικές και δείκτες µνήµης των 4 bytes.

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

Ακολουθεί παράδειγµα πρόγραµµα που ελέγχει αν µια µεταβλητή ( η num) µεγέθους µιας word (2 bytes) είναι µηδέν και τυπώνει το αντίστοιχο µήνυµα. Το πρόγραµµα είναι γραµµένο σε small µοντέλο.

Page 22: ΚΕΦΑΛΑΙΟ 1dima/wp-content/uploads/... · 1 ΚΕΦΑΛΑΙΟ 1 Ο ... διαιρέσεις. BX ∆είκτης για έµµεσο τρόπο προσδιορισµού διευθύνσεων

22

Παράδειγµα προγράµµατος υπ’ αριθµόν 6 :

; αρχή τµήµατος κώδικα .model small .code mov ax,@data mov ds,ax mov ax,num or ax,ax ; έλεγχος µέσω της or αν είναι µηδέν jz einai_mhden mov dx, offset mhnhma_oxi mov ah,9; Κλήση του DOS που τυπώνει ένα µήνυµα int 21h ; DOS jmp telos einai_mhden: mov dx,offset mhnhma_nai mov ah,9; κλήση του DOS που τυπώνει ένα µήνυµα int 21h ; DOS telos: mov ah,4ch; κλήση του DOS για τέλος προγράµµατος int 21h ; DOS ; τµήµα δεδοµένων .data num dw 0 mhnhma_nai db 10,13, "It is zero",10,13,'$' mhnhma_oxi db 10,13, "It is not zero",10,13,'$' ;τµήµα σωρού .stack 256 end ΚΕΦΑΛΑΙΟ 3 ΒΑΣΙΚΕΣ ΕΝΤΟΛΕΣ 1.ΕΝΤΟΛΕΣ ΜΕΤΑΦΟΡΑΣ ∆Ε∆ΟΜΕΝΩΝ 1.1 Εντολή MOV Σύνταξη MOV προορισµός , προέλευση Μεταφέρει δεδοµένα ενός η δύο byte από : καταχωρητή σε καταχωρητή (π.χ MOV AX,BX) καταχωρητή σε θέση µνηµης (π.χ MOV APOT,AL) θέση µνήµης σε καταχωρητή (π.χ MOV DL,APOT) σταθερά τιµή σε καταχωρητή (π.χ MOV AH,21h) σταθερά τιµή σε θέση µνήµης (π.χ MOV ARIT,5)

Page 23: ΚΕΦΑΛΑΙΟ 1dima/wp-content/uploads/... · 1 ΚΕΦΑΛΑΙΟ 1 Ο ... διαιρέσεις. BX ∆είκτης για έµµεσο τρόπο προσδιορισµού διευθύνσεων

23

Η τελευταία περίπτωση δεν επιτρέπεται σε καταχωρητές τµηµάτων Π.χ MOV DS,DATASEG; δεν επιτρέπεται Και οι δυο τελεστές πρέπει να είναι ίσου µήκους δηλαδή ή και οι δύο είναι µεγέθους 1 byte ή και οι δύο είναι µεγέθους 1 word = 2 bytes. Π.Χ. οι εντολές: MOV ax,dl MOV bh,dx δεν επιτρέπονται. 1.2 Εντολή PUSH και POP Είναι εντολές µεταφοράς δεδοµένων από και προς το σωρό. Ο σωρός (stack) είναι µια περιοχή µνήµης στην οποία οι τιµές µπορούν να αποθηκεύονται και να ανακτούνται σύµφωνα µε την λογική LIFO (Last In First Out). Ο σωρός ενός προγράµµατος είναι ένα και µοναδικό τµήµα η βάση του οποίου έχει δ/νση SS:0000 η δε κορυφή του SS:SP. Η εντολή PUSH ελαττώνει τον SP κατά 2 και στην συνέχεια µεταφέρει µια λέξη (2 bytes) στην κορυφή του σωρού. Η εντολή POP µεταφέρει την λέξη που βρίσκεται στην κορυφή του σωρού στον τελεστή προορισµού και στην συνέχεια αυξάνει τον SP κατά 2. Τελεστής µπορεί να είναι ή καταχωρητής ή δ/νση µνήµης των 16 bit, όχι όµως σταθερά. Π.χ. Αν SP=100h , SS=1000h , Ax=12. Μετά από την εκτέλεση της εντολής : PUSH ax SP=0FEh και η δ/νση 1000:00FE περιέχει την τιµή 12. Η εντολή PUSH 10 δεν είναι επιτρεπτή. Αντίστοιχες προς τις παραπάνω εντολές είναι οι PUSHF , POPF οι οποίες συντάσσονται χωρίς τελεστή και µεταφέρουν από και προς το σωρό το περιεχόµενο του καταχωρητή κατάστασης. 1.3 Εντολή XCHG Ανταλλάσσει τα περιεχόµενα των δυο τελεστών (προέλευσης µε προορισµό) που ηµπορεί να είναι bytes ή words. Οι τελεστές µπορεί να είναι καταχωρητές ή θέσεις µνήµης. Απαγορεύεται να είναι όµως και οι δυο θέσεις µνήµης. Π.χ. Αν AX=14 , BX=15 , µετά την εντολή :

Page 24: ΚΕΦΑΛΑΙΟ 1dima/wp-content/uploads/... · 1 ΚΕΦΑΛΑΙΟ 1 Ο ... διαιρέσεις. BX ∆είκτης για έµµεσο τρόπο προσδιορισµού διευθύνσεων

24

XCHG ax,bx Ο ax=15 και bx=14. 2.ΑΡΙΘΜΗΤΙΚΕΣ ΛΟΓΙΚΕΣ ΕΝΤΟΛΕΣ. 2.1 Αριθµητικές εντολές Ο 8086 από µόνος του διαθέτει περιορισµένες δυνατότητες αριθµητικών πράξεων. ∆ιαθέτει εντολές µόνο πρόσθεσης, αφαιρέσεις, πολλαπλασιασµού και διαίρεσης σε προσηµασµένους και µη ακέραιους δυαδικούς αριθµούς των 8 ή των 16 bits. Οι αρνητικοί αριθµοί συµβολίζονται µε την λογική του συµπληρώµατος ως προς δύο (two’s complement). Υποστηρίζει και πράξεις των 32 bits αλλά µε περισσότερες της µια εντολές. Πράξεις µε αριθµούς κινητής υποδιαστολής δεν υποστηρίζει. Οι πράξεις αυτές εκτελούνται ή από µαθηµατικό συνεπεξεργαστή εάν υπάρχει, ή από υποπρογράµµατα που περιέχουν πολυάριθµες εντολές ολισθήσεων, προσθέσεων και συγκρίσεων. 2.2 Πρόσθεση Αφαίρεση Οι εντολές είναι ADD και SUB και συντάσσονται όπως ακριβώς ή MOV δηλαδή : ADD προορισµός, προέλευση SUB προορισµός, προέλευση Ως προς τους τελεστές ισχύουν οι περιορισµοί της εντολείς MOV και επιπλέον ότι απαγορεύεται η χρήση καταχωρητών τµηµάτων. Οι εντολές ADC και SBB είναι παρόµοιες µε τις προηγούµενες µε επιπλέον στοιχείο ότι λαµβάνουν υπόψη την τιµή της Carry Flag, δηλαδή προσθέτουν ή αφαιρούν αντίστοιχα και το περιεχόµενο της CF. Είναι χρήσιµες για πράξεις των 32 bits. Παράδειγµα µε τον κώδικα που ακολουθεί προστίθεται ο 32 bit αριθµός που το περιεχόµενο του είναι αποθηκευµένο στους καταχωρητές CX:BX στον 32 bit αριθµό DX:AX. … add ax,bx adc dx,cx ; αν υπάρχει κρατούµενο από τα χαµηλά 16 bit προστίθεται … Ο 8086 διαθέτει εντολές αύξησης και µειώσεις κατά 1 INC και DEC. Οι εντολές αυτές είναι ιδιαίτερα χρήσιµες σε µετρητές και επεξεργασία πινάκων, συντάσσονται µε ένα τελεστή καταχωρητή ή µεταβλητή µνήµης. Οι εντολές : INC <τελεστής> DEC <τελεστής> είναι µικρότερες και ταχύτερες από τις αντίστοιχες : ADD <τελεστής> , 1 SUB <τελεστής> , 1

Page 25: ΚΕΦΑΛΑΙΟ 1dima/wp-content/uploads/... · 1 ΚΕΦΑΛΑΙΟ 1 Ο ... διαιρέσεις. BX ∆είκτης για έµµεσο τρόπο προσδιορισµού διευθύνσεων

25

2.2 Πολλαπλασιασµός ∆ιαίρεση Η εντολή MUL συντάσσεται: MUL <προέλευση> Όπου προέλευση ένας τελεστής γενικής χρήσης καταχωρητή ή µεταβλητή µνήµης. Αν ο τελεστής είναι ενός byte τότε η προέλευση πολλαπλασιάζει το περιεχόµενο του AL και το αποτέλεσµα αποθηκεύεται στον AX. Αν ο τελεστής είναι δυο byte τότε η προέλευση πολλαπλασιάζει το περιεχόµενο του AX και το αποτέλεσµα αποθηκεύεται σαν διπλή λέξη στους καταχωρητές DX:AX. Ο πολλαπλασιασµός θεωρείται µη προσηµασµένος. Η εντολή IMUL είναι παρόµοια αλλά για προσηµασµένο πολλαπλασιασµό Π.χ. αν AL=10 και DL=15 µετά την εντολή : MUL DL Ο AX = 150. Η εντολή DIV συντάσσεται DIV <προέλευση> Όπου προέλευση ένας τελεστής γενικής χρήσης καταχωρητής ή µεταβλητή µνήµης. Αν ο τελεστής είναι ενός byte τότε η προέλευση διαιρεί το περιεχόµενο του AX και το µεν πηλίκο της διαιρέσεις αποθηκεύεται στον AL το δε υπόλοιπο στον AH. Αν ο τελεστής είναι δύο byte τότε η προέλευση διαιρεί το περιεχόµενο της διπλής λέξης που είναι αποθηκευµένο στους DX:AX και το µεν πηλίκο της διαίρεσης αποθηκεύεται στον AX το δε υπόλοιπο στον DX. Η διαίρεση θεωρείται µη προσηµασµένη. Η εντολή IDIV είναι παρόµοια αλλά για προσηµασµένη διαίρεση. Π.χ. αν AX=115 και DL=10 µετά την εντολή : DIV DL Ο AH =5 και AL = 11. Τέλος αναφέρουµε την εντολή NEG <προορισµός> η οποία αλλάζει το πρόσηµο του τελεστή σε συµπλήρωµα ως προς δύο. 2.3 Λογικές πράξεις Ο 8086 διαθέτει πλήρες σύνολο λογικών εντολών AND, OR, XOR και NOT. Οι εντολές αυτές είναι πολύ χρήσιµες για την επεξεργασία µεµονωµένων bit ενός byte ή µιας λέξης. Οι πράξεις σε δεδοµένα bit γίνονται συµφωνά µε τους γνωστούς πίνακες αλήθειας. Οι δε λογικές πράξεις εκτελούν τις πράξεις µε προσανατολισµό σε bit ενεργώντας στα αντίστοιχα bits των τελεστών Π.Χ αν AL=10110110b , AH=11110000b µετά την εκτέλεση της εντολής : AND al,ah ο al = 10110000b

Page 26: ΚΕΦΑΛΑΙΟ 1dima/wp-content/uploads/... · 1 ΚΕΦΑΛΑΙΟ 1 Ο ... διαιρέσεις. BX ∆είκτης για έµµεσο τρόπο προσδιορισµού διευθύνσεων

26

∆ηλαδή η παραπάνω εντολή εκτελεί ένα λογικό ΚΑΙ του 0 bit του al µε το 0 bit του ah , του 1 bit του al µε το 1 bit του ah και ούτω καθεξής. Οι AND, OR, XOR συντάσσονται µε δύο τελεστές, η NOT µε έναν. Προορισµός είναι ο πρώτος τελεστής όπως στις αριθµητικές πράξεις, και ως προς το είδος των τελεστών ισχύουν τα ίδια µε τις αριθµητικές πράξεις. 3.ΟΛΙΣΘΗΣΕΙΣ ΠΕΡΙΣΤΡΟΦΕΣ Ο 8086 διαθέτει µια ποικιλία εντολών µε τις οποίες µπορεί να µετακινεί bits αριστερά και δεξιά σε έναν καταχωρητή ή στην µνήµη. Οι σηµαντικότερες από αυτές είναι :

CF0

SHL ή SAL

Η SHL ή SAL µετακινεί κάθε bit του τελεστή µια θέση προς τα αριστερά προς την κατεύθυνση του σηµαντικότερου bit. Το σηµαντικότερα bit µετακινείται στην CF και στο χαµηλότερο bit εισέρχεται ένα 0. Ισοδυναµεί µε ταχύτατο πολλαπλασιασµό του τελεστή επί 2.

CF0

SHR

Η SHR µετακινεί κάθε bit του τελεστή µια θέση προς τα δεξιά. Το µη σηµαντικότερο bit (υπ’αριθµ. 0) µετακινείται στην CF και στο υψηλότερο bit εισέρχεται ένα 0. Ισοδυναµεί µε ταχύτατη µη προσηµασµένη διαίρεση του τελεστή δια 2.

Page 27: ΚΕΦΑΛΑΙΟ 1dima/wp-content/uploads/... · 1 ΚΕΦΑΛΑΙΟ 1 Ο ... διαιρέσεις. BX ∆είκτης για έµµεσο τρόπο προσδιορισµού διευθύνσεων

27

CF

SAR

Η SAR είναι παρόµοια προς την προηγούµενη εντολή δηλαδή µετακινεί κάθε bit του τελεστή µια θέση προς τα δεξιά αλλά το σηµαντικότερο bit αφού µετακινηθεί προς τα δεξιά επιστρέφει στην θέση του. Ισοδυναµεί µε ταχύτατη προσηµασµένη διαίρεση του τελεστή δια 2. Υπάρχουν οι εξής 4 εντολές περιστροφής:

CF

ROR

H ROR είναι παρόµοια µε την SHR µε την διαφορά ότι το ολιγότερο σηµαντικό bit µεταφέρεται στο σηµαντικότερο bit καθώς και στην CF.

Page 28: ΚΕΦΑΛΑΙΟ 1dima/wp-content/uploads/... · 1 ΚΕΦΑΛΑΙΟ 1 Ο ... διαιρέσεις. BX ∆είκτης για έµµεσο τρόπο προσδιορισµού διευθύνσεων

28

CF

ROL

Η ROL είναι αντίστροφος της προηγούµενης εντολής. Περιστρέφει τα bits κατά αριστερή φορά.

CF

RCR

CF

RCL

Page 29: ΚΕΦΑΛΑΙΟ 1dima/wp-content/uploads/... · 1 ΚΕΦΑΛΑΙΟ 1 Ο ... διαιρέσεις. BX ∆είκτης για έµµεσο τρόπο προσδιορισµού διευθύνσεων

29

Η RCL και RCR είναι λίγο διαφορετικές από τις προηγούµενες. Στις εντολές αυτές κατά την περιστροφή συµµετέχει και η CF. ∆ηλαδή κατά την RCL τα bits ολισθαίνουν προς τα αριστερά, το σηµαντικότερο bit µεταφέρεται στην CF και το περιεχόµενο της CF µεταφέρεται στο υπ’ αριθµ. 0 bit. Η RCR λειτουργεί αντίστροφα. Όλες οι παραπάνω εντολές συντάσσονται µε δυο τρόπους. Εφόσον οι ολισθήσεις ή περιστροφές είναι µια ο δεύτερος τελεστής είναι 1, αλλιώς δεύτερος τελεστής είναι ο καταχωρητής CL ο οποίος και καθορίζει το αριθµό των περιστροφών ή ολισθήσεων. Π.χ µε την εντολή: SHL AX,1 Πολλαπλασιάζεται το περιεχόµενο του AX επί 2. Ενώ µε τις εντολές : MOV CL,4 SHL AX,CL Πολλαπλασιάζεται το περιεχόµενο του AX επί 16. 4.ΑΛΛΑΓΗ ΡΟΗΣ ΠΡΟΓΡΑΜΜΑΤΟΣ – ΣΥΓΚΡΙΣΕΙΣ – ΕΝΤΟΛΕΣ ∆ΕΙΚΤΩΝ 4.1 Εισαγωγή Κατά την εκτέλεση ενός προγράµµατος κανονικά οι εντολές του αναλύονται και εκτελούνται ακολουθησιακά, γραµµικά. Αλλά ένα θεµελιώδες χαρακτηριστικό κάθε χρήσιµου υπολογιστή είναι η παρουσία εντολών µε τις οποίες διακλαδώνεται το πρόγραµµα σε εντολή άλλη από την επόµενη που ακολουθεί στην µνήµη. Περιλαµβάνονται εντολές διακλαδώσεων χωρίς συνθήκη , αλλά και είτε πολύ χρήσιµες εντολές µε της οποίες η διακλάδωση εξαρτάται από την κατάσταση των σηµαιών ή από το αποτέλεσµα της πράξης. Υπενθυµίζεται ότι οι αριθµητικές , λογικές πράξεις και οι περιστροφές είναι γνωστό βέβαια επηρεάζουν την κατάσταση των δεικτών κατάστασης. Οι σηµαντικότεροι δείκτες κατάστασης είναι οι CF, OF, ZF. 4.2 ∆ιακλαδώσεις χωρίς συνθήκη Η εντολή είναι η JMP <ετικέτα> Η διακλαδώσει µπορεί να είναι :

- Σε σχετική διεύθυνση ενός byte ( -128 έως +127 ) θέσεων από την διεύθυνση της επόµενης εντολής κλήσεως. Στην περίπτωση αυτή είναι υποχρεωτική η χρήση της οδηγίας SHORT.

- Σε σχετική διεύθυνση µιας λέξης ( -32768 έως +32767 ) θέσεων από την

διεύθυνσης της επόµενης εντολής κλήσεως. Η διακλάδωση αυτή είναι στο ίδιο τµήµα κώδικα (ενδοτµηµατική).

Page 30: ΚΕΦΑΛΑΙΟ 1dima/wp-content/uploads/... · 1 ΚΕΦΑΛΑΙΟ 1 Ο ... διαιρέσεις. BX ∆είκτης για έµµεσο τρόπο προσδιορισµού διευθύνσεων

30

- Σε σχετική διεύθυνση δύο λέξεων θέσεων. Στην περίπτωση αυτή είναι

υποχρεωτική η χρήση της οδηγίας FAR PTR. Η διακλάδωση αυτή καλύπτει όλο το χώρο της µνήµης του 8086.

Η δ/νση µπορεί να είναι σταθερή (άµεση) ή µεταβλητή (έµµεση).

Παραδείγµατα :

a: ….. jmp SHORT a; άµεση ενός byte διακλάδωση στο label a a: ….. jmp FAR PTR a; άµεση εξωτµηµατική διακλάδωση στο label a a: ….. mov ax, OFFSET a jmp ax ; έµµεση ενδοτµηµατική διακλάδωση στο label a a: ….. jmp word ptr [b] ; έµµεση ενδοτµηµατική διακλάδωση στο label a ….. b dw offset a

4.3 ∆ιακλαδώσεις µε συνθήκη – Συγκρίσεις

Ο 8086 διαθέτη 18 εντολές διακλαδώσεων µε τις οποίες υπάρχει η δυνατότητα διακλάδωσης ανάλογα µε την τιµή µιας σηµαίας ή συνδυασµού σηµαιών. Ειδικά αναφέρουνε ότι αν ελέγχουµε το αποτέλεσµα πράξεων µε µη προσηµασµένους αριθµούς τότε λαµβάνεται υπόψη µεταξύ των άλλων η CF ( Carry Flag), ενώ σε προσηµασµένους αριθµούς ελέγχεται η OF (Overflow Flag) και η SF (Sign Flag).

Πολύ συχνά µιας εντολής διακλάδωσης µε συνθήκη προηγείται µια εντολή σύγκρισης CMP όποτε και η διακλάδωση πραγµατοποιείται ή όχι, ανάλογα µε το αποτέλεσµα της σύγκρισης. Η εντολή σύγκρισης συντάσσεται όπως η εντολή αφαίρεσης SUB:

CMP <προορισµός>, <προέλευση>

Η CMP συγκρίνει τον προορισµό µε την προέλευση , δηλαδή όπως και η SUB αφαιρεί από τον προορισµό την προέλευση, ενηµερώνει τους δείκτες κατάστασης (Flags) ανάλογα µε το αποτέλεσµα της πράξης αλλά το αποτέλεσµα της πράξης δεν το αποθηκεύει πουθενά, δηλαδή οι τελεστές της σύγκρισης δεν αλλάζουν τιµή. Π.χ

CMP AL,6 JA a ; ∆ιακλάδωση αν το περιεχόµενο του AL > 6 …..

Page 31: ΚΕΦΑΛΑΙΟ 1dima/wp-content/uploads/... · 1 ΚΕΦΑΛΑΙΟ 1 Ο ... διαιρέσεις. BX ∆είκτης για έµµεσο τρόπο προσδιορισµού διευθύνσεων

31

a:

Παρόµοια µε την CMP είναι η εντοµή TEST η οποία συντάσσεται µε δύο τελεστές (προορισµός, προέλευση) και εκτελεί λογικό AND µεταξύ των δύο τελεστών (Byte ή λέξεων) ενηµερώνει τις σηµαίες, αλλά δεν επιστέφει αποτέλεσµα (δεν αλλοιώνονται οι τελεστές). Η εντολή TEST είναι χρήσιµη για τον έλεγχο της τιµής συγκεκριµένων bits ενός τελεστή και συνδυάζεται συνήθως µε την εντολή JNZ. Π.χ το παρακάτω τµήµα προγράµµατος ελέγχει αν ένας ακέραιος αριθµός διαιρείται ακριβώς, µε το 4. Παράδειγµα προγράµµατος υπ’ αριθµόν 7 :

.MODEL SMALL ; µικρό µοντέλο µνήµης .CODE mov ax,@data mov ds,ax MOV AX,ARIT; Ο αριθµός στον συσσωρευτή TEST AX,0000000000000011h; έλεγχος αν είναι µηδέν τα δύο τελευταία bit JNZ NOT__EVEN; αν δεν είναι άλµα στην εκτύπωση δεν είναι LEA DX,MHNHMA__EINAI; εκτύπωση MOV AH,09 ; µηνύµατος είναι INT 21H Jmp TELOS NOT__EVEN: LEA DX,MHNHMA__DEN__EINAI; εκτύπωση MOV AH,09 ; µηνύµατος INT 21H ; δεν είναι TELOS: mov ah,4ch; έξοδος int 21h ; από το πρόγραµµα .DATA MHNHMA__EINAI db "4 is a divisor of arit",10,13,"$" MHNHMA__DEN__EINAI db "4 is not a divisor of arit",10,13,"$" arit dw 1201 .stack 100h end Ακολουθεί Πίνακας των εντολών µε συνθήκη µαζί µε τα συνώνυµα τους καθώς και τις τιµές των σηµαιών σύµφωνα µε τις οποίες θα πραγµατοποιηθεί ή όχι διακλάδωση:

Page 32: ΚΕΦΑΛΑΙΟ 1dima/wp-content/uploads/... · 1 ΚΕΦΑΛΑΙΟ 1 Ο ... διαιρέσεις. BX ∆είκτης για έµµεσο τρόπο προσδιορισµού διευθύνσεων

32

Όνοµα Περιγραφή ∆είκτες που ελέγχονται

JB/JNAE ∆ιακλάδωση εάν είναι µικρότερο µη προσηµασµένο

CF=1

JAE/JNB

∆ιακλάδωση εάν δεν είναι µικρότερο µη προσηµασµένο

CF=0

JBE/JNA

∆ιακλάδωση εάν δεν είναι µεγαλύτερο µη προσηµασµένο

CF=1 ή ZF=1

JA/JNBE

∆ιακλάδωση εάν είναι µεγαλύτερο µη προσηµασµένο

CF=0 και ZF=0

JE/JZ

∆ιακλάδωση αν είναι ίσο

ZF=1

JNE/JNZ

∆ιακλάδωση αν είναι άνισα

ZF=0

JL/JNGE

∆ιακλάδωση εάν είναι µικρότερο προσηµασµένο

SF<>OF

JGE/JNL

∆ιακλάδωση εάν δεν είναι µικρότερο προσηµασµένο

SF=OF

JLE/JNG

∆ιακλάδωση εάν δεν είναι µεγαλύτερο προσηµασµένο

ZF=1 ή SF<>OF

JG/JNLE

∆ιακλάδωση εάν είναι µεγαλύτερο προσηµασµένο

ZF=O και SF = OF

JP/JPE

∆ιακλάδωση εάν υπάρχει ισοτιµία

PF=1

JNP/JPO

∆ιακλάδωση εάν δεν υπάρχει ισοτιµία

PF=0

JS

∆ιακλάδωση εάν αρνητικό αποτέλεσµα

SF=1

JNS

∆ιακλάδωση εάν θετικό αποτέλεσµα

SF=0

JC

∆ιακλάδωση εάν υπάρχει κρατούµενο

CF=1

JNC

∆ιακλάδωση εάν δεν υπάρχει κρατούµενο

CF=0

JO

∆ιακλάδωση εάν υπάρχει υπέρβαση κρατουµένου

OF=1

Page 33: ΚΕΦΑΛΑΙΟ 1dima/wp-content/uploads/... · 1 ΚΕΦΑΛΑΙΟ 1 Ο ... διαιρέσεις. BX ∆είκτης για έµµεσο τρόπο προσδιορισµού διευθύνσεων

33

JNO

∆ιακλάδωση εάν δεν υπάρχει υπέρβαση κρατουµένου

OF=0

Παρόλη την ευελιξία τους οι εντολές διακλαδώσεων υπό συνθήκη παρουσιάζουν τον περιορισµό ότι είναι διακλαδώσεις µεγέθους ενός προσηµασµένου byte. ∆ηλαδή η ετικέτα διακλαδώσεις πρέπει να απέχει από το –128 έως +127 θέσεις (Bytes) από την δ/νση της επόµενης εντολής. Για µεγαλύτερου µεγέθους διακλαδώσεις γίνεται συνδυασµός µιας διακλάδωσης µε συνθήκη και µιας χωρίς συνθήκη. Παράδειγµα η µικρού µεγέθους διακλάδωση: CMP DL,7 JA A ....... A: Αντικαθίσταται µε την µεγάλου µεγέθους ισοδύναµη της: CMP DL,7 JNA B JMP A B: ……. A: 4.4 Εντολές βρόγχων επανάληψης Οι βρόγχοι είναι ένα τµήµα κώδικα το οποίο τελειώνει µε συνθήκη διακλάδωσης στην αρχή του. Κατ’ αυτόν τον τρόπο το τµήµα αυτό εκτελείται συνεχώς έως ότου ικανοποιηθεί η συνθήκη. Οι βρόγχοι είναι πολύ χρήσιµοι για τον χειρισµό πινάκων, εισαγωγή αλφαριθµητικών από το πληκτρολόγιο, έλεγχο της κατάστασης θυρών εισόδου ή εξόδου, εµφάνιση αλφαριθµητικών στην οθόνη, καθυστερήσεις κ.α. Ο 8086 διαθέτει ορισµένες χρήσιµες ειδικές εντολές βρόγχων επανάληψης : LOOP, LOOPE, LOOPNE και JCXZ. Συντάσσονται όλες µε ένα τελεστή που είναι η ετικέτα διακλάδωσης. Όλες ελέγχουν την τιµή του καταχωρητή CX ο οποίος χρησιµεύει σαν µετρητής βρόγχων επανάληψης. Ειδικότερα η LOOP µειώνει κατά 1 τον CX και εάν η τιµή του δεν είναι 0 πραγµατοποιείται η διακλάδωση, αλλιώς εκτελείται η εντολή που βρίσκεται µετά την LOOP. Π.χ το παρακάτω τµήµα κώδικα τυπώνει 18 χαρακτήρες ενός µηνύµατος, στην οθόνη. mhnhma DB ‘ΤΕΛΟΣ ΠΡΟΓΡΑΜΜΑΤΟΣ’ .. .. mov cx,18; µετρητής επανάληψης lea bx,mhmnhma; ενεργός δ/νση ή µετατόπιση της µεταβλητής ; mhnhma στον καταχωρητή δείκτη bx

Page 34: ΚΕΦΑΛΑΙΟ 1dima/wp-content/uploads/... · 1 ΚΕΦΑΛΑΙΟ 1 Ο ... διαιρέσεις. BX ∆είκτης για έµµεσο τρόπο προσδιορισµού διευθύνσεων

34

loop__ektyp: mov dl,[bx] ; στον dl ο χαρακτήρας προς εµφάνιση inc bx ; αύξηση του δείκτη mov ah,02h ; κλήση του DOS για εµφάνιση χαρακτήρα int 21h ; διακοπή του DOS loop loop_ektyp ; επανάληψη αν ο CX > 0 Η LOOPE είναι παρόµοια µε την LOOP ως προς τον CX. Η διαφορά είναι ότι η LOOPE πραγµατοποιεί την επανάληψη όταν CX<>0 και ZF = 1 (δηλαδή αποτέλεσµα προηγούµενης αριθµητικής πράξης ή σύγκρισης µηδέν). Αντίθετα η LOOPNE πραγµατοποιεί την επανάληψη όταν CX<>0 και ZF = 0 (δηλαδή αποτέλεσµα προηγούµενης αριθµητικής πράξης η σύγκρισης διάφορο του µηδενός). Π.χ το παραπάνω τµήµα κώδικα εισάγει από το πληκτρολόγιο χαρακτήρες σε προσωρινή µνήµη µεγέθους 256 bytes. Η εισαγωγή διακόπτεται εάν γεµίσει η µνήµη ή αν πληκτρολογηθεί ENTER ( χαρακτήρας µε ASCIl τιµή 13). Buffer db 126 dup (0) ; ∆ήλωση προσωρινής µνήµης .. .. mov cx,256; µετρητής επανάληψης lea bx,buffer; ενεργός δ/νση της προσωρινής µνήµης ; στον καταχωρητή δείκτη bx again: mov ah,8 ; κλήση του DOS για εισαγωγή χαρακτήρα από το πληκτρολόγιο int 21h ; διακοπή του DOS mov [bx],al ; ο χαρακτήρας που έχει εισαχθεί από την προηγούµενη κλήση του ; DOS αποθηκεύεται στον AL και µεταφέρεται στην µνήµη inc bx ; αύξηση του δείκτη cmp al,0dh ; έλεγχος αν πατήθηκε το πλήκτρο ENTER loopne again ; επανάληψη αν ο CX > 0 και ZF = 0 Τέλος αναφέρουµε την JCXZ ή οποία διακλαδώνεται αν ο CX = 0. Είναι ιδιαίτερα χρήσιµα πριν ξεκινήσει να εκτελείται ο βρόγχος επανάληψης όταν η τιµή του CX δεν είναι σταθερά. Π.χ JCXZ parakatv; Αν ο CX=0 να µην εκτελεστεί η καθυστέρηση again: loop again; Καθυστέρηση CX κύκλους parakatv: Αναρωτηθείτε τι θα συνέβαινε αν είχε παραληφθεί η εντολή JCXZ και η τιµή του CX=0. Τέλος σηµειώνουµε ότι οι εντολές βρόγχων όπως και οι εντολές διακλαδώσεων υπό συνθήκη παρουσιάζουν τον περιορισµό ότι µπορούν να διακλαδώνονται σε απόσταση µόνο ενός προσηµασµένου byte από την επόµενη του βρόγχου εντολή.

Page 35: ΚΕΦΑΛΑΙΟ 1dima/wp-content/uploads/... · 1 ΚΕΦΑΛΑΙΟ 1 Ο ... διαιρέσεις. BX ∆είκτης για έµµεσο τρόπο προσδιορισµού διευθύνσεων

35

Ασκήσεις: 1. Να συντάξετε πρόγραµµα µε το οποίο εισάγεται ένας χαρακτήρας από το πληκτρολόγιο και εµφανίζεται στην οθόνη η ASCII τιµή του α) σε δυαδική µορφή β) σε δεκαδική µορφή γ) σε δεκαεξαδική µορφή 2. Να συντάξετε πρόγραµµα που αθροίζει δυο προσηµασµένους αριθµούς µεγέθους byte και τυπώνει το αποτέλεσµα σε δεκαδική µορφή. 3. Να συντάξετε πρόγραµµα µε το οποίο εισάγονται 20 χαρακτήρες από το πληκτρολόγιο τους οποίους τυπώνει στην οθόνη αφού προηγούµενος µετατρέψει τα κεφαλαία λατινικά γράµµατα µικρά λατινικά γράµµατα. 4.5 Εντολές χειρισµού µεταβλητών τύπου δείκτη µνήµης(pointer). ∆είκτες µνήµης είναι µεταβλητές µνήµης των οποίων το περιεχόµενο είναι δ/νσεις είτε άλλων µεταβλητών είτε και υποπρογραµµάτων. Υπάρχουν δυο τύποι δεικτών. Οι δείκτες που αποθηκεύουν δ/νσεις στο ίδιο τµήµα (near pointers) και οι δείκτες που αποθηκεύουν δ/νσεις σε άλλο τµήµα (far pointers). Οι πρώτοι αποθηκεύουν µόνο την µετατόπιση της δ/νσης επειδή το τµήµα είναι γνωστό, και εποµένως το µέγεθος τους είναι 2 bytes. Οι δείκτες σε άλλο τµήµα αποθηκεύουν και την δ/νση του τµήµατος και την µετατόπιση µε την σειρά πρώτα την µετατόπιση και ύστερα το τµήµα, και εποµένως το µέγεθος τους είναι 4 bytes. 0 8086 διαθέτει δύο εντολές µε τις οποίες µεταφέρει το περιεχόµενο ενός µακρινού δείκτη µνήµης σε ένα δίδυµο καταχωρητών. Οι εντολές αυτές είναι : LES <καταχωρητής>, <τελεστής µνήµης> LDS <καταχωρητής>, <τελεστής µνήµης> Ο τελεστής µνήµης είναι τύπου DWORD µεγέθους 4 bytes, και ο καταχωρητής είναι ένας 16bit καταχωρητής. Οι εντολές αυτές διαβάζουν τα 2 πρώτα bytes του τελεστή µνήµης (την µετατόπιση) και τα µεταφέρουν στον καταχωρητή της εντολής και κατόπιν διαβάζουν τα 2 επόµενα bytes και τα µεταφέρουν στον ES ή στον DS ανάλογα µε την εντολή. Στο παράδειγµα που ακολουθεί εµφανίζεται στην οθόνη το περιεχόµενο ενός αλφαριθµητικού (µε όνοµα mhnhma) µέσω µιας µεταβλητής τύπου µακρινού δείκτη. Η µεταβλητή αυτή (µε όνοµα pointer) περιέχει την πλήρη δ/νση του αλφαριθµητικού mhnhma. Παράδειγµα προγράµµατος υπ’ αριθµόν 8: code_seg segment public assume cs:code_seg,ds:data_seg main proc near mov ax,data_seg; αποκατάσταση του ds mov ds,ax les di,pointer; το περιεχόµενο της µεταβλητής pointer, ; δηλαδή η δ/νση του mhnhma , στους ES:DI again: mov dl,es:[di]; έναν χαρακτήρα από την δ/νση es:[di] στον dl

Page 36: ΚΕΦΑΛΑΙΟ 1dima/wp-content/uploads/... · 1 ΚΕΦΑΛΑΙΟ 1 Ο ... διαιρέσεις. BX ∆είκτης για έµµεσο τρόπο προσδιορισµού διευθύνσεων

36

cmp dl,0; είναι µηδέν? je telos; αν ναι τέλος mov ah,2; αλλιώς εµφάνισέ τον int 21h inc di; και αύξησε τον δείκτη µνήµης jmp again ; επανέλαβε την διαδικασία µε τον επόµενο χαρακτήρα telos: mov ah,4ch int 21h main endp code_seg ends data_seg segment ; µεταβλητή τύπου far pointer µε αρχική τιµή την δ/νση του mhnhma pointer label dword dw offset mhnhma dw seg mhnhma mhnhma db "END OF TESTING PROGRAM",10,13,0 data_seg ends soros segment para stack db 256 dup (0) soros ends END MAIN

Page 37: ΚΕΦΑΛΑΙΟ 1dima/wp-content/uploads/... · 1 ΚΕΦΑΛΑΙΟ 1 Ο ... διαιρέσεις. BX ∆είκτης για έµµεσο τρόπο προσδιορισµού διευθύνσεων

37

ΚΕΦΑΛΑΙΟ 4 ∆ΙΕΥΘΥΝΣΟΠΟΙΗΣΗ 1.ΕΙΣΑΓΩΓΙΚΑ Όπως προαναφέρθηκε ο προσπελάσιµος χώρος του 8086 είναι 1Mbyte, καθώς και ότι κάθε θέση µνήµης δείχνεται από τον συνδυασµό δυο τετραψήφιων δεκαεξαδικών αριθµών. Ο πρώτος από αυτούς λέγεται τµήµα και περιέχεται υποχρεωτικά σε έναν από τους τέσσερις καταχωρητές τµηµάτων. Ο δεύτερος λέγεται µετατόπιση ή λογική δ/νση ή ενεργός δ/νση και είναι ή σταθερά ή περιεχόµενο ενός καταχωρητή δείκτη όπως θα αναλυθεί παρακάτω. Από τους δυο αυτούς αριθµούς προκύπτει όπως αναλύθηκε στο Κεφαλαίο 4, η πραγµατική φυσική δ/νση µνήµης η οποία είναι πενταψήφιος αριθµός του δεκαεξαδικού συστήµατος. Με την διευθυνσιοποίηση επιδιώκεται η ανάκτηση ή η ανεύρεση ενός δεδοµένου στο οποίο θα γίνει επεξεργασία. Με την έννοια αυτή ορισµένοι από τους τρόπους διευθυνσιοποίησης αφορούν τελεστές µνήµης και άλλοι όχι. Όσον αφορά την µνήµη σκοπός, είναι ο προσδιορισµός της λογικής διεύθυνσης δηλαδή της δ/νσης µέσα σε ένα συγκεκριµένο τµήµα από τα τέσσερα, διότι η απόλυτη δ/νση κατασκευάζεται εσωτερικά µέσα στο επεξεργαστή (στην BIU). Το τµήµα είτε αναφέρεται ρητά στην εντολή , είτε υπονοείται. 2.ΑΜΕΣΗ ∆ΙΕΥΘΥΝΣΙΟΠΟΙΗΣΗ Εδώ η λογική δ/νση ή δεν δίδεται καθόλου ή δίδεται απ’ευθείας στην εντολή µέσα, ή υπονοείται. 2.1 Άµεση διευθυνσιοποίηση ∆εν πρόκειται στην ουσία για διευθυνσιοποίηση, αλλά για µεταφορά µιας σταθεράς σε ένα καταχωρητή. Π.χ: MOV al,3;AL <-- 3 2.2 Άµεση διευθυνσιοποίηση µε καταχωρητή Όπως και στην προηγούµενη , αλλά το δεδοµένο βρίσκεται µέσα σε ένα από τους εσωτερικούς καταχωρητές. Παράδειγµα: MOV al,bl;AL <-- (BL) 2.3 Υπονοούµενη ∆ιευθυνσιοποίηση Και εδώ δεν υπάρχει καθόλου δ/νση ούτε λογική ούτε φυσική. Στην εντολή υπονοείται κάποιος καταχωρητής µέσα στον οποίο βρίσκεται το δεδοµένο. Παράδειγµα: Π.χ. AAA ; Ρύθµιση ASCII για πρόσθεση

Page 38: ΚΕΦΑΛΑΙΟ 1dima/wp-content/uploads/... · 1 ΚΕΦΑΛΑΙΟ 1 Ο ... διαιρέσεις. BX ∆είκτης για έµµεσο τρόπο προσδιορισµού διευθύνσεων

38

Πρόκειται για εντολή που επενεργεί πάνω στον καταχωρητή AX µετατρέποντας το περιεχόµενο του σε παραδεκτό µη συνεπτυγµένο αριθµό του δεκαδικού συστήµατος. 2.4 Απ’ ευθείας ∆ιευθυνσιοποίηση Η εντολή τώρα περιλαµβάνει την µετατόπιση σε κάποιο τµήµα. Αν το τµήµα δεν αναφέρεται είναι το τµήµα των δεδοµένων (DS). Σε αντίθετη περίπτωση στον τελεστή της δ/νσης πρέπει να υπάρχει πρόθεµα ακύρωσης του εξ ορισµού τµήµατος (segment override prefix). Η λογική δ/νση είναι σταθερά , ή αριθµός σε αγκύλες ή ετικέτα ( µε ή χωρίς αγκύλες) ή και συνδυασµός των δύο. Παραδείγµατα : .DATA mhnhma db ‘ΤΕΛΟΣ ΠΡΟΓΡΑΜΜΑΤΟΣ’,10,13,’$’ PIN db 10 dup (0) Arit db 10,3 Apot db 0 MOV AL, ARIT[0]; ή mov al , [arit] ή mov al,arit ADD al, arit[1]; ή add al, [arit + 1] MOV AL, MHNHMA[2]; Τον χαρακτήρα ‘Λ’ ή mov al,[2] MOV dl,pin[3]; ή mov dl,[pin+3] ή mov dl,mhnhma[21+3] mov al,es:[6]; Το 7ο byte του extra segment mov al,ss:[9]; Το 10ο byte του σωρού. Σηµειώνεται ότι η αρίθµηση των δεικτών από την αρχή µιας ετικέτας ή ενός τµήµατος αρχίζει από το 0. Ότι βρίσκεται µέσα σε αγκύλες µεταφράζεται σε δ/νση ή απόσταση από την αρχή του τµήµατος ή την αρχή ετικέτας. __ 3. ΕΜΜΕΣΗ ∆ΙΕΥΘΥΝΣΟΠΟΙΗΣΗ 3.1 Έµµεση διευθυνσοποίηση Στις περιπτώσεις αυτές η λογική διεύθυνση υπολογίζεται µε έµµεσο τρόπο µέσω της τιµής κάποιων καταχωρητών. Όπως φαίνεται από τα παραπάνω δείγµατα σε ένα τµήµα µνήµης µπορούµε να το χειριζόµαστε σαν µονοδιάστατο πίνακα µε δείκτες αριθµούς από 0 έως το τέλος του τµήµατος. Ως τώρα οι δείκτες µνήµης ήταν σταθερές. Μπορούµε όµως σαν δείκτες να χρησιµοποιηθούν και µεταβλητές δηλαδή περιεχόµενα κάποιων καταχωρητών. Με τον τρόπο αυτό και µε την βοήθεια βρόγχων µπορούµε και επεξεργαζόµαστε µεγάλα τµήµατα µνήµης µε πολύ λίγες εντολές. Η γενική µορφή εντολών του δείκτη των τελεστών µνήµης είναι: [ <καταχωρητής βάσης> + <καταχωρητής δείκτης> + <σταθερά>] Όπου καταχωρητής βάσης ένας ή και κανένας από τους BX και BP και όχι και δυο, καταχωρητής δείκτης ένας ή κανένας από τους SI και DI, και σταθερά ετικέτα ή σταθερά ή και τα δυο. Σηµειώνουµε ότι η µορφή αυτή είναι ισοδύναµη µε την : [<καταχωρητής βάσης>] [<καταχωρητής δείκτης>] [<σταθερά>]

Page 39: ΚΕΦΑΛΑΙΟ 1dima/wp-content/uploads/... · 1 ΚΕΦΑΛΑΙΟ 1 Ο ... διαιρέσεις. BX ∆είκτης για έµµεσο τρόπο προσδιορισµού διευθύνσεων

39

Η παραπάνω µορφή παρόλο που θυµίζει πίνακες πολλών διαστάσεων, καµία σχέση δεν έχει µε δισδιάστατους ή και τρισδιάστατους πίνακες, διότι πριν από τον υπολογισµό της τελικής λογικής δ/νσης απλώς αθροίζονται όλοι οι δείκτες. Ο τύπος που χρησιµοποιούµε για να σχηµατίσουµε µια διεύθυνση της µνήµης είναι: BX SI ή ή + σταθερά µετατόπιση BP DI (base) (index) (displacement) Εποµένως , µπορούµε να ορίσουµε µια διεύθυνση χρησιµοποιώντας έναν από τους ακόλουθους τρόπους : [σταθερά] [BP+σταθερά] [BX] [BXσταθερά] [SI] [SI+σταθερά] [DI] [DI+σταθερά] [BX+SI] [BX+SI+σταθερά] [BX+DI] [BX+DI+σταθερά] [BP+SI] [BP+SI+σταθερά] [BP+DI] [BP+DI+σταθερά] [BP] Μένει να δούµε σε ποιο τµήµα αναφέρονται οι δ/νσεις αυτές αν δεν αναφέρεται στην εντολή. Αν µεταξύ των δεικτών συµµετέχει ο BP τότε αναφέρεται σε δ/νση στο τµήµα του σωρού ( SS ), αλλιώς το τµήµα των δεδοµένων ( DS ). Βέβαια όπως αναφέρθηκε παραπάνω µπορούµε να αλλάξουµε το εξ ορισµού τµήµα µνήµης µε την χρήση προθέµατος ακύρωσης τµήµατος. Παραδείγµατα : MOV di,100 mov al,’a’ mov [di],al; Την θέση 100 του data segment θέτουµε σε τιµή ‘a’ mov bp,sp sub bp,10 mov al,[bp]; το περιεχόµενο 10 θέσεις από την κορυφή του σωρού στον al mov si,10 mov al,es:[si]; το περιεχόµενο της 10 θέσης του extra segment στον al 3.2 Τελεστές και εντολές σχετικές µε διευθυνσοποίηση Σε ορισµένες εντολές σχετικές µε την διευθυνσοποίηση δεν φαίνεται το µέγεθος σε byte των δεδοµένων. Επίσης σε άλλες εντολές παρόλο που η δοµή της µνήµης είναι δεδοµένη (DB ή DW) µπορούµε να αλλάξουµε κατά την µεταφορά το εξ ορισµού µέγεθος των δεδοµένων. Αυτό επιτυγχάνεται µε τους τελεστές WORD PTR, BYTE PTR. Παραδείγµατα : MOV SI,2

Page 40: ΚΕΦΑΛΑΙΟ 1dima/wp-content/uploads/... · 1 ΚΕΦΑΛΑΙΟ 1 Ο ... διαιρέσεις. BX ∆είκτης για έµµεσο τρόπο προσδιορισµού διευθύνσεων

40

MOV WORD PTR [SI],8; Στα 2 και 3 byte του data segment ο ακέραιος αριθµός ; 080h. Υπενθυµίζεται ότι στην µνήµη τα δύο ψηφία τοποθετούνται ; αντίστροφα, δηλαδή πρώτα το 8 και µετά το 0 Κατά την επεξεργασία τµηµάτων µνήµης είναι απαραίτητη ο υπολογισµός της δ/νσης ετικέτας ή της αρχής ενός αλφαριθµητικού. Αυτό γίνεται µε τους τελεστές OFFSET και SEG ή και µε την εντολή: LEA <προορισµός>, <ετικέτα> Όπου προορισµός 16 bit καταχωρητής. Η εντολή αυτή υπολογίζει την ενεργό δ/νση ή λογική δ/νση ή µετατόπιση της ετικέτας και την µεταφέρει στον προορισµό. Το ίδιο αποτέλεσµα µπορούµε να έχουµε µε την χρήση του τελεστή OFFSET. MOV προορισµός, OFFSET ετικέτα Τέλος µε τoν τελεστή SEG υπολογίζεται η τιµή του τµήµατος (segment) στο οποίο βρίσκεται µια ετικέτα. Παραδείγµατα : .DATA mhnhma db ‘ΤΕΛΟΣ ΠΡΟΓΡΑΜΜΑΤΟΣ’ .. .CODE .. MOV AX,SEG MHNHMA; έµµεση µεταφορά της τιµής του τµήµατος MOV ES,AX; στο ES (extra segment) MOV SI,OFFSET MHNHMA; ή LEA SI, MHNHMA INC SI MOV BYTE PTR ES:[SI],’A’;Αλλάζουµε το ‘E’ σε ‘A’ Τέλος το παρακάτω παράδειγµα δείχνει τους διάφορους τρόπους έµµεσης διευθυνσοποίησης. Χρησιµοποιείται απλοποιηµένος (Simplified) τρόπος γραφής του προγράµµατος. ;Στο παράδειγµα αυτό φαίνονται οκτώ διαφορετικοί τρόποι διευθυνσοποίησης µε ;τους οποίους έχουµε το ίδιο αποτέλεσµα δηλαδή την εκτύπωση του χαρακτήρα 1 Παράδειγµα προγράµµατος υπ’ αριθµόν 9: .model small ;Μοντέλο small .stack 200h ; Σωρός µεγέθους 512 χαρακτήρων .data db 200 dup (0) charstring db "ABCDEFGHIJKLM" .code mov ax,@data ; Ο DS δείχνει το τµήµα mov ds,ax ; των δεδοµένων one: mov si , offset charstring +8; στον si η δ/νση του charstring συν 8 mov dl,[si] ; Το περιεχόµενο της δ/νσης που δείχνει ο si στον dl

Page 41: ΚΕΦΑΛΑΙΟ 1dima/wp-content/uploads/... · 1 ΚΕΦΑΛΑΙΟ 1 Ο ... διαιρέσεις. BX ∆είκτης για έµµεσο τρόπο προσδιορισµού διευθύνσεων

41

mov ah,2 int 21h two: mov bx,8 mov dl,[charstring + bx] mov ah,2 int 21h three: mov bx,offset charstring mov dl,[bx+8] mov ah,2 int 21h four: mov si,8 mov dl,[si+charstring] mov ah,2 int 21h five: mov bx,offset charstring mov di,8 mov dl,[bx+di] mov ah,2 int 21h six: mov si,offset charstring mov bx,8 mov dl,[bx+si] mov ah,2 int 21h seven: mov bx,offset charstring mov si,7 mov dl,[bx+si+1] mov ah,2 int 21h eight: mov bx,3 mov si,5 mov dl,[bx+charstring+si] mov ah,2 int 21h telos: mov ah,4ch int 21h End Μετά την εκτέλεση του παραπάνω προγράµµατος εµφανίζεται στην οθόνη: IIIIIIII

Page 42: ΚΕΦΑΛΑΙΟ 1dima/wp-content/uploads/... · 1 ΚΕΦΑΛΑΙΟ 1 Ο ... διαιρέσεις. BX ∆είκτης για έµµεσο τρόπο προσδιορισµού διευθύνσεων

42

4 ΕΝΤΟΛΕΣ ΣΕΙΡΩΝ ΧΑΡΑΚΤΗΡΩΝ 4.1 Εισαγωγή Με την δ/σιοποίηση και µε την βοήθεια εντολών επανάληψης µπορούµε εύκολα να επεξεργαστούµε µεγάλα µνήµατα µνήµης. Ο 8086 όµως διαθέτει και άλλες εντολές µε τις οποίες µπορεί να έχει πρόσβαση σε µεγάλα τµήµατα µνήµης, µέσω κάποιου δείκτη οποίος αυξάνεται ή µειώνεται αυτόµατα µετά την εκτέλεση της εντολής. Οι εντολές αυτές είναι ιδιαίτερα χρήσιµες για τον χειρισµό πινάκων , δεδοµένων σε προσωρινές µνήµες και κάθε είδους σειράς χαρακτήρων ή αριθµών. Σε κάθε περίπτωση οι εντολές αυτές είναι και µικρότερες και ταχύτερες από έναν αντίστοιχο συνδυασµό εντολών MOV , LOOP, INC. Οι εντολές αυτές διακρίνονται σε εντολές µεταφοράς δεδοµένων και σε εντολές σύγκρισης. Οι εντολές αυτές συντάσσονται χωρίς τελεστές. Όπου υπονοείται µεταφορά από την µνήµη ( προέλευση – source ) αυτή γίνεται πάντοτε από την διεύθυνση που δείχνουν οι Καταχωρητές DS;[SI], ενώ όπου υπονοείται µεταφορά στην µνήµη ( προορισµός – destination ) αυτή γίνεται στην διεύθυνση που δείχνουν οι καταχωρητές ES:[DI]. Μετά από την εκτέλεση τους οι καταχωρητές δείκτες SI και DI αυξάνονται ή µειώνονται ανάλογα µε την τιµή του δείκτη κατάσταση DF. Εάν:

- (DF) = 0 τότε γίνεται αύξηση κατά 1 για εντολές byte ή κατά 2 για εντολές λέξεων(word).

- (DF) = 1 τότε γίνεται µείωση κατά 1 για εντολές byte ή κατά 2 για εντολές λέξεων(word).

Σηµειώνεται τέλος ότι µε τις εντολές : CLD (µηδενισµός DF) STD (η DF τίθεται σε 1) µπορούµε και αλλάζουµε την τιµή της DF όποτε ορίζουµε την κατεύθυνση προς την οποία θα συνεχίσει ή επεξεργασία της σειράς. Οι δείκτες αυξάνονται ή µειώνονται κατά ένα ή κατά δύο byte ανάλογα αν πρόκειται για εντολές επεξεργασίας χαρακτήρων ή λέξεων. Όλες οι εντολές σειράς χαρακτήρων έχουν δύο εκδόσεις , µια για byte και µια για λέξεις. 4.2 Εντολές µεταφοράς 4.2.1 LODS / LODSB / LODSW Η εντολή LODSB µεταφέρει ένα byte από την δ/νση DS:[SI] στον συσσωρευτή AL και αυξάνει ή µειώνει τον SI κατά 1. Π.χ. µε τις εντολές : CLD ; µηδενισµός της DF MOV SI,2 LODSB Ο µεταφέρεται στον AL το περιεχόµενο του 2ου byte του τµήµατος των δεδοµένων.

Page 43: ΚΕΦΑΛΑΙΟ 1dima/wp-content/uploads/... · 1 ΚΕΦΑΛΑΙΟ 1 Ο ... διαιρέσεις. BX ∆είκτης για έµµεσο τρόπο προσδιορισµού διευθύνσεων

43

Η εντολή LODSW µεταφέρει µια λέξη από την δ/νση DS:[SI] στον συσσωρευτή AX και αυξάνει ή µειώνει τον SI κατά 2. Π.χ. µε τις εντολές: CLD MOV SI,2 LODSW Ο µεταφέρεται στον AX το περιεχόµενο του 2ου byte και του 3ου byte του τµήµατος των δεδοµένων. 4.2.2 STOS / STOSB / STOSW Η εντολή STOSB µεταφέρει ένα byte από τον συσσωρευτή AL στην δ/νση µνήµης ES:[DI] και αυξάνει ή µειώνει τον DI κατά 1. Π.χ. µε τις εντολές: STD ; DF=1 MOV di,2 MOV AL,4 STOSB µεταφέρεται στο 2ου byte του extra τµήµατος η τιµή 4 και µειώνεται ο DI κατά 1. Η εντολή STOSW µεταφέρει µια λέξη από τον συσσωρευτή AX στην δ/νση µνήµης ES:[DI] και αυξάνει ‘η µειώνει τον DI κατά 2. 4.2.3 MOVS / MOVSB / MOVSW Οι εντολές αυτές µπορούν να θεωρηθούν σαν συνδυασµός µιας εντολής LODS και µιας εντολής STOS. Μεταφέρουν byte ( η MOVSB ) ή λέξη ( η MOVSW ) από την δ/νση DS:[SI] στην δ/νση µνήµης ES:[DI] και αυξάνουν ή µειώνει τον DI και τον SI κατά 1 ή 2. Είναι ιδιαίτερα χρήσιµες για µεταφορά αλφαριθµητικών από περιοχή µνήµης σε περιοχή µνήµης. Με το παρακάτω παράδειγµα µεταφέρεται το περιεχόµενο του πίνακα PHGH στον πίνακα PROORISMOS. Το µέγεθος των πινάκων είναι MEGETHOS__SE__BYTE. cld ; µηδενισµός DF mov cx,MEGETHOS__SE__BYTE : ο µετρητής επανάληψης στον cx mov si,OFFSET PHGH ; λογική δ/νση πίνακα στον SI mov ax,SEG PHGH ; τµήµα πίνακα προέλευσης mov ds,ax ; στον DS mov di, OFFSET PROORISMOS ; λογική δ/νση πίνακα στον DI mov ax, SEG PROORIMOS ;τµήµα πίνακα προέλευσης mov es,ax ; στον ES brogxos__metaforas : movsb : µεταφορά ενός BYTE loop brogxos__metaforas ; επανάληψη µέχρι να µηδενιστεί ο CX 4.3 Εντολές σύγκρισης 4.3.1 SCAS / SCASB / SCASW

Page 44: ΚΕΦΑΛΑΙΟ 1dima/wp-content/uploads/... · 1 ΚΕΦΑΛΑΙΟ 1 Ο ... διαιρέσεις. BX ∆είκτης για έµµεσο τρόπο προσδιορισµού διευθύνσεων

44

Η εντολή SCAS συγκρίνει το περιεχόµενο του συσσωρευτή µε το περιεχόµενο µνήµης ES:[DI]. Όπως και στις υπόλοιπες εντολές σειρών χαρακτήρων υπάρχουν δύο εκδόσεις της εντολής: Η SCASB η οποία συγκρίνει τα περιεχόµενα του AL (ένα byte) και η SCASW η οποία συγκρίνει τα περιεχόµενα του AX (µιας λέξης). Υπενθυµίζουµε ότι σύγκριση σηµαίνει ότι από το περιεχόµενο του συσσωρευτή ( al ή ax ) αφαιρείτε το περιεχόµενο της µνήµης ES:[DI] ενηµερώνονται οι δείκτες κατάστασης χωρίς όµως το αποτέλεσµα να λαµβάνεται υπόψη πουθενά. Μετά την εκτέλεση της εντολής ο δείκτης DI αυξάνεται ή µειώνεται κατά 1 ή κατά 2 σύµφωνα µε την λογική που αναπτύχθηκε στις άλλες εντολές σειρών. Η εντολή είναι ιδιαίτερα χρήσιµη στην αναζήτηση συγκεκριµένου χαρακτήρα ή λέξης στην µνήµη, όπως στο παράδειγµα που ακολουθεί : Παράδειγµα προγράµµατος υπ’ αριθµόν 10: DOSSEG ; Οδηγίες για παραγωγή κώδικα συµβατού µε γλώσσα .MODEL TINY ; Turbo C σε µοντέλο Tiny ( προσοχή .com πρόγραµµα ) .CODE org 100h ; Αρχή κώδικα 256 byte µετά το τµήµα arxh proc LEA DX,EISAGVGH ; Εµφάνιση µηνύµατος MOV AH,9 ; µε το INT 21h ;DOS mov ah,08 ; Εισαγωγή χαρακτήρα int 21h ; µε το DOS ο χαρακτήρας αποθηκεύεται στον al MOV CX, MHKOS_KEIMENOY ; µετρητής βρόγχου επανάληψης στον cx lea di,keimeno ; mov bx,seg keimeno ; εντολές απαραίτητες σε .EXE προγράµµατα ; mov es,bx cld ; µηδενισµός DF loop_again : ; Σηµείο βρόγχου scasb ;σύγκριση και αύξηση του δείκτη je nai ; αν υπάρχει άλµα στο µήνυµα ναι loop loop_again ; επανάληψη LEA DX,mhnhma_no MOV AH,9 INT 21h Jmp short telos nai: LEA DX, Μηνυµα_yes MOV AH,9 INT 21h telos: INT 20H Arxh endp .DATA ; Απλοποιηµένη οδηγία αρχής τµήµατος δεδοµένων EISAGVGH DB "PRESS A KEY PLEASE $" KEIMENO db "SEARCH OF A CHARACTER" MHKOS_KEIMENOY DW $ - KEIMENO

Page 45: ΚΕΦΑΛΑΙΟ 1dima/wp-content/uploads/... · 1 ΚΕΦΑΛΑΙΟ 1 Ο ... διαιρέσεις. BX ∆είκτης για έµµεσο τρόπο προσδιορισµού διευθύνσεων

45

MHNHMA_NO db 10,13," THE CHARACTER THAT YOU HAVE SELECTED DOES NOT EXIST",10,13,"$" ΜΗΝΗΜΑ_YES db 10,13,"YES THE CHARACTER THAT YOU HAVE SELECTED REALLY EXIST IN THE SET",10,13,"$" End arxh 4.3.2 CMPS / CMPSB / CMPSW Εντολές σύγκρισης περιοχής µνήµης µε περιοχή µνήµης. Λειτουργούν µε την ίδια λογική των προηγούµενων εντολών. Συγκρίνουν την δ/νση DS:[SI µε την δ/νση ES:[DI]. Σύγκριση σηµαίνει αφαίρεση του περιεχοµένου της δ/νσης ES:[DI] από το περιεχόµενο της δ/νσης DS:[SI] και ενηµέρωση µόνο των δεικτών κατάστασης. Μετά από την εκτέλεση των εντολών οι δείκτες DI, SI αυξάνονται ή µειώνονται ανάλογα µε την τιµή του δείκτη DF. 4.4 Επανάληψη των εντολών των σειρών χαρακτήρων Όπως φάνηκε και από τα παραδείγµατα τα παραπάνω οι εντολές των σειρών χρησιµοποιούνται κυρίως σε βρόγχους για να επεξεργαστούν µεγάλες περιοχές µνήµης. Την επανάληψη των εντολών αυτών µπορούµε να την επιτύχουµε χρησιµοποιώντας τα προθέµατα: REP , REPE, REPZ, REPNE, REPNZ. Προσοχή τα προθέµατα δεν είναι άλλες εντολές , αλλά οδηγίες για µετάφραση εντολών µε διαφορετικό τρόπο. Με το πρόθεµα REP η εντολή εκτελείται τόσες φορές όσο και το περιεχόµενο του µετρητή CX. Φυσικά µετά από κάθε εκτέλεση οι δείκτες (SI, DI) µειώνονται ή αυξάνονται και ο CX µειώνεται κατά 1. Παράδειγµα το τµήµα προγράµµατος : mov cx,megethos__se__byte brogxos__metaforas : movsb ; µεταφορά ενός BYTE loop brogxos_metaforas ; επανάληψη µέχρι να µηδενιστεί ο γράφεται : mov cx,megethos__se__byte REP movsb ; µεταφορά ενός BYTE πολλές φορές Εξυπακούεται ότι αν CX = 0 η εντολή δεν εκτελείται καθόλου. Τα υπόλοιπα προθέµατα εξετάζουν τόσο την τιµή του CX όσο και τον δείκτη κατάστασης ZF. Χρησιµοποιούνται κυρίως στις εντολές σύγκρισης. Με το πρόθεµα REPE ή REPZ η εντολή επαναλαµβάνεται έως ότου ή ο CX=0 ή έως ότου αποτύχει η σύγκριση (δηλαδή επανέλαβε εφόσον ίσοι οι συγκρινόµενοι τελεστές). Αντίθετα µε το πρόθεµα REPNE ή REPNZ η εντολή επαναλαµβάνεται έως ότου η ο CX=0 ή έως ότου επιτύχει η σύγκριση (δηλαδή επανέλαβε εφόσον άνισοι οι συγκρινόµενοι τελεστές). Παράδειγµα το τµήµα του κώδικα: MOV CX, MHKOS__KEIMENOY ; µετρητής βρόγχου επανάληψης στον cx

Page 46: ΚΕΦΑΛΑΙΟ 1dima/wp-content/uploads/... · 1 ΚΕΦΑΛΑΙΟ 1 Ο ... διαιρέσεις. BX ∆είκτης για έµµεσο τρόπο προσδιορισµού διευθύνσεων

46

loop__again: ; σηµείο βρόγχου scasb ; σύγκριση και αύξηση του δείκτη je nai; αν υπάρχει άλµα στο µήνυµα ναι loop loop__again; επανάληψη γράφεται : MOV CX, MHKOS__KEIMENOY; µετρητής βρόγχου επανάληψης στον cx Repnz scasb ; σύγκριση και αύξηση του δείκτη 5 ΠΙΝΑΚΕΣ ΜΕΤΑΦΡΑΣΗΣ XLAT Η εντολή XLAT είναι πολύ χρήσιµη σε πίνακες µετάφρασης χαρακτήρων : XLAT <όνοµα πίνακα> Ο τελεστής της εντολής µπορεί να παραληφθεί. Η εντολή µεταφέρει ένα byte στον καταχωρητή AL από ένα πίνακα µετάφρασης κωδικοποιηµένο από τον χρηστή , που βρίσκεται στο τµήµα δεδοµένων. Ο καταχωρητής BX πρέπει να δείχνει στην αρχή του πίνακα µετάφρασης. Το αρχικό περιεχόµενο του AL χρησιµοποιείται σαν δείκτης στον πίνακα µετάφρασης. ∆ηλαδή στον AL µεταφέρεται το περιεχόµενο της δ/σης µνήµης [AL + BX] του τµήµατος δεδοµένων ( σαν καταχωρητής τµήµατος υπονοείται ο DS). Παράδειγµα: Στο παρακάτω πρόγραµµα εισάγονται χαρακτήρες από το πληκτρολόγιο και τυπώνονται µεταφράζοντας τους λατινικούς χαρακτήρες σε αντίστοιχους ελληνικούς σύµφωνα µε τις θέσεις τους στο πληκτρολόγιο. Χρησιµοποιείται πίνακας µετάφρασης όπου στις θέσεις ASCII των λατινικών χαρακτήρων τοποθετήθηκαν οι ascii τιµές των ελληνικών χαρακτήρων σύµφωνα µε την κωδικοσελίδα ΟΕΜ 737. Παράδειγµα προγράµµατος υπ’ αριθµόν 11: DOSSEG ;DGROUP group @data,@code .MODEL TINY,c;προσοχή πρόκειται για .COM πρόγραµµα .CODE org 100h; 256 απαραίτητοι χαρακτήρες στην αρχή κάθε .com προγράµµατος arxh proc lea dx ,message mov ah,09 int 21h AGAIN: mov ah,08; Εισαγωγή χαρακτήρα int 21h ; µέσω DOS CMP AL,27 ; για έξοδο ESC JE TELOS ; ο χαρακτήρας ESC cmp al,7fh ja print LEA BX,TRANS_PINAKAS ; Ο BX δείχνει στην αρχή του πίνακα

Page 47: ΚΕΦΑΛΑΙΟ 1dima/wp-content/uploads/... · 1 ΚΕΦΑΛΑΙΟ 1 Ο ... διαιρέσεις. BX ∆είκτης για έµµεσο τρόπο προσδιορισµού διευθύνσεων

47

XLAT ; τον AL το περιεχόµενο της θέσης [a1] του πίνακα µετάφρασης print: MOV DL,AL ; εµφάνιση του τροποποιηµένου ή µη χαρακτήρα MOV AH,2; µέσω INT 21h ; DOS JMP SHORT AGAIN; επανάληψη της διαδικασίας telos: INT 20H; έξοδος στο DOS για .com προγράµµατα Arxh endp .DATA ; Πίνακας µετάφρασης των χαρακτήρων πάνω από ASCII τιµή 127 TRANS_PINAKAS label byte db 00h,01h,02h,03h,04h,05h,06h,07h,08h,09h,0ah,0bh,0ch,0dh,0eh,0fh db 10h,11h,12h,13h,14h,15h,16h,17h,18h,19h,1ah,1bh,1ch,1dh,1eh,1fh DB 20h,21h,22h,23h,24h,25h,26h,27h,28h,29h,2ah,2bh,2ch,2dh,2eh,2fh DB 30h,31h,32h,33h,34h,35h,36h,37h,38h,39h,3ah,3bh,3ch,3dh,3eh,3fh DB 40h,128,129,150,131,132,148,130,134,136,141,137,138,139,140,142 DB 143,51h,144,145,146,135,151,145,149,147,133,5bh,5ch,5dh,5eh,5fh DB 60h,152,153,175,155,156,173,154,158,160,165,161,162,163,164,166 DB 167,71h,168,169,171,159,224,170,174,172,157,7bh,7ch,7dh,7eh,7fh MESSAGE DB "PRESS ANY KEY TO TRANSLATE IT IN GREEK LETTER",10,13, "PRESS ESC FOR EXIT",10,13,"$" end arxh ΚΕΦΑΛΑΙΟ 5 ΥΠΟΠΡΟΓΡΑΜΜΑΤΑ 1.ΕΙΣΑΓΩΓΗ Τα προγράµµατα που εξετάστηκαν µέχρις εδώ αποτελούνταν από ένα και µόνο σύνολο εντολών το οποίο εκτελούνταν ολόκληρο από την αρχή µέχρι το τέλος. Σε µεγάλα όµως προγράµµατα είναι απαραίτητος ο διαχωρισµός του προγράµµατος σε υποπρογράµµατα (subroutines) για την απλούστερη της επίλυση και για την αποδοτικότερη λειτουργία του. Τα υποπρογράµµατα είναι αντίστοιχα των διαδικασιών και συναρτήσεων της PASCAL (Function , Procedures). ∆ηλαδή είναι τµήµατα κώδικα που συγκεντρώνουν ένα σύνολο από εντολές το οποίο θα εκτελέσει πλήρως µια λειτουργία και πιθανόν να επιστρέψει και τιµή. Τα υποπρογράµµατα είναι απαραίτητα στοιχεία του δοµηµένου προγραµµατισµού. ∆εδοµένου ότι κάθε υποπρόγραµµα µπορεί να γραφτεί, να ελέγχει και να δοκιµαστεί ανεξάρτητα από τα υπόλοιπα, είναι ευκολότερη η υλοποίηση και η επαλήθευση ενός προγράµµατος που αποτελείται από υποπρογράµµατα. Εξάλλου η διάσπαση ενός προγράµµατος σε υποπρογράµµατα κάνει το πρόγραµµα ευκολοκατανόητο γιατί το κάθε υποπρογράµµατα µπορεί να διαβαστεί και να κατανοηθεί ξεχωριστά.

Page 48: ΚΕΦΑΛΑΙΟ 1dima/wp-content/uploads/... · 1 ΚΕΦΑΛΑΙΟ 1 Ο ... διαιρέσεις. BX ∆είκτης για έµµεσο τρόπο προσδιορισµού διευθύνσεων

48

Ένα υποπρόγραµµα µπορεί να κληθεί από διάφορα σηµεία του προγράµµατος, µε διαφορετικές αν χρειάζεται πραγµατικές παραµέτρους. Μπορεί επίσης για λόγους αυτονοµίας να χρησιµοποιεί τοπικές µεταβλητές οι οποίες υπάρχουν µόνο όσο χρόνο εκτελείται το υποπρόγραµµα αυτό. 2. ΛΕΙΤΟΥΡΓΙΑ ΥΠΟΠΡΟΓΡΑΜΜΑΤΩΝ (PROCEDURES) Ένα υποπρόγραµµα (procedure) συγκεντρώνει ένα ολοκληρωµένο σύνολο εντολών το οποίο θα εκτελέσει πλήρως µια λειτουργία και θα επιστρέψει στο κυρίως πρόγραµµα. Για να παρουσιαστεί ο τρόπος γραφής των υποπρογραµµάτων θα χρησιµοποιηθεί το εξής παράδειγµα: Να γραφεί πρόγραµµα µε το οποίο εισάγεται από το πληκτρολόγιο διψήφιος δεκαεξαδικός αριθµός και εµφανίζεται ο χαρακτήρας που έχει την αντίστοιχη ASCII τιµή. Το πρόγραµµα αναλύεται στα εξής βασικά τµήµατα

1. Μήνυµα πληκτρολόγησης. 2. Εισαγωγή 1ου δεκαεξαδικού ψηφίου. 3. Αποθήκευση στην µνήµη µετά την κατάλληλη µετατροπή 4. Εισαγωγή 2ου δεκαεξαδικού ψηφίου. 5. Αποθήκευση στην µνήµη µετά την κατάλληλη µετατροπή. 6. Εµφάνιση του χαρακτήρα.

Παράδειγµα προγράµµατος υπ’ αριθµόν 12: code_seg segment assume cs:code_seg,ds:data_seg kyrioproc proc far xor ax,ax; µηδενισµός του ax push ds ; η διεύθυνση του PSP push ax ; στον σωρό, προετοιµασία για επιστροφή στο DOS. mov dx,data_seg mov ds,dx ; αποκατάσταση του DS lea dx,mhnhma1 call emfanish_mhnhma call input_hex mov cl,4 ; Το δεκαεξαδικό ψηφίο στον al shl al,cl; πολλαπλασιάζεται επί 16 και mov ascii_timh,al; αποθηκεύεται στην µνήµη call input_hex ; Το δεύτερο δεκαεξαδικό ψηφίο στον al add ascii_timh,al; αποθηκεύεται στην µνήµη mov dl,ascii_timh call emfan_hex ret ; επιστροφή στο DOS kyrioproc endp ; Υποπρογράµµατα εισαγωγής δεκαεξαδικού ψηφίου input_hex proc near

Page 49: ΚΕΦΑΛΑΙΟ 1dima/wp-content/uploads/... · 1 ΚΕΦΑΛΑΙΟ 1 Ο ... διαιρέσεις. BX ∆είκτης για έµµεσο τρόπο προσδιορισµού διευθύνσεων

49

again: call input_char ; εισαγωγή χαρακτήρα cmp al,'0' ; σύγκριση αν είναι jb again ; στο διάστηµα από cmp al,'9' ; 0 έως 9 ja deytero_elegxo mov dl,al ; εµφάνιση call emfanish_char ; χαρακτήρα sub al,'0' ; µετατροπή σε αριθµό ret ; επιστροφή deytero_elegxo: cmp al,'A' ; σύγκριση για το διάστηµα από jb again ; A έως F cmp al,'F' ja trito_elegxo mov dl,al call emfanish_char add al,10 sub al,'A' ret trito_elegxo: cmp al,'a' ; σύγκριση για το διάστηµα a έως f jb again cmp al,'f' ja again mov dl,al call emfanish_char add al,10 sub al,'a' ret input_hex endp ; Υποπρογράµµατα εµφάνισης του χαρακτήρα µε ASCII τιµή τον ; δεκαεξαδικό αριθµό που έχει εισαχθεί emfan_hex proc near call allagh_grammhs lea dx,mhnhma2 call emfanish_mhnhma mov dl,ascii_timh call emfanish_char ret emfan_hex endp ; Υποπρόγραµµα για αλλαγή γραµµή στην οθόνη allagh_grammhs proc near lea dx,nea_grammh call emfanish_mhnhma ret allagh_grammhs endp ;Υποπρογράµµατα εµφάνισης µηνύµατος emfanish_mhnhma proc near

Page 50: ΚΕΦΑΛΑΙΟ 1dima/wp-content/uploads/... · 1 ΚΕΦΑΛΑΙΟ 1 Ο ... διαιρέσεις. BX ∆είκτης για έµµεσο τρόπο προσδιορισµού διευθύνσεων

50

mov ah,09h int 21h ret emfanish_mhnhma endp ;Υποπρογράµµα εµφάνισης χαρακτήρα emfanish_char proc near mov ah,02h int 21h ret emfanish_char endp ; Υποπρόγραµµα εισαγωγής χαρακτήρα input_char proc near mov ah,08h int 21h ret input_char endp code_seg ends ; Τµήµα δεδοµένων data_seg segment mhnhma1 db "Please enter a two digits hexadecimal number",10,13,"$" nea_grammh db 10,13,"$" mhnhma2 db 10,13,"The character is : $" ascii_timh db ? data_seg ends soros segment para stack db 256 dup (0) soros ends end kyrioproc Παρατηρουµε :

1. Το πρόγραµµα αποτελείται από το κύριο τµήµα το οποίο καλεί διάφορα υποπρογράµµατα τα όποια µε την σειρά τους πιθανόν να καλούν και αλλά υποπρογράµµατα.

2. Κάθε υποπρόγραµµα έχει συγκεκριµένο όνοµα, η αρχή του δηλώνεται µε την

οδηγία PROC και το πέρας του µε την οδηγία ENDP. Το όνοµα του υποπρογράµµατος είναι ετικέτα που αντιπροσωπεύει την λογική δ/νση της αρχής του κώδικα του ; υποπρογράµµατος.

3. Κάθε υποπρόγραµµα καλείται µε την εντολή CALL και το όνοµα του Π.χ

CALL emfanish__char

4. Κάθε υποπρόγραµµα επιστέφει στο κυρίως πρόγραµµα ή στο υποπρόγραµµα που το κάλεσε µε την εντολή RET.

Page 51: ΚΕΦΑΛΑΙΟ 1dima/wp-content/uploads/... · 1 ΚΕΦΑΛΑΙΟ 1 Ο ... διαιρέσεις. BX ∆είκτης για έµµεσο τρόπο προσδιορισµού διευθύνσεων

51

5. Και η επιστροφή στο λειτουργικό γίνεται µε την εντολή RET.

6. Η ύπαρξη σωρού απαραίτητη για την λειτουργία των υποπρογραµµάτων.

7. Κάθε υποπρόγραµµα δηλώνεται NEAR ή FAR.

8. Κάθε υποπρόγραµµα έχει τουλάχιστον µια εντολή RET.

2.ΕΝΤΟΛΕΣ CALL ΚΑΙ RET. 2.1 Λειτουργία Η θεµελιώδης λειτουργία των υποπρογραµµάτων επιτυγχάνεται µε τον συνδυασµό των εντολών CALL και RET και µε την βοήθεια του σωρού, κατά τον εξής τρόπο: Η εντολή CALL αποθηκεύει την δ/νση της εντολής µετά την CALL στο σωρό, και µεταφερθεί µε άλµα τον έλεγχο του προγράµµατος στην δ/νση του υποπρογράµµατος της CALL. Μόλις το υποπρόγραµµα τελειώσει εκτελεί µια εντολή RET, η οποία ανακαλεί από τον σωρό την δ/νση επιστροφής και την φορτώνει στον µετρητή προγράµµατος για να συνεχιστεί η εκτέλεση του προγράµµατος στην εντολή µετά την CALL που κάλεσε το υποπρόγραµµα. 2.2 Εντολή CALL Υπάρχουν δυο µορφές κλήσεων µε την εντολή CALL, η ενδοτµηµατική και η εξωτµηµατική. Υπάρχουν δυο µορφές της εντολής επιστροφής RET. Όταν το υποπρόγραµµα που βρίσκεται η CALL είναι NEAR πρόκειται για ενδοτµηµατική CAL L (near ptr call), αλλιώς αν είναι FAR τότε η CALL είναι εξωτµηµατική (far ptr call). Στην ενδοτµηµατική κλήση µεταφέρεται στην κορυφή του σωρού το περιεχόµενο του IP και µειώνεται ο δείκτης σωρού SP κατά 2. Ακολούθως συνεχίζεται η εκτέλεση του προγράµµατος στην δ/νση του υποπρογράµµατος η οποία όµως πρέπει να βρίσκεται στο ίδιο τµήµα κώδικα. Στην εξωτµηµατική κλήση µεταφέρεται πρώτα στην κορυφή του σωρού το περιεχόµενο του καταχωρητή τµήµατος κώδικα CS και µειώνεται ο δείκτης σωρού SP κατά 2 και ακολούθως µεταφέρεται στην κορυφή του σωρού το περιεχόµενο του IP µειώνεται πάλι ο δείκτης σωρού SP. Η εκτέλεση του προγράµµατος συνεχίζεται στην δ/νση του υποπρογράµµατος η οποία µπορεί να βρίσκεται σε διαφορετικό τµήµα κώδικα από το τµήµα εντολής CALL. Στην περίπτωση αυτή πριν από το όνοµα του υποπρογράµµατος πρέπει να µπεί η έκφραση FAR PTR αν δεν υπάρχουν οι δηλώσεις NEAR ή FARπ.χ. CALL FAR PTR emfanish__char.

Page 52: ΚΕΦΑΛΑΙΟ 1dima/wp-content/uploads/... · 1 ΚΕΦΑΛΑΙΟ 1 Ο ... διαιρέσεις. BX ∆είκτης για έµµεσο τρόπο προσδιορισµού διευθύνσεων

52

Η κλήση του υποπρογράµµατος µπορεί να είναι και έµµεση, δηλαδή η δ/νση του υποπρογράµµατος είναι περιεχόµενο σε µια µεταβλητή δεδοµένων. Στην περίπτωση αυτή πριν από το όνοµα της µεταβλητής µπαίνει η έκφραση WORD PTR για ενδοτµηµατική κλήση ή η έκφραση DWORD PTR όταν πρόκειται για εξωτµηµατική κλήση. Π.χ. …. CALL WORD PTR function__ptr Function__ptr dw input__char Η παραπάνω εντολή call καλεί το υποπρόγραµµα του οποίου η δ/νση βρίσκεται στην µεταβλητή τύπου, pointer function__ptr. Επειδή το περιεχόµενο αυτό είναι η δ/νση input__char καλεί έµµεσα το υποπρόγραµµα input__char. 2.3 Εντολή RET Υπάρχουν δυο µορφές της εντολής επιστροφής RET. Όταν το υποπρόγραµµα που βρίσκεται η RET είναι NEAR πρόκειται για ενδοτµηµατική RET (RETN), αλλιώς αν είναι FAR τότε η RET είναι εξωτµηµατική (RETF). Στην ενδοτµηµατική RET µεταφέρεται από την κορυφή του σωρού το περιεχόµενο στον IP και αυξάνεται ο δείκτης σωρού SP κατά 2. Ακολούθως συνεχίζεται η εκτέλεση του προγράµµατος στην µετά την CALL εντολή. Στην εξωτµηµατική RET µεταφέρεται από την κορυφή του σωρού το περιεχόµενο του IP αυξάνεται ο δείκτης σωρού SP κατά 2 και ακολούθως µεταφέρεται από νέα κορυφή σωρού το περιεχόµενο στον CS αυξάνεται πάλι ο δείκτης σωρού SP κατά 2 και συνεχίζεται η εκτέλεση του προγράµµατος. Όπως φαίνεται από τα παραπάνω πρέπει ο συνδυασµός των εντολών CALL και RET να γίνεται µε προσοχή ούτως ώστε και οι δυο να είναι του ίδιου τύπου δηλαδή ή ενδοτµηµατικές ή εξωτµηµατικές. 2.4 Πρόθεµα προγράµµατος. Κατά την εκτέλεση ενός προγράµµατος το DOS δηµιουργεί στην αρχή του µια περιοχή δεδοµένων µεγέθους 256 bytes η οποία ονοµάζεται πρόθεµα προγράµµατος (program segment prefix) ή PSP. Στα προγράµµατα .COM τα 256 bytes αυτά είναι τα πρώτα bytes του τµήµατος που βρίσκεται όλο το πρόγραµµα. Στα .EXE προγράµµατα το πρόθεµα προγράµµατος βρίσκεται σε άλλο τµήµα που προηγείται από τα υπόλοιπα τµήµατα του προγράµµατος. Στην περιοχή αυτή αποθηκεύονται χρήσιµες πληροφορίες όπως η δ/νση του ENVIROMENT (PATH, κ.α), το µέγεθος του προγράµµατος κ.τ.λ και η γραµµή εντολών για να διαβάζονται οι παράµετροι του προγράµµατος. Αναλυτικότερα η δοµή προθέµατος του προγράµµατος είναι η εξής:

Page 53: ΚΕΦΑΛΑΙΟ 1dima/wp-content/uploads/... · 1 ΚΕΦΑΛΑΙΟ 1 Ο ... διαιρέσεις. BX ∆είκτης για έµµεσο τρόπο προσδιορισµού διευθύνσεων

53

Απόκλιση από την αρχή του προθέµατος Περιεχόµενο – Σχόλια

00-01 Τα δυο πρώτα bytes περιέχουν 0CD20H

δηλαδή σε µνηµονική γλώσσα την εντολή int 20h επιστροφής στο DOS

02-03 ∆ιεύθυνση της παραγράφου ή του τµήµατος που βρίσκεται µετά από το κοµµάτι µνήµης που διατέθηκε στο πρόγραµµα. Με το πεδίο αυτό υπολογίζεστε εύκολα το µέγεθος του προγράµµατος.

04 ∆εσµευµένο 05 Εδώ υπάρχει µια κλήση στο λειτουργικό

σύστηµα µέσω του CL. 0AH-ODH 0EH-11H 12H-15H 16H-2BH 2CH-2DH

∆ιατηρήθηκε για συµβατότητα µε το CP/M Άνυσµα της διακοπής int 22h Άνυσµα της διακοπής int 23h Άνυσµα της διακοπής int 24h ∆εσµευµένο Αντίγραφο της δ/νσης τµήµατος του ENVIRONMENT. Environment είναι µια σειρά από µεταβλητές του συστήµατος που ελέγχονται µε την εντολή SET του DOS και αποθηκεύονται στην µνήµη σαν συµβολοσειρές της µορφής: µεταβλητή = τιµή

2EH-5BH ∆εσµευµένο 5Ch-6BH Εξ ορισµού FCB 1 6CH-7BH Εξ ορισµού FCB 2

Τα δυο παραπάνω αναφέρονται σε παλαιότερο τρόπο χειρισµού των αρχείων

7CH-7FH ∆εσµευµένο 80H Το µέγεθος σε bytes των παραµέτρων της

γραµµής εντολής του προγράµµατος. Περιλαµβάνονται όλοι οι χαρακτήρες εκτός του ονόµατος του προγράµµατος και του τελευταίου χαρακτήρα <Enter>

81H-0FFH Στην περιοχή αυτή της µνήµης βρίσκονται οι παράµετροι του προγράµµατος.

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

Page 54: ΚΕΦΑΛΑΙΟ 1dima/wp-content/uploads/... · 1 ΚΕΦΑΛΑΙΟ 1 Ο ... διαιρέσεις. BX ∆είκτης για έµµεσο τρόπο προσδιορισµού διευθύνσεων

54

Παράδειγµα προγράµµατος υπ’ αριθµόν 13: ASSUME CS:CODE__SEG MAIN proc far PUSH DS; προετοιµασία για έξοδο στο DOS, σώζουµε στο σωρό το XOR AX,AX; τµήµα (SEGMENT) του PSP PUSH AX; και την µηδενική µετατόπιση του PSP MOV BX, 80H; Ο BX δείκτης στον µετρητή των χαρακτήρων των παραµέτρων XOR CX,CX; µηδένισε τον CX MOV Cl,ES:[BX];µετέφερε τον αριθµό των χαρακτήρων των παραµέτρων στον CX JCXZ TELOS; αν ο µετρητής είναι µηδέν τέλος AGAIN: INC BX; τον δείκτη στην µνήµη MOV DL,ES:[BX]; και µετέφερε τον χαρακτήρα στο dl MOV AH,2; εµφάνισε τον χαρακτήρα INT 21H; µέσω DOS LOOP AGAIN TELOS: RET; επιστροφή στο DOS µέσω INT 20h του PSP MAIN endp CODE__SEG ENDS SOROS SEGMENT STACK DB 100H DUP (0) SOROS ENDS END MAIN 2.5 Επιστροφή στο DOS µε την εντολή RET. Στο σηµείο αυτό πρέπει να αναφέρουµε την τεχνική µε την οποία επιστρέφει το πρόγραµµα στο DOS µε την εντολή RET. Όπως είδαµε προηγούµενος, τα δύο πρώτα byte του PSP είναι η εντολή : INT 20h , δηλαδή η εντολή επιστροφής στο DOS. Με το ξεκίνηµα του προγράµµατος οι καταχωρητές DS και ES περιέχουν την δ/νση του τµήµατος PSP του προγράµµατος, δηλαδή η δ/νση του PSP είναι DS:0000. Αποθηκεύοντας την δ/νση αυτή στον σωρό µε εντολές PUSH µπορούµε αργότερα µε εντολή RETF να µεταφέρουµε την εκτέλεση του προγράµµατος στην αρχή του PSP όπου µέσω της INT 20h επιστέφουµε στο DOS. Η διαδικασία αυτή περιγράφεται µε τις εντολές : ….. push ds ; η διεύθυνση του PSP xor ax,ax ; µηδενισµός του ax push ax ; στον σωρό, προετοιµασία για επιστροφή στο DOS. ….. ; ΚΥΡΙΩΣ ΠΡΟΓΡΑΜΜΑ ….. ret ; επιστροφή µε άλµα στο PSP 2.6 Πέρασµα παραµέτρων

Page 55: ΚΕΦΑΛΑΙΟ 1dima/wp-content/uploads/... · 1 ΚΕΦΑΛΑΙΟ 1 Ο ... διαιρέσεις. BX ∆είκτης για έµµεσο τρόπο προσδιορισµού διευθύνσεων

55

Το θέµα επεξηγείτε µε το παράδειγµα ενός προγράµµατος που εµφανίζει στην οθόνη µια σειρά χαρακτήρων που τελειώνουν µε τον χαρακτήρα ASCII 0.(null terminated string τύπου C) Παράδειγµα προγράµµατος υπ’ αριθµόν 14: code_seg segment assume cs:code_seg,ds:data_seg kyrioproc proc far xor ax,ax; µηδενισµός του ax push ds ; η διεύθυνση του PSP push ax ; στον σωρό, προετοιµασία για επιστροφή στο DOS. mov dx,data_seg mov ds,dx ; αποκατάσταση του DS lea bx,mhnhma call emfan_mhnhma ret ; επιστροφή στο DOS kyrioproc endp ;************************************ ;* Υποπρογράµµατα εµφάνισης µηνύµατος * ;* ΠΑΡΑΜΕΤΡΟΙ * ;* ********** * ;* Η δ/νση του µηνύµατος στον BX * ;************************************* emfan_mhnhma proc near again: mov dl,[bx] ; τον χαρακτήρα στην δ/νση bx στον dl inc bx ; δ/νση επόµενου χαρακτήρα cmp dl,0 ; αν είναι µηδέν ο χαρακτήρας τέλος jz epistrofh ; επιστροφή call emfanish_char ; αλλιώς εµφάνιση jmp short again ; και επανάληψη epistrofh : ret emfan_mhnhma endp ;************************************ ;* Υποπρογράµµατα εµφάνισης χαρακτήρα * ;* ΠΑΡΑΜΕΤΡΟΙ * ;* ********** * ;* Η ASCII τιµή του χαρακτήρα στον DL * ;************************************ emfanish_char proc near mov ah,02h int 21h ret emfanish_char endp

Page 56: ΚΕΦΑΛΑΙΟ 1dima/wp-content/uploads/... · 1 ΚΕΦΑΛΑΙΟ 1 Ο ... διαιρέσεις. BX ∆είκτης για έµµεσο τρόπο προσδιορισµού διευθύνσεων

56

code_seg ends ; Τµήµα δεδοµένων data_seg segment mhnhma db "END OF PROGRAMM",10,13,0 nea_grammh db 10,13,0 data_seg ends soros segment para stack db 256 dup (0) soros ends end kyrioproc Το κυρίως πρόγραµµα καλεί το υποπρόγραµµα emfan__mhnhma για να εµφανιστεί το αλφαριθµητικό στην δ/νση mhnhma. Η δ/νση του αλφαριθµητικού είναι παράµετρος του υποπρογράµµατος emfan__mhnhma και µεταβιβάζεται στο υποπρόγραµµα µέσω του καταχωρητή BX. Το υποπρόγραµµα emfanish__char εµφανίζει ένα χαρακτήρα του οποίου η ASCII τιµή περιέχεται στον καταχωρητή DL , η παράµετρος εν προκειµένω µεταβιβάζεται στο υποπρόγραµµα µέσω του καταχωρητή DL. Η ενέργεια αυτή µε την οποία µεταβιβάζουµε δεδοµένα διαφορετικά κάθε φορά στα υποπρογράµµατα για να καθοδηγήσουµε τι να κάνουν , λέγεται πέρασµα παραµέτρων. Υπάρχουν δύο µέθοδοι για πέρασµα παραµέτρων :

- Πέραµα µέσω καταχωρητών - Πέρασµα µέσω σωρού

Πέρασµα µέσω καταχωρητών είναι πιο απλή µέθοδος και χρησιµοποιείται κυρίως σε προγράµµατα γραµµένα αποκλειστικά σε ASSEMBLY. Στην περίπτωση αυτή επιλέγονται οι κατάλληλοι καταχωρητές σαν παράµετροι οι οποίοι βέβαια είναι οι ίδιοι σε κάθε κλήση του υποπρογράµµατος. Για αυτόν τον λόγο πρέπει πριν από τον κώδικα του υποπρογράµµατος µε κατάλληλα σχόλια να αναγράφονται όλοι οι καταχωρητές που χρησιµοποιούνται σαν παράµετροι. Την µέθοδο αυτή χρησιµοποιούν και οι λειτουργίες του DOS και του BIOS για τις παραµέτρους τους (∆ες κεφαλαίο 10). Πέρασµα παραµέτρων µέσω σωρού είναι σχετικά πιο δυσχερής µέθοδος λιγότερο ευέλικτη και απαιτεί περισσότερο κώδικα. Είναι όµως η µέθοδος που χρησιµοποιούν όλες οι γλώσσες τρίτης γενιάς (C, PASCAL), µε τις ιδιαιτερότητες της κάθε µια από αυτές. Εποµένως είναι υποχρεωτική η χρήση της µεθόδου αυτής εφόσον το υποπρόγραµµα πρόκειται να συνδεθεί και να κληθεί από πρόγραµµα γλώσσας 3ης γενιάς. Η διαδικασία περάσµατος είναι η εξής: Το πρόγραµµα που καλεί µεταφέρει στον σωρό µε PUSH τις παραµέτρους , ενώ το υποπρόγραµµα του ανακτά από το σωρό µε την βοήθεια του καταχωρητή δείκτη BP. Μετά την επιστροφή από το υποπρόγραµµα (µετά την εντολή CALL) πρέπει να

Page 57: ΚΕΦΑΛΑΙΟ 1dima/wp-content/uploads/... · 1 ΚΕΦΑΛΑΙΟ 1 Ο ... διαιρέσεις. BX ∆είκτης για έµµεσο τρόπο προσδιορισµού διευθύνσεων

57

αποκαθιστάται ο σωρός. Το παραπάνω πρόγραµµα µε την µέθοδο περάσµατος παραµέτρων στα υποπρογράµµατα µέσω σωρού, µπορεί να γράφει ως εξής: Παράδειγµα προγράµµατος υπ’ αριθµόν 15: code_seg segment assume cs:code_seg,ds:data_seg kyrioproc proc far xor ax,ax; µηδενισµός του ax push ds ; η διεύθυνση του PSP push ax ; στον σωρό, προετοιµασία για επιστροφή στο DOS mov dx,data_seg mov ds,dx ; αποκατάσταση του DS lea ax,mhnhma; η δ/νση του mhnhma στον push ax ; σωρό call near ptr emfan_mhnhma add sp,2; επαναφορά του σωρού λόγω της εντολής push ax ret ; επιστροφή στο DOS kyrioproc endp ; Υποπρόγραµµα εµφάνισης µηνύµατος emfan_mhnhma proc near push bp mov bp,sp mov bx,[bp+4]; µέσω σωρού η δ/νση του string στον bx ; το +4 διότι σε near call οι 4 θέσεις πάνω από τον SP είναι η ;δ/νση επιστροφής 2 θέσεις για την φύλαξη στο σωρό το bp ; και 2 θέσεις για την δ/νση επιστροφής λόγψ της call again: mov dl,[bx] inc bx cmp dl,10 jz epistrofh push dx; Η ASCII τιµή του µηνύµατος στον σωρό call emfanish__char add sp,2; επαναφορά του σωρού λόγω της εντολής push ax jmp short again epistrofh: pop bp ret emfan_mhnhma endp ; Υποπρόγραµµα εµφάνισης χαρακτήρα emfanish__char proc near push bp mov bp,sp mov dx,[bp+4]; µέσω σωρού η ASCII τιµή του χαρακτήρα στον DX ; και εποµένως στον DL που απαιτεί η 2η κλήση του ; DOS mov ah,02h

Page 58: ΚΕΦΑΛΑΙΟ 1dima/wp-content/uploads/... · 1 ΚΕΦΑΛΑΙΟ 1 Ο ... διαιρέσεις. BX ∆είκτης για έµµεσο τρόπο προσδιορισµού διευθύνσεων

58

int 21h pop bp ret emfanish__char endp code_seg ends ; Τµήµα δεδοµένων data_seg segment mhnhma db "END OF PROGRAMM",10,13,0 data_seg ends soros segment para stack db 256 dup (0) soros ends end kyrioprocΟ σωρός χρησιµοποιείται στα υποπρογράµµατα και σαν χώρος µνήµης τοπικών µεταβλητών, στις οποίες έχει πρόσβαση πάλι µέσω του καταχωρητή BP και µε παρόµοια µε την παραπάνω διαδικασία. 2.7 Επιστροφή τιµών Τα υποπρογράµµατα είναι δυνατόν λειτουργούν και σαν συναρτήσεις και να επιστρέφουν τιµή. Η τιµή επιστρέφεται πάντα µέσω καταχωρητή και µια συµβατική µέθοδος είναι η εξής:

- Αν η τιµή που επιστρέφεται είναι ενός BYTE χρησιµοποιείται ο καταχωρητής AL.

- Αν η τιµή που επιστρέφεται είναι µιας WORD χρησιµοποιείται ο

καταχωρητής AX.

- Αν η τιµή που επιστρέφεται είναι µιας DWORD (διπλή λέξη) χρησιµοποιείται το δίδυµο των καταχωρητών DX:AL.

2.8 ∆ιατήρηση της τιµής των καταχωρητών Κάθε υποπρόγραµµα χρησιµοποιεί για εσωτερικούς λόγους κάποιους καταχωρητές. Η διατήρηση της τιµής των καταχωρητών κατά την κλήση των υποπρογραµµάτων είναι ένα από τα σηµαντικότερα προβλήµατα του προγραµµατισµού σε assembly , διότι υπάρχει περίπτωση τόσο το κυρίως πρόγραµµα όσο και το υποπρόγραµµα να χρησιµοποιούν ίδιους καταχωρητές για αποθήκευση δεδοµένων. Εποµένως αν το κυρίως πρόγραµµα χρησιµοποιεί την τιµή κάποιου καταχωρητή τόσο πριν όσο και µετά την κλήση ενός υποπρογράµµατος και το υποπρόγραµµα αλλάζει την τιµή του καταχωρητή αυτού, τότε θα προκύψει µεγάλο λογικό λάθος στο πρόγραµµα. Το πρόβληµα λύνεται ως εξής: στην αρχή κάθε υποπρογράµµατος διαφυλάσσονται στον σωρό όλοι οι καταχωρητές που πρόκειται να χρησιµοποιηθούν ( µε την εντολή

Page 59: ΚΕΦΑΛΑΙΟ 1dima/wp-content/uploads/... · 1 ΚΕΦΑΛΑΙΟ 1 Ο ... διαιρέσεις. BX ∆είκτης για έµµεσο τρόπο προσδιορισµού διευθύνσεων

59

PUSH), και πριν την επιστροφή ( δηλαδή πριν την εντολή RET) ανακαλούνται από τον σωρό κατά αντίστροφη φορά ( µε εντολή POP) Με την λογική αυτή το παραπάνω υποπρόγραµµα εµφάνισης µηνύµατος γράφεται: ,************************************ ,* Υποπρογράµµατα εµφάνισης µηνύµατος * ,* ΠΑΡΑΜΕΤΡΟΙ * ,* ********** * ,* Η δ/νση του µηνύµατος στον BX * ,************************************ emfan__mhnhma proc near again: push dx; διαφύλαξη της τιµής του dx mov dl:[bx]; τον χαρακτήρα στην δ/νση bx στον dl inc bx ; δ/νση επόµενου χαρακτήρα cmp dl,0 ; αν είναι µηδέν ο χαρακτήρας τέλος jz epistrofh ; επιστροφή call emfanish__char ; αλλιώς εµφάνιση jmp short again ; και επανάληψη epistrofh : pop dx; ανάκληση της τιµής του dx από τον σωρό ret emfan__mhnhma endp

Page 60: ΚΕΦΑΛΑΙΟ 1dima/wp-content/uploads/... · 1 ΚΕΦΑΛΑΙΟ 1 Ο ... διαιρέσεις. BX ∆είκτης για έµµεσο τρόπο προσδιορισµού διευθύνσεων

60

ΚΕΦΑΛΑΙΟ 6 DEBUG 1 ΕΙΣΑΓΩΓΗ Η πορεία που ακολουθείται για το γράψιµο των προγραµµάτων συνίσταται στην κατάστρωση του λογικού διαγράµµατος, στην κωδικοποίηση του, στο γράψιµο του µε έναν κειµενογράφο, στην µετάφραση του, στην σύνδεση για την παραγωγή εκτελέσιµου αρχείου και τέλος στην εκτέλεση του από το λειτουργικό σύστηµα. Από όλες τις παραπάνω διαδικασίες είναι δυνατό να προκύψουν σφάλµατα συντακτικά ή λογικά. Τα συντακτικά συνήθως εντοπίζονται από τον µεταφραστή ή τον συνδέτη και διορθώνονται. Τα λογικά όµως καθώς και άλλα τα “bugs” που οφείλονται στην δοµή του επεξεργαστή για να εντοπιστούν απαιτείται ειδικό πρόγραµµα εκσφαλµάτωσης. Το λειτουργικό σύστηµα συνοδεύεται µε ένα τέτοιο βοηθητικό πρόγραµµα το DEBUG. Το πρόγραµµα µπορεί να εκτελείται είτε όλο µαζί, είτε τµηµατικά είτε βήµα βήµα , να διορθωθεί και να εξεταστεί, να ελεγχθούν και να µεταβληθούν η µνήµη και το περιεχόµενο των καταχωρητών κατά την διάρκεια της εκτέλεσης του προγράµµατος. Αν πρόκειται για .COM πρόγραµµα µπορεί και να γραφεί εξ αρχής να διορθωθεί και να σωθεί στο δίσκο. Η διαταγές του DEBUG είναι ενός χαρακτήρα. Η εκτέλεση τους µπορεί να σταµατήσει µε τα πλήκτρα CNTR – C. Επίσης µε τα πλήκτρα CNTR – S µπορούµε να σταµατήσουµε προσωρινά την εξέλιξη µιας διαταγής για να µελετήσουµε τα µέχρι στιγµής δεδοµένα στην οθόνη. Η επανεκκίνηση γίνεται στο πάτηµα οποιοδήποτε άλλου πλήκτρου εκτός του CNTR – C. 2 ΓΡΑΨΙΜΟ ΕΚΤΕΛΕΣΗ ΠΡΟΓΡΑΜΜΑΤΟΣ 2.1 Πρώτα βήµατα Η είσοδος στο πρόγραµµα DEBUG γίνεται µε την διαταγή debug η οποία µπορεί να ακολουθείται και από την ονοµασία του προγράµµατος που θέλουµε να ελεγχθεί. Π.χ. C: >DEBUG ή C: > DEBUG ASKHSH.EXE Το ερωτηµατικό (prompt) του debug είναι το σύµβολο “-“. Η έξοδος από το debug γίνεται µε την διαταγή -Q (Quit). Οι κυριότερες λειτουργίες του debug θα εξεταστούν µε την αναγραφή και εκτέλεση προγράµµατος στο περιβάλλον αυτό. Το πρόγραµµα είναι η εµφάνιση ενός µηνύµατος στην Οθόνη µέσω DOS. Η κωδικοποίηση του προγράµµατος είναι:

Page 61: ΚΕΦΑΛΑΙΟ 1dima/wp-content/uploads/... · 1 ΚΕΦΑΛΑΙΟ 1 Ο ... διαιρέσεις. BX ∆είκτης για έµµεσο τρόπο προσδιορισµού διευθύνσεων

61

LEA DX, MHNHMA MOV AH,9 INT 21H INT 20 MHNHMA DB “ΤΕΛΟΣ ΠΡΟΓΡΑΜΜΑΤΟΣ $” 2.2 Γράψιµο του προγράµµατος. Μετά την είσοδο στον debug δίνουµε την διαταγή “-A100”(Assembly) µε την οποία µπορούµε να γράψουµε προγράµµατα σε assembly κώδικα. Επιτρέπονται µέσα στον debug µόνο εντολές και όχι οδηγίες assembly οι δε διευθύνσεις είναι πραγµατικές διευθύνσεις και ότι ετικέτες. Με την παραπάνω διαταγή δηλώνουµε ότι θέλουµε να γράψουµε πρόγραµµα στην λογική δ/νση 100H που είναι και δ/νση αρχής .COM προγραµµάτων. Σαν απάντηση ο Debug προτείνει ένα segment έστω το 247F, και εµφανίζει την µετατόπιση 100. Ο δροµέας περιµένει δίπλα, οπότε µπορεί να αρχίσει το γράψιµο του προγράµµατος. Επιστροφή στον Debug µε ένα Return: -a100 247F:0100 lea dx,[200] 247F:0104 mov ah,09 247F:106 int 21 247F:018 int 20 247F:010A Με την διαταγή “-A” µετατρέπονται αυτόµατα οι εντολές σε συµβολική γλώσσα σε δυαδική µορφή αµέσως µε το Return µετά το γράψιµο της εντολής. Πρόκειται ουσιαστικά για διαταγή µε την οποία γράφουµε απευθείας στην µνήµη κώδικα σε συµβολική µορφή 2.3 Γράψιµο του µηνύµατος Το µήνυµα που θα εµφανίσει το πρόγραµµα αυτό, πρέπει να βρίσκεται στην 200 δ/νση µνήµης. Για να φορτώσουµε το µήνυµα στην µνήµη χρησιµοποιούµε την διαταγή: -f200 L9 “Geia soy$” Όπου “-F” η διαταγή (Fill) γεµίσµατος περιοχής µνήµης και L 9 δηλώνει το µέγεθος του µηνύµατος. Πρόκειται για µια άλλη διαταγή µε την οποία αλλάζουµε το περιεχόµενο της µνήµης. 2.4 Τρέξιµο του προγράµµατος Για τρέξιµο του προγράµµατος χρησιµοποιούµε την διαταγή “-G”(Go), όποτε θα εµφανιστεί στην οθόνη: -g

Page 62: ΚΕΦΑΛΑΙΟ 1dima/wp-content/uploads/... · 1 ΚΕΦΑΛΑΙΟ 1 Ο ... διαιρέσεις. BX ∆είκτης για έµµεσο τρόπο προσδιορισµού διευθύνσεων

62

Geia soy Program terminated normally - 2.5 ∆ιευθύνσεις Στις δύο πρώτες θέσεις δίδονται αριστερά η δ/νση αρχής του τµήµατος (segment) και δεξιά η µετατόπιση µέσα στο τµήµα. Έτσι η δ/νση αρχής του προγράµµατος στο παραπάνω παράδειγµα είναι 247F:100 η δε φυσική δ/νση προκύπτει εύκολα ότι είναι 247F0 + 100 -------- 248F0 2.6 Unassembly Είναι η διαταγή µε την οποία θα εµφανιστεί το πρόγραµµα τόσο µε την µορφή εντολών assembly όσο και σε δεκαεξαδική µορφή . ∆ίδεται µε την µορφή “-U” όπου όµως µπορούµε να σίσουµε και την περιοχή διευθύνσεων στην οποία θέλουµε να δούµε λίστα του προγράµµατος. -U 100 108 247F:0100 8D160002 LEA DX,[0200] 247F:0104 B409 MOV AH,09 247F:0106 CD21 INT 21 247F:0108 CD20 INT 20 2.7 Ονοµασία , ∆ιαφύλαξη του προγράµµατος Όπως προαναφερθήκαµε µε τον Debug µπορούµε να δηµιουργήσουµε µόνο .com εκτελέσιµα προγράµµατα. Για να σωθεί ένα πρόγραµµα .com πρέπει:

- Να του δοθεί όνοµα µε την διαταγή “-N”(Name). - Να γραφεί το µέγεθός του του σαν διπλή λέξη στους καταχωρητές BX:CX µε

την διαταγή “-R”(Register).

- Να σωθεί στον δίσκο µε την διαταγή “-W”(Write). Στο παραπάνω πρόγραµµα για να συµπεριλάβουµε και το µήνυµα πρέπει να σώσουµε στον δίσκο 110H bytes. Αν ονοµάσουµε το πρόγραµµα MHNHMA.COM η διαδικασία για σώσιµο του προγράµµατος µέσα από τον Debug είναι: -N MHNHMA.COM -RBX BX 0000 : -RCX

Page 63: ΚΕΦΑΛΑΙΟ 1dima/wp-content/uploads/... · 1 ΚΕΦΑΛΑΙΟ 1 Ο ... διαιρέσεις. BX ∆είκτης για έµµεσο τρόπο προσδιορισµού διευθύνσεων

63

CX 0000 :210 -W Writing 00210 bytes - Με την διαταγή “-R”(register) βλέπουµε τα περιεχόµενα των καταχωρητών και των δεικτών. Αν µετά την “-R” ακολουθεί ένας καταχωρητής όπως, στο προηγούµενο παράδειγµα, µπορούµε να µεταβάλουµε το περιεχόµενο του. Π.χ ∆ίνοντας “-R” έχουµε -R AX=0900 BX=0000 CX=0000 DX=0200 SP=FFEE BP=0000 SI=0000 DI=0000 DS=247B ES=247B SS=247B CS=247B IP=0108 NV UP EI PL NZ NA PONC 247F:0108 CD20 2.7 Εµφάνιση περιεχοµένου µνήµης. Με την διαταγή “-D” (Dump) µπορούµε να δούµε τα περιεχόµενα συγκεκριµένης περιοχής µνήµης υπό δεκαεξαδική µορφή και υπό µορφή χαρακτήρων, 128 χαρακτήρες κάθε φορά, σε 8 γραµµές επί 16 στήλες. Έτσι για να δούµε την περιοχή του µηνύµατος δίνουµε την διαταγή: -d 247F:0200 47 65 69 61 20 73 6F 75-24 00 00 00 00 00 00 00 Geia sou$……. 247F:0210 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ……………. 247F:0220 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ……………. 247F:0230 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ……………. 247F:0240 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ……………. 247F:0250 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ……………. 247F:0260 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ……………. 247F:0270 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ……………. Στο αριστερό µέρος είναι η δ/νση µε την µορφή “segment:offset” των πρώτων bytes κάθε γραµµής. Τέλος δεξιά ο Debug θα εµφανίσει τα ίδια bytes σε ASCII µορφή, εφόσον βέβαια είναι εµφανίσιµοι χαρακτήρες. ∆ιαδοχικά “-D” βλέπουµε την περιοχή µνήµης του DS. Αν θέλουµε να δούµε την µνήµη στα άλλα 3 segments πρέπει µετά την “-D” στην δ/νση να συµπεριλάβουµε και το τµήµα που θέλουµε να δούµε. Π.Χ για την στοίβα πρέπει να δώσουµε -D SS:0100 2.8 Μεταβολή τιµών στην µνήµη. Για την είσοδο νέων τιµών στην µνήµη υπάρχει η διαταγή “-E”(Enter). Με την διαταγή αυτή αλλάζουµε ένα byte κάθε φορά στην µνήµη. Το νέο δεδοµένο το εισάγουµε σε δεκαεξαδική µορφή. Πατώντας spacebar κατεβαίνουµε στον επόµενο χαρακτήρα στην µνήµη για να τον µεταβάλλουµε. Πατώντας Return εγκαταλείπουµε

Page 64: ΚΕΦΑΛΑΙΟ 1dima/wp-content/uploads/... · 1 ΚΕΦΑΛΑΙΟ 1 Ο ... διαιρέσεις. BX ∆είκτης για έµµεσο τρόπο προσδιορισµού διευθύνσεων

64

την διαταγή. Π.χ. µε τις παρακάτω ενέργειες τροποποιούµε το µήνυµα του προγράµµατος σε “AAAAAAAA”. -e 200 247F:0200 47.41 65.41 61.41 20.41 73.41 6F.41 75.41 247F:0208 24. Υπενθυµίζουµε ότι 41h είναι η ASCII τιµή του χαρακτήρα “A”. Σε κάθε θέση αριστερά είναι τα δυο ψηφία της δ/σης του χαρακτήρα που εισάγουµε και δεξιά η νέα τιµή της δ/νσης µνήµης. Με την διαταγή “-d” µπορούµε να δούµε το νέο περιεχόµενο της µνήµης. -d200 247Β:0200 4141 41 41 41 41 41 41-24 00 00 00 00 00 00 00 ΑΑΑΑΑΑΑΑ$……. 247Β:0210 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ……………. 247Β:0220 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ……………. 247Β:0230 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ……………. 247Β:0240 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ……………. 247Β:0250 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ……………. 247Β:0260 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ……………. 247Β:0270 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ……………. Και να τρέξουµε το πρόγραµµα για να εµφανιστεί το νέο µήνυµα -g=100 AAAAAAAA Program terminated normally - 2.9 Τρέξιµο βήµα βήµα Θα δοκιµάσουµε ένα καινούργιο πρόγραµµα στον Debug, το οποίο εµφανίζει στην οθόνη τους χαρακτήρες του κώδικα ASCII από ‘?’ έως και τον ‘Z’. Το πρόγραµµα αποτελείται από τα εξής λογικά βήµατα: 1. Στον DL η ASCII τιµή του χαρακτήρα ‘?’ (3F στο δεκαεξαδικό) 2. Εµφάνιση του περιεχοµένου του DL µε την 2η κλήση του DOS. 3. Αύξηση κατά 1 του περιεχοµένου του DL. 4. Έλεγχος αν ο (DL) είναι µικρότερος ίσος από την ASCII τιµή του ‘Z’(5B στο δεκαεξαδικό) επανάληψη των βηµάτων 2 έως και 4. 5. Έξοδος στο DOS. Κατόπιν κωδικοποιούµε το πρόγραµµα στον Debug: A>debug -a 247B:0100 mov dl,3F 247B:0102 MOV AH,2

Page 65: ΚΕΦΑΛΑΙΟ 1dima/wp-content/uploads/... · 1 ΚΕΦΑΛΑΙΟ 1 Ο ... διαιρέσεις. BX ∆είκτης για έµµεσο τρόπο προσδιορισµού διευθύνσεων

65

247B:0104 INT 21 247B:0106 INT DL 247B:0108 CMP DL,5B 247B:010B JBE 102 247B:010D INT 20 247B:010F και τρέχουµε το πρόγραµµα: -G ?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[ Program terminated normally Σώζουµε το πρόγραµµα στον δίσκο µε το όνοµα ASKHSH1.COM και εγκαταλείπουµε τον Debug: -N ASKHSH1.COM -RBX BX 0000 : -RCX CX 0000 :f -W Writing 0000F bytes -Q Για να ανακαλέσουµε το πρόγραµµα από τον δίσκο µέσα από τον Debug χρησιµοποιούµε την διαταγή “-L” (Load) αφού προηγουµένως έχουµε δώσει όνοµα στο πρόγραµµα: A>debug -n askhsh1.com -l -u 100 10D 2490:0100 B23F MOV DL,3F 2490:0102 B402 MOV AH,02 2490:0104 CD21 INT 21 2490:0106 FEC2 INC DL 2490:0108 80FA5A CMP DL,5A 2490:010B 76F5 JBE 0102 2490:010D CD20 INT 20 Μπορούµε να τρέξουµε το πρόγραµµα εντολή προς εντολή µε την διαταγή “-T” (Trace). Με την διαταγή αυτή εκτελείται µια εντολή και ταυτόχρονα εµφανίζεται το περιεχόµενο όλων των καταχωρητών και των δεικτών καθώς και η αµέσως επόµενη προς εκτέλεση εντολή: -t

Page 66: ΚΕΦΑΛΑΙΟ 1dima/wp-content/uploads/... · 1 ΚΕΦΑΛΑΙΟ 1 Ο ... διαιρέσεις. BX ∆είκτης για έµµεσο τρόπο προσδιορισµού διευθύνσεων

66

AX=023F BX=0000 CX=000F DX=0040 SP=FFFE BP=0000 SI=0000 DI=0000 DS=2490 ES=2490 SS=2490 CS=2490 IP=010B NV UP EI NG NZ AC PO CY 2490:010B 76F5 JBE 0102 -t AX=023F BX=0000 CX=000F DX=0040 SP=FFFE BP=0000 SI=0000 DI=0000 DS=2490 ES=2490 SS=2490 CS=2490 IP=0102 NV UP EI NG NZ AC PO CY 2490:0102 B402 MOV AH,02 -t AX=023F BX=0000 CX=000F DX=0040 SP=FFFE BP=0000 SI=0000 DI=0000 DS=2490 ES=2490 SS=2490 CS=2490 IP=0104 NV UP EI NG NZ AC PO CY 2490:0104 CD21 INT 21 -p ? AX=0240 BX=0000 CX=000F DX=0040 SP=FFFE BP=0000 SI=0000 DI=0000 DS=2490 ES=2490 SS=2490 CS=2490 IP=0106 NV UP EI NG NZ AC PO CY 2490:0106 FEC2 INC DL -p AX=0240 BX=0000 CX=000F DX=0041 SP=FFFE BP=0000 SI=0000 DI=0000 DS=2490 ES=2490 SS=2490 CS=2490 IP=0108 NV UP EI NG NZ AC PO CY 2490:0108 80FA5A CMP DL,5A -t AX=0240 BX=0000 CX=000F DX=003F SP=FFFE BP=0000 SI=0000 DI=0000 DS=2490 ES=2490 SS=2490 CS=2490 IP=0102 NV UP EI NG NZ AC PO CY 2490:0102 B402 MOV AH,02 -p AX=0240 BX=0000 CX=000F DX=003F SP=FFFE BP=0000 SI=0000 DI=0000 DS=2490 ES=2490 SS=2490 CS=2490 IP=0104 NV UP EI NG NZ AC PO CY 2490:0104 CD21 INT 21 -p ? AX=023F BX=0000 CX=000F DX=003F SP=FFFE BP=0000 SI=0000 DI=0000 DS=2490 ES=2490 SS=2490 CS=2490 IP=0106 NV UP EI NG NZ AC PO CY 2490:0106 FEC2 INC DL -p AX=023F BX=0000 CX=000F DX=0040 SP=FFFE BP=0000 SI=0000 DI=0000 DS=2490 ES=2490 SS=2490 CS=2490 IP=0108 NV UP EI NG NZ AC PO CY 2490:0108 80FA5A CMP DL,5A -T AX=023F BX=0000 CX=000F DX=0040 SP=FFFE BP=0000 SI=0000 DI=0000 DS=2490 ES=2490 SS=2490 CS=2490 IP=010B NV UP EI NG NZ AC PO CY 2490:010B 76F5 JBE 0102 Εδώ πρέπει να αναφέρουµε ότι πριν από την κλήση υποπρογραµµάτων ή υποπρογραµµάτων εξυπηρέτησης διακοπών (εντολή CALL ή INT) µπορούµε αντί της “-T” να χρησιµοποιήσουµε την διαταγή “-P” (Proceed) η οποία εκτελεί όλο το υποπρόγραµµα και σταµατά στην µετά την CALL ή INT εντολή.

Page 67: ΚΕΦΑΛΑΙΟ 1dima/wp-content/uploads/... · 1 ΚΕΦΑΛΑΙΟ 1 Ο ... διαιρέσεις. BX ∆είκτης για έµµεσο τρόπο προσδιορισµού διευθύνσεων

67

Στο τέλος της δεύτερης γραµµής, µετά τις τιµές των καταχωρητών, εµφανίζονται µε συµβολικό τρόπο οι τιµές των δεικτών. Τα συµβολικά των περιεχοµένων των δεικτών είναι: Παρατηρούµε ότι µετά την εκτέλεση της εντολής: CMP DL,5A Αλλάζει η τιµή της SF (δείκτης πρόσηµου) διότι από την πράξη : (DL) – 5A προκύπτει αρνητικό αποτέλεσµα. 2.10 Σηµεία στάσεως. Το πρόγραµµα µπορούµε να το τρέξουµε και τµηµατικά αρχίζοντας από ένα σηµείο του κώδικα. Επίσης µπορούµε να το σταµατήσουµε σε συγκεκριµένα σηµεία του προγράµµατος (break points) για να εξετάσουµε το περιεχόµενο των καταχωρητών ή να δώσουµε µια άλλη διαταγή. Αυτό επιτυγχάνεται µε την διαταγή “-G” της οποίας η πλήρη σύνταξη είναι : -G=<∆/νση Αρχής> <∆/νση Στάσης> Π.Χ. Αν δώσουµε -g=100 10d ?@ABCDEFGHIJKLMNOPQRSTUVWXYZ AX=025A BX=0000 CX=000F DX=005B SP=FFFE BP=0000 SI=0000 DI=0000 DS=2490 ES=2490 SS=2490 CS=2490 IP=010D NV UP EI NG NZ AC PO CY 2490:010D CD20 INT 20 Το πρόγραµµα θα ξεκινήσει να εκτελεί τις εντολές από την δ/νση 100 και θα σταµατήσει στην 010D δ/νση όπου θα εµφανίσει τα περιεχόµενα των καταχωρητών και θα αναµείνει για την επόµενη διαταγή. Επειδή η δ/νση 010D είναι µετά τον βρόγχο επανάληψης η σύγκριση (DL) > 5A είναι αληθής δηλαδή το αποτέλεσµα είναι θετικός µη µηδενικός αριθµός και εποµένως η CF και SF έχουν τιµή 0, ενώ ZF=1. 2.11 Debug σε προγράµµατα .EXE Όλες οι διαταγές που ισχύουν για το προγράµµατα .COM ισχύουν και για προγράµµατα .EXE. Στα .EXE προγράµµατα όµως δεν υπάρχει η δυνατότητα να σώσουµε το πρόγραµµα σε εκτελέσιµη µορφή στον δίσκο. Εποµένως µπορούµε µόνο να ελέγξουµε προγράµµατα που ήδη υπάρχουν στον δίσκο και έχουν δηµιουργηθεί από µεταφραστικά προγράµµατα. Για παράδειγµα µπορούµε να ελέγξουµε το

Page 68: ΚΕΦΑΛΑΙΟ 1dima/wp-content/uploads/... · 1 ΚΕΦΑΛΑΙΟ 1 Ο ... διαιρέσεις. BX ∆είκτης για έµµεσο τρόπο προσδιορισµού διευθύνσεων

68

πρόγραµµα MHNHMA.EXE του προηγούµενου κεφαλαίου, που τυπώνει ένα αλφαριθµητικό στην οθόνη. A>debug -n mhnhma.exe -l -u 24A0:0000 33C0 XOR AX,AX 24A0:0002 1E PUSH DS 24A0:0003 50 PUSH AX 24A0:0004 BAA324 MOV DX,24A3 24A0:0007 90 NOP 24A0:0008 8EDA MOV DS,DX 24A0:000A BB0000 MOV BX,0000 24A0:000D E80100 CALL 0011 24A0:0010 CB RETF 24A0:0011 8A17 MOV DL,[BX] 24A0:0013 43 INC BX 24A0:0014 80FA00 CMP DL,00 24A0:0017 7405 JZ 001E 24A0:0019 E80300 CALL 001F 24A0:001C EBF3 JMP 0011 24A0:001E C3 RET 24A0:001F B402 MOV AH.02 24A0:0021 CD21 INT 21 24A0:0023 RET ∆ιαπιστώνουµε ότι η µετατόπιση της πρώτης εντολής είναι 0000. Από τις εντολές : MOV DX,24A3 MOV DS,DX MOV BX,0000 Συµπεραίνουµε ότι το αλφαριθµητικό που εµφανίζεται στην οθόνη βρίσκεται στην δ/νση 24A3:0000, και µπορούµε να το δούµε µε την διαταγή: -d 24a3:0000 24A3:0000 54 45 4C 4F 53 20 50 52-4F 47 52 41 4D 4D 41 54 TELOS PROGRAMMAT 24A3:0010 4F 53 0A 0D 00 0A 0D 00-00 00 00 00 00 00 00 00 OS……………. 24A3:0020 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ……………. 24A3:0030 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ……………. 24A3:0040 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ……………. 24A3:0050 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ……………. 24A3:0060 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ……………. 24A3:0070 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ……………. Τέλος µπορούµε να τρέξουµε το πρόγραµµα από έως ή και βήµα βήµα όπως και τα .COM η µεταβολή του περιεχοµένου µνήµης κ.λ.π.Π.χ. για να τρέξουµε όλο το πρόγραµµα: -g TELOS PROGRAMMATOS

Page 69: ΚΕΦΑΛΑΙΟ 1dima/wp-content/uploads/... · 1 ΚΕΦΑΛΑΙΟ 1 Ο ... διαιρέσεις. BX ∆είκτης για έµµεσο τρόπο προσδιορισµού διευθύνσεων

69

Program terminated normally - Ενδιαφέρον στο πρόγραµµα αυτό έχει η παρακολούθηση της µεταβολής της στοίβας µετά από εντολές CALL και RET αν τρέξουµε το πρόγραµµα βήµα – βήµα. Π.χ µετά από διαδοχικά “-T” φθάνουµε στις δ/νσεις: AX=0000 BX=0000 CX=0150 DX=24A3 SP=00FC BP=0000 SI=0000 DI=0000 DS=24A3 ES=2490 SS=24A5 CS=24A0 IP=000D NV UP EI NG NZ AC PO CY 24A0:000D E80100 CALL 0011 -t AX=0000 BX=0000 CX=0150 DX=24A3 SP=00FA BP=0000 SI=0000 DI=0000 DS=24A3 ES=2490 SS=24A5 CS=24A0 IP=0011 NV UP EI NG NZ AC PO CY 24A0:0011 8A17 MOV DL,[BX] DS:0000=54 Παρατηρούµε την µείωση κατά της τιµής του SP µετά την είσοδο στο υποπρόγραµµα µετά από την εντολή CALL. Αντίστροφα µετά την έξοδο από το υποπρόγραµµα µετά την εντολή RET , έχουµε αύξηση του SP.Π.Χ. AX=0254 BX=0001 CX=0150 DX=2454 SP=00F8 BP=0000 SI=0000 DI=0000 DS=24CB ES=24B8 SS=24CD CS=24C8 IP=0023 NV UP EI NG NZ AC PO CY 24C8 :0023 C3 RET -t AX=0254 BX=0001 CX=0150 DX=2454 SP=00FA BP=0000 SI=0000 DI=0000 DS=24CB ES=24B8 SS=24CD CS=24C8 IP=001C NV UP EI NG NZ AC PO CY 24C8 :001C EBF3 JMP 0011 3 ∆ΙΑΤΑΓΕΣ ΤΟΥ DEBUG. Το πλήρες set των διαταγών του DEBUG είναι: ∆ΙΑΤΑΓΗ ΠΑΡΑΜΕΤΡΟΙ ΛΕΙΤΟΥΡΓΙΑ A [address]

Assemble

C range address Compare

D [range] Dump

E address [list] Enter

F range list Fill

G [=address [address]..] Go

H value value Hex

I value Input

L [address [drive:record record] Load

Page 70: ΚΕΦΑΛΑΙΟ 1dima/wp-content/uploads/... · 1 ΚΕΦΑΛΑΙΟ 1 Ο ... διαιρέσεις. BX ∆είκτης για έµµεσο τρόπο προσδιορισµού διευθύνσεων

70

M range address Move

N filename [filename] Name

O value byte Output

Q Quit

R [register-name] Register

S range list Search

T [=address] [value] Trace

U [range] Unassemble

W [address [drive:record record ]] Write Οι διαταγές του Debug συντάσσονται µε παραµέτρους οι οποίοι µπορούν να χωρίζονται µε διαχωριστικά κενά. Οι παράµετροι είναι: drive: Ένας δεκαεξαδικό αριθµός που συµβολίζει Drive ήτοι 0=A, 1=B, 2=C. byte: Ένας διψήφιος δεκαεξαδικός αριθµός. record: Ένας αριθµός που συµβολίζει τον αριθµό λογικού record ή τον αριθµό του sector στον δίσκο. value: Τετραψήφιος δεκαεξαδικός αριθµός. address: Μια πλήρη δ/νση του 8086 ή µια δ/νση offset του 8086. Αν πρόκειται για offset δ/νση τότε σαν segment θεωρείται ο CS ή ο DS ανάλογα αν η διαταγή έχει σχέση µε κώδικα ή µε περιεχόµενο µνήµης. range: Περιλαµβάνει µια περιοχή µνήµης είτε µε δύο δ/νσεις από έως ή αρχική δ/νση και µέγεθος µε τον συµβολισµό L value. Ακολουθεί περιληπτική αναφορά των εντολών του Debug -A (Assemble) Εισάγει κώδικα στην µνήµη υπό µορφή µνηµονικών εντολών -C (Compare) Συγκρίνει περιοχή µνήµης µε περιοχή µνήµης που αρχίζει από την δ/νση της παραµέτρου address της εντολής. Εµφανίζει τις διαφορές. -D (Dump) Εµφανίζει το περιεχόµενο περιοχής µνήµης σε δεκαεξαδική µορφή -E (Enter)

Page 71: ΚΕΦΑΛΑΙΟ 1dima/wp-content/uploads/... · 1 ΚΕΦΑΛΑΙΟ 1 Ο ... διαιρέσεις. BX ∆είκτης για έµµεσο τρόπο προσδιορισµού διευθύνσεων

71

Εισάγει στην µνήµη bytes υπό µορφή διψήφιων δεκαεξαδικών αριθµών. Μεταφορά από byte σε byte µε την spacebar. Τέλος µε το πλήκτρο <Enter> -F (Fill) Γεµίζει επαναληπτικά µια περιοχή µνήµης µε σειρά από χαρακτήρες. Οι χαρακτήρες δίδονται είτε µε µορφή σειράς δεκαεξαδικών είτε σαν αλφαριθµητικό. -G (Go) Εκτελεί το πρόγραµµα όλο , είτε από έως, είτε από µέχρι τέλους, είτε έως -H (Hex) Εκτελεί πρόσθεση και αφαίρεση διψήφιων δεκαεξαδικών αριθµών -I (Input) Εισάγει byte από θύρα -L (Load) Φορτώνει από τον δίσκο στην µνήµη αρχείο -M (Move) Μετακινεί µια περιοχή µνήµης σε άλλη που αρχίζει από την δ/νση address. -N (Name) Ονοµάζει το τρέχον αρχείο. Χρήσιµη για τις εντολές Load και Write -O (Output) Στέλνει byte σε θύρα -P (Proceed) Τρέχει το πρόγραµµα βήµα βήµα εκτελώντας τις εντολές Call,Int. -Q (Quit) Τέλος Debug -R (Register) Εµφανίζει και αλλάζει τα περιεχόµενα των καταχωρητών και των σηµαιών -S (Search) Αναζητά σε µια περιοχή µνήµης µια σειρά από χαρακτήρες ή ένα αλφαριθµητικό -T (Trace) Τρέχει το πρόγραµµα βήµα βήµα από την αρχή ή από άλλη δ/νση. -U (Unassemble) Εµφανίζει το περιεχόµενο της µνήµης σαν κώδικα υπό µορφή συµβολικών εντολών. -W (Write) Γράφει στον δίσκο BX:CX χαρακτήρες από την µνήµη.

Page 72: ΚΕΦΑΛΑΙΟ 1dima/wp-content/uploads/... · 1 ΚΕΦΑΛΑΙΟ 1 Ο ... διαιρέσεις. BX ∆είκτης για έµµεσο τρόπο προσδιορισµού διευθύνσεων

72

ΚΕΦΑΛΑΙΟ 7 ΕΙΣΟ∆ΟΙ ΕΞΟ∆ΟΙ 1 ΕΙΣΟ∆ΟΙ ΕΞΟ∆ΟΙ ΘΥΡΕΣ 1.1 Είσοδοι έξοδοι. Με τις µονάδες εισόδου εξόδου επιτυγχάνεται η επικοινωνία του υπολογιστή µε τον έξω κόσµο. Σαν έξω κόσµος µπορούν να χαρακτηριστούν οι µονάδες εισόδου εξόδου όπου:

- Είσοδος θεωρείται η µονάδα από την οποία εισέρχονται δεδοµένα στον επεξεργαστή που δεν προέρχονται από την µνήµη του και

- Έξοδος η µονάδα από την οποία εξέρχονται δεδοµένα από τον επεξεργαστή

σε προορισµός που δεν αποτελεί µνήµη του συστήµατος. Ένα σύστηµα που χρησιµοποιεί τον 8086 γενικά αποτελείται από πολλές συσκευές εισόδου εξόδου. Στο σχήµα 6.1 φαίνεται η γενική διάταξη ενός µικροεπεξεργαστή. Παρατηρούµε ότι ο µ/ε επικοινωνεί µε τον ενώ κόσµο και την µνήµη του µε τρεις αγωγούς:

1. Τον δίαυλο δεδοµένων 2. Τον δίαυλο ελέγχου 3. και τον δίαυλο διευθύνσεων

Στα προηγούµενα κεφαλαία συζητήσαµε για µεταφορά δεδοµένων από και προς την µνήµη του 8086 ROM και RAM . Το εύρος του αγωγού επικοινωνίας καθορίζει και την συνολική µνήµη η οποία είναι 220, δηλαδή παραδεκτές δ/νσεις από 00000h έως FFFFFh. Εκτός από αυτές τις δ/νσεις διαθέτει και ένα άλλο ανεξάρτητο χώρο δ/νσεων εισόδου / εξόδου (γνωστό σαν χώρος I/O) για επικοινωνία µε τον έξω κόσµο. Οι δ/νσεις I/O γνωστές και σαν θύρες (ports) ανέρχονται σε 216 = 65.356 και χρησιµοποιούνται σαν αγωγοί µεταφοράς δεδοµένων και ελέγχου συσκευών (δίσκοι, πληκτρολόγιο, ποντίκι, ελεγκτή οθόνης, κ.τ.λ) Εδώ πρέπει να παρατηρήσουµε ότι µερικοί επεξεργαστές όπως οι 6809 και 68000 της Motorola, διαθέτουν ένα τµήµα από την διαθέσιµη µνήµη τους για Ε/Ε. Εποµένως υπάρχουν δυο είδη δ/νσεων Ε/Ε:

- “Ε/Ε µε χαρτογράφηση µνήµης” όταν δηλαδή χρησιµοποιείται τµήµα της κνήµης για Ε/Ε. Στην περίπτωση αυτή οι εντολές µεταφοράς δεδοµένων σε Ε/Ε και σε µνήµη είναι οι ίδιες.

- “Ε/Ε µε χαρτογράφηση Ε/Ε” όταν δηλαδή οι δ/νσεις για Ε/Ε είναι

ανεξάρτητες από τον συνολικό χώρο της µνήµης. Στην περίπτωση αυτή υπάρχουν άλλες εντολές για µεταφορά δεδοµένων σε Ε/Ε.

Στα τελευταία συστήµατα , δεδοµένου ότι τα δεδοµένα προς την µνήµη και προς Ε/Ε χρησιµοποιούν τον ίδιο αγωγό δ/νσεων, υπάρχουν ειδικά σήµατα ελέγχου (control

Page 73: ΚΕΦΑΛΑΙΟ 1dima/wp-content/uploads/... · 1 ΚΕΦΑΛΑΙΟ 1 Ο ... διαιρέσεις. BX ∆είκτης για έµµεσο τρόπο προσδιορισµού διευθύνσεων

73

bus) προσδιορίζουν αν τα δεδοµένα που βρίσκονται στον αγωγό δεδοµένων αφορούν την µνήµη ή αφορούν ανάγνωση ή γράψιµο σε θύρα Ε/Ε. 1.2 ∆/νσεις Εισόδου Εξόδου – Συσκευές Η επικοινωνία του υπολογιστή µε τον έξω κόσµο γίνεται µέσω των θυρών (= ports). Θύρα είναι ένα συγκεκριµένο τµήµα του συστήµατος από το οποίο και προς το οποίο διαβάζονται και γράφονται δεδοµένα , αλλά δεν ανήκει στην µνήµη του συστήµατος. Κάθε θύρα έχει την δ/νση της η οποία λέγεται κωδικός επιλογής θύρας. Για να µπορέσει ο µ/ε να επικοινωνήσει µε µια από τις θύρες Ε/Ε , τοποθετεί την δ/νση της στο δίαυλο δ/νσεων (Address bus) , χρησιµοποιώντας τις γραµµές A0 έως A15, ταυτόχρονα δε ειδοποιεί και το σύστηµα µέσω ειδικών σηµάτων έλεγχου ότι η δ/νση αφορά δ/νση Ε/Ε και όχι θέση µνήµης. Εφόσον χρησιµοποιούνται 16 γραµµές για σχηµατισµό δ/νσεων έχουµε 216 = 64K διαφορετικές δ/νσεις Ε/Ε. Από αυτές όµως µερικές δεν χρησιµοποιούνται διότι είναι δεσµευµένες από τον κατασκευαστή για µελλοντικές χρήσεις. Μια συσκευή εισόδου εξόδου είναι ένα ολοκληρωµένο κύκλωµα το οποίο ελέγχεται από τον 8086. Μια συσκευή έχει συνήθως περισσότερες από µια θύρες Ε/Ε για επικοινωνία. Οι θύρες των συσκευών ανάλογα µε την λειτουργία τους διακρίνονται σε:

1. Θύρες ∆εδοµένων (Data ports). 2. Θύρες Ελέγχου (Control ports). 3. Θύρες κατάστασης (Status ports).

Τέτοιες συσκευές είναι ο ελεγκτής διακοπών 8259, ο χρονιστής 8253, το ολοκληρωµένο διασύνδεσης περιφερειακών 8255 κ.α. Στο παράδειγµα παραγωγής ήχου, θα αναφερθούµε εκτενέστερα σε µερικές συσκευές Ε/Ε. 2 ΕΝΤΟΛΕΣ ΕΙΣΟ∆ΟΥ ΕΞΟ∆ΟΥ 2.1 Εισαγωγή Οι περισσότερες από τις εντολές του 8086 µπορούν να έχουν προσπέλαση σε τελεστές µνήµης. Οι µόνες εντολές µε τις οποίες έχουµε προσπέλαση σε θύρες Ε/Ε είναι η IN και OUT. 2.2 Εντολή εισόδου IN. Η συντακτική της κορφή είναι : IN < Συσσωρευτής >, < Θύρα > Όπου συσσωρευτής ο AL ή ο AX ανάλογα αν το εισερχόµενο δεδοµένο είναι ενός byte ή µιας λέξης Όπου θύρα µια από τις θύρες του συστήµατος. Υπάρχουν δυο τρόποι προσδιορισµού της θύρας:

Page 74: ΚΕΦΑΛΑΙΟ 1dima/wp-content/uploads/... · 1 ΚΕΦΑΛΑΙΟ 1 Ο ... διαιρέσεις. BX ∆είκτης για έµµεσο τρόπο προσδιορισµού διευθύνσεων

74

Άµεσος τρόπος – Θύρα σταθεράς δ/νσης. Εφόσον η δ/νση της θύρας είναι ενός byte (µικρότερη του 256) Τίτε η θύρα στην εντολή IN µπορεί να είναι σταθερά. Π.Χ IN al,60h ; είσοδος ενός byte από το πληκτρολόγιο Έµµεσος τρόπος – Θύρα µεταβλητής δ/νσης. Σε κάθε περίπτωση όµως και υποχρεωτικά για θύρες µε δ/νση µεγαλύτερη του 255 , σαν θύρα χρησιµοποιείται ο καταχωρητής DX , στον οποίο βέβαια πρέπει να έχει φορτωθεί η δ/νση της θύρας εισόδου, η εντολή IN αποκτά παραµετρικότητα Π.χ. mov dx,3f4h ; είσοδος ενός byte από τον καταχωρητή in al,dx ; κατάστασης του τσιπ FCD 8272A 2.3 Εντολή εξόδου OUT. Η συντακτική της µορφή είναι : OUT < θύρα > , < Συσσωρευτής > Ως προς τον συσσωρευτή και την θύρα , ισχύουν όσα αναφέρθηκαν προηγουµένως στην εντολή IN. Παράδειγµα : mov dx,3d4h mov al,0fh out dx,al ; Στέλνουµε την τιµή 15 στην δ/νση θύρας 3b4h. 2.4 Προσπέλαση των θυρών του 8086 Υπενθυµίζουµε ότι ο δίαυλος δεδοµένων του 8086 είναι των 16bits. Για την προσπέλαση των θυρών ισχύουν όσα αναφέραµε για την µνήµη στην παράγραφο 5 του 1ου κεφαλαίου. Συνοπτικά αναφέρουµε ότι: Αν η θύρα δέχεται δεδοµένα ενός byte ( οι εντολές IN και OUT χρησιµοποιούν τον AL) και έχει άρτια δ/νση θα συνδεθεί στο χαµηλό byte του αγωγού (στους ακροδέκτες D0 - D7) αλλιώς θα συνδεθεί στο υψηλό byte (στους ακροδέκτες D8 – D15). Αν η θύρα δέχεται δεδοµένα µιας λέξης (οι εντολές IN και OUT χρησιµοποιούν τον AX), χρησιµοποιείς όλο τον αγωγό δεδοµένων , και έχει υποχρεωτικό άρτια δ/νση. 3 ΠΑΡΑΓΩΓΗ ΗΧΟΥ 3.1 Σήµα στάθµης – Σήµα παλµού. Η διάφορα σήµατος στάθµης και σήµατος παλµού είναι ότι το µεν σήµα στάθµης διαρκεί συνεχώς (έως ότου διακοπεί) ενώ το σήµα παλµού αποτελείται από εναλλασσόµενα διαστήµατα κατά τα οποία ενεργοποιείται και απενεργοποιείται. Χαρακτηριστικό του δεύτερου είναι το πλάτος του , δηλαδή η χρονική διάρκεια των διαστηµάτων αυτών.

Page 75: ΚΕΦΑΛΑΙΟ 1dima/wp-content/uploads/... · 1 ΚΕΦΑΛΑΙΟ 1 Ο ... διαιρέσεις. BX ∆είκτης για έµµεσο τρόπο προσδιορισµού διευθύνσεων

75

Σαν παράδειγµα σήµατος στάθµης, µπορεί να θεωρηθεί µια συσκευή συνδεµένη µε το σύστηµα και η οποία ελέγχεται από ένα ρελέ. Υποθέτουµε ότι το ρελέ είναι συνδεµένο µε µια θύρα (την ονοµάζουµε OUTKIN) ενός byte και τίθεται σε λειτουργία ή διακόπτεται η λειτουργία ανάλογα µε την τιµή του υπ’αριθµ 0 bit του δεδοµένου που στέλνεται στην θύρα. Τα υπόλοιπα 7 bits δεν επηρεάζουν την λειτουργία του ρελέ. Επειδή όµως υπάρχει περίπτωση να ελέγχονται και άλλες συσκευές από την ίδια θύρα , πρέπει να διαφυλαχθεί το περιεχόµενο των υπόλοιπων bits. Όταν θέλουµε να αλλάξουµε την τιµή συγκεκριµένων bits ενός byte χρησιµοποιούµε τις λογικές πράξεις AND και OR µε κατάλληλη δυαδική τιµή που καλείται µάσκα. Για µηδενισµό bits χρησιµοποιείται η AND ενώ για να δώσουµε τιµή ‘1’ σε bits χρησιµοποιείται η OR µε κατάλληλη µάσκα. Ο κώδικας για να θέσουµε σε λειτουργία την συσκευή είναι : in al,OUTKIN ; ∆ιαβάζουµε το παλιό περιεχόµενο της θύρας or al,00000001b ; Αλλάζουµε σε ‘1’ την τιµή του 0 bit out OUTKIN,al ; και το στέλνουµε στην θύρα Ο κώδικας για να διακόψουµε την λειτουργία της συσκευής είναι: in al,OUTKIN ; ∆ιαβάζουµε το παλιό περιεχόµενο της θύρας and al,11111110b ; Αλλάζουµε σε ‘0’ την τιµή του 0 bit out OUTKIN,al ; και το στέλνουµε στην θύρα 3.2 ∆ηµιουργία ενός παλµού

Σήµα Στάθµης Σήµα παλµούV

t

V

t

∆ιαφορά σήµατος στάθµης και σήµατος παλµού Σήµα παλµού µπορούµε να δηµιουργήσουµε µε τον ίδιο ακριβώς τρόπο, δηλαδή πρώτα να ενεργοποιηθεί το ρελέ και στην συνέχεια µετά από ορισµένο χρονικό διάστηµα να απενεργοποιηθεί και ούτω καθ’ εξής. Αυτό µπορεί να κωδικοποιηθεί µε το εξής πρόγραµµα: in al,OUTKIN ; ∆ιαβάζουµε το παλιό περιεχόµενο της θύρας or al,00000001b ; Αλλάζουµε σε ‘1’ την τιµή του 0 bit

Page 76: ΚΕΦΑΛΑΙΟ 1dima/wp-content/uploads/... · 1 ΚΕΦΑΛΑΙΟ 1 Ο ... διαιρέσεις. BX ∆είκτης για έµµεσο τρόπο προσδιορισµού διευθύνσεων

76

out OUTKIN,al ; και το στέλνουµε στην θύρα ;………………………. ; Καθυστέρηση ; ………………………. in al,OUTKIN ; ∆ιαβάζουµε το παλιό περιεχόµενο της θύρας and al,11111110b ; Αλλάζουµε σε ‘0’ την τιµή του 0 bit out OUTKIN,al ; και το στέλνουµε στην θύρα ;………………………. ; Καθυστέρηση ; ………………………. ; Επανάληψη της παραπάνω διαδικασίας µέχρι της ; συνολικής διάρκειας του παλµού Η καθυστέρηση µπορεί να επιτευχθεί είτε µε λογισµικό είτε µε υλικό. Με λογισµικό σηµαίνει πρόγραµµα στο οποίο γίνεται χρήση µετρητών, βρόγχων για µια µεγαλύτερη ή µικρότερη καθυστέρηση. ( εντολή LOOP ή συνδυασµός εντολών CMP και διακλαδώσεων υπό συνθήκη) . Με υλικό σηµαίνει χρήση ενός ολοκληρωµένου που µπορεί να προγραµµατιστεί για να παράγει καθυστέρηση για δηµιουργία παλµού. Οι δύο αυτές περιπτώσεις θα εξεταστούν παρακάτω στο πρόβληµα της παραγωγής ήχου από το µεγάφωνο. 3.3 Ήχος Στην µικροπληροφορική συνήθως ο ήχος χρησιµοποιείται µε την µορφή τετραγωνικών κυµάτων. Ουσιαστικά πρόκειται για παλµούς που δηµιουργούνται µε το άνοιγµα και το κλείσιµο ενός διακόπτη. Όσο περισσότερη ώρα ο διακόπτης παραµένει κλειστός τόσο η περίοδος του παλµού ελαττώνεται και ο ήχος γίνεται πιο βαθύς. 3.4 Παραγωγή ήχου µε καθυστέρηση λογισµική. Για την παραγωγή ήχου χρησιµοποιείται το ολοκληρωµένο διασύνδεσης περιφερειακών 8255 της Intel. Αυτό αναφέρει τις ρυθµίσεις των διακοπτών dip της κάρτας του συστήµατος, δέχεται την είσοδο των δεδοµένων από το πληκτρολόγιο τέλος ελέγχει έναν αριθµό περιφερειακών, µεταξύ των οποίων και το ολοκληρωµένο του χρονιστή 8253. Το 8255 έχει τρεις καταχωρητές του ενός byte που αναφέρονται σαν θύρες A έως C και βρίσκονται στις δ/νσεις 60H-62H. Οι θύρες αυτές είναι όλες αναγνώσιµες, αλλά µόνο στην θύρα Β (δ/νση 61H) µπορούµε να γράψουµε. Για την παραγωγή ήχου ενδιαφέρουν τα bit 0 και 1 της θύρας αυτής. Το bit 0 ελέγχει αν υπάρχει διασύνδεση µε την 2η πύλη του χρονιστή και πρέπει να είναι µηδενισµένο προκειµένου να µην ελέγχεται η περίοδος του ήχου που θα παραχθεί από τον χρονιστή. Το bit 1 παρέχει έξοδο προς το µεγάφωνο. Για την παραγωγή ήχου πρέπει να στείλουµε ένα κύµα τετραγωνικής µορφής προς το µεγάφωνο του συστήµατος για κάποιο χρονικό διάστηµα. Αυτό γίνεται µε τα εξής βήµατα.

1. Γράψιµο στην θύρα 61h xxxxxx10b

Page 77: ΚΕΦΑΛΑΙΟ 1dima/wp-content/uploads/... · 1 ΚΕΦΑΛΑΙΟ 1 Ο ... διαιρέσεις. BX ∆είκτης για έµµεσο τρόπο προσδιορισµού διευθύνσεων

77

2. Καθυστέρηση 3. Γράψιµο στην θύρα 61h xxxxxx00b 4. Καθυστέρηση 5. Επανάληψη των βηµάτων 1 έως 4 µεχρί τέλος ήχου

Όπου XXXXXX συµβολίζονται τα υπόλοιπα bits της θύρας 61h , τα οποία οφείλουµε να µην τα θίξουµε. Η περίοδος του ήχου προσδιορίζεται από την διάρκεια των δύο παλµών της (γράψιµο ‘1’, γράψιµο ‘0’) η οποία θα είναι ίδια και για τους δύο. Ουσιαστικά δηλαδή η περίοδος και η συχνότητα του ήχου ελέγχεται από την καθυστέρηση λογισµικού (βήµατα 2 και 4). Όσο για την καθυστέρηση, µπορούµε να χρησιµοποιήσουµε την εντολή βρόγχων LOOP µε µετρητή τον CX (Κεφ.3 παρ.4.4). Με το παρακάτω παράδειγµα προγράµµατος .com το µεγάφωνο παράγει έναν απλό ήχο : Παράδειγµα προγράµµατος υπ’ αριθµόν 16: code_seg segment assume cs:code_seg org 100h hxos proc near port_b equ 61h ; Αριθµός της θύρας oliko_loop equ 50000 ; Αριθµός που καθορίζει την διάρκεια ariumos_epanalalhcevn equ 1000; Αριθµός που καθορίζει την περίοδο του ήχου in al, port_b ; ∆ιάβασµα θύρας and al,11111110b ; Αποσύνδεση του χρονιστή mov cx,oliko_loop; Αριθµός επαναλήψεων στον CX again: push cx ; Σώσιµο στον σωρό του µετρητή των εξωτερικών ; βρόγχων or al,00000010b ; Στέλνουµε ‘1’ το 1 bit out port_b,al ; στην θύρα mov cx,ariumos_epanalalhcevn; kauysterhsh_1: loop kauysterhsh_1; Καθυστέρηση and al,11111100b ; Στέλνουµε ‘0’ το 1 bit out port_b,al ; στην θύρα mov cx,ariumos_epanalalhcevn; kauysterhsh_2: loop kauysterhsh_2; Καθυστέρηση pop cx ; Από τον σωρό ο µετρητής του εξωτερικού ; βρόγχου loop again int 20h ; έξοδος στο DOS για .COM προγράµµατα hxos endp code_seg ends end hxos

Page 78: ΚΕΦΑΛΑΙΟ 1dima/wp-content/uploads/... · 1 ΚΕΦΑΛΑΙΟ 1 Ο ... διαιρέσεις. BX ∆είκτης για έµµεσο τρόπο προσδιορισµού διευθύνσεων

78

3.5 Παραγωγή ήχου µε την βοήθεια του χρονιστή 8253 Το ολοκληρωµένο 8253 λειτουργεί σαν ρολόι πραγµατικού χρόνου και λειτουργεί ανεξάρτητα από τον 8086. Ο 8253 έχει τρία κανάλια σε τρεις θύρες αριθµηµένες 40h έως 42h. Όταν ένα κανάλι προγραµµατίζεται, στέλνεται προς την θύρα µια τιµή των δύο bytes µε το byte χαµηλής τάξης πρώτο. Ο αριθµός µεταφέρεται σε ένα καταχωρητή εναλλαγής και από εκεί σε ένα καταχωρητή µέτρησης των 16 bits. Στον καταχωρητή µέτρησης ο αριθµός µειώνεται κατά ένα µετά από κάθε παλµό του ρολογιού του συστήµατος. Όταν ο αριθµός µηδενιστεί το κανάλι στέλνει ένα παλµό εξόδου και µεταφέρεται ένα νέο αντίγραφο του αριθµού στον καταχωρητή µέτρησης από την καταχωρητή εναλλαγής και η διαδικασία επαναλαµβάνεται. Κάθε κανάλι έχει δύο εισόδους και µια έξοδο. Η γραµµή εξόδου µεταφέρει τον παλµό στον προορισµό. Το κανάλι 0 χρησιµοποιείται από το ρολόι χρόνου του συστήµατος. Ρυθµίζεται κατά την εκκίνηση του συστήµατος ώστε να στέλνει ένα παλµό περίπου 18.2 φορές το δευτερόλεπτο. Κάθε παλµός προκαλεί την διακοπή χρονιστή η οποία αυξάνει κατά ένα , έναν µετρητή των παλµών αυτών ο οποίος βρίσκεται στην δ/νση µνήµης 0046CH. Ο µετρητής είναι των τεσσάρων bytes και τοποθετείται στην µνήµη µε το λιγότερο σηµαντικό byte πρώτο. Επίσης χρησιµοποιείται για ορισµένες λειτουργίες του δίσκου. Το κανάλι 1 ελέγχει την ανανέωση της µνήµης. Η γραµµή εξόδου του καναλιού αυτού συνδέεται µε το ολοκληρωµένο άµεσης προσπέλασης DMA(Direct Memory Access) της µνήµης και ένας παλµός υποχρεώνει το DMA να ανανεώσει όλη την RAM. Το κανάλι 2 είναι συνδεµένο µε το µεγάφωνο για παραγωγή απλών σηµάτων τετραγωνικού κύµατος. Οι απλοί ήχοι παράγονται ανεξάρτητα από τις άλλες λειτουργίες του συστήµατος. Για την παραγωγή σύνθετων ήχων είναι απαραίτητη και η απασχόληση της κµε. Η γραµµή εξόδου συνδέεται µε το µεγάφωνο του υπολογιστή. Για την παραγωγή ήχου ώµος πρέπει και τα 0 και 1 bit της θύρας 61H του 8255 να είναι ON (‘1’). Το 8253 προσφέρει έξη καταστάσεις λειτουργίας µε σηµαντικότερη την κατάσταση 3 τόσο στο κανάλι 0 για χρονισµό όσο και στο κανάλι 2 για παραγωγή ήχου. Τέλος ο 8253 διαθέτει ένα καταχωρητή εντολών στην θύρα 43H. Στον καταχωρητή αυτόν στέλνεται ένα byte για να ενηµερωθεί ο 8253 πιο κανάλι πρόκειται να προγραµµατιστεί, σε τι κατάσταση ποια µορφή δεδοµένου. Η διάταξη των bits είναι: bit 0 0 δυαδικά δεδοµένα, 1 BCD

3-1 αριθµός κατάστασης (0-5) 5-4 είδος λειτουργίας

00 µεταφορά της τιµής του µετρητή στον εναλλάκτη 01 διάβασµα/γράψιµο υψηλού byte 10 διάβασµα/γράψιµο χαµηλού byte 11 διάβασµα/γράψιµο πρώτα υψηλού byte και µετά του χαµηλού byte

7-6 Αριθµός καναλιού 00 ή 01 ή 10

Page 79: ΚΕΦΑΛΑΙΟ 1dima/wp-content/uploads/... · 1 ΚΕΦΑΛΑΙΟ 1 Ο ... διαιρέσεις. BX ∆είκτης για έµµεσο τρόπο προσδιορισµού διευθύνσεων

79

Περιληπτικά τα βήµατα προγραµµατισµού του 8253 για παραγωγή ήχου είναι

1. Στέλνουµε ένα byte εντολής στην θύρα 43h, που περιέχει την διάταξη των bits για επιλογή του καναλιού, την κατάσταση λειτουργίας, την κατάσταση γραψίµατος, το είδος του δεδοµένου

2. Ενεργοποιούµε το σήµα του ρολογιού και το µεγάφωνο κάνοντας ‘1’ και το

bit 0 και το bit 1 της θύρας 61h.

3. Υπολογίζουµε ένα µετρητή µέχρι 64k και τον στέλνουµε στην θύρα 42h, πρώτα το χαµηλό byte και ύστερα το υψηλό byte. Υπολογίζουµε τον µετρητή ήχου διαιρώντας τα 1.19 εκατοµµύρια µε τον επιθυµητό αριθµό κύκλων.

Τα βήµατα αυτά κωδικοποιούνται µε τον παρακάτω κώδικα που µπορεί να χρησιµεύσει σαν υπόδειγµα : Παράδειγµα προγράµµατος υπ’ αριθµόν 17: code_seg segment assume cs:code_seg,ds:code_seg org 100h hxos proc near port_b equ 61h ; η θύρα διασύνδεσης περιφερειακών command_rec equ 43h; θύρα για τον καταχωρητή εντολών του χρονιστή channel_2 equ 42h; κανάλι 2 του χρονιστή in al, port_b; or al,00000011b ; κάνουµε ‘1’ τα δύο τελευταία out port_b,al ; bits της θύρας 61h του 8255 mov al,10110110b; αποστολή κατάλληλης διάταξης bits ; 10 κανάλι 2 - 2 byte - κατάσταση 3 - δυαδικός out command_rec,al; στον καταχωρητή εντολών mov ax,2000 ; Αποστολή του µετρητή του παλµού out channel_2,al; πρώτα το χαµηλό byte xchg al,ah ; και ύστερα το υψηλό byte out channel_2,al ; στην ίδια θύρα mov ah,8 ; αναµονή για int 21h ; πάτηµα ενός πλήκτρου (κλήση 8 του DOS) in al,port_b ; µηδενισµός των 2 τελευταίων bits της and al,11111100b ; θύρας 61h για να αποσυνδεθεί ο χρονιστής out port_b,al ; από το µεγάφωνο και να µηδενιστή το bit από ; εξόδου προς το µεγάφωνο int 20h ; έξοδος στο DOS hxos endp code_seg ends end hxos Από τα δυο τελευταία παράδειγµα βγαίνουν εύκολα τα εξής συµπεράσµατα:

Page 80: ΚΕΦΑΛΑΙΟ 1dima/wp-content/uploads/... · 1 ΚΕΦΑΛΑΙΟ 1 Ο ... διαιρέσεις. BX ∆είκτης για έµµεσο τρόπο προσδιορισµού διευθύνσεων

80

1. Ενώ οι εντολές για επικοινωνία µε Ε/Ε είναι µόνο δύο και η σύνταξη τους πολύ απλή τα προγράµµατα ελέγχου των συσκευών είναι µακροσκελή και πολύπλοκα ακόµη και για µα απλή ενέργεια όπως το άκουσµα ενός bit.

2. Απαιτείται άριστη γνώση και τεκµηρίωση του περιφερειακού το οποίο

θέλουµε να προγραµµατίσουµε. ΚΕΦΑΛΑΙΟ 8 ∆ΙΑΚΟΠΕΣ ΠΡΟΓΡΑΜΜΑΤΟΣ 1 Η ΕΝΝΟΙΑ ΤΩΝ ∆ΙΑΚΟΠΩΝ 1.1 Υποπρογράµµατα εξυπηρέτησης διακοπών. Μια από τις σηµαντικότερες δυνατότητες των υπολογιστών είναι το ότι έχουν την ικανότητα να ανταποκρίνονται σε απρόβλεπτες και διαφορετικές εργασίες που τους ανατίθενται. Το κλειδί για την ικανότητα αυτή είναι ένα χαρακτηριστικό γνωστό σαν διακοπές (interrupts). Ο υπολογιστής είναι έτσι σχεδιασµένος ώστε ενώ εκτελεί µια εργασία , σε κάθε έγκυρη απαίτηση για προσοχή (π.χ. πάτηµα ενός πλήκτρου) να την αναστέλλει να περνάει σε µια άλλη εργασία µε βάση το γεγονός που προκάλεσε την διακοπή και να επιστρέφει στην αρχική εργασία µετά το πέρας της διακοπής. Η έννοια δηλαδή των διακοπών είναι:

1. Το πρόγραµµα εκτελείται. 2. Ένα τυχαίο εξωτερικό γεγονός συµβαίνει

3. Υπάρχει ειδικά σχεδιασµένο κύκλωµα που αναγνωρίζει το γεγονός και

δηµιουργεί σήµα διακοπής που πληροφορεί την CPU σχετικά.

4. Ο µ/ε αποτελειώνει την τρέχουσα εντολή, απενεργοποιεί τις διακοπές µε µάσκα, διαφυλάσσει στο σωρό την τρέχουσα κατάσταση των δεικτών, διαφυλάσσει στο σωρό την πλήρη δ/νση της επόµενης εντολής (πρώτα την τιµή του CS και ύστερα την τιµή του IP) και καλεί ένα υποπρόγραµµα εξυπηρέτησης της διακοπής (Interrupt Service Routine – ISR).

5. Μετά το πέρας του υποπρογράµµατος εξυπηρέτησης της διακοπής καλούνται

από τον σωρό οι τιµές των καταχωρητών IP , CS και ο καταχωρητής

Page 81: ΚΕΦΑΛΑΙΟ 1dima/wp-content/uploads/... · 1 ΚΕΦΑΛΑΙΟ 1 Ο ... διαιρέσεις. BX ∆είκτης για έµµεσο τρόπο προσδιορισµού διευθύνσεων

81

κατάστασης (SR). Το πρόγραµµα συνεχίζει την εκτέλεση του µετά την επόµενη εντολή από εκείνη στην οποία είχε σταµατήσει.

Τα υποπρογράµµατα εξυπηρέτησης της διακοπής είναι ανάλογα µε τις άλλες διαδικασίες που διακλαδώνεται κάποιο πρόγραµµα και αµέσως µετά την εκτέλεση του γίνεται επιστροφή στο κυρίως πρόγραµµα. Μόλις συµβεί µια διακοπή αποθηκεύονται στον σωρό ο καταχωρητής κατάστασης (status register) και η πλήρης διεύθυνσης της επόµενης εντολής. Μετά το πέρας του υποπρογράµµατος εξυπηρέτησης ανακλούνται από το σωρό η δ/νση αυτή και ο καταχωρητής κατάστασης και το κυρίως πρόγραµµα συνεχίζει την εργασία από το σηµείο που διακόπηκε. Το υποπρόγραµµα εξυπηρέτησης διακοπής, που λέγεται και χειριστής διακοπής (Interrupt Handler), πρέπει να είναι γραµµένο κατά τέτοιο τρόπο ώστε το πρόγραµµα που διακόπηκε να µπορεί να συνεχίσει , µετά το τέλος της διακοπής, χωρίς προβλήµατα. Επόµενος µέσα στον κώδικα του πρέπει να σώζονται οι τιµές όλων των χρησιµοποιουµένων από το υποπρόγραµµα καταχωρητών και πριν την επάνοδο στο κυρίως πρόγραµµα να επαναφέρονται οι αρχικές τιµές. Τελευταία εντολή ενός χειριστή διακοπών είναι η εντολή IRET(Interrupt RETurn) που αναιρεί την διαδικασία που ενεργοποίησε την διακοπή και αποκαθιστά τις τιµές των καταχωρητών CS ,IP και του καταχωρητή σηµαιών SR. 1.2 Πίνακας διακοπών. Όλες οι δυνατές διακοπές που µπορεί να χειριστεί ο 8086 είναι 256 και κάθε µια από αυτές λέγεται τύπος διακοπής. Σε κάθε τύπο δίδεται ένα όνοµα από 0 έως 255. Η δ/νση του υποπρογράµµατος εξυπηρέτησης της διακοπής κάθε τύπου λέγεται άνυσµα (Interrupt Vector) του τύπου αυτού. Το µέγεθος κάθε ανύσµατος είναι διπλή λέξη δηλ. 4 bytes (dword), διότι οι δ/νσεις αυτές είναι απόλυτες (και τµήµα και µετατόπιση). Τα ανύσµατα αυτά είναι αποθηκευµένα στα πρώτα 1024 bytes της µνήµης (από δ/νση 0000:0000h έως δ/νση 0000:03FFh), σε µορφή πίνακα 256 διπλών λέξεων (dword = 4 bytes), γνωστό ως Πίνακας Ανυσµάτων ∆ιακοπών (Interrupt Vector Table). Έτσι το άνυσµα της διακοπής τύπου 10 βρίσκεται στην 11 θέση του πίνακα και σε απόλυτη δ/νση µνήµης : 10 * 4 = 40D = 0000:0028h. Σε κάθε θέση του πίνακα το άνυσµα δηλαδή η δ/νση τοποθετείται µε την λογική low high δηλαδή πρώτα η µετατόπιση και µετά το τµήµα, και σε κάθε λέξη (µετατόπιση ή τµήµα) πρώτα το χαµηλό byte και µετά το υψηλό (Κεφ.1 παρ 5). Με την διαταγή ‘-D’ του debug µπορούµε να δούµε αυτόν τον πίνακα των ανυσµάτων: A>debug -d0000:0000 0000:0000 FB 91 19 00 F4 04 70 00-16 00 88 0D F4 06 70 00 …p…p. 0000:0010 F4 06 70 00 54 FF 00 F0-6F EF 00 F0 6F EF 00 F0 …p.To..o.. 0000:0020 EC 03 39 0F 3B 06 39 0F-6F EF 00 F0 6F EF 00 F0 ..9..9.o…o..

Page 82: ΚΕΦΑΛΑΙΟ 1dima/wp-content/uploads/... · 1 ΚΕΦΑΛΑΙΟ 1 Ο ... διαιρέσεις. BX ∆είκτης για έµµεσο τρόπο προσδιορισµού διευθύνσεων

82

0000:0030 6F EF 00 F0 6F EF 00 F0-B7 00 88 0D F4 06 70 00 o..o……p. 0000:0040 65 F0 00 F0 4D F8 00 F0-41 F8 00 F0 74 07 70 00 e..M..A…t.p. 0000:0050 39 E7 00 F0 4A 08 70 00-2E E8 00 F0 D2 EF 00 F0 9..J.p...... 0000:0060 C8 E3 00 F0 FB 07 70 00-6E FE 00 F0 EE 06 70 00 ….p.n...p. 0000:0070 53 FF 00 F0 A4 F0 00 F0-22 05 00 00 00 00 00 00 2….*….. -d 0000:0080 BF 40 19 00 EB 40 19 00-4F 03 DF 1E 8A 03 DF 1E .@[email protected].... 0000:0090 17 03 DF 1E D8 42 19 00-5F 43 19 00 64 A1 19 00 …B…C…d.. 0000:00A0 29 04 39 0F 62 07 70 00-C5 40 19 00 C5 40 19 00 ).9.b.p..@..@.. 0000:00B0 C5 40 19 00 C5 40 19 00-40 01 FD 0D A0 01 FE 0D .@…@..@…. 0000:00C0 EA C6 40 19 00 EF 00 F0-C5 40 19 00 C5 40 19 00 .@….@..@.. 0000:00D0 C5 40 19 00 C5 40 19 00-C5 40 19 00 C5 40 19 00 .@..@..@..@.. 0000:00E0 C5 40 19 00 C5 40 19 00-C5 40 19 00 C5 40 19 00 .@..@..@..@.. 0000:00F0 C5 40 19 00 C5 40 19 00-C5 40 19 00 C5 40 19 00 .@..@..@..@.. -d 0000:0100 59 EC 00 F0 41 E4 00 F0-6F EF 00 F0 6F EF 00 F0 Y..A..o..o.. 0000:0110 6F EF 00 F0 6F EF 00 F0-01 E4 00 F0 6F EF 00 F0 o..o….o.. 0000:0120 6F EF 00 F0 6F EF 00 F0-6F EF 00 F0 6F EF 00 F0 o..o..o..o.. 0000:0130 6F EF 00 F0 6F EF 00 F0-6F EF 00 F0 6F EF 00 F0 o..o..o..o.. 0000:0140 6F EF 00 F0 6F EF 00 F0-6F EF 00 F0 6F EF 00 F0 o..o..o..o.. 0000:0150 6F EF 00 F0 6F EF 00 F0-6F EF 00 F0 6F EF 00 F0 o..o..o..o.. 0000:0160 6F EF 00 F0 6F EF 00 F0-6F EF 00 F0 6F EF 00 F0 o..o..o..o.. 0000:0170 6F EF 00 F0 6F EF 00 F0-6F EF 00 F0 6F EF 00 F0 o..o..o..o.. -d 0000:0180 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ............ 0000:0190 01 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ............ 0000:01A0 6F EF 00 F0 6F EF 00 F0-6F EF 00 F0 6F EF 00 F0 o..o..o..o.. 0000:01B0 6F EF 00 F0 6F EF 00 F0-6F EF 00 F0 6F EF 00 F0 o..o..o..o.. 0000:01C0 52 00 88 0D F3 EC 00 F0-6F EF 00 F0 6F EF 00 F0 R…..o..o.. 0000:01D0 6F EF 00 F0 70 F0 00 F0-17 01 88 0D 6F EF 00 F0 o..p….o.. 0000:01E0 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ............ 0000:01F0 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ............ -d 0000:0200 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ............ 0000:0210 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ............ 0000:0220 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ............ 0000:0230 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ............ 0000:0240 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ............ 0000:0250 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ............ 0000:0260 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ............ 0000:0270 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ............ -d 0000:0280 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ............ 0000:0290 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ............ 0000:02A0 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ............ 0000:02B0 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ............ 0000:02C0 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ............ 0000:02D0 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ............ 0000:02E0 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ............ 0000:02F0 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ............ -d 0000:0300 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ............ 0000:0310 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ............ 0000:0320 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ............ 0000:0330 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ............ 0000:0340 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ............ 0000:0350 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ............ 0000:0360 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ............ 0000:0370 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ............ -d

Page 83: ΚΕΦΑΛΑΙΟ 1dima/wp-content/uploads/... · 1 ΚΕΦΑΛΑΙΟ 1 Ο ... διαιρέσεις. BX ∆είκτης για έµµεσο τρόπο προσδιορισµού διευθύνσεων

83

0000:0380 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ............ 0000:0390 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ............ 0000:03A0 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ............ 0000:03B0 00 00 00 00 00 00 00 00-00 00 00 00 00 00 DC 03 ............ 0000:03C0 40 00 E0 03 40 00 42 42-00 CC F4 C9 00 F0 6D EF @[email protected]. 0000:03D0 00 F0 86 00 30 80 39 ED-00 07 E2 03 E2 03 00 F0 ....0.9...... 0000:03E0 3A A4 27 00 01 00 00 7C-01 00 00 00 00 00 00 00 ..`….|…. 0000:03F0 00 00 03 00 01 00 00 7C-95 8D 12 8D 00 F0 46 02 ….|….F. Έτσι η δ/νση της διακοπής 0 είναι 1900:91FB της 1 7000:06F4 και ούτω καθεξής. Παρατηρούµε ότι πολλές θέσεις του πίνακα είναι µηδενισµένες. Οι θέσεις αυτές ανήκουν σε διακοπές µη χρησιµοποιούµενες ή διακοπές στην διάθεση του χρηστή. Οι ενέργειες του µ/ε κατά τον χειρισµό της αίτησης διακοπής είναι :

1. Αναγνωρίζεται ο ΤΥΠΟΣ της διακοπής. (π.χ διακοπή τύπου 8) 1. Ο καταχωρητής κατάστασης στον σωρό. 2. Απενεργοποιούνται οι διακοπές µε µάσκα (IF=0) 3. Απενεργοποιείται η κατάσταση µονού βήµατος (TF=0) 4. Οι καταχωρητές CS, IP αποθηκεύονται στον σωρό 5. Στον καταχωρητή IP φορτώνεται το περιεχόµενο της δ/νσης ΤΥΠΟΣ * 4 της

µνήµης και στον καταχωρητή CS το περιεχόµενο της δ/νσης ΤΥΠΟΣ * 4 + 2 6. Η εκτέλεση του προγράµµατος συνεχίζεται µε επόµενη εντολή την εντολή που

βρίσκεται στην δ/νση που σχηµατίστηκε µε τις νέες τιµές των CS:IP. 2 ΕΙ∆Η ∆ΙΑΚΟΠΩΝ 2.1 Γενικά Υπάρχουν δύο κατηγορίες διακοπών, οι διακοπές που προκαλούνται από εξωτερικά του µ/ε αίτια και σε εσωτερικές διακοπές. Οι εξωτερικές διακοπές διακρίνονται σε διακοπές µη επιδεχόµενες µάσκα και σε διακοπές επιδεχόµενες µάσκα. 2.2 ∆ιακοπές Εξωτερικές επιδεχόµενες µάσκα. Οι διακοπές αυτές προέρχονται από εξωτερικές συσκευές (πληκτρολόγιο, ρολόι, COM1, δίσκος κ.λ.π) που είναι συνδεµένες και ελέγχονται από το σύστηµα µέσω του προγραµµατιζόµενου ελεγκτή διακοπών 8259 και γίνονται αντιληπτές από τον µ/ε από τον ακροδέκτη INTR. Οι διακοπές αυτές γίνονται αντιληπτές και εκτελούνται ή όχι ανάλογα µε την τιµή της σηµαίας ελέγχου IF. Αν η IF είναι 1 τότε οι διακοπές αυτές δεν αναγνωρίζονται. Αν η IF είναι 0 τότε αναγνωρίζονται. Με την εντολή CLI γίνεται 0 η IF και απενεργοποιούνται οι διακοπές. Επειδή η τιµή της IF µπορεί µε τις εντολές CLI και STI να αλλάξει, υπάρχει η δυνατότητα στο πρόγραµµα να επιτρέπει ή να απαγορεύει την είσοδο τους στον µ/ε. Πρόκειται δηλαδή για διακοπές που µπορούν να αποκρύβουν (maskable). Όταν γίνονται αντιληπτές ο ακροδέκτης INTA (INTerrupt Acknowledge = λήψη υπόψη της διακοπής που ζητήθηκε), ενεργοποιείται δείχνοντας ότι είναι έτοιµος να επεξεργαστεί την διακοπή που παρουσιάστηκε.

Page 84: ΚΕΦΑΛΑΙΟ 1dima/wp-content/uploads/... · 1 ΚΕΦΑΛΑΙΟ 1 Ο ... διαιρέσεις. BX ∆είκτης για έµµεσο τρόπο προσδιορισµού διευθύνσεων

84

Με την εντολή STI γίνεται 1 η IF και ενεργοποιούνται οι διακοπές µε µάσκα. Συνοψίζοντας τις ενέργειες του µ/ε κατά τον χειρισµό της αίτησης διακοπής χωρίς µάσκα έχουµε:

1. Αναγνωρίζεται ο ΤΥΠΟΣ της διακοπής. (π.χ διακοπή 8) 1. Ο καταχωρητής κατάστασης στον σωρό. 2. Απενεργοποιούνται οι διακοπές µε µάσκα (IF=0) 3. Απενεργοποιείται η κατάσταση µονού βήµατος (TF=0) 4. Οι καταχωρητές CS, IP αποθηκεύονται στον σωρό 5. Στον καταχωρητή IP φορτώνεται το περιεχόµενο της δ/νσης ΤΥΠΟΣ * 4 της

µνήµης και στον καταχωρητή CS το περιεχόµενο της δ/νσης ΤΥΠΟΣ * 4 + 2 6. Η εκτέλεση του προγράµµατος συνεχίζεται µε επόµενη εντολή την εντολή που

βρίσκεται στην δ/νση που σχηµατίστηκε µε τις νέες τιµές των CS:IP. ∆ιακοπές εξωτερικές µε µάσκα είναι:

Η διακοπή τύπου 5 εκτυπωτής οθόνης Η διακοπή τύπου 8 του χρονιστή του συστήµατος Η διακοπή τύπου 9 του πληκτρολογίου Η διακοπή τύπου 0B της σειριακής θύρας COM2 Η διακοπή τύπου 0C της σειριακής θύρας COM1 Η διακοπή τύπου 0D του σκληρού δίσκου Η διακοπή τύπου 0F του εκτυπωτή

2.3 ∆ιακοπή χωρίς µάσκα Πρόκειται για εξωτερική διακοπή που γίνεται αντιληπτή από τον ακροδέκτη NMI και οφείλεται σε περιπτώσεις διάγνωσης καταστροφικών αιτιών όπως απώλεια ισχύος, λάθος ισοτιµίας της µνήµης, παλµούς ρολογιού που πρέπει να επεξεργαστούν κ.α. Η διακοπής αυτή δεν µπορεί να απενεργοποιηθεί και µόλις γίνει αναγνώριση της από τον µ/ε γίνεται πάντα αποδεκτή και εκτελείται µια διακοπή ΤΥΠΟΥ 2. 2.4 Εσωτερικές διακοπές. Πρόκειται για διακοπές που προκαλεί ο ίδιος ο επεξεργαστής. Οι διακοπές αυτές δεν µπορούν να απενεργοποιηθούν. 2.5 Οι διακοπές λογισµικού Πρόκειται για την διακοπή που προκαλεί η εντολή INT n, όπου n ο τύπος της διακοπής. Πολύ γνωστός τύπος ο τύπος 21H που περιέχει όλες τις γνωστές κλήσεις του DOS. ∆εν είναι διακοπές ουσιαστικά αλλά κλήσεις γενικότερου ενδιαφέροντος υποπρογραµµάτων που βρίσκονται µόνιµα στην µνήµη για εξυπηρέτηση όλων των προγραµµάτων. Τέτοια υποπρογράµµατα µας παρέχει το λειτουργικό και το BIOS. Η εντολή: INT N Μπορεί να αντικατασταθεί, σύµφωνα µε τα παραπάνω, µε τις εξής 3 εντολές:

Page 85: ΚΕΦΑΛΑΙΟ 1dima/wp-content/uploads/... · 1 ΚΕΦΑΛΑΙΟ 1 Ο ... διαιρέσεις. BX ∆είκτης για έµµεσο τρόπο προσδιορισµού διευθύνσεων

85

CLI; Απενεργοποίηση των διακοπών µε µάσκα PUSHF; Στο σωρό οι δείκτες κατάστασης CALL DWORD PTR 4 * N; κλήση του υποπρογράµµατος του οποίου η δ/νση ;βρίσκεται στην µνήµη σε απόλυτο δ/νση 4 * N 2.5 Η διακοπή divide by zero τύπου 0. Η διακοπή δηµιουργείται µετά από εντολή DIV ή IDIV όταν έχουµε διαίρεση µε το µηδέν. 2.6 Η διακοπή single step τύπου 1. Η διακοπή δηµιουργείται όταν η TF είναι 1, µετά από την εκτέλεση κάθε εντολής και χρησιµεύει σε προγράµµατα εκσφαλµάτωσης.( ∆ιαταγή Trace του debug) 2.7 Η διακοπή breakpoint τύπου 3. Άλλη µια διακοπή χρήσιµη για προγράµµατα εκσφαλµάτωσης. (διαταγή Go του Debug). Όταν ένα πρόγραµµα θέτει ένα σηµείο στάσης κάπου στο πρόγραµµα, αντικαθιστά το Byte στην θέση εκείνη µε την τιµή 0CCH που είναι σε γλώσσα 8086 η εντολή INT 3. Ο χειριστής της διακοπής 3 περιέχει διάφορες εντολές που εξυπηρετούν την εκσφαλµάτωση του προγράµµατος 2.8 Η διακοπή overflow τύπου 4. Πραγµατοποιείται από την εντολή INTO και µόνον όταν η σηµαία OF(Overflow flag) είναι 1. Χρησιµεύει σε προγράµµατα που απαιτείται έλεγχος αν το αποτέλεσµα µιας αριθµητικής πράξης µπορεί να χωρέσει σαν µέγεθος στον αποδεκτή χωρίς απώλεια σηµαντικών ψηφίων. Ακολουθεί πίνακας των πιο σηµαντικών τύπων διακοπών του 8086. ΠΙΝΑΚΑΣ ΣΗΜΑΝΤΙΚΩΝ ∆ΙΑΚΟΠΩΝ του 8086 ----------------------------------------------------------- ΤΥΠΟΣ ∆ΙΑΚΟΠΗΣ ΠΕΡΙΛΗΨΗ ΛΕΙΤΟΥΡΓΙΑΣ ----------------------------------------------------------- 00H ∆ιαίρεση διά του µηδενός 01H ∆ιακοπή µονού βήµατος για εκσφαλµάτωση 02H Χωρίς µάσκα διακοπή κρίσιµου σφάλµατος µνήµης 03H Σηµείου στάσης για εκσφαλµάτωση 04H Αριθµητική υπερχείλιση(overflow) 05H BIOS εκτύπωση οθόνης 08H Χρονιστής συστήµατος, κτύπος ρολογιού 09H Πληκτρολογίου 0BH Σειριακή COM2 0CH Σειριακή COM1 0DH XT σκληρός δίσκος / AT παράλληλος LPT2 0EH Ελεγκτής δισκέτας

Page 86: ΚΕΦΑΛΑΙΟ 1dima/wp-content/uploads/... · 1 ΚΕΦΑΛΑΙΟ 1 Ο ... διαιρέσεις. BX ∆είκτης για έµµεσο τρόπο προσδιορισµού διευθύνσεων

86

0FH Παράλληλη LPT1 ελεγκτής εκτυπωτή 10H Λειτουργίες οθόνης BIOS 11H Εύρεση κατάστασης εξοπλισµού 12H Λειτουργία εύρεσης µεγέθους µνήµης BIOS 13H Λειτουργίες δίσκου BIOS 14H Λειτουργίες επικοινωνίας BIOS 15H Άλλες λειτουργίες BIOS 16H Λειτουργίες πληκτρολογίου BIOS 17H Λειτουργίες εκτυπωτή BIOS 18H ∆ιακοπή ROM-BASIC 19H Θερµή επανεκκίνηση του συστήµατος 1AH Λειτουργίες ηµεροµηνίας και ώρας BIOS 1BH CNTRL-BREAK Χειριστής διακοπής 1CH ∆ιακοπή που καλείται από τον 08H χείριστη (ρολόι) 1DH ∆/νση πίνακα παραµέτρων οθόνης 1EH ∆/νση πίνακα παραµέτρων δίσκου 1FH ∆/νση πίνακα γραφικών χαρακτήρων 20H Λειτουργία τέλος προγράµµατος DOS 21H Κλήσεις του λειτουργικού DOS 22H ∆/νση εντολής µετά το τέλος προγράµµατος 23H Χειριστής CNTR-BREAK του DOS 24H Χειριστής κρίσιµου σφάλµατος DOS 25H Απόλυτο διάβασµα στον δίσκο µε το DOS 26H Απόλυτο γράψιµο στον δίσκο µε το DOS 27H Λειτουργία DOS για παραµονή του προγράµµατος µόνιµα

στην µνήµη 28H ∆ιακοπή του DOS όταν παραµένει αδρανές (idle) 29H Εκτύπωση χαρακτήρα µε DOS τηλετυπικά 2AH MS- λειτουργίες δικτύου 2EH Φορτωτής κελύφους (Shell) του DOS 2FH Λειτουργίες µονίµων στην µνήµη DOS προγραµµάτων

(spooler του DOS , εντολή print) 33H Λειτουργίες του ποντικιού 40H Άνυσµα δισκέτας, αν υπάρχει σκληρός δίσκος 41H Πίνακας παραµέτρων σκληρού δίσκου 42H Ανακατεύθυνση EGA BIOS 43H Πίνακας παραµέτρων EGA 44H Πίνακας χαρακτήρων EGA 4AH Συναγερµός πραγµατικού ρολογιού της 70H κλήσης 5CH Λειτουργίες NetBIOS 67H Λειτουργίες EMS 70H Πραγµατικό ρολόι AT 75H Μαθηµατικού συνεπεξεργαστή

3 ∆ΙΑΚΟΠΕΣ ΓΡΑΜΜΕΝΕΣ ΑΠΟ ΤΟΝ ΧΡΗΣΤΗ. 3.1 Γενικά

Page 87: ΚΕΦΑΛΑΙΟ 1dima/wp-content/uploads/... · 1 ΚΕΦΑΛΑΙΟ 1 Ο ... διαιρέσεις. BX ∆είκτης για έµµεσο τρόπο προσδιορισµού διευθύνσεων

87

Υπάρχουν πολλοί λόγοι για να γράψετε µια νέα διακοπή ή να συµπληρώσετε µια ήδη υπάρχουσα. Όπως είδαµε στα προηγούµενα παραδείγµατα το λειτουργικό αλλά και το BIOS µας παρέχουν έτοιµες κάποιες συνηθισµένες διαδικασίες που µπορούµε να καλέσουµε από τα προγράµµατα µας. Μπορούµε να µεγαλώσουµε αυτήν την έτοιµη βιβλιοθήκη γράφοντας και άλλες χρήσιµες διαδικασίες οι οποίες συνδέονται µε κάποιο αχρησιµοποίητο τύπο διακοπής. Οι διαδικασίες αυτές καλούντα από όλα τα προγράµµατα µας µε την εντολή INT n όπου n ο τύπος της διακοπής µε τον οποίο συνδέθηκε η διαδικασία αυτή. Μπορείτε επίσης να χρησιµοποιήσετε και ορισµένες διακοπές υλικού, που είναι συνδεµένες µε εξωτερικές συσκευές. Τέτοιου είδους υποπρογράµµατα γράφονται για έλεγχο της παράλληλης ή της σειριακής θύρας. Επίσης αυτής της φύσης είναι και τα καλούµενα TSR µόνιµα στην µνήµη (Terminate Stay Resident) προγράµµατα τα οποία ‘αναδύονται’ και λειτουργούν µετά το πάτηµα κάποιου ειδικού πλήκτρου λειτουργίας διακόπτοντας το κυρίως πρόγραµµα. Πρόκειται για βοηθητικά προγράµµατα όπως αριθµοµηχανή (calculator), σηµειωµατάρια κ.λ.π. Τα προγράµµατα αυτά συνδέονται συνήθως µε τον χείριστη της διακοπής του πληκτρολόγιου (τύπος 9) και του χρονιστή (τύπος 8). Ο χρονιστής διακόπτει 18. 2 φορές το δευτερόλεπτο και κάθε φορά αυξάνει κατά ένα µετρητή που βρίσκεται στην περιοχή δεδοµένων του BIOS__ στην απόλυτη δ/νση 46C. Ένα πρόγραµµα TSR αποτελείται από δύο ανεξάρτητα τµήµατα :

- Το τµήµα εγκατάστασης του νέου ανύσµατος ή των νέων ανυσµάτων.

- Το ή υποπρογράµµατα των νέων ανυσµάτων διακοπών. 3.2 Το τµήµα εγκατάστασης Στο τµήµα εγκατάστασης πρέπει να προβλέπονται τα εξής : 1ον. Εφόσον ο νέος χειριστής της διακοπής πρόκειται να καλεί και το παλαιό υποπρόγραµµα εξυπηρέτησης, τότε πρέπει να αποθηκεύονται τα παλαιά ανύσµατα σε µεταβλητές (θέσεις) µνήµης µεγέθους 1 dword (4 bytes). Μέσα από τον νέο χειριστή διακοπής µπορεί να καλούνται τα παλαιά ανύσµατα, έµµεσα. Call dword < µεταβλητή που περιέχει την δ/νση του παλαιού ανύσµατος > Η λειτουργία 35H του DOS επιστρέφει την δ/νση του ανύσµατος της διακοπής, της οποίας ο τύπος (αριθµός) βρίσκεται στον AL , στους καταχωρητές ES:BX. Η δ/νση αυτή φυλάσσεται µετά την κλήση της λειτουργίας αυτής στην περιοχή δεδοµένων. AL <----- τύπος διακοπής AH <------ 35H αριθµός λειτουργίας του DOS INT 21H oldvect <----- ΒΧ (το offset της παλαιάς διακοπής στην µνήµη) oldvect + 2 <------ ES (το segment της παλαιάς διακοπής στην µνήµη) Η διαδικασία αποθήκευσης είναι απαραίτητη σε διακοπές που προσθέτουν χαρακτηριστικά σε παλαιές διακοπές όπως ISR µονίµων προγραµµάτων που

Page 88: ΚΕΦΑΛΑΙΟ 1dima/wp-content/uploads/... · 1 ΚΕΦΑΛΑΙΟ 1 Ο ... διαιρέσεις. BX ∆είκτης για έµµεσο τρόπο προσδιορισµού διευθύνσεων

88

αναδύονται µε το πάτηµα ενός πλήκτρου. Τα προγράµµατα αυτά καλούν την παλιά ρουτίνα εξυπηρέτησης του πληκτρολόγιου και ελέγχουν το πλήκτρο που πατήθηκε. 2ον. Προαιρετικά το πρόγραµµα πρέπει να ελέγχει αν έχει ήδη εγκατασταθεί το νέο υποπρόγραµµα εξυπηρέτησης, για να µην γίνει διπλή εγκατάσταση. ∆εν υπάρχει τυποποιηµένος τρόπος για τον έλεγχο αυτό. Ένας τρόπος είναι το πρόγραµµα εγκατάστασης µετά την εγκατάσταση , να αλλάζει την τιµή σε µια αχρησιµοποίητη περιοχή µνήµης (π.χ σε ένα αχρησιµοποίητο άνυσµα διακοπής µέσα στον πίνακα ανυσµάτων). Πριν κάνει την εγκατάσταση ελέγχει την τιµή αυτή, και ανάλογα προχωράει στην εγκατάσταση ή όχι. 3ον. Η καθαυτού εγκατάσταση µε την λειτουργία 25H του DOS. Στον AL ο τύπος της διακοπής, στον DS:DX η δ/νση του νέου χειριστή διακοπής.

AL <---- < Τύπος διακοπής > DS <---- Segment της νέας ρουτίνας εξυπηρέτησης. DX <---- Offset της νέας ρουτίνας εξυπηρέτηση AH <---- 25H INT 21H

4ον. Τέλος εγκατάστασης και έξοδος στο DOS παραµένοντας µόνιµα στην µνήµη, µε την λειτουργία 31H του DOS.

DX <--- µέγεθος του προγράµµατος που παραµένει στην µνήµη, σε παραγράφους (1 παράγραφος = 16 bytes) AH <---- 31H INT 21H

3.3 Το νέο υποπρόγραµµα εξυπηρέτησης. Στο νέο υποπρόγραµµα πρέπει να προβλέπονται τα εξής 1ον Αποθήκευση στον σωρό όλων των καταχωρητών µε διαδοχικά PUSH 2ον Προαιρετικά και εφόσον αποτελείται από πολλές διαδικασίες δηµιουργεί σωρό, αφού προηγούµενος σώσει τις παλαιές τιµές των SS,SP σε θέσεις µνήµης. 3ον Εφόσον προβλέπεται από την λειτουργία της, κλήση της παλαιάς ρουτίνας εξυπηρέτησης. 4ον Ο κυρίως κώδικας του νέου υποπρογράµµατος της διακοπής 5ον Αποκατάσταση των SS,SP αν άλλαξαν 6ον Αποκατάσταση των υπόλοιπων καταχωρητών µε διαδοχικά POP σε αντίστροφη σειρά από τα PUSH. 7ον Επιστροφή µε την εντολή IRET.

Page 89: ΚΕΦΑΛΑΙΟ 1dima/wp-content/uploads/... · 1 ΚΕΦΑΛΑΙΟ 1 Ο ... διαιρέσεις. BX ∆είκτης για έµµεσο τρόπο προσδιορισµού διευθύνσεων

89

Πρέπει εδώ να επισηµάνουµε ότι ένα ISR πρόγραµµα δεν µπορεί χωρίς έλεγχο, να καλεί λειτουργίες του DOS, διότι το DOS είναι µη επαναεισερχόµενο (Re-entrant). Αυτό σηµαίνει ότι εφόσον η διακοπή συµβεί κατά την διάρκεια µιας λειτουργίας του DOS, δεν µπορεί το υποπρόγραµµα διακοπής να χρησιµοποιήσει λειτουργία του DOS. Το πρόβληµα αυτό µπορεί να ξεπεραστεί µε διάφορες τεχνικές που ξεφεύγουν του αντικειµένου των σηµειώσεων αυτών. Ακολουθεί παράδειγµα προγράµµατος που αλλάζει τον χειριστή της διακοπής τύπου 5. Η νέα ρουτίνα διακοπής καλεί την παλαιά και συγχρόνως αλλάζει τις ιδιότητες όλων των χαρακτήρων που εµφανίζονται στην οθόνη µέσω µνήµης οθόνης. Μνήµη οθόνης είναι µια περιοχή µνήµης όπου απεικονίζονται τα δεδοµένα για την εικόνα της οθόνης. Η οθόνη ενηµερώνεται περιοδικά µε σάρωση των δεδοµένων αυτών. Το µέγεθος και η θέση στη µνήµη των περιοχών αυτών εξαρτώνται από τον προσαρµογέα οθόνης. Σε κατάσταση κειµένου οι πληροφορίες της οθόνης αποθηκεύονται στην µνήµη σε 4000 bytes σαν συνεχές αλφαριθµητικό. Για ελεγκτή οθόνης VGA αρχική δ/νση της µνήµης οθόνης είναι 0B800:0000H, τα δε δεδοµένα της οθόνης αποθηκεύονται µε την λογική ένας χαρακτήρας στην οθόνη δύο χαρακτήρες στην µνήµη. Το πρώτο byte για το περιεχόµενο και το δεύτερο για την ιδιότητα του χαρακτήρα που εµφανίζεται. Όπως φαίνεται στην παρακάτω εικόνα πρώτο ζευγάρι αντιστοιχεί στον χαρακτήρα που βρίσκεται στην άνω αριστερή γωνία της οθόνης, το επόµενο ζευγάρι αντιστοιχεί στην δεύτερη στήλη της πρώτης γραµµής κ.ο.κ. µέχρι να φτάσουµε στον χαρακτήρα της 24 γραµµής και 79 στήλης. Μπορούµε να υπολογίσουµε την σχετική θέση της οθόνης στην µνήµη µε τον εξής απλό τύπο : Θέση = (Γραµµή * 80 + Στήλη) * 2 Εννοείται ότι η αρίθµηση των γραµµών και των στηλών αρχίζει από το 0 µε πρώτη (0) γραµµή την πάνω και πρώτη (0) στήλη την αριστερά.

MNHMH

Περιεχόµενο Ιδιότητα Περιεχόµενο Ιδιότητα Περιεχόµενο Ιδιότητα

ΟΘΟΝΗ

Σχηµατική απεικόνιση της µνήµης οθόνης Το πρόγραµµα αυτό τροποποιεί το άνυσµα της 5ης διακοπής (διακοπή υλικού ; του πλήκτρου Print screen) µε αποτέλεσµα πατώντας το πλήκτρο Print Screen ; καλείται το υποπρόγραµµα MAIN__INTER αντί του κανονικού υποπρογράµµατος

Page 90: ΚΕΦΑΛΑΙΟ 1dima/wp-content/uploads/... · 1 ΚΕΦΑΛΑΙΟ 1 Ο ... διαιρέσεις. BX ∆είκτης για έµµεσο τρόπο προσδιορισµού διευθύνσεων

90

; διακοπής. Το παλαιό υποπρόγραµµα βρίσκεται στο BIOS (ROM) σε τµήµα ; (segment) µε τιµή µεγαλύτερη από 0F000h ; Το πρόγραµµα αποτελείται από δυο υποπρογράµµατα: ; α) Το υποπρόγραµµα εγκατάστασης του ανύσµατος (MAIN PROCEDURE) ; β) Το νέο υποπρόγραµµα εξυπηρέτησης της διακοπής 5H ; ; Το νέο υποπρόγραµµα εξυπηρέτησης καλεί την παλιά ρουτίνα ; εξυπηρέτησης της διακοπής 5 ; και αλλάζει τις ιδιότητες (attributes) ; όλων των χαρακτήρων της µνήµης οθόνης (VIDEO MEMORY) η οποία βρίσκεται ; στην φυσική διεύθυνση 0B8000 H (στο δεκαεξαδικό σύστηµα) ; Παράδειγµα προγράµµατος υπ’ αριθµόν 18: TITLE INTPRINTSCR ; ψευδοεντολή τίτλου του προγράµµατος PAGE 65,80 ; Ψευδοεντολή που επηρεάζει τον τρόπο εκτύπωσης CODE__SEG SEGMENT PUBLIC assume cs:CODE__SEG, SS:SOROS,ds:data__seg MAIN PROC FAR ; ελέγχουµε πρώτα αν το άνυσµα της διακοπής 5 βρίσκεται στο BIOS XOR AX,AX ; µηδενισµός του AX MOV ES,AX ; µηδενισµός του ES MOV AX,WORD PTR ES:[22] ; µεταφέρουµε στον AX ; την τιµή του τµήµατος (SEGMENT) του υποπρογράµµατος εξυπηρέτησης της ; διακοπής 5 (5 * 4 + 2 = 22) CMP AX,0F000H ; εάν έχει εγκατασταθεί νέο ; υποπρόγραµµα εξυπηρέτησης το οποίο ; βέβαια είναι στην RAM ( σε φυσική ; δ/νση < 0F0000 h) JB EXV ; κανονική έξοδος στο DOS ; βρίσκουµε το παλαιό άνυσµα της διακοπής 5 µε την κλήση 35H του DOS ; και την αποθηκεύουµε στη δ/νση (µεταβλητή) OLD__VECTOR__5 MOV AX,DATA__SEG; Ο DS πρέπει να είναι βλέπει στο MOV DS,AX ; τµήµα των δεδοµένων MOV AL,5 MOV AH,35H INT 21H ; Το άνυσµα της διακοπής στους καταχωρητές ES:BX ; Αποθηκεύεται στην θέση µνήµης OLD__VECTOR__5 MOV WORD PTR OLD__VECTOR__5,BX ; MOV AX,ES MOV WORD PTR OLD__VECTOR__5[2],AX; ; Οι επόµενες 6 εντολές αλλάζουν το άνυσµα της διακοπής 5 µε την ; βοήθεια της 25H κλήση του DOS MOV AX,CODE__SEG ; Στον DS η τιµή του MOV DS,AX ; τµήµατος του νέου ανύσµατος

Page 91: ΚΕΦΑΛΑΙΟ 1dima/wp-content/uploads/... · 1 ΚΕΦΑΛΑΙΟ 1 Ο ... διαιρέσεις. BX ∆είκτης για έµµεσο τρόπο προσδιορισµού διευθύνσεων

91

MOV DX,OFFSET CODE__SEG:MAIN__INTER;στον DX ; η µετατόπιση του νέου ανύσµατος MOV AL,5 ; στον AL το No της διακοπής MOV AH,25H ; κλήση 25H INT 21H ; διακοπή DOS ; Με τις επόµενες 3 εντολές έχουµε έξοδο στο DOS διατηρώντας όµως ; στην µνήµη το πρόγραµµα µετά τον τερµατισµό του για να εξυπηρετεί ; την διακοπή 5h. Αυτό επιτυγχάνεται µε την 31H κλήση του DOS MOV DX,100H ; µέγεθος του προγράµµατος σε ; παραγράφους (1 παράγραφος 16 BYTES) MOV AH,31H ; έξοδο στο DOS παραµένοντας INT 21H ; µετά την έξοδο στην µνήµη EXV: PUSH DS ; κανονική έξοδος στο DOS XOR AX,AX ; µέσω της INT 20H PUSH AX ; που βρίσκεται στο PSP (τµήµα RETF ; προθέµατος του προγράµµατος) MAIN ENDP ; Νέο υποπρόγραµµα εξυπηρέτησης της διακοπής 5H MAIN__INTER PROC FAR push AX; Σώζονται τα περιεχόµενα PUSH BX; Των καταχωρητών PUSH CX PUSH DX PUSH DS PUSH ES CLI; απαγορεύονται οι διακοπές µε µάσκα MOV AX,DATA__SEG MOV DS,AX; αποκατάσταση του DS MOV AX,SS ; Σώζουµε τον παλαιό σωρό σε δύο µεταβλητές MOV OLD__SS,AX MOV OLD__SP,SP MOV AX,new__stack ; Φτιάχνουµε ένα νέο ; Σωρό για το συγκεκριµένο υποπρόγραµµα εξυπηρέτησης MOV SS,AX; Αποκατάσταση του DS mov SP,100h PUSHF; Αποθήκευση των δεικτών στον Σωρό CALL DWORD PTR OLF__VECTOR__5; κλήση του παλαιού ; υποπρογράµµατος εξυπηρέτησης της διακοπής 5 STI ; Επιτρέπονται οι εξωτερικές διακοπές µε µάσκα CALL REVERSE_SCR; καλούµε το υποπρόγραµµα ; που κάνει όλη την οθόνη που εκτυπώθηκε να αναβοσβήνει

Page 92: ΚΕΦΑΛΑΙΟ 1dima/wp-content/uploads/... · 1 ΚΕΦΑΛΑΙΟ 1 Ο ... διαιρέσεις. BX ∆είκτης για έµµεσο τρόπο προσδιορισµού διευθύνσεων

92

; Αποκατάσταση του παλαιού Σωρού MOV SP,OLD__SP MOV AX,OLD__SS MOV SS,AX POP ES; επαναφέρουµε τις αρχικές τιµές POP DS; των καταχωρητών µε την αντιστροφή POP DX; σειρά POP CX POP BX POP AX IRET ; Εντολή επιστροφής από ; υποπρόγραµµα εξυπηρέτησης διακοπής ; επιστροφή στην αρχική διαδικασία ; και επαναφορά από τον ; σωρό του καταχωρητή δεικτών (σηµαιών) MAIN__INTER ENDP REVERSE__SCR PROC NEAR STI; επιτρέπονται οι διακοπές µε µάσκα ; ένα από τα δύο παρακάτω ; διεύθυνση τµήµατος ; της µονόχρωµης κάρτας οθόνης ; MOV BX,0B000H ; διεύθυνση τµήµατος της ; VGA κάρτας οθόνης ; MOV BX,OB8OOH MOV ES,BX MOV BX,0; BX ο δείκτης στην µνήµη οθόνης MOV CX,2000 ; Μετρητής των χαρακτήρων ;οθόνης 80 Χ 25 = 2000 AGAIN: INC BX; αύξησε κατά 1 τον δείκτη ; για να παρακάµψουµε το περιεχόµενο του χαρακτήρα MOV AL,BYTE PTR ES:[BX] ; φέρε την ιδιότητα του χαρακτήρα CMP AL,127 ; έλεγξε αν ο χαρακτήρας JA A ; αναβοσβήνει και πήγαινε στο A OR AL,10000000B ; αλλιώς κάνε να αναβοσβήνει JMP B A: AND AL,01111111B ; κάνε να µη αναβοσβήνει B: MOV BYTE PTR ES:[BX],AL ; µετέφερε την ; νέα ιδιότητα στην µνήµη οθόνης INC BX; ο επόµενος χαρακτήρας (αύξηση κατά ένα του δείκτη) LOOP AGAIN ; επανέλαβε την διαδικασία αυτή ; από το AGAIN µέχρι εδώ 2000 φορές RET ; Επιστροφή στο κυρίως υποπρόγραµµα εξυπηρέτησης

Page 93: ΚΕΦΑΛΑΙΟ 1dima/wp-content/uploads/... · 1 ΚΕΦΑΛΑΙΟ 1 Ο ... διαιρέσεις. BX ∆είκτης για έµµεσο τρόπο προσδιορισµού διευθύνσεων

93

REVERSE__SCR ENDP CODE__SEG ENDS DATA__SEG SEGMENT OLD__VECTOR__5 DD 0 OLD__SS DW 0 OLD__SP DW 0 ; NEW__STACK DB 100H DUP (0) DATA__SEG ENDS NEW__STACK segment Db 100 dup (0) New__stack ends SOROS SEGMENT PARA STACK DB 256 DUP (0) SOROS ENDS END MAIN ΚΕΦΑΛΑΙΟ 9 ΠΡΟΧΩΡΗΜΕΝΕΣ ∆ΥΝΑΤΟΤΗΤΕΣ ΤΟΥ ASSEMBLER 1 MACRO Η λειτουργία των macro είναι πολύ απλή: ∆ίνουµε όνοµα σε ένα τµήµα πηγαίου κώδικα, έξω από το κυρίως πρόγραµµα. Όπου µέσα στον κώδικα ο Assembler συναντά το όνοµα αυτό, το αντικαθιστά µε τον αντίστοιχο πηγαίο κώδικα και συνεχίζει την µετάφραση . Με τον τρόπο αυτό επιτυγχάνουµε κώδικα που επαναλαµβάνεται πολλές φορές µέσα στο πρόγραµµα να γράφεται µόνο µια φορά πριν από το κυρίως πρόγραµµα και να καλείται µόνο µε το όνοµα του macro. Η µετάφραση του πηγαίου κώδικα του macro γίνεται σε κάθε αντικατάσταση και όχι µια φορά µόνο . Τα macro δηλώνονται το όνοµα τους (που θεωρείται ετικέτα), και την µε την οδηγία MACRO. Με την οδηγία ENDM δηλώνεται το τέλος του πηγαίου κώδικα του macro. Στον σηµείο που ορίζεται η macro δεν παράγεται κώδικας. Μέσα στον κώδικα τον macro µπορούµε να χρησιµοποιούµε και άλλα macro που δηλώθηκαν προηγουµένως. Παραδείγµατα : Τα παρακάτω macro pusha (pushall) , popa (popall) και clrscr διασώζουν στον σωρό όλους τους καταχωρητές, ανακαλούν από τον σωρό όλους τους καταχωρητές και καθαρίζουν την οθόνη: PUSHALL MACRO PUSH AX PUSH BX PUSH CX PUSH DX

Page 94: ΚΕΦΑΛΑΙΟ 1dima/wp-content/uploads/... · 1 ΚΕΦΑΛΑΙΟ 1 Ο ... διαιρέσεις. BX ∆είκτης για έµµεσο τρόπο προσδιορισµού διευθύνσεων

94

PUSH BP PUSH SI PUSH DI ENDM POPALL MACRO POP DI POP SI POP BP POP DX POP CX POP BX POP AX ENDM CLRSCR MACRO PUSHALL mov cx,0; πάνω γωνία παράθυρου mov dx,2479h; κάτω γωνία παραθύρου mov bh,7; ιδιότητα normal mov ah,06; αριθµός κλήσης BIOS mov al,00; αριθµός σελίδας int 10h; κλήση του BIOS POPALL ENDM Τα macro µπορούν να δεχτούν και παραµέτρους. Οι παράµετροι των macro δηλώνονται µετά την οδηγία MACRO και λειτουργούν σαν τελεστές της. Οι τελεστές της οδηγίας MACRO ονοµάζονται τυπικοί παράµετροι. Οι παράµετροι µε τις οποίες καλείται το macro µέσα στον κώδικα ονοµάζονται πραγµατικοί παράµετροι. Σε κάθε κλήση του macro, πριν την µετάφραση, οι τυπικοί παράµετροι αντικαθίστανται µε τις πραγµατικές παραµέτρους. Ακολουθούν παραδείγµατα macro µε παραµέτρους. MACRO που µεταφέρει τον κέρσορα σε συγκεκριµένη θέση στην οθόνη: GOTOXY MACRO X,Y mov ah,0fh int 10h; στον bx η ενεργός σελίδα mov dl,Y; στήλη mov dh,X; γραµµή mov ah,02; αριθµός κλήσης BIOS int 10h ; κλήση BIOS ENDM MACRO που εµφανίζει µήνυµα στην οθόνη µε την λογική της κλήσης 9 του DOS PRINT_DOS__STRING MACRO STRING lea dx,string; Η ενεργός δ/νση του αλφαριθµητικού στον dx mov ah,09; κλήση του DOS για εκτύπωση µηνύµατος int 21h ; διακοπή DOS

Page 95: ΚΕΦΑΛΑΙΟ 1dima/wp-content/uploads/... · 1 ΚΕΦΑΛΑΙΟ 1 Ο ... διαιρέσεις. BX ∆είκτης για έµµεσο τρόπο προσδιορισµού διευθύνσεων

95

ENDM Μέσα στον κώδικα των macro µπορούµε να χρησιµοποιήσουµε και ετικέτες, αλλά πρέπει πρώτα να τις δηλώσουµε µε την οδηγία : LOCAL INPUT_DIGIT MACRO; macro που εισάγουµε ένα δεκαδικό ψηφίο LOCAL UP,TELOS ,MHDEN ; και τον επιστρέφει σαν χαρακτήρα UP : ; αφού τον τυπώνει στην οθόνη MOV AH,08; εκτός αν πατήσουµε ENTER οπότε επιστρέφει 0 INT 21H CMP AL,13 JE MHDEN CMP AL,’0’ JB UP; αν λάθος χαρακτήρας τότε επαναεισαγωγή CMP AL,’9’ JA UP; αν λάθος χαρακτήρας τότε επαναεισαγωγή MOV DL,AL ; Εµφάνιση του χαρακτήρα MOV AH,02 ; στην οθόνη INT 21H JMP TELOS MHDEN: XOR AL,AL; µηδενισµός του al TELOS: ENDM Από το παράδειγµα της επόµενης παραγράφου, φαίνεται ότι µέσα στον κώδικα η κλήση των macro µοιάζει µε την κλήση των υποπρογραµµάτων. Η διάφορα όµως είναι τεραστία , γιατί η εντολή call που καλεί υποπρόγραµµα παράγει κώδικα σε γλώσσα µηχανής και ο κώδικας του υποπρογράµµατος µεταφράζεται µόνο µια φορά, ενώ τα macro µεταφράζονται σε κάθε εµφάνιση τους µέσα στον κώδικα , η δε οδηγία macro δεν παράγει κώδικα. Επειδή η εντολή call είναι γενικά αργή στην εκτέλεση της, η χρήση των macro αυξάνει τον κώδικα στο πρόγραµµα αλλά συγχρόνως αυξάνει και τον την ταχύτητα εκτέλεσης του. 2 ΑΡΧΕΙΑ INCLUDE Πολλές φορές είναι χρήσιµο να ενσωµατώνουµε τον ίδιο πηγαίο κώδικα σε διάφορα πηγαία αρχεία assembly κώδικα. Είναι συνηθισµένο τα προγράµµατα να χρησιµοποιούν τα ίδια macro και τις ίδιες equ σταθερές. Με την οδηγία INCLUDE µπορούµε να δηµιουργήσουµε βιβλιοθήκες πηγαίου κώδικα συνήθως από macro και equ οι οποίες θα ενσωµατώνονται κατά την µετάφραση στον πηγαίο κώδικα των assembly προγραµµάτων µας. Μετά την οδηγία INCLUDE ακολουθεί ένας τελεστής ο οποίος πρέπει να είναι ένα αρχείο πηγαίου κώδικα assembly στον δίσκο. Κατά την µετάφραση µόλις ο assembler συναντήσει την οδηγία include φορτώνει το αρχείο της οδηγίας από τον δίσκο, το µεταφράζει, και µετά συνεχίζει την µετάφραση στην γραµµή µετά την οδηγία. Παράδειγµα αν συµπεριλάβουµε όλα τα macro του προηγούµενου κεφαλαίου σε ένα αρχείο µε το όνοµα LIB.MAC µπορούµε να γράψουµε ένα πρόγραµµα µε το οποίο να εισάγεται ακέραιος αριθµός στην οθόνη ως εξής:

Page 96: ΚΕΦΑΛΑΙΟ 1dima/wp-content/uploads/... · 1 ΚΕΦΑΛΑΙΟ 1 Ο ... διαιρέσεις. BX ∆είκτης για έµµεσο τρόπο προσδιορισµού διευθύνσεων

96

Παράδειγµα προγράµµατος υπ’ αριθµόν 19: INCLUDE LIB.MAC; Καλούµε προς µετάφραση το αρχείο µε τα macro ;Πρόγραµµα εισαγωγής Ακέραιου αριθµού SOROS SEGMENT PARA STACK DB 256 DUP (0) SOROS ENDS code_seg segment assume cs:code_seg,DS:DATA_SEG MAIN proc far push ds; προετοιµασία για έξοδο στο DOS, σώζουµε στο σωρό το xor ax,ax; τµήµα (SEGMENT) του PSP push ax; και την µηδενική µετατόπιση του PSP mov ax,data_seg mov ds,ax CLRSCR; κλήση του macro για καθάρισµα οθόνης GOTOXY 5,10; κλήση macro για να πάει ο κέρσορας στην θέση 5,10 PRINT_DOS_STRING MHNHMA; κλήση macro για εµφάνιση µηνύµατος again: INPUT_DIGIT cmp al,0 jne again ret; επιστροφή στο DOS µέσω INT 20h του PSP MAIN endp code_seg ENDS DATA_SEG SEGMENT PUBLIC MHNHMA DB "EISAGOGI AKERAIOY ARITMOY $" DATA_SEG ENDS END MAIN Να συµπληρώσετε το πρόγραµµα ώστε ο αριθµός που εισάγεται να αποθηκεύεται στην µνήµη σε κάποιο αλφαριθµητικό, µε το όνοµα NUM Επιτρέπεται τα αρχεία INCLUDE να είναι φωλιασµένα, δηλαδή σε ένα include αρχείο να υπάρχει η οδηγία include η οποία καλεί προς µετάφραση τρίτο αρχείο από τον δίσκο, και ούτω καθεξής. Τα αρχεία include συνήθως χρησιµεύουν για macro, για equ, για δηλώσεις γενικών σε όλα τα πηγαία αρχεία ετικετών, για δηλώσεις των ονοµάτων των segment κ.α.. Παρόλο που δεν απαγορεύεται σπάνια περιλαµβάνεται καθαυτού κώδικας assembly σε αρχείο που καλείται µέσω include. 3. ΠΟΛΥΤΜΗΜΑΤΙΚΗ ΚΩ∆ΙΚΟΠΟΙΗΣΗ 3.1 Εισαγωγή

Page 97: ΚΕΦΑΛΑΙΟ 1dima/wp-content/uploads/... · 1 ΚΕΦΑΛΑΙΟ 1 Ο ... διαιρέσεις. BX ∆είκτης για έµµεσο τρόπο προσδιορισµού διευθύνσεων

97

Σε όλα τα προγράµµατα και τις ασκήσεις των σηµειώσεων αυτών ο κώδικας γράφεται σε ένα πηγαίο πρόγραµµα το οποίο ακολούθως µεταφράζεται από τον assembler και συνδέεται µε τον linker για την παραγωγή ενός εκτελέσιµου προγράµµατος. Κατά την ανάπτυξη µιας εφαρµογής όµως ο κώδικας συνεχεία αυξάνεται και αργά ή γρήγορα θα παραστεί η ανάγκη να γράφει το πρόγραµµα σε περισσότερα από ένα πηγαία αρχεία. Το κάθε ένα από τα πηγαία αρχεία µεταφράζεται ξεχωριστά από τα υπόλοιπα και παράγει το δικό του αντικείµενο αρχείο. Κατόπιν όλα τα αντικείµενα αρχεία συνδέονται σε ένα εκτελέσιµο αρχείο µε τον συνδέτη (Linker). Το κύριο πλεονέκτηµα της πολυτµηµατικής κωδικοποίησης είναι ότι µετά από κάθε τροποποίηση του πηγαίου κώδικα δεν µεταφράζεται όλο το πρόγραµµα , αλλά µόνο τα τµήµατα που τροποποιήθηκαν. Επίσης είναι πιο εύκολο να επεξεργαζόµαστε κώδικα που βρίσκεται σε πολλά µικρά πηγαία αρχεία παρά σε ένα µεγάλο αρχείο. Κάθε πηγαίο αρχείο έχει ορισµένες διαδικασίες και ορισµένα δεδοµένα. Ο συνδέτης συνδυάζει και συνδέει τα αντικείµενα αρχεία των δυο τµηµάτων (modulus), σύµφωνα µε τις οδηγίες που υπάρχουν στα πηγαία αρχεία. Οι σηµαντικότερες οδηγίες που χρησιµοποιούµε για να γράψουµε κώδικα σε πολλά πηγαία αρχεία είναι οι EXTRN και PUBLIC. Με το παρακάτω παράδειγµα φαίνεται ο τρόπος µε τον οποίο χρησιµοποιούνται οι οδηγίες αυτές. Το πρόγραµµα τυπώνει δύο ακέραιους αριθµούς στην οθόνη τον num1 και τον num2. Το πρόγραµµα είναι γραµµένο σε δύο πηγαία αρχείο το MODULE1.ASM και το MODULE2.ASM. Παράδειγµα προγράµµατος υπ’ αριθµόν 20: Ακολουθεί ο κώδικας του module1.asm Code_seg segment public assume cs:code_seg,ds:data_seg extrn emfan_decimal:near,new_line :near,num2 :word ; εξωτερικές δ/νσεις ; δεδοµένων και κώδικα public nea_grammh ; δεδοµένα που θα χρειαστούν άλλα αρχεία ; υποπρογράµµατα σε άλλα πηγαία αρχεία kyrioproc proc far xor ax,ax; µηδενισµός του ax push ds ; η δ/νση του PSP push ax ; στον σωρό, προετοιµασία για επιστροφή στο DOS. mov dx,data_seg mov ds,dx ; αποκατάσταση του DS mov dx,num1 ; ο dx χρησιµοποιείται για πέρασµα παραµέτρου του call emfan_decimal; υποπρογράµµατος emfan__decimal call new_line; πηγαίνει στην παρακάτω γραµµή mov dx,num2 ; και εµφανίζει τον δεύτερο αριθµό call emfan_decimal; καλεί την emfan_decimal ret ; επιστροφή στο DOS kyrioproc endp

Page 98: ΚΕΦΑΛΑΙΟ 1dima/wp-content/uploads/... · 1 ΚΕΦΑΛΑΙΟ 1 Ο ... διαιρέσεις. BX ∆είκτης για έµµεσο τρόπο προσδιορισµού διευθύνσεων

98

code_seg ends ; Τµήµα δεδοµένων data_seg segment public num1 dw 12345 nea_grammh db 10,13,'$' data_seg ends soros segment para stack db 256 dup (0) soros ends end kyrioproc Ακολουθεί ο κώδικας του module2.asm code_seg segment public assume cs:code_seg,ds:data_seg public emfan_decimal,new_line,num2 ; δ/νσεις δεδοµένων και κώδικα που θα ; κληθούν ή θα χρειαστούν σε άλλα object ; modules αρχεία extrn nea_grammh:byte; δεδοµένα που βρίσκονται σε άλλα πηγαία αρχεία emfan_decimal proc near mov ax,dx ; το περιεχόµενο του αριθµού προς εµφάνιση στον ax mov si,10 ; ο διαιρέτης στον si xor cx,cx ; µηδενισµός του µετρητή των ψηφίων του αριθµού non_zero: xor dx,dx ; µηδενισµός του άνω τµήµατος του διαιρετέου div si ; υπενθυµίζουµε ότι η div διαιρεί τον δίδυµο αριθµό dx:ax push dx ; το υπόλοιπο στον dx το ψηφίο και αποθήκευση στο σωρό inc cx ; αύξηση κατά 1 του µετρητή των ψηφίων or ax,ax ; είναι το πηλίκο της διαίρεσης 0 jne non_zero ; εάν όχι ξανά διαίρεση µε το 10 για εξαγωγή άλλου next_digit: ; δεκαδικού ψηφίου και αποθήκευση στον σωρό pop dx ; εξαγωγή από το σωρό των δεκαδικών ψηφίων add dl,'0' ; κατά αντίστροφη φορά από την εισαγωγή τους mov ah,2 ; µετατροπή τους σε ASCII και εµφάνιση τους int 21h loop next_digit ; επανάληψη για όλα τα δεκαδικά ψηφία ret emfan_decimal endp new_line proc near mov dx, offset ds:nea_grammh; στον dx η ενεργός δ/νση του αλφαριθµητικού mov ah,09; κατά DOS προς εµφάνιση int 21h; ret

Page 99: ΚΕΦΑΛΑΙΟ 1dima/wp-content/uploads/... · 1 ΚΕΦΑΛΑΙΟ 1 Ο ... διαιρέσεις. BX ∆είκτης για έµµεσο τρόπο προσδιορισµού διευθύνσεων

99

new_line endp code_seg ends ; Τµήµα δεδοµένων data_seg segment public num2 dw 6789 data_seg ends end ; ; Τµήµα δεδοµένων data__seg segment public num2 dw 6789 data__seg ends end ; Τα δύο πηγαία αρχεία µεταφράζονται ανεξάρτητα π.χ C> tasm module1 C> tasm module2 και συνδέονται σε ένα εκτελέσιµο πρόγραµµα µε την εντολή A> tlink module1 module2 Για περισσότερες πληροφορίες ως προς την σύνδεση να αναφερθείτε ο εγχειρίδιο του προγράµµατος συνδέτη. 3.2 ∆ήλωση PUBLIC των τµηµάτων (Segments). Κάθε ένα από τα πηγαία αρχεία έχει και κώδικα που βρίσκεται στο τµήµα του κώδικα µε το όνοµα code__seg και δεδοµένα που βρίσκεται στο τµήµα των δεδοµένων µε όνοµα data__seg. Στη δήλωση SEGMENT µετά τις ονοµασίες των τµηµάτων code__seg και data__seg εµφανίζεται η δήλωση PUBLIC. Με την δήλωση αυτή ενηµερώνουµε τον συνδέτη ότι το τµήµα αυτό π.χ το code__seg, θα συνδυαστεί µε όλα τα άλλα τµήµατα των άλλων αρχείων, που έχουν το ίδιο όνοµα και την δήλωση PUBLIC. Σύµφωνα µε τα παραπάνω τµήµατα code__seg των αρχείων module1 και module2 θα ενοποιηθούν στο τελικό εκτελέσιµο αρχείο, σε ένα τµήµα κώδικα. Το ίδιος ισχύει και για τα δυο data__seg των δεδοµένων. Πρέπει να τονίσουµε εδώ ότι το τµήµα σωρού (STACK) δηλώνεται µόνο σε ένα πηγαίο αρχείο, δεν συνδέεται και δεν συνδυάζεται µε τµήµατα άλλων πηγαίων αρχείων και εποµένως απαγορεύεται να δηλώνεται PUBLIC. 3.3 Οδηγίες PUBLIC και EXTRN

Page 100: ΚΕΦΑΛΑΙΟ 1dima/wp-content/uploads/... · 1 ΚΕΦΑΛΑΙΟ 1 Ο ... διαιρέσεις. BX ∆είκτης για έµµεσο τρόπο προσδιορισµού διευθύνσεων

100

Οι οδηγίες αυτές ενηµερώνουν τον µεταφραστή ότι υπάρχουν συνδέσεις σε ετικέτες και δ/νσεις µεταξύ των διαφόρων πηγαίων αρχείων. Την σύνδεση των ετικετών αυτών θα την κάνει ο linker. Με την οδηγία PUBLIC ενός πηγαίου αρχείο δηλώνουµε ότι οι ετικέτες, δ/νσεις που ακολουθούν µετά την PUBLIC είναι διαθέσιµες και µπορούν να χρησιµοποιηθούν και σε άλλα πηγαία αρχεία. Έτσι µετά την δήλωση Public emfan__decimal,new__line,num2 του πηγαίου αρχείου module2.asm, οι διαδικασίες emfan__decimal,new__line και η µεταβλητή num2 µπορούν να κληθούν και να χρησιµοποιηθούν στον κώδικα του module1. Εννοείται βέβαια ότι οι ετικέτες της PUBLIC είναι δηλωµένες παρακάτω στον κώδικα το αρχείου της PUBLIC. Με την δήλωση EXTRN µπορούµε να χρησιµοποιήσουµε ετικέτες από άλλα αρχεία, οι οποίες έχουν δηλωθεί στα αρχεία τους PUBLIC. Μετά την EXTRN ακολουθεί το όνοµα της εξωτερικής ετικέτας (label) και µε : ο τύπος της. Συνηθισµένοι τύποι, προκείµενου περί διαδικασιών είναι :

FAR για κλήση προγραµµάτων εξωτµηµατική NEAR για κλήση προγραµµάτων ενδοτµηµατική

και προκειµένου περί δεδοµένων BYTE για δεδοµένο ενός byte WORD για δεδοµένο δύο byte DWORD για δεδοµένο τεσσάρων byte Έτσι µε την οδηγία Extrn emfan_decimal;near,new_line:near,num2:word Του module1 δηλώνουµε τα εξής:

1. Οι ετικέτες emfan_decimal,new_line είναι υποπρογράµµατα που βρίσκονται σε άλλο πηγαίο αρχείο (εν προκειµένω στο αρχείο module2.asm). Τα υποπρογράµµατα αυτά βρίσκονται στο ίδιο τµήµα του κώδικα µε το υποπρόγραµµα που πρόκειται να τα καλέσει

2. Η ετικέτα num2 είναι µεταβλητή µεγέθους 2 byte, και εποµένως µπορεί να

χρησιµοποιηθεί σαν ακέραια µεταβλητή στο διάστηµα 0 έως 64k. Επαναλαµβάνουµε ότι οι ετικέτες emfan_decimal,new_line,num2 πρέπει να δηλωθούν public στο αρχείο τους module2.asm.

Page 101: ΚΕΦΑΛΑΙΟ 1dima/wp-content/uploads/... · 1 ΚΕΦΑΛΑΙΟ 1 Ο ... διαιρέσεις. BX ∆είκτης για έµµεσο τρόπο προσδιορισµού διευθύνσεων

101

ΚΕΦΑΛΑΙΟ 10 ΛΕΙΤΟΥΡΓΙΕΣ ROM-BIOS & DOS 1 ΛΕΙΤΟΥΡΓΙΕΣ ROM-BIOS 1.1 Εισαγωγή. Το ROM-BIOS προέρχεται από τα αρχικά των λέξεων Read Only Memory Basic Input Output System (Βασικό Σύστηµα Εισόδου Εξόδου Μνήµης Μόνο για ∆ιάβασµα). Είναι µια οµάδα από υποπρογράµµατα τα οποία είναι ενσωµατωµένα στον υπολογιστή µας και εκτελούν τις βασικότερες και χαµηλότερου επιπέδου λειτουργίες του. Είναι υποπρογράµµατα ελέγχου και επικοινωνίας µε τον εξοπλισµό του υπολογιστή µας (οθόνη, πληκτρολόγιο κ.λ.π) που εξυπηρετούν την διασύνδεση των άλλων προγραµµάτων µε τις εξωτερικές συσκευές του υπολογιστή µας. Το BIOS είναι λογισµικό του συστήµατος που λειτουργεί σαν γέφυρα ανάµεσα στο υλικό και στα άλλα προγράµµατα. Όπως αναφέραµε στο Κεφάλαιο 7 η επικοινωνία µε τις εξωτερικές συσκευές γίνεται µέσω των θυρών. Οι λειτουργίες του BIOS είναι κυρίως πολύπλοκα και δαιδαλώδη προγράµµατα ελέγχου του υλικού. Ο έλεγχος και επικοινωνία αυτή γίνεται µε την αποστολή και λήψη διαταγών ή ρυθµίσεων παραµέτρων, δια µέσου των θυρών (πολύπλοκα τµήµατα προγραµµάτων µε εντολές IN και OUT). Βέβαια κάθε ολοκληρωµένο κύκλωµα έχει τις δικές του θύρες στις οποίες και αποκρίνεται. Τα υπόλοιπα προγράµµατα εποµένως χρησιµοποιώντας τις λειτουργίες του BIOS απαλλάσσονται από την λεπτοµερή γνώση της λειτουργίας των συσκευών. Μια άλλη υπηρεσία του BIOS είναι η ενηµέρωση των άλλων προγραµµάτων σχετικά µε την κατάσταση του εξοπλισµού του υπολογιστή, µέσω της περιοχής δεδοµένων του BIOS που βρίσκεται στην RAM στις δ/νσεις από 0400H έως 0500h. Κατά την εκκίνηση του υπολογιστή το BIOS πραγµατοποιεί τους αρχικούς ελέγχους µε το πρόγραµµα εκκίνησης και κατόπιν φορτώνει το λειτουργικό σύστηµα. Είναι προφανές ότι επειδή το BIOS είναι εγκατεστηµένο σε ολοκληρωµένο, διαφέρει από υπολογιστή σε υπολογιστή. Υπάρχουν λειτουργίες του BIOS σε νεώτερους υπολογιστές που δεν υποστηρίζονται σε παλαιοτέρου τύπου µηχανήµατα. Αλλά και λειτουργίες του BIOS που συµπεριφέρονται διαφορετικά από Η/Υ σε Η/Υ ανάλογα από τον τύπο του.. Γενικά βέβαια οι περισσότερες λειτουργίες του BIOS είναι συµβατές στα διαφόρου τύπου µηχανήµατα της αγοράς. Οι λειτουργίες του BIOS είναι ταχύτερες από τις αντίστοιχες του DOS. Καλούνται µε την εντολή INT n , όπου n ο τύπος διακοπής λογισµικού BIOS, έχοντας όµως δώσει κατάλληλες τιµές σε συγκεκριµένους καταχωρητές. Ακολουθεί περιληπτικός και επιλεκτικός για τις ανάγκες του µαθήµατος οδηγός των λειτουργιών BIOS. Για περισσότερες λεπτοµέρειες αναφερθείτε σε πλήρεις οδηγούς των λειτουργιών του BIOS που κυκλοφορούν στην αγορά. Οι λειτουργίες του BIOS βρίσκονται στο τελευταίο τµήµα της µνήµης στην δ/νση 0F0000h έως 0FFFFFh.

Page 102: ΚΕΦΑΛΑΙΟ 1dima/wp-content/uploads/... · 1 ΚΕΦΑΛΑΙΟ 1 Ο ... διαιρέσεις. BX ∆είκτης για έµµεσο τρόπο προσδιορισµού διευθύνσεων

102

2.2 Λειτουργίες Οθόνης. ∆ιακοπή Περιγραφή Καταχωρητές κατά την

κλήση Καταχωρητές κατά την επιστροφή

Συσκευή

Int 10H Καθορίζει τον τύπο οθόνης

AH=0h AL= Τύπος οθόνης

Όλες οι κάρτες

Int 10H Ρυθµίζει το µέγεθος του δροµέα

ΑΗ=1h CH=Αρχική γραµµή σάρωσης (0-4) CL=Τελική γραµµή σάρωσης (0-4)

Όλες οι κάρτες

Int 10H Καθορίζει την θέση του δροµέα

AH=2h BH=Αριθµός σελίδας DH=Γραµµή DL=Στήλη

Όλες οι κάρτες

Int 10H ∆ιαβάζει την θέση του δροµέα

AH=3h BH=Αριθµός σελίδας

CH=Αρχική γραµµή σάρωσης (0-4) CL=Τελική γραµµή σάρωσης (0-4) DH=Γραµµή DL=Στήλη

Int 10H Ρολάρισµα παραθύρου προς τα πάνω

AH=6h BH=Ιδιότητα γεµίσµατος της περιοχής AL=γραµµές ρολαρίσµατος, για 0 όλο το παράθυρο CH=Πάνω γραµµή CL=Αριστερή στήλη DH=Κάτω γραµµή DL=∆εξιά στήλη

Όλες οι κάρτες

Int 10H Ρολάρισµα παραθύρου προς τα κάτω

AH=7h BH=Ιδιότητα γεµίσµατος της περιοχής AL=γραµµές ρολαρίσµατος, 0 όλο το παράθυρο CH=Πάνω γραµµή CL=Αριστερή στήλη DH=Κάτω γραµµή DL=∆εξιά στήλη

Όλες οι κάρτες

Int 10H ∆ιάβασµα χαρακτήρα στην θέση του δροµέα

AH=8h BH=Σελίδα εµφάνισης

AH=ιδιότητα χαρακτήρα AL=Ascii τιµή χαρακτήρα

Int 10H Γράψιµο χαρακτήρων στην θέση του δροµέα

AH=9h BH=Σελίδα εµφάνισης AL=Ascii τιµή χαρακτήρα BL= Ιδιότητα χαρακτήρα CX=Αριθµός χαρακτήρων

Όλες οι κάρτες

Int 10H Γράψιµο χαρακτήρων στην θέση του δροµέα σε κατάσταση γραφικών

AH=0Ah BH= Σελίδα εµφάνισης AL=Ascii τιµή χαρακτήρα BL=Χρώµα χαρακτήρα CX=Αριθµός χαρακτήρων

Όλες οι κάρτες

Int 10H Γράψιµο AH=0Ch Όλες οι κάρτες

Page 103: ΚΕΦΑΛΑΙΟ 1dima/wp-content/uploads/... · 1 ΚΕΦΑΛΑΙΟ 1 Ο ... διαιρέσεις. BX ∆είκτης για έµµεσο τρόπο προσδιορισµού διευθύνσεων

103

εικονοστοιχείου σε κατάσταση γραφικών

BH=Σελίδα εµφάνισης AL=Χρώµα CX=Γραµµή DX=Στήλη

∆ιακοπή Περιγραφή Καταχωρητές κατά την Καταχωρητές κατά την Συσκευή κλήση επιστροφή Int 10H ∆ιάβασµα

εικονοστοιχείου σε κατάσταση γραφικών

AH=0Dh BH=Σελίδα εµφάνισης DX=Στήλη CX=Γραµµή

AL=Χρώµα εικονοστοιχείου

Όλες οι κάρτες

Int 10H Γράψιµο χαρακτήρα στην θέση του δροµέα σε λειτουργία τηλετύπου

AH=0Eh BH= Σελίδα εµφάνισης AL=Ascii τιµή χαρακτήρα BL=Χρώµα χαρακτήρα γραφικών

Όλες οι κάρτες

Int 10H ∆ιάβασµα του τύπου της οθόνης

AH=0Fh AH=Αριθµός στηλών AL=Τύπος οθόνης BH=Ενεργός σελίδα

Όλες οι κάρτες

Int 10H Γράψιµο συµβολοσειράς στην θέση του δροµέα σε λειτουργία τηλετύπου

AH=013h AL=Τρόπος εµφάνισης 00 Ιδιότητα χαρακτήρα στον BL ο δροµέας δεν µετακινείται 01 Ιδιότητα χαρακτήρα στον BL ο δροµέας µετακινείται 02 Η σειρά αποτελείται από διαδοχή χαρακτήρων και ιδιοτήτων χαρακτήρων ο δροµέας δεν µετακινείται 03 Η σειρά αποτελείται από διαδοχή χαρακτήρων και ιδιοτήτων χαρακτήρων ο δροµέας µετακινείται BH=Ενεργός σελίδα BL=Ιδιότητα CX=Μέγεθος σειράς σε bytes DH=Γραµµή DL=Στήλη ES=∆/νση τµήµατος σειράς BP=Ενεργός δ/νση σειράς

Όλες οι κάρτες

2.3 Λειτουργίες ∆ίσκου. ∆ιακοπή Περιγραφή Καταχωρητές κατά

την κλήση Καταχωρητές κατά την επιστροφή

Συσκευή

Int 13H Αρχικοποιεί το σύστηµα εύκαµπτου δίσκου

AH=00h DL= Αριθµός οδηγού 00h-7Fh εύκαµπτος 80H-0FF σκληρός

Επιτυχής CF=0 AH=0 Ανεπιτυχής AH= Κωδικός λάθους

Όλες οι συσκευές

Int 13H Βρίσκει την κατάσταση του εύκαµπτου δίσκου

AH=01h DL=Αριθµός οδηγού 00h-7Fh εύκαµπτος 80H-0FF σκληρός

AH=Κατάσταση 00 Επιτυχής 01 Λάθος εντολή Κ.Λ.Π

Όλες οι συσκευές

Page 104: ΚΕΦΑΛΑΙΟ 1dima/wp-content/uploads/... · 1 ΚΕΦΑΛΑΙΟ 1 Ο ... διαιρέσεις. BX ∆είκτης για έµµεσο τρόπο προσδιορισµού διευθύνσεων

104

Int 13H ∆ιαβάζει τοµείς του δίσκου

AH=02h AL=Αριθµός τοµέων (0-9) CH=Κύλινδρος* CL=Αρχική τροχιά DH=Κεφαλή DL=Αριθµός Οδηγού ES:BX=∆/νση ενδιάµεσης βοηθητικής µνήµης διαβάσµατος

CF=0 AH=0 Επιτυχής AL= Αριθµός τοµέων CF=1 Ανεπιτυχής AH=Κατάσταση

Όλες οι συσκευές

∆ιακοπή Περιγραφή Καταχωρητές κατά την Καταχωρητές κατά την Συσκευή κλήση επιστροφή Int 13H Γράφει σε τοµείς

του δίσκου AH=03h AL=Αριθµός τοµέων (0-9) CH=Κύλινδρος* CL=Αρχική τροχιά DH=Κεφαλή DL=Αριθµός Οδηγού ES:BX=∆/νση ενδιάµεσης βοηθητικής µνήµης διαβάσµατος

CF=0 AH=0 Επιτυχής AL= Αριθµός τοµέων CF=1 Ανεπιτυχής AH=Κατάσταση

Όλες οι συσκευές

Παρατήρηση Στους σκληρούς δίσκους ο κύλινδρος είναι µια τιµή των 10 δυαδικών ψηφίων. Τα 8 χαµηλότερα δυαδικά ψηφία βρίσκονται στον CH. Τα υπόλοιπα δύο είναι το 7ο και το 8ο του CL. Τα υπόλοιπα 6 ψηφία του CL περιέχουν τον αριθµό του τοµέα. 2.4 Λειτουργίες Πληκτρολογίου ∆ιακοπή Περιγραφή Καταχωρητές

κατά την κλήση Καταχωρητές κατά την επιστροφή

Συσκευή

Int 16H ∆ιαβάζει χαρακτήρα από το πληκτρολόγιο

AH=0h AH=Κωδικός σάρωσης AL=Ascii τιµή χαρακτήρα

Όλες οι συσκευές

Int 16H ∆ιαβάζει κατάσταση του πληκτρολογίου

AH=01h ZF=0 πατήθηκε πλήκτρο AH=Κωδικός σάρωσης AL=Ascii τιµή χαρακτήρα Αν ZF=1 δεν πατήθηκε πλήκτρο

Όλες οι συσκευές

Int 16H Επιστρέφει την κατάσταση του πληκτρολογίου

AH=02h AL=Κατάσταση πληκτρολογίου Bit 0 Πάτηµα πλήκτρου SHIFT δεξιά Bit 1 Πάτηµα πλήκτρου SHIFT αριστερά Bit 2 Πάτηµα πλήκτρου CTRL Bit 3 Πάτηµα πλήκτρου ALT Bit 4 Πλήκτρο SCROLL LOCK ενεργοποιηµένο

Όλες οι συσκευές

Page 105: ΚΕΦΑΛΑΙΟ 1dima/wp-content/uploads/... · 1 ΚΕΦΑΛΑΙΟ 1 Ο ... διαιρέσεις. BX ∆είκτης για έµµεσο τρόπο προσδιορισµού διευθύνσεων

105

Bit 5Πλήκτρο NUM LOCK ενεργοποιηµένο Bit 6 Πλήκτρο CAP LOCK ενεργοποιηµένο Bit 7Πλήκτρο INS ενεργοποιηµένο

Int 16H Γράφει στην ενδιάµεση µνήµη πληκτρολογίου

AH=05h CH=Κωδικός σάρωσης CL=Ascii τιµή

Αν CF=0 AL=0 επιτυχής Αν CF=1 AL=1 ανεπιτυχής ενδιάµεση µνήµη γεµάτη

Όλες οι συσκευές

2.6 Λειτουργίες Εκτυπωτή Int 17H Γράφει

χαρακτήρα στον εκτυπωτή

AH=00h AL=Ascii χαρακτήρα DX=Αριθµός εκτυπωτή 00H LPT1 01H LPT2 02H LPT3

AH=Κατάσταση εκτυπωτή

Όλες οι συσκευές

2.8 ∆ιάφορες άλλες λειτουργίες. ∆ιακοπή Περιγραφή Καταχωρητές

κατά την κλήση Καταχωρητές κατά την επιστροφή

Συσκευή

Int 11H Βρίσκει τον εξοπλισµό συστήµατος

AX=Κατάλογος συσκευών Bit 0 είναι 1 αν υπάρχει εύκαµπτος δίσκος Bit 1 είναι 1 αν υπάρχει µαθηµατικός συνεπεξεργαστής Bits 2-3 Μνήµη RAM κεντρικής µονάδας

00 16kb 01 32kb 10 48kb 11 64kb4

Bits 4-5 Αρχικός τύπος οθόνης 01 40X25 έγχρωµη 02 80X25 έγχρωµη 03 80Χ25 ασπρόµαυρη

Bits 6-7 Αριθµός εύκαµπτων δίσκων 00 ένας 01 δύο

10 τρεις 11 τέσσερις

Bit 8 ∆εν χρησιµοποιείται Bit2 9-11 Αριθµός σειριακών θυρών Bit 12 είναι 1 αν υπάρχει κάρτα χειριστηρίου Bit 13 είναι 1 αν υπάρχει εσωτερικό modem Bits 14-15 Αριθµός εκτυπωτών

Όλες οι συσκευές

2. ΛΕΙΤΟΥΡΓΙΕΣ DOS

Page 106: ΚΕΦΑΛΑΙΟ 1dima/wp-content/uploads/... · 1 ΚΕΦΑΛΑΙΟ 1 Ο ... διαιρέσεις. BX ∆είκτης για έµµεσο τρόπο προσδιορισµού διευθύνσεων

106

2.1 Εισαγωγή Στο λειτουργικό σύστηµα DOS περιλαµβάνονται ένας διερµηνέας εντολών (COMMAND.COM) πολλά βοηθητικά προγράµµατα (Utilities) και λογισµικό για την εξυπηρέτηση όλων των άλλων προγραµµάτων. Το σύνολο των εξυπηρετήσεων αυτών ονοµάζονται λειτουργίες του DOS και καλούνται κυρίως µέσω της εσωτερικής διακοπής INT 21H. Οι λειτουργίες DOS φορτώνονται και παραµένουν µόνιµα στην µνήµη κατά την εκκίνηση του, από τα κρυφά αρχεία IO.SYS και MSDOS.SYS. Εκτός από τις λειτουργίες του το DOS φορτώνει στην µνήµη του οδηγούς συσκευών, δηλαδή προγράµµατα .SYS εξυπηρέτησης συνδεµένων συσκευών, που είναι δηλωµένα στο αρχείο CONFIG.SYS µε την δήλωση DEVICE=. Η κατανοµή της συµβατικής µνήµης του υπολογιστή είναι η εξής:

- Τα πρώτα 1024 bytes καταλαµβάνει ο πίνακας δ/νσεων των 256 διακοπών του συστήµατος.

- Ακολουθούν 256 bytes της περιοχής δεδοµένων του BIOS - Ακολουθούν 512 bytes που καταλαµβάνει η περιοχή δεδοµένων επικοινωνίας

του DOS - Ακολουθεί η περιοχή που είναι εγκαταστηµένος ο πυρήνας του DOS δηλαδή

το λογισµικό των λειτουργιών του DOS και οι εσωτερικοί οδηγοί συσκευών. - Ακολουθούν οι οδηγοί που είναι δηλωµένοι στο CONFIG.SYS - Ο υπόλοιπος χώρος µέχρι τα 640KB είναι διαθέσιµος στα προγράµµατα.

Πρώτο πρόγραµµα βέβαια είναι το µόνιµο τµήµα του COMMAND.COM. Ακολουθούν άλλα µόνιµα στην µνήµη εγκατεστηµένα προγράµµατα, Ακολουθεί το κυρίως πρόγραµµα Στο τέλος της περιοχής βρίσκεται το κινητό τµήµα του COMMAND.COM

- Τα 384kb από 640kb έως 960kb διαφυλάσσονται για την οθόνη και άλλες συσκευές Ε/Ε.

- Τέλος τα τελευταία 64kb από 960kb έως 1Mb είναι οι λειτουργίες του ROM-BIOS.

Οι λειτουργίες του DOS είναι πιο σύνθετες και σε υψηλότερο επίπεδο από τις λειτουργίες του BIOS. Ο κατάλογος των λειτουργιών αυξάνεται σε κάθε νέα έκδοση του DOS. Οι λειτουργίες είναι οργανωµένες κατά οµάδες αλλά κατά όχι κατά τρόπο επίσηµο και αυστηρό. Έτσι υπάρχουν λειτουργίες: Α) Εισόδου και εξόδου δεδοµένων από περιφερειακές συσκευές (πληκτρολόγιο, οθόνη, εκτυπωτής, σειριακή θύρα). Β) ∆ιαχείρισης του χώρου του δίσκου (κατάλογοι αρχεία). Γ) ∆ιαχείριση της µνήµης. ∆) Αποθήκευση και ανάκτηση πληροφοριών από το δίσκο µε την παλαιά µέθοδο FCB και µε την καινούργια µέθοδο του χειριστηρίου. Ε) Συνεργασίας µε τις συσκευές του υπολογιστή µέσα στα πλαίσια του DOS ΣΤ) Φορτώµατος και εκτέλεσης προγραµµάτων. Ζ) Χειρισµού των διακοπών, χειρισµού και εξυπηρέτησης των µόνιµων στην µνήµη προγραµµάτων. Κ.α.

Page 107: ΚΕΦΑΛΑΙΟ 1dima/wp-content/uploads/... · 1 ΚΕΦΑΛΑΙΟ 1 Ο ... διαιρέσεις. BX ∆είκτης για έµµεσο τρόπο προσδιορισµού διευθύνσεων

107

Ακολουθεί περιληπτικός και επιλεκτικός για τις ανάγκες του µαθήµατος οδηγός των λειτουργιών DOS. Για περισσότερες λεπτοµέρειες αναφερθείτε σε πλήρεις οδηγούς των λειτουργιών του DOS που κυκλοφορούν στην αγορά. 2.2 Περιληπτικός κατάλογος λειτουργιών του DOS ∆ιακοπή Περιγραφή Καταχωρητές κατά την

κλήση Καταχωρητές κατά την επιστροφή

Σχόλια

INT 20H Τερµατισµός προγράµµατος

CS=∆/νση Τµήµατος Προθέµατος Προγράµµατος (PSP)

Χρήσιµη για .COM προγράµµατα

INT 21H Τερµατισµός προγράµµατος

ΑΗ=00Η CS=∆/νση Τµήµατος Προθέµατος Προγράµµατος (PSP)

Χρήσιµη για .COM προγράµµατα

INT 21H Είσοδος χαρακτήρα από το πληκτρολόγιο µε παράλληλη εµφάνιση στην οθόνη

AH=01H AL=Ascii χαρακτήρα

Αναµένει την είσοδο

INT 21H Εµφάνιση χαρακτήρα στην οθόνη

AH=02H DL=Ascii χαρακτήρα

INT 21H Είσοδος χαρακτήρα από την πρώτη σειριακή θύρα

AH=03H AL=Ascii χαρακτήρα

INT 21H Αποστολή χαρακτήρα στην πρώτη σειριακή θύρα

AH=04H DL=Ascii χαρακτήρα

INT 21H Αποστολή χαρακτήρα στον εκτυπωτή

AH=05H DL=Ascii χαρακτήρα

∆ιακοπή Περιγραφή Καταχωρητές κατά Καταχωρητές κατά Συσκευή την κλήση την επιστροφή INT 21H Είσοδος χαρακτήρα

από το πληκτρολόγιο ή εµφάνιση στην οθόνη

AH=06H DL= Ascii χαρακτήρα DL=0FFh έχουµε είσοδο

Εφόσον έχουµε είσοδο ZF=0 ∆εν υπάρχει χαρακτήρας AL=Ascii χαρακτήρα από πληκτρολόγιο

∆εν αναµένει την είσοδο χαρακτήρα από το πληκτρολόγιο

INT 21H Είσοδος χαρακτήρα από το πληκτρολόγιο χωρίς παράλληλη εµφάνιση στην οθόνη

AH=07H AL=Ascii χαρακτήρα Αναµένει την είσοδο ∆εν ισχύει το CNTR-BREAK

INT 21H Είσοδος χαρακτήρα AH=08H AL=Ascii χαρακτήρα Αναµένει την

Page 108: ΚΕΦΑΛΑΙΟ 1dima/wp-content/uploads/... · 1 ΚΕΦΑΛΑΙΟ 1 Ο ... διαιρέσεις. BX ∆είκτης για έµµεσο τρόπο προσδιορισµού διευθύνσεων

108

από το πληκτρολόγιο χωρίς παράλληλη εµφάνιση στην οθόνη

είσοδο Ισχύει το CNTR-BREAK

INT 21H Εµφάνιση αλφαριθµητικού στην οθόνη

AH=09H DS:DX=∆/νση αλφαριθµητικού

Τελευταίος χαρακτήρας του αλφαριθµητικού είναι το ‘$’

INT 21H Εισαγωγή αλφαριθµητικού σε βοηθητική µνήµη

AH=OAH 0 byte περιέχει τον µέγιστο αριθµό bytes βοηθ.µνήµης που µπορούν να διαβαστούν 1 byte περιέχει τον αριθµό των bytes που διαβάστηκαν 2 Αρχική δ/νση των bytes εισαγωγής

Πλήκτρο ENTER. O χαρακτήρας CR δεν περιλαµβάνεται στους χαρακτήρες που διαβάστηκαν

INT 21H Ελέγχει την κατάσταση του πληκτρολογίου

AH=0BH AL=0FFh υπάρχει διαθέσιµος χαρακτήρας AL=00h δεν υπάρχει διαθέσιµος χαρακτήρας

INT 21H Καθαρίζει την ενδιάµεση µνήµη και καλεί µια λειτουργία πληκτρολογίου

AH=0CH AL=Αριθµός λειτουργίας του DOS (01h, 06h, 07h, 08h)

AL=Ascii χαρακτήρας εισαγωγής

INT 21H Αδειάζει την ενδιάµεση µνήµη όλων των ανοικτών αρχείων στον δίσκο

AH=0DH

INT 21H Ορίζει νέο άνυσµα διακοπής αρχείων στον δίσκο

AH=25H AL=Αριθµός διακοπής DS:DX= ∆/νση του νέου υποπρογράµµατος εξυπηρέτησης διακοπής

INT 21H Βρίσκει την ηµεροµηνία του συστήµατος αρχείων στον δίσκο

AH=2AH CX=Έτος (1980-2099) DH=Μήνας(1-12) DL=Ηµέρα (1-31) AL=Ηµέρα της εβδοµάδας (0-6 0=Κυριακή)

INT 21H Ορίζει την ηµεροµηνία του συστήµατος αρχείων στον δίσκο

AH=2BH CX=Έτος DH=Μήνας DL=Ηµέρα

AL=Αποτέλεσµα ενέργειας 00 Επιτυχής ρύθµιση 0FFh Λάθος ηµεροµηνία Ανεπιτυχής ενέργεια

INT 21H Βρίσκει την ώρα του συστήµατος αρχείων

AH=2CH CL=Λεπτά(0-59) CH=Ώρα (0-24)

Page 109: ΚΕΦΑΛΑΙΟ 1dima/wp-content/uploads/... · 1 ΚΕΦΑΛΑΙΟ 1 Ο ... διαιρέσεις. BX ∆είκτης για έµµεσο τρόπο προσδιορισµού διευθύνσεων

109

στον δίσκο DH=∆ευτερόλεπτα (0-59) DL= Εκατοστά δευτερολέπτου (0-99)

∆ιακοπή Περιγραφή Καταχωρητές κατά Καταχωρητές κατά Συσκευή την κλήση την επιστροφή INT 21H Ορίζει την ώρα του

συστήµατος αρχείων στον δίσκο

AH=2DH CL=Λεπτά CH=Ώρα DH=∆ευτερόλεπτα DL= Εκατοστά δευτερολέπτου

AL=Αποτέλεσµα ενέργειας 00 Επιτυχής ρύθµιση 0FFh Λάθος ηµεροµηνία Ανεπιτυχής ενέργεια

INT 21H Βρίσκει την έκδοση του DOS

AH=30H AL=Μεγάλος αριθµός έκδοσης AH=Μικρός αριθµός έκδοσης

Π.χ για έκδοση 3.10 0 AL=3 και AH=10

INT 21H Τερµατισµός προγράµµατος που παραµένει µόνιµα στην µνήµη

AH=31H AL=Κωδικός που επιστρέφει το πρόγραµµα µετά τον τερµατισµό του DX=Απαιτούµενη µνήµη σε παραγράφους (1 παράγραφος = 16 Bytes)

INT 21H Βρίσκει το άνυσµα διακοπής αρχείων στον δίσκο

AH=35H AL= Αριθµός διακοπής

ES:BX=∆/νση της διακοπής

INT 21H ∆ηµιουργία υποκαταλόγου στον δίσκο

AH=39H DS:DX=∆/ση του αλφαριθµητικού που περιέχει το πλήρες σύµφωνα µε το DOS όνοµα του υποκαταλόγου

CF=0 επιτυχής ενέργεια CF=1 Ανεπιτυχής ενέργεια AX=03 Λάθος διαδροµή AX=05 Απαιτείται πρόσβαση

INT 21H ∆ιαγραφή υποκαταλόγου από τον δίσκο

AH=3AH DS:DX= ∆/ση του αλφαριθµητικού που περιέχει το πλήρες σύµφωνα µε το DOS όνοµα του υποκαταλόγου

CF=0 επιτυχής ενέργεια CF=1 Ανεπιτυχής ενέργεια AX=03 Λάθος διαδροµή AX=05 Απαιτείται πρόσβαση AX=10 Αδύνατος διαγραφή

INT 21H Αλλαγή υποκαταλόγου στον δίσκο

AH=3BH DS:DX= ∆/ση του αλφαριθµητικού που περιέχει το πλήρες σύµφωνα µε το DOS όνοµα του υποκαταλόγου

CF=0 επιτυχής ενέργεια CF=1 Ανεπιτυχής ενέργεια AX=03 Λάθος διαδροµή

Page 110: ΚΕΦΑΛΑΙΟ 1dima/wp-content/uploads/... · 1 ΚΕΦΑΛΑΙΟ 1 Ο ... διαιρέσεις. BX ∆είκτης για έµµεσο τρόπο προσδιορισµού διευθύνσεων

110

INT 21H ∆ηµιουργία αρχείου στον δίσκο

AH=3CH DS:DX= ∆/ση του αλφαριθµητικού που περιέχει το πλήρες σύµφωνα µε το DOS όνοµα του αρχείου CX= Χαρακτηριστικά αρχείου 00H Κανονικό αρχείο 01H Αρχείο µόνο για διάβασµα 02H κρυφό αρχείο 04H Αρχείο του συστήµατος 08H Ετικέτα τόµου 20H Αρχείο βιβλιοθήκης

CF=0 επιτυχής ενέργεια CF=1 Ανεπιτυχής ενέργεια AX=03 Λάθος διαδροµή AX=05 Απαιτείται πρόσβαση AX=04 Πολλά ανοικτά αρχεία

∆ιακοπή Περιγραφή Καταχωρητές κατά την Καταχωρητές κατά Συσκευή κλήση την επιστροφή INT 21H Άνοιγµα αρχείου

στον δίσκο µε την µέθοδο του χειριστηρίου

AH=3DH DS:DX= ∆/ση του αλφαριθµητικού που περιέχει το πλήρες σύµφωνα µε το DOS όνοµα του αρχείου AL= Τρόπος προσπέλασης Bits 0-2 000 Για διάβασµα 001 Για γράψιµο 010 για διάβασµα και γράψιµο

CF=0 επιτυχής ενέργεια AX=Αριθµός χειριστηρίου CF=1 Ανεπιτυχής ενέργεια AX=03H Λάθος διαδροµή AX=05H Απαιτείται πρόσβαση AX=04H Πολλά ανοικτά αρχεία AX=01H Λάθος λειτουργία AX=02H ∆εν υπάρχει το αρχείο AX=0CH Λάθος προσπέλαση

INT 21H Κλείσιµο αρχείου στον δίσκο µε την µέθοδο του χειριστηρίου

AH=3EH BX=Αριθµός χειριστηρίου

CF=0 επιτυχής ενέργεια CF=1 Ανεπιτυχής ενέργεια AX=06H Λάθος αριθµός χειριστηρίου

INT 21H ∆ιάβασµα από αρχείο σε ενδιάµεση µνήµη

AH=3FH BX=Αριθµός χειριστηρίου CX=Αριθµός bytes DS:DX=∆/νση ενδιάµεσης µνήµης

CF=0 επιτυχής ενέργεια AX=Αριθµός χαρακτήρων που διαβάστηκαν CF=1 Ανεπιτυχής ενέργεια AX=05 Απαιτείται πρόσβαση AX=06H Λάθος αριθµός χειριστηρίου

INT21H Γράψιµο σε αρχείο από ενδιάµεση µνήµη

AH=40H BX=Αριθµός χειριστηρίου CX=Αριθµός bytes DS:DX=∆/νση ενδιάµεσης µνήµης

CF=0 επιτυχής ενέργεια AX=Αριθµός χαρακτήρων που διαβάστηκαν CF=1 Ανεπιτυχής ενέργεια AX=05 Απαιτείται πρόσβαση AX=06H Λάθος αριθµός χειριστηρίου

Page 111: ΚΕΦΑΛΑΙΟ 1dima/wp-content/uploads/... · 1 ΚΕΦΑΛΑΙΟ 1 Ο ... διαιρέσεις. BX ∆είκτης για έµµεσο τρόπο προσδιορισµού διευθύνσεων

111

INT 21H ∆ιαγραφή αρχείου από τον δίσκο

AH=41H DS:DX= ∆/ση του αλφαριθµητικού που περιέχει το πλήρες σύµφωνα µε το DOS όνοµα του αρχείου

CF=0 επιτυχής ενέργεια CF=1 Ανεπιτυχής ενέργεια AX=03 Λάθος διαδροµή AX=05 Απαιτείται πρόσβαση AX=02 Λάθος όνοµα αρχείου

INT 21H Μετατόπιση του δείκτη αρχείου

AH=42H BX=Αριθµός χειριστηρίου AL=Κωδικός µεθόδου 00H απόκλιση από αρχή 01H απόκλιση από τρέχουσα θέση 10H απόκλιση από τέλος CX:DX Μέγεθος απόκλισης

CF=0 επιτυχής ενέργεια DX:AX=Απόλυτη θέση του δείκτη CF=1 Ανεπιτυχής ενέργεια AX=01H Λάθος ενέργεια AX=06H Λάθος αριθµός χειριστηρίου

INT 21H ∆έσµευση µνήµης

AH=48H BX= Αριθµός παραγράφων που θα δεσµευτούν

CF=0 επιτυχής ενέργεια AX=∆/νση του τµήµατος που δεσµεύτηκε CF=1 Ανεπιτυχής ενέργεια AX=07H Κατεστραµµένα τµήµατα µνήµης AX=08H ανεπαρκής η υπάρχουσα διαθέσιµη µνήµη BX=Μέγεθος σε παραγράφους διαθέσιµης µνήµης

∆ιακοπή Περιγραφή Καταχωρητές κατά την Καταχωρητές κατά Συσκευή κλήση την επιστροφή INT 21H Απελευθέρωση

µνήµης που έχει δεσµευτεί προηγουµένως µε την λειτουργία 48H

AH=49H ES=∆/νση τµήµατος µνήµης που θα απελευθερωθεί

CF=0 επιτυχής ενέργεια CF=1 Ανεπιτυχής ενέργεια AX=07H Κατεστραµµένα τµήµατα µνήµης AX=08H ανεπαρκής η υπάρχουσα διαθέσιµη µνήµη

INT 21H Τερµατισµός προγράµµατος

AH=4CH AL=Κωδικός που επιστρέφει το πρόγραµµα µετά τον τερµατισµό του

Page 112: ΚΕΦΑΛΑΙΟ 1dima/wp-content/uploads/... · 1 ΚΕΦΑΛΑΙΟ 1 Ο ... διαιρέσεις. BX ∆είκτης για έµµεσο τρόπο προσδιορισµού διευθύνσεων

112

ΣΥΝΟΠΤΙΚΟΣ Ο∆ΗΓΟΣ ΤΩΝ ΕΝΤΟΛΩΝ ΤΟΥ 8086 Ακολουθεί µια αναφορά των εντολών του 8086, µε την σύνταξη τους και µια απλή προγραφή της λειτουργίας τους. Για περισσότερες λεπτοµέρειες σε επιµέρους εντολές να ανατρέξετε στα προηγούµενα κεφάλαια AAA Adjust result of Ascii Addition AAA Η εντολή AAA θεωρεί ότι προηγήθηκε µια άθροιση ASCII στον AL και τροποποιεί τον AX ώστε να περιέχει το αποτέλεσµα της άθροισης σαν unpacked BCD αριθµό. Λειτουργεί ως εξής:

1. Αν LS nibble του al µεταξύ 0 και 9 τότε πήγαινε στο στάδιο 3 2. Αν LS nibble του al µεταξύ 0Af και 0Fh ή AF (Auxiliary Flag) = 1, πρόσθεσε

6 στον AL, πρόσθεσε 1 στον AH, θέσε 1 στην AF 3. Μηδένισε το MS nibble του AL

Π.Χ Αν AX=0535h, BL=39 τότε µετά τις εντολές: ADD AL,BL AAA AX=0604h AAD Ascii Adjust for Division AAD Η εντολή AAD θεωρεί ότι οι AH και AL περιέχουν unpacked BCD περιεχόµενο, και το µετατρέπει σε δυαδικό στον AL. Λειτουργεί µε την εξής λογική:

1. Πολλαπλασιάζει τον AH επί 0AH 2. Προσθέτει AH στον AL 3. Μηδενίζει τον AH

AAM Ascii Adjust of Multiplication AAM Η εντολή AAM τροποποιεί το περιεχόµενο του AL, θεωρώντας ότι προηγήθηκε πολλαπλασιασµός δύο unpacked BCD αριθµών. Η µετατροπή γίνεται ως εξής: ∆ιαιρεί τον AL µε 0Ah και αποθηκεύει το πηλίκο στον AL και το υπόλοιπο στον AH AAS Ascii Adjust of Subtraction AAS

Page 113: ΚΕΦΑΛΑΙΟ 1dima/wp-content/uploads/... · 1 ΚΕΦΑΛΑΙΟ 1 Ο ... διαιρέσεις. BX ∆είκτης για έµµεσο τρόπο προσδιορισµού διευθύνσεων

113

Η εντολή AAS τροποποιεί το περιεχόµενο του AL θεωρώντας ότι προηγήθηκε αφαίρεση δύο Ascii χαρακτήρων. Η µετατροπή γίνεται ως εξής:

1. Αν LS nibble του al µεταξύ 0 και 9 και AF=1, τότε πήγαινε στο στάδιο 3 2. Αν LS nibble του al µεταξύ A και F ή AF (Auxiliary Flag)=1, να αφαιρέσεις 6

απ τον AL, αφαίρεσε 1 από τον AH, θέσε 1 στην AF 3. Μηδένισε το MS nibble του AL 4. Θέσε τη CF = AF

ADC ADd with Carry ADC <τελεστής 1> , <τελεστής 2> Προσθέτει στον τελεστή 1 τον τελεστή 2 και το περιεχόµενο της Carry Flag ADD ADDition ADD <τελεστής 1> , <τελεστής 2> Προσθέτει στον τελεστή 1, τον τελεστή 2 AND AND logical AND <τελεστής 1> , <τελεστής 2> Λογική σύζευξη του τελεστή 2 στον τελεστή 1 CALL CALL procedure CALL <∆/νση υποπρογράµµατος> Η εντολή αναπτύχθηκε πλήρως στο Κεφάλαιο 5 CBW Convert Byte to Word CBW Μετατρέπει το περιεχόµενο του AL σε word ως εξής: Αν AL >= 80H AH=0FFH Αν AL < 80H AH=00 CLC Clear Carry Flag CLC Μηδενίζει την Carry Flag CLD Clear Direction Flag

Page 114: ΚΕΦΑΛΑΙΟ 1dima/wp-content/uploads/... · 1 ΚΕΦΑΛΑΙΟ 1 Ο ... διαιρέσεις. BX ∆είκτης για έµµεσο τρόπο προσδιορισµού διευθύνσεων

114

CLD Μηδενίζει την Direction Flag CLI Clear Interrupt Flag CLI Μηδενίζει την Interrupt Flag CMC CoMplement Carry flag CMC Αλλάζει την τιµή της Carry Flag από 0 σε 1 ή από 1 σε 0 CMP CoMPare CMP <τελεστής 1> , <τελεστής 2> Συγκρίνει τον τελεστή 1 µε τον τελεστή 2 και ενηµερώνει τους δείκτες CMPS CMPSB ή CMPSW Σύγκριση περιοχής µνήµης µε περιοχή µνήµης. Λεπτοµερής αναφορά στο Κεφάλαιο 3 CWD Convert Word to Dword CWD Μετατρέπει το περιεχόµενο του AX σε διπλή λέξη DX:AX. Αν το byte προσήµου του AX είναι 0 , DX = 0. Αν το byte προσήµου του AX είναι 1 , DX=0FFh. DAA Decimal Adjust accumulator after Addition DAA Η εντολή αυτή πρέπει να έπεται µετά από µια εντολή πρόσθεσης. Η DAA τροποποιεί το περιεχόµενο του AL , ούτως ώστε η πρόσθεση που προηγήθηκε να είναι µια σωστή BCD πρόσθεση. Η µετατροπή γίνεται ως εξής:

1. Εάν η AF = 1 ή το LS nibble του AL είναι µεταξύ 0Ah έως 0Fh τότε πρόσθεσε 6 στον AL και θέσε ON την AF

2. Εάν CF = 1 ή εάν το MS nibble του AL είναι µεταξύ 0Ah έως 0Fh τότε πρόσθεσε 60h στον AL και θέσε ON την CF

Page 115: ΚΕΦΑΛΑΙΟ 1dima/wp-content/uploads/... · 1 ΚΕΦΑΛΑΙΟ 1 Ο ... διαιρέσεις. BX ∆είκτης για έµµεσο τρόπο προσδιορισµού διευθύνσεων

115

Π.χ αν AL = 68h και BL = 28h, µετά από πράξεις ADD AL,BL DAA ο AL = 96H και όχι 90H DAS Decimal Adjust accumulator after Substraction DAA Η εντολή αυτή πρέπει να έπεται µετά από µια εντολή αφαίρεσης. Η DAS τροποποιεί το περιεχόµενο του AL, ούτως ώστε η αφαίρεση που προηγήθηκε να είναι µια σωστή BCD αφαίρεση. Η µετατροπή γίνεται ως εξής :

1. Εάν η AF = 1 ή το LS nibble του AL είναι µεταξύ 0Ah έως 0Fh τότε αφαίρεσε 6 από τον AL και θέσε ON την AF

2. Εάν CF = 1 ή εάν το MS nibble του AL είναι µεταξύ 0Ah έως 0Fh τότε αφαίρεσε 60h από τον AL και θέσε ON την CF

Π.χ αν AL = 67h και BL = 28h , µετά από τις πράξης SUB AL,BL DAS Ο AL = 39H και όχι 3FH DEC DECrement DEC <τελεστής> Μείωση κατά 1 της τιµής του τελεστή DIV DIVine DIV <τελεστής> Αν τελεστής byte, διαιρεί τον AX δια του τελεστή, και τοποθετεί το πηλίκο στον AL και το υπόλοιπο στον AH. Αν τελεστής word, διαιρεί τον DX:AX δια του τελεστή και τοποθετεί το πηλίκο στον AL και το υπόλοιπο στον AH. ESC ESCape ESC <διεύθυνση µνήµης> Η εντολή αυτή τοποθετεί στο data bus το περιεχόµενο της δ/νσης µνήµης που είναι τελεστής. Τα δεδοµένα αυτά θα χρησιµοποιηθούν από άλλον επεξεργαστή που διαθέτει το σύστηµα, και εποµένως χρησιµεύει όταν υπάρχουν περισσότεροι από έναν επεξεργαστές για να πετύχουµε την συνεργασία τους. HLT HaLT

Page 116: ΚΕΦΑΛΑΙΟ 1dima/wp-content/uploads/... · 1 ΚΕΦΑΛΑΙΟ 1 Ο ... διαιρέσεις. BX ∆είκτης για έµµεσο τρόπο προσδιορισµού διευθύνσεων

116

HLT Προκαλεί σταµάτηµα της εκτέλεσης του προγράµµατος έως ότου συµβεί µια διακοπή IDIV Interger DIVision IDIV <τελεστής> Λειτουργεί όπως και η DIV αλλά θεωρεί τα περιεχόµενα των τελεστών προσηµασµένα µε την λογική συµπλήρωµα ως προς δύο. IMUL Interger MULtiply IMUL <τελεστής> Προσηµασµένος πολλαπλασιασµός. Κατά τα άλλα όπως η MUL IN INput IN <συσσωρευτής>,<Θύρα> ∆ιάβασµα δεδοµένου από εξωτερική συσκευή µέσω κάποιας θύρας εισόδου INC INCrement INC <τελεστής> Αύξηση κατά 1 της τιµής του τελεστή INT INTerrupt INT <τύπος διακοπής> Προκαλεί διακοπή λογισµικού INTO INTerrupt on Overflow INTO Προκαλεί µια διακοπή τύπου 4 αν η Overflow Flag είναι 1. IRET Interrupt RETurn IRET Επιστροφή από υποπρόγραµµα (χειριστή) διακοπής. JA/JNBE Jump if Above/Jump if Not Below or Equal JAE/JNB Jump if Above or Equal/Jump if Not Below JB/JNAE Jump if Below/Jump if not Above Equal JBE/JNA Jump if Below or Equal/Jump if Not Above

Page 117: ΚΕΦΑΛΑΙΟ 1dima/wp-content/uploads/... · 1 ΚΕΦΑΛΑΙΟ 1 Ο ... διαιρέσεις. BX ∆είκτης για έµµεσο τρόπο προσδιορισµού διευθύνσεων

117

JC Jump if Carry flag set JCXZ Jump if CX register is Zero JE/JZ Jump if Equal/Jump if Zero JG/JNLE Jump if Greater/Jump if Not Less or Equal JGE/JNL Jump if Greater or Equal/Jump if Not Less JL/JNGE Jump if Less/Jump if Not Greater or Equal JLE/JNG Jump if Less/Jump if not Greater JNC Jump if not Carry set JNE/JNZ Jump if Not Equal/Jump if Not Zero JNO Jump if Not Overflow JPO/JNP Jump if Not Parity/Jump if Parity Odd JNS/ Jump if Not Sign JO Jump if Overflow JP/JPE Jump if Parity Even JS Jump if Sign Είναι όλες εντολές διακλάδωσης υπό συνθήκη σε απόσταση ενός BYTE (-128 έως 127) θέσεις µνήµης από την επόµενη εντολή. Για περισσότερα στον κεφάλαιο των διακλαδώσεων. JMP JuMP JMP < ∆/νση > Εντολή διακλάδωσης του προγράµµατος χωρίς συνθήκη. LAHF Load int AH Flags register LAHF Φορτώνει τον AH καταχωρητή µε το περιεχόµενο του χαµηλού byte του καταχωρητή των δεικτών. Τα οκτώ bits που µετακινούνται είναι: LDS Load register and DS from memory LDS <καταχωρητής>,<µνήµη> Από την συγκεκριµένη περιοχή µνήµης, µεταφέρει τα δυο πρώτα bytes στον 16bits καταχωρητή της εντολής, και τα επόµενα δύο bytes στον καταχωρητή DS. Η περιοχή µνήµης µπορεί να θεωρηθεί ότι είναι µια µεταβλητή τύπου µακρινού δείκτη µνήµης (far pointer). LEA Load Effective Address LEA <καταχωρητής>,<µνήµη> Μεταφέρει στον καταχωρητή την ενεργό δ/νση της µεταβλητής µνήµης στον 16bits καταχωρητή της εντολής, και τα επόµενα δύο bytes στον

Page 118: ΚΕΦΑΛΑΙΟ 1dima/wp-content/uploads/... · 1 ΚΕΦΑΛΑΙΟ 1 Ο ... διαιρέσεις. BX ∆είκτης για έµµεσο τρόπο προσδιορισµού διευθύνσεων

118

LES Load register and ES from memory LES <καταχωρητής>,<µνήµη> Από την συγκεκριµένη περιοχή µνήµης, µεταφέρει τα δυο πρώτα bytes στον 16bits καταχωρητή της εντολής, και τα επόµενα δύο bytes στον καταχωρητή ES. Η περιοχή µνήµης µπορεί να θεωρηθεί ότι είναι µια µεταβλητή τύπου µακρινού δείκτη µνήµης (far pointer). LOCK LOCK the bus LOCK Η εντολή αυτή ενεργοποιεί το σήµα LOCK κατά την εκτέλεση της επόµενης εντολής LODS LoaD String LODS/LODSB/LODSW Μεταφέρει από την δ/νση µνήµης DS:SI το περιεχόµενο στον συσσωρευτή. Για περισσότερα στο Κεφάλαιο 3. LOOP LOOP if cx not zero LOOP <∆/νση µνήµης> Μειώνει τον cx κατά 1 και διακλαδίζεται στην δ/νση µνήµης αν ο cx <> 0. Η απόσταση της δ/νσης πρέπει να είναι ενός byte. LOOPZ/LOOPE LOOP if cx not zero and Zf = 1 (WHILE Equal) LOOPZ/LOOPE <∆/νση µνήµης> Μειώνει τον cx κατά 1 και διακλαδίζεται στην δ/νση µνήµης αν ο cx <> 0 και το αποτέλεσµα της προηγούµενης αριθµητικής εντολής είναι 0 (ZF = 1). Η απόσταση της δ/νσης πρέπει να είναι ενός byte. LOOPNZ/LOOPNE LOOP if cx not zero and Zf = 0 (While not Equal) LOOPNZ/LOOPNE <∆/νση µνήµης> Μειώνει τον cx κατά 1 και διακλαδίζεται στην δ/νση µνήµης αν ο cx <> 0 και το αποτέλεσµα της προηγούµενης αριθµητικής εντολής δεν είναι 0 (ZF = 0). Η απόσταση της δ/νσης πρέπει να είναι ενός byte. MOV MOVe MOV <προορισµός>,<προέλευση> Η γνωστή εντολή µεταφοράς δεδοµένων. Αναπτύχθηκε πλήρως στα προηγούµενα Κεφάλαια.

Page 119: ΚΕΦΑΛΑΙΟ 1dima/wp-content/uploads/... · 1 ΚΕΦΑΛΑΙΟ 1 Ο ... διαιρέσεις. BX ∆είκτης για έµµεσο τρόπο προσδιορισµού διευθύνσεων

119

MUL MULtiply accumulator MUL <τελεστής> Εντολή πολλαπλασιασµού. Αν τελεστής byte, πολλαπλασιάζεται ο AL µε τον τελεστή και τοποθετείται το αποτέλεσµα στον AX. Αν τελεστής word, πολλαπλασιάζεται ο AX µε τον τελεστή και τοποθετείται το αποτέλεσµα στον διπλό αριθµό DX:AX. NEG NEGate NEG <τελεστής> Αλλάζει το πρόσηµο του τελεστή. Ο τελεστής είναι ή καταχωρητής ή δ/νση µνήµης. Το περιεχόµενο του θεωρείται ότι είναι προσηµασµένος αριθµός, σύµφωνα µε την κωδικοποίηση συµπλήρωµα ως προς δύο. NOP No Operation NOP Ο µ/ε δεν πραγµατοποιεί καµία ενέργεια. Προκαλείται µόνο καθυστέρηση µερικούς κύκλους µηχανής. NOT NOT NOT <τελεστής> Αντιστρέφει κάθε bit του τελεστή. Ο τελεστής είναι ή καταχωρητής ή δ/νση µνήµης. OR OR logical OR <τελεστής 1> , <τελεστής 2> Λογική πρόσθεση του τελεστή 2 στον τελεστή 1. OUT OUTput OUT <Θύρα>,<συσσωρευτής> Γράψιµο ενός δεδοµένου σε εξωτερική συσκευή µέσω κάποιας θύρας εξόδου POP POP from top of stack POP <τελεστής> Μεταφορά του περιεχοµένου της κορυφής του σωρού στον τελεστή, µε αντίστοιχη αύξηση του SP κατά δύο. Ο τελεστής είναι τελεστής µεγέθους µιας word. POPF POP Flags register from top of stack

Page 120: ΚΕΦΑΛΑΙΟ 1dima/wp-content/uploads/... · 1 ΚΕΦΑΛΑΙΟ 1 Ο ... διαιρέσεις. BX ∆είκτης για έµµεσο τρόπο προσδιορισµού διευθύνσεων

120

POPF Μεταφορά του περιεχοµένου της κορυφής του σωρού στον καταχωρητή κατάστασης (Status Register). PUSH PUSH onto top of s tack PUSH <τελεστής> Αποθήκευση του περιεχοµένου του τελεστή στον σωρό, µε αντίστοιχη µείωση του SP κατά δύο. Ο τελεστής είναι τελεστής µεγέθους µιας word. PUSHF PUSH Flags register onto top of stack PUSHF Αποθήκευση του περιεχοµένου του καταχωρητή κατάστασης στον σωρό, µε αντίστοιχη µείωση του SP κατά δύο. RCL Rotate through Carry left RCL Rotate through Carry left RCL <τελεστής>,<µετρητής> Περιστρέφει τα bits του τελεστή προς τα αριστερά. Η Carry flag συµµετέχει στην περιστροφή σαν υπ’αριθµ 8 bit. RCR Rotate through Carry right RCR <τελεστής>,<µετρητής> Περιστρέφει τα bits του τελεστή προς τα δεξιά µε την λογική της προηγούµενης εντολής. REP REPeat REP/REPE/REPNE/REPZ/REPNZ Πρόθεµα των εντολών των αλφαριθµητικών. Προκαλεί επανάληψη των εντολών. Για λεπτοµέρειες στο Κεφάλαιο 4. RET RETurn RET <σταθερά> ( Η σταθερά µπορει να παραληφθεί) Πρόκειται για δυο εντολές επιστροφής από υποπρογράµµατα, την RETN (RETurn Near) και την RETH (RETurn Far). Για λεπτοµέρειες στον Κεφάλαιο 5. Αν µετά την ret ακολουθεί µια σταθερά, τότε µετά την επιστροφή, αυξάνεται η τιµή του δείκτη σωρού SP κατά το µέγεθος της σταθεράς. Την σύνταξη της RET µε σταθερά εφαρµόζει η Pascal για αποκατάσταση του σωρού λόγω των παραµέτρων που τοποθετήθηκαν µε PUSH πριν την κλήση (CALL) του υποπρογράµµατος.

Page 121: ΚΕΦΑΛΑΙΟ 1dima/wp-content/uploads/... · 1 ΚΕΦΑΛΑΙΟ 1 Ο ... διαιρέσεις. BX ∆είκτης για έµµεσο τρόπο προσδιορισµού διευθύνσεων

121

ROL Rotate Left ROL <τελεστής>,<µετρητής> Περιστρέφει τα bits του τελεστή προς τα αριστερά. Στην περιστροφή δεν συµπεριλαµβάνεται η Carry Flag, στην οποία όµως αποθηκεύεται το υπ’αριθµ επτά bit του τελεστή. ROR Rotate Right ROR <τελεστής>,<µετρητής> Περιστρέφει τα bits του τελεστή προς τα δεξιά. Στην περιστροφή δεν συµπεριλαµβάνεται η Carry Flag, στην οποία όµως αποθηκεύεται το υπ’αριθµ µηδέν bit του τελεστή. SAHF Store register AH into Flags SAHF Αντίστροφη της LAHF εντολή. Το περιεχόµενο του καταχωρητή AH στο χαµηλό byte του δείκτη κατάστασης SF. SAL/SHL Shift Arithetic Right /Shift left SAL/SHL <τελεστής>,<µετρητής> Μετακινεί προς τα αριστερά τα bits του τελεστή. SAR Shift Arithetic Right SAR <τελεστής>,<µετρητής> Μετακινεί προς τα δεξιά τα bits του τελεστή, διατηρώντας την τιµή του bit προσήµου. SBB SuBtract with Borrow SBB <τελεστής 1> , <τελεστής 2> Αφαιρεί από τον τελεστή 1 τον τελεστή 2 και το περιεχόµενο της Carry Flag. SCAS SCAn String SCAN/SCANS/SCANW Συγκρίνει τα περιεχόµενα της δ/νση µνήµης DS:SI µε το περιεχόµενο του συσσωρευτή. Για περισσότερα στο Κεφάλαιο 3. SHR Shift Right SHR <τελεστής>,<µετρητής>

Page 122: ΚΕΦΑΛΑΙΟ 1dima/wp-content/uploads/... · 1 ΚΕΦΑΛΑΙΟ 1 Ο ... διαιρέσεις. BX ∆είκτης για έµµεσο τρόπο προσδιορισµού διευθύνσεων

122

Μετακινεί προς τα δεξιά τα bits του τελεστή συµπληρώνοντας τα κενά bits µε 0. STC SeT Carry flag STC Μετά την εντολή αυτή η CF = 1. STD SeT Direction flag STD Μετά από την εντολή αυτή η DF = 1. STI SeT Interrupt flag STI Μετά από την εντολή αυτή η IF = 1. STOS STOre String STOS/STOSB/STOSW Μεταφέρει το περιεχόµενο του συσσωρευτή στην δ/νση µνήµης ES:DI. Για περισσότερα στο Κεφάλαιο 3 SUB SUBtract SUB <τελεστής 1> , <τελεστής 2> Αφαιρεί τον τελεστή 2 από τον τελεστή 1 TEST TEST TEST <τελεστής 1> , <τελεστής 2> Κάνει ένα λογικό AND του τελεστή 2 µε τον τελεστή 1, ενηµερώνει τις σηµαίες δείκτες κατάστασης και απορρίπτει το αποτέλεσµα. Λειτουργεί όπως η εντολή σύγκρισης. WAIT WAIT WAIT Θέτει τον µ/ε σε κατάσταση αναµονής, εφόσον δεν είναι ενεργό το σήµα του ακροδέκτη TEST. Η κατάσταση αναµονής σταµατάει µόλις ενεργοποιηθεί ο ακροδέκτης TEST. Οι εξωτερικές διακοπές εξυπηρετούνται εφόσον είναι ενεργοποιηµένες.

Page 123: ΚΕΦΑΛΑΙΟ 1dima/wp-content/uploads/... · 1 ΚΕΦΑΛΑΙΟ 1 Ο ... διαιρέσεις. BX ∆είκτης για έµµεσο τρόπο προσδιορισµού διευθύνσεων

123

XCHG exchange XCHG <τελεστής 1> , <τελεστής 2> Ανταλλάσσει τα περιεχόµενα του τελεστή 1 µε τον τελεστή 2. XLAT exchange via Look up At Table XLAT Μεταφέρει το περιεχόµενο της δ/νσης µνήµης DS:[BX+AL] στον AL. Ο AL λειτουργεί και σαν δείκτης πίνακα στην µνήµη και σαν αποδέκτης. XOR eXclusive OR XOR <τελεστής 1> , <τελεστής 2> Λογικό bitwise XOR του τελεστή 2 στον τελεστή 1.

Page 124: ΚΕΦΑΛΑΙΟ 1dima/wp-content/uploads/... · 1 ΚΕΦΑΛΑΙΟ 1 Ο ... διαιρέσεις. BX ∆είκτης για έµµεσο τρόπο προσδιορισµού διευθύνσεων

124

ΠΑΡΑΡΤΗΜΑ

ΑΝΑΠΑΡΑΣΤΑΣΗ ∆Ε∆ΟΜΕΝΩΝ

Οι Η/Υ χειρίζονται τα δεδοµένα υπό µορφή αριθµών ή χαρακτήρων. Παρακάτω συνοπτικά θα εξετάσουµε την αναπαράσταση των κυριότερων µορφών των δεδοµένων εσωτερικά και όπως εµφανίζονται εξωτερικά στα πηγαία προγράµµατα ASSEMBLY 8086. Υπενθυµίζουµε ότι στον debuger τα δεδοµένα εµφανίζονται σε δεκαεξαδική µορφή.

ΕΣΩΤΕΡΙΚΗ ΑΝΑΠΑΡΑΣΤΑΣΗ ΤΩΝ ∆Ε∆ΟΜΕΝΩΝ

Τα δεδοµένα αποθηκεύονται σε έναν υπολογιστή υπό µορφή δυαδικών ψηφίων που αποκαλούνται BIT (BInary digiT). Η επεξεργασία των δεοµένων γίνεται συνήθως σε σύνολα από BIT µε συνηθέστερη των οµάδων από 8 BIT ονοµάζεται BYTE. Μια οµάδα 4 bit ονοµάζεται nibble, δηλαδή ένα byte αποτελείται από δύο nibble. Τα αριθµητικά δεδοµένα αποθηκεύονται εσωτερικά υπό µορφή ενός , δύο τεσσάρων ή και περισσοτέρων byte. Για ευκολία όµως στα παραδείγµατα που ακολουθούν θα αναφερόµαστε σε δεδοµένα µόνο ενός byte.

Όπως προαναφέρθηκε εκτός από τα δεδοµένα και το πρόγραµµα το οποίο

είναι ένα σύνολο από εντολές κάθε µία από τις οποίες εσωτερικά µετατρέπετε σε δυαδική µορφή (σύνολα από µερικά byte) σύµφωνα µε τον κώδικα της εταιρείας του µικροϋπολογιστή.

Παράσταση αριθµητικών δεδοµένων Θα αναφερθούµε µόνο στους ακέραιούς αριθµούς. ∆ιακρίνουµε τους µη

προσηµασµένους και τους προσηµασµένους. Θα εξετάσουµε µόνο την δυαδική αναπαράσταση των αριθµών και όχι άλλους τρόπους κωδικοποίησης (BCD κ.α.)

Μη προσηµασµένοι αριθµοί. Στην κωδικοποίηση αυτή οι ακέραιοι αριθµοί αναπαρίστανται µε άµεσο

δυαδικό συµβολισµό. Αυτό σηµαίνει ότι ο αριθµός µετατρέπεται εσωτερικά στο δυαδικό σύστηµα. Στο δυαδικό σύστηµα το δεξιότερο ψηφίο παριστάνει το δύο υψωµένο στην δύναµη του 0 (που αποκαλείται LSBIT, Less Significant BIT), το επόµενο αριστερά του το δύο υψωµένο στην δύναµη του 1, το επόµενο το δύο υψωµένο στην δύναµη του 2 κ.ο.κ µέχρι το τελευταίο αριστερά (που αποκαλείται MSBIT, More Significant BIT) που παριστάνει το 2 υψωµένο στην δύναµη n-1 όπου n µέγεθος σε bit της εσωτερικής αναπαράστασης του αριθµού. Προκειµένου για αποθήκευση ενός byte το n = 8. Έτσι ενός αριθµός µεγέθους ενός byte:

b7b6b5b4b3b2b1b0 Παριστάνει τον αριθµό: b7 2

7 b62

6 b5 2

5 b4 24

b3 2 3

b2 2 2

b1 2 1

b02 0

Page 125: ΚΕΦΑΛΑΙΟ 1dima/wp-content/uploads/... · 1 ΚΕΦΑΛΑΙΟ 1 Ο ... διαιρέσεις. BX ∆είκτης για έµµεσο τρόπο προσδιορισµού διευθύνσεων

125

∆ηλαδή ο δυαδικός αριθµός : 1 0 1 0 0 1 1 0 παριστάνει τον δεκαδικό : 1 Χ 128 + 0 Χ 64 + 1 Χ 32 + 0 Χ 16 + 0 Χ 8 + 1 Χ 4 + 1Χ 2 + 0 = 166 στο δεκαδικό σύστηµα. Το αντίστροφο οι δεκαδικοί αριθµοί µετατρέπονται δυαδικό σύστηµα µε συνεχής διαιρέσεις µε το 2 µέχρι να προκύψει πηλίκο 0. π.χ. ο δεκαδικός αριθµός 135 µετατρέπεται ως εξής: 135 : 2 = 67 υπόλοιπο 1 > 1 (χαµηλότερης τάξης bit) 67 : 2 = 33 υπόλοιπο 1 > 1 33 : 2 = 16 υπόλοιπο 1 > 1 16 : 2 = 8 υπόλοιπο 0 > 0 8 : 2 = 4 υπόλοιπο 0 > 0 4 : 2 = 2 υπόλοιπο 0 > 0 2 : 2 = 1 υπόλοιπο 0 > 0 1 : 2 = 0 υπόλοιπο 1 > 1 (υψηλότερης τάξης bit) ∆ηλαδή δυαδικός ισοδύναµος αριθµός είναι ο : 1 0 0 0 0 1 1 1 Με οκτώ bit µπορούµε να παραστήσουµε µη προσηµασµένους ακέραιούς αριθµούς του δυαδικού συστήµατος από 00000000 έως και 11111111 δηλαδή από 0 έως και 28 - 1 στο δεκαδικό σύστηµα (από 0 έως 255). Εάν από αριθµητική πράξη έχουµε µεγαλύτερο αποτέλεσµα θα προκύψει υπέρβαση κρατούµενου το οποίο αποθηκεύεται στην CF . Π.Χ. αν προστεθούν οι δυαδικοί αριθµοί (128)10 1 0 0 0 0 0 0 0 +(129)10 1 0 0 0 0 0 0 1 (257)10 (1) 0 0 0 0 0 0 0 1 Όπου (1) παριστά το κρατούµενο που αποθηκεύεται στη CF. Προσηµασµένοι αριθµοί Εάν το δεδοµένο θεωρηθεί ότι είναι προσηµασµένο, σαν πρόσηµο χρησιµεύει το αριστερότερο δυαδικό ψηφίο. Το 0 δηλώνει θετικό πρόσηµο και το 1 το αρνητικό πρόσηµο. Η αναπαράσταση των αρνητικών αριθµών γίνεται σύµφωνα µε τον συµβολισµό του «συµπληρώµατος ως προς 2». Με την λογική αυτή ο αντίθετος κάθε δυαδικού αριθµού προκύπτει µε την αντιστροφή όλων των δυαδικών ψηφίων (τα 0 σε 1 και τα 1 σε 0 ) και την πρόσθεση µιας µονάδας στο αποτέλεσµα. Π.Χ. αν θεωρήσουµε σε αριθµούς µεγέθους ενός BYTE ο αντίθετος του δυαδικού αριθµού 0 0 0 0 0 1 0 1 (5)10 δηλαδή ο δεκαδικός αριθµός 5 είναι :

Page 126: ΚΕΦΑΛΑΙΟ 1dima/wp-content/uploads/... · 1 ΚΕΦΑΛΑΙΟ 1 Ο ... διαιρέσεις. BX ∆είκτης για έµµεσο τρόπο προσδιορισµού διευθύνσεων

126

1 1 1 1 1 0 1 0 συµπλήρωµα ως προς ένα του αριθµού + 1 1 1 1 1 1 0 1 1 (-5)10 Με οκτώ bit µπορούµε να παραστήσουµε προσηµασµένους ακέραιούς αριθµούς του δυαδικού συστήµατος από 10000000 έως και 01111111 δηλαδή από -27-1 έως και 27 - 1 στο δεκαδικό σύστηµα (από -128 έως +127). Εάν από αριθµητική πράξη έχουµε µεγαλύτερο ή µικρότερο αποτέλεσµα από τα παραπάνω όρια θα προκύψει υπερχείλιση η οποία αποθηκεύεται στην ΟF . Π.Χ. αν προστεθούν οι δυαδικοί αριθµοί ( 64)10 0 1 0 0 0 0 0 0 +( 65)10 0 1 0 0 0 0 0 1 (129)10 1 0 0 0 0 0 0 1 Προκύπτει υπερχείλιση λόγω υπέρβασης στο 6ο bit χωρίς να υπάρχει υπέρβαση στο 7ο bit. Aν όµως προστεθούν οι δυαδικοί αριθµοί ( -1)10 1 1 1 1 1 1 1 1 +( -2)10 1 1 1 1 1 1 1 0 (-3)10 1 1 1 1 1 1 0 1 ∆εν προκύπτει υπερχείλιση λόγω υπέρβασης στο 6ο bit µε σύγχρονη υπέρβαση και στο 7ο bit Αλφαριθµητικά δεδοµένα. Τα αλφαριθµητικά δεδοµένα δηλαδή οι χαρακτήρες κωδικοποιούνται σύµφωνα µε τον κώδικα ASCII (American Standard Code for Information) των χαρακτήρων που χρησιµοποιείται διεθνώς στον κόσµο των µικροϋπολογιστών. Στον κώδικα αυτόν κωδικοποιούµε 26 κεφαλαία γράµµατα του λατινικού αλφάβητου συν 26 πεζά γράµµατα συν 10 αριθµητικά σύµβολα συν 20 ειδικά σύµβολα. Η κωδικοποίηση αυτή επιτυγχάνεται µε συνδυασµούς 7 δυαδικών ψηφίων που δίνουν συνολικά 27 = 128 συνδυασµούς. Το πιο σηµαντικό bit είναι 0. Εφόσον το bit αυτό τεθεί 1 προκύπτουν άλλες 128 θέσεις (από 128 έως και 255) στις οποίες αποθηκεύουµε µη συνήθεις χαρακτήρες (γραφικούς κ.λ.π.) . Οι θέσεις αυτές αποτελούν τον extended ASCII. Παρατηρούµε ότι οι 32 πρώτες θέσεις του κώδικα ASCII είναι µη εµφανίσιµοι χαρακτήρες που αντιπροσωπεύουν ενέργειες του λειτουργικού συστήµατος. Οι ενέργειες αυτές επεξηγούνται παρακάτω µετά τον κώδικα ASCII που ακολουθεί.

Page 127: ΚΕΦΑΛΑΙΟ 1dima/wp-content/uploads/... · 1 ΚΕΦΑΛΑΙΟ 1 Ο ... διαιρέσεις. BX ∆είκτης για έµµεσο τρόπο προσδιορισµού διευθύνσεων

127

ΠΙΝΑΚΑΣ ASCII

HEX MSD 0 1 2 3 4 5 6 7 LSD BITS 0000 0001 0010 0011 0100 0101 0110 0111

0 0000 NUL DLE SPACE 0 @ P ` p 1 0001 SOH DC1 ! 1 A Q a q 2 0010 STX DC2 “ 2 B R b r 3 0011 ETX DC3 # 3 C S c s 4 0100 EOT DC4 $ 4 D T d t 5 0101 ENQ NAK % 5 E U e U 6 0110 ACK SYN & 6 F V f v 7 0111 BEL ETB ‘ 7 G W g w 8 1000 BS CAN ( 8 H X h x 9 1001 HT EM ) 9 I Y i y A 1010 LF SUB * : J Z j z B 1011 VT ESC * ; K [ k C 1100 FF FS , < L \ l | D 1101 CR GS - = M ] m E 1110 SO RS . > N ^ n ~ F 1111 SI US / ? O _ o DEL

ΤΑ ΣΥΜΒΟΛΑ ASCII

NUL - Κενό DLE – ∆ιαφυγή συνδέσµου δεδοµένων SOH – Αρχή Επικεφαλίδας DC1 – Έλεγχος συσκευής STX – Αρχή κειµένου DC2 – Έλεγχος συσκευής ETX – Τέλος κειµένου DC3 – Έλεγχος συσκευής EOT – Τέλος µετάδοσης DC4 – Έλεγχος συσκευής ENQ – Αίτηση NAK – Αρνητική αποδοχή ACK – Αποδοχή SYN - Νεκρός χρόνος σύγχρονης µετάδοσης BEL - Βοµβητής ETB – Τέλος µπλοκ µετάδοσης BS - Οπισθοδρόµηση CAN - Ακύρωση HT – Οριζόντια στοίχιση EM – Τέλος µέσου LF – Τροφοδοσία γραµµής SUB - Υποκατάσταση VT – Κατακόρυφη στοίχιση ESC – ∆ιαφυγή FF – Τροφοδοσία σελίδας FS - ∆ιαχωριστής αρχείων CR – Επιστροφή κέρσορα GS – ∆ιαχωριστής οµάδων SO – Αλλαγή εκτός RS – ∆ιαχωριστής εγγράφων SI – Αλλαγή εντός US – ∆ιαχωριστής µονάδων SPACE – ∆ιάστηµα DEL – ∆ιαγραφή

Page 128: ΚΕΦΑΛΑΙΟ 1dima/wp-content/uploads/... · 1 ΚΕΦΑΛΑΙΟ 1 Ο ... διαιρέσεις. BX ∆είκτης για έµµεσο τρόπο προσδιορισµού διευθύνσεων

128

ΕΞΩΤΕΡΙΚΗ ΑΝΑΠΑΡΑΣΤΑΣΗ ΤΩΝ ∆Ε∆ΟΜΕΝΩΝ

Η εξωτερική αναπαράσταση αφορά τον τρόπο µε τον οποίο εµφανίζονται τα δεδοµένα στο πηγαίο αρχείο της ASSEMBLY 8086. Τα δεδοµένα εµφανίζονται σε µορφή χαρακτήρων µέσα σε απλά ή διπλά εισαγωγικά, σε µορφή δεκαδικών αριθµών , σε µορφή δεκαεξαδικών αριθµών ή σε µορφή δυαδικών αριθµών. Για τα αλφαριθµητικά δεν έχουµε να προσθέσουµε τίποτα παραπάνω. Κάθε χαρακτήρας κατά την µετάφραση θα µετατραπεί σε δυαδικό αριθµό σύµφωνα µε τον παραπάνω κώδικα ASCII.

Οι αριθµοί του δεκαδικού συστήµατος προαιρετικά συνοδεύονται από το σύµβολό D ( Decimal ) . Π.Χ. µε την παρακάτω δήλωση δηλώνω δύο αριθµούς του δεκαδικού συστήµατος τους 14 και 13 οι οποίοι κατά την µετάφραση θα καταλάβουν δύο θέσεις µνήµης µεγέθους ενός byte η κάθε µία. DB 14,13D Οι δυαδικοί αριθµοί συνοδεύονται υποχρεωτικά από το σύµβολο B (Binary). Οι δυαδικοί αριθµοί έχουν σαν µοναδικά σύµβολα αναπαράστασης τα ψηφία του δυαδικού συστήµατος 0 και 1. Π.Χ. µε την παρακάτω δήλωση : DB 01010101B, 11111111b

∆ηλώνουµε δύο αριθµούς του δυαδικού συστήµατος οι οποίοι κατά την µετάφραση θα καταλάβουν δύο θέσεις µνήµης µεγέθους ενός byte η κάθε µία. Τέλος οι αριθµοί του δεκαεξαδικού συστήµατος συνοδεύονται από το σύµβολο H (Hex). Το δεκαεξαδικό σύστηµα έχει δεκαέξη ψηφία, τα πρώτα δέκα τα δανείζεται από το δεκαδικό σύστηµα για δε τα δε υπόλοιπα έξη δανείζεται τα πρώτα έξη γράµµατα του λατινικού αλφάβητου. Σε κάθε ψηφίο του δεκαεξαδικού συστήµατος αντιστοιχούν τέσσερα ψηφία του δυαδικού συστήµατος σύµφωνα µε τον παρακάτω πίνακα:

∆εκαεξαδικό ∆υαδικό ∆εκαδικό

0 0000 0 1 0001 1 2 0010 2 3 0011 3 4 0100 4 5 0101 5 6 0110 6 7 0111 7 8 1000 8 9 1001 9 A 1010 10 B 1011 11 C 1100 12 D 1101 13 E 1110 14 F 1111 15

Page 129: ΚΕΦΑΛΑΙΟ 1dima/wp-content/uploads/... · 1 ΚΕΦΑΛΑΙΟ 1 Ο ... διαιρέσεις. BX ∆είκτης για έµµεσο τρόπο προσδιορισµού διευθύνσεων

129

Σύµφωνα µε τον παραπάνω πίνακα πολύ εύκολα µετατρέπεται ένας αριθµός του δυαδικού συστήµατος στο δεκαεξαδικό σύστηµα και το αντίθετο . Π.Χ. Ο αριθµός 1 4 A F Η του δεκαεξαδικού συστήµατος είναι ο 0 0 0 1 0 1 0 0 1 0 1 0 1 1 1 1 Β του δυαδικού. Η χρησιµότητα δηλαδή του δεκεξαδικού συστήµατος είναι ότι µπορεί να θεωρηθεί ως συντοµογραφία του δυαδικού συστήµατος. Αν το σηµαντικότερο ψηφίο του δεκαεξαδικού αριθµού είναι γράµµα του λατινικού αλφάβητού πρέπει αριστερά του αριθµού να προστεθεί και το ψηφίο 0, αλλιώς ο συµβολοµεταφραστής εκλαµβάνει τον αριθµό σαν άλλο σύµβολο και όχι ως αριθµητική σταθερά. Π.Χ. το σύµβολο CH είναι το υψηλό (High) τµήµα του καταχωρητή CX ενώ το σύµβολο 0CX είναι ο αριθµός 12 στο δεκαεξαδικό σύστηµα. Με την παρακάτω δήλωση : DB 0ACH,12H

∆ηλώνουµε δύο αριθµούς του δεκαεξαδικού συστήµατος οι οποίοι κατά την µετάφραση θα καταλάβουν δύο θέσεις µνήµης µεγέθους ενός byte η κάθε µία. Περιττό είναι να επαναλάβουµε ότι µετά την µετάφραση εσωτερικά όλες οι σταθερές θα µετατραπούν στο δυαδικό σύστηµα.

Page 130: ΚΕΦΑΛΑΙΟ 1dima/wp-content/uploads/... · 1 ΚΕΦΑΛΑΙΟ 1 Ο ... διαιρέσεις. BX ∆είκτης για έµµεσο τρόπο προσδιορισµού διευθύνσεων

130

ΒΙΒΛΙΟΓΡΑΦΙΑ

Ιωάννη Γαβρηιλίδη Σηµειώσεις ASSEMBLER 8086 DOS

1989

Kris jamsa Programming the complete Reference

1991

Νίκος Νασουφης 8088 8086 Προγραµµατισµός και εφαρµογές για IBM PC/TX & Συµβατούς

1987

Microsoft Microsoft. MS-DOS Operating System For Personal Computers Compatible with IBM.

1990

Leo J. Scanlon 8086/88 ASSEMBLY LANGUAGE PROGRAMMING

1984

James W. Cofron PROGRAMMING THE 8086/88

1987

Peter Norton ASSEMBLY Language Book

1986

Peter Norton Inside the IBM PC, Revised and Enlarged

1986

Rodert Jourdain Programmer’s Problem Solver for IBM PC XT & AT

1987

Russel Rector - George Alexy - -

THE 8086 BOOK 1980

Borland International Turbo Assembler User’s Guide

1988

Borland International Turbo Assembler Reference Guide 1988