[Contents][Next] [Art of Assembly][Randall Hyde]

Art of Assembly Language: Κεφαλαιο 4


ΚΕΦΑΛΑΙΟ 4 ΔΙΑΤΑΞΗ ΚΑΙ ΠΡΟΣΒΑΣΗ ΜΝΗΜΗΣ

4.0 Περίληψη κεφαλαίου
4.1 Οι 80x86 CPUs : Από την πλευρά του προγραμματιστή
4.1.1 Οι 8086 καταχωρητές γενικού σκοπού
4.1.2 Οι 8086 καταχωρητές τμήματος
4.1.3 Οι 8086 καταχωρητές ειδικού σκοπού
4.1.4 Οι 80286 καταχωρητές
4.1.5 Οι 80386/80486 καταχωρητές
4.2 Η 8086 φυσική οργάνωση της μνήμης
4.3 Τμήματα στους 80x86
4.4 Κανονικοποιημένες διευθύνσεις στους 80x86
4.5 Καταχωρητές τμήματος στους 80x86 επεξεργαστές
4.6. The 80x86 Addressing Mode
4.6.1. Register Addressing Modes
4.6.2. 8086 Memory Addressing Modes
4.6.2.1. Ο τύπος Displacement Only
4.6.2.2. Οι έμμεσοι τύποι διευθυνσιοδότησης καταχωρητών.
4.6.2.3. Δεικτοδοτούμενοι τύποι διευθυνσιοδότησης
4.6.2.4. Based Indexed Addressing Modes
4.6.2.5. Based Indexed Plus Displacement Addressing Modes
4.6.2.6. Ένας εύκολος τρόπος για να θυμάστε τους 8086 τύπους διευθυνσιοδότησης μνήμης .
4.6.2.7. Τελευταίες Παρατηρήσεις για τους 8086 Addressing Modes.
4.6.3. Οι 80386 Τύποι Διευθυνσιοδότησης Καταχωρητή.
4.6.4. Οι 80386 Τύποι Διευθυνσιοδότησης Μνήμης .
4.6.4.1. Register Indirect Addressing Modes
4.6.4.2. 80386 Indexed, Base / Indexed and Base / Indexed / Disp Addressing Modes.
4.6.4.3. Οι 80386 Scaled Indexed Addressing Modes
4.6.4.4. Μερικές Τελευταίες Παρατηρήσεις για τον 80386 Τύπο         Διευθυνσιοδότησης Μνήμης.
4.7. Η Εντολή MOV του 80x86
4.8. Τελευταίες Παρατηρήσεις πάνω στην εντολή MOV
 


Copyright 1996 by Randall Hyde

All rights reserved.

Duplication other than for immediate display through a browser is prohibited by U.S. Copyright Law.

This material is provided on-line as a beta-test of this text. It is for the personal use of the reader only. If you are interested in using this material as part of a course, please contact

rhyde@cs.ucr.edu

Supporting software and other materials are available via anonymous ftp from ftp.cs.ucr.edu. See the "/pub/pc/ibmpcdir" directory for details. You may also download the material from "Randall Hyde's Assembly Language Page" at URL:

http://webster.ucr.edu

Notes:

This document does not contain the laboratory exercises, programming assignments, exercises, or chapter summary. These portions were omitted for several reasons: either they wouldn't format properly, they contained hyperlinks that were too much work to resolve, they were under constant revision, or they were not included for security reasons. Such omission should have very little impact on the reader interested in learning this material or evaluating this document.

This document was prepared using Harlequin's Web Maker 2.2 and Quadralay's Webworks Publisher. Since HTML does not support the rich formatting options available in Framemaker, this document is only an approximation of the actual chapter from the textbook.

If you are absolutely dying to get your hands on a version other than HTML, you might consider having the UCR Printing a Reprographics Department run you off a copy on their Xerox machines. For details, please read the following EMAIL message I received from the Printing and Reprographics Department:

Hello Again Professor Hyde,

Dallas gave me permission to take orders for the Computer Science 13 Manuals. We would need to take charge card orders. The only cards we take are: Master Card, Visa, and Discover. They would need to send the name, numbers, expiration date, type of card, and authorization to charge $95.00 for the manual and shipping, also we should have their phone number in case the company has any trouble delivery. They can use my e-mail address for the orders and I will process them as soon as possible. I would assume that two weeks would be sufficient for printing, packages and delivery time.

I am open to suggestions if you can think of any to make this as easy as possible.

Thank You for your business,

Kathy Chapman, Assistant
Printing and Reprographics
University of California
Riverside
(909) 787-4443/4444

We are currently working on ways to publish this text in a form other than HTML (e.g., Postscript, PDF, Frameviewer, hard copy, etc.). This, however, is a low-priority project. Please do not contact Randall Hyde concerning this effort. When something happens, an announcement will appear on "Randall Hyde's Assembly Language Page." Please visit this WEB site at http://webster.ucr.edu for the latest scoop.





ΚΕΦΑΛΑΙΟ 4     ΔΙΑΤΑΞΗ ΚΑΙ ΠΡΟΣΒΑΣΗ ΜΝΗΜΗΣ

 
 Αυτο το κεφαλαιο ασχολειται με το πως οι 8086 CPU προσπελαυνουν δεδομενα στη μνημη.



 


4.0 Περίληψη κεφαλαίου

Αυτό το κεφάλαιο, αναφέρεται στην διευθυνσιοδότηση της μνήμης, την οργάνωση της μνήμης, τους τύπους διευθυνσιοδότησης της CPU και την αναπαράσταση δεδομένων στη μνήμη. Από την πλευρά προγραμματισμού σε γλώσσα assembly, αυτό το κεφάλαιο αναφέρεται στις ομάδες 80x86 καταχωρητών, τους 80x86 τρόπους διευθυνσιοδότησης και τους σύνθετους τύπους δεδομένων.

Το κεφάλαιο ξεκινάει με τους καταχωρητές των 80x86 επεξεργαστών. Αυτοί οι επεξεργαστές παρέχουν μία ομάδα από καταχωρητές γενικού σκοπού, καταχωρητές τμημάτων και κάποιους ειδικούς καταχωρητές.

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

Οι 80x86 τρόποι διευθυνσιοδότησης είναι ίσως το πιο σημαντικό θέμα αυτού του κεφαλαίου. Χωρίς τη γνώση τους είναι αδύνατο να γράψετε λογικά προγράμματα σε γλώσσα assembly.  Αυτό το κεφάλαιο επίσης μας εισάγει σε κάποιες βοηθητικές 80x86 εντολές. Παρόλο που αυτές οι εντολές, στις οποίες αναφέρεται το κεφάλαιο είναι ανεπαρκείς για να γραφτούν πραγματικά προγράμματα μηχανής, δίνουν τη δυνατότητα για χειρισμό των μεταβλητών και των δομών δεδομένων.
 
 


4.1 Οι 80x86 CPUs : Από την πλευρά του προγραμματιστή
 
Εδώ θα αναφερθούμε σε μερικούς πραγματικούς  επεξεργαστές : 8088/8086, 80188/80186, 80286 και 80386/80486/80586/pentium. Στο κεφάλαιο 3 ασχοληθήκαμε με πολλά τμήματα του hardware ενός Η/Υ. Εδώ θα ασχοληθούμε με εκείνα τα συστατικά της CPU που είναι πιο ορατά στον προγραμματιστή γλώσσας assembly.

Το πιο ορατό συστατικό της CPU είναι η ομάδα των καταχωρητών. Το καλύτερο μέρος για να ξεκινήσουμε είναι με την ομάδα καταχωρητών 8088, 8086, 80188 και 80186 μια και αυτοί οι τέσσερις επεξεργαστές έχουν τους ίδιους καταχωρητές. Παρακάτω ο όρος ‘8086’ θα αφορά οποιαδήποτε από αυτές τις 4 CPU.

Οι σχεδιαστές της Intel έχουν ταξινομήσει τους καταχωρητές 8086 σε τρείς κατηγορίες : τους καταχωρητές γενικού σκοπού, τους καταχωρητές τμημάτων και τους ετερογενείς καταχωρητές. Οι καταχωρητές γενικού σκοπού είναι εκείνοι που μπορεί να εμφανίζονται ως τελεστές αριθμητικών, λογικών και σχεσιακών εντολών. Παρόλο που αυτοί οι καταχωρητές είναι ‘γενικού σκοπού’, καθένας έχει το δικό του σκοπό. Η Intel χρησιμοποιεί τον όρο ‘γενικού σκοπού’ αόριστα. Παρακάτω θα αναφερθούμε σε κάθε κατηγορία καταχωρητών αναλυτικότερα.
 


4.1.1 Οι 8086 καταχωρητές γενικού σκοπού

Υπάρχουν  οχτώ 16bit καταχωρητές γενικού σκοπού στους 8086 επεξεργαστές : ax, bx, cx, dx, si, di, dp και sp. Ενώ γενικά μπορούμε να χρησιμοποιήσουμε αυτούς τους καταχωρητές εναλλακτικά σε έναν υπολογισμό, πολλές εντολές λειτουργούν πιο αποτελεσματικά ή απαιτούν οπωσδήποτε ένα συγκεκριμένο καταχωρητή από αυτή την ομάδα.

Ο ax καταχωρητής (Συσσωρευτής, Accumulator) είναι εκεί όπου λαμβάνουν χώρα οι περισσότεροι αριθμητικοί και λογικοί υπολογισμοί. Παρόλο που μπορούν να γίνουν οι λογικές και αριθμητικές λειτουργίες και σε άλλους καταχωρητές, είναι συχνά πιο αποδοτικό να χρησιμοποιούνται ο ax καταχωρητής για τέτοιους υπολογισμούς. Ο bx (Βάση, Base) καταχωρητής έχει επίσης κάποιους ειδικούς σκοπούς. Συνήθως χρησιμοποιείται για να κρατάει έμμεσες διευθύνσεις , όπως ο bx καταχωρητής στους επεξεργαστές x86. Ο cx καταχωρητής (Μετρητής, count) μετράει πράγματα. Συχνά χρησιμοποιείται για να υπολογίζει τον αριθμό των επαναλήψεων σε ένα βρόγχο (loop) ή για να  καθορίσει τον αριθμό των χαρακτήρων ενός αλφαριθμητικού. Ο καταχωρητής dx έχει δύο  ειδικούς σκοπούς : κρατάει την υπερχείλιση από συγκεκριμένες αριθμητικές λειτουργίες και κρατάει τις διευθύνσεις εισόδου/εξόδου όταν προσπελαύνει δεδομένα στον δίαυλο I/O.

Οι καταχωρητές si και di (δείκτης πηγής και δείκτης προορισμού, Source Index & Destination Index) έχουν κάποιους ειδικούς σκοπούς επίσης. Μπορεί να χρησιμοποιηθούν ως δείκτες όπως και o bx για έμμεση πρόσβαση στη μνήμη. Ακόμη  αυτοί οι καταχωρητές χρησιμοποιούνται με τις 8086 string εντολές, όταν επεξεργαζόμαστε χαρακτήρες αλφαριθμητικών .

Ο καταχωρητής bp (δείκτης βάσης, base pointer) είναι παρόμοιος με τον bx καταχωρητή. Αυτός ο καταχωρητής θα χρησιμοποιηθεί γενικά για την πρόσβαση παραμέτρων και τοπικών μεταβλητών σε μια διαδικασία.

Ο καταχωρητής sp (δείκτης στοίβας, stuck pointer) έχει ένα πολύ ειδικό σκοπό - διατηρεί τη στοίβα του προγράμματος. Κανονικά δεν χρησιμοποιείται αυτός ο καταχωρητής για αριθμητικούς υπολογισμούς. Η σωστή λειτουργία των περισσότερων προγραμμάτων εξαρτάται από τη σωστή λειτουργία αυτού του καταχωρητή.

Εκτός από τους οχτώ 16bits καταχωρητές οι 8086 CPUs έχουν επίσης οχτώ 8bits καταχωρητές. Η intel καλεί αυτούς τους καταχωρητές al, ah, bl, bh, cl, ch, dl και dh.  Παρατήρουμε μια ομοιότητα μεταξύ των ονομάτων αυτών των καταχωρητών και των ονομάτων μερικών από τους 16bits καταχωρητών (ax, bx, cx και dx για να είμαστε ακριβείς). Οι 8bits καταχωρητές δεν είναι ανεξάρτητοι. Ο al  κρατάει το  L.O byte του ax και ο ah  το Η.Ο byte. Τα ονόματα των άλλων 8 καταχωρητών σημαίνουν το ίδιο και για τους bx, cx και dx αντάστοιχα. Το παρακάτω σχήμα δείχνει τους καταχωρητές γενικού σκοπού.
 

 

 
 
 

Εδώ πρέπει να σημειωθεί ότι οι 8bit καταχωρητές δεν αποτελούν μια ανεξάρτητη ομάδα καταχωρητών. Αν μεταβάλλουμε το περιεχόμενο του al θα αλλάξει και η αξία του ax και έτσι θα αλλάξει  και ο ah. Η αξία του al ανταποκρίνεται στα  bits 0 ως 7 του ax. Η αξία του ah ανταποκρίνεται στα bits 8 ως 15 του ax. Έτσι οποιαδήποτε αλλαγή στον al ή ah θα έχει σαν συνέπεια την αλλαγή στον ax. Ισχύει και το αντίστροφο, δηλαδή αλλάζοντας τον ax θα αλλάξει αντίστοιχα και ο al και ο ah. Όμως αλλάζοντας τον al δεν θα επηρεαστεί η αξία του ah και  αντίστροφα. Τα παραπάνω ισχύουν και για τους καταχωρητές bx/bl/bh, cx/xl/xh και dx/dl/dh .

Οι καταχωρητές si, di, bp και sp είναι μόνο 16 bits. Δεν υπάρχει τρόπος για άμεση πρόσβαση των μεμονωμένων bytes των ax,bx,cx και dx.
 
 


4.1.2 Οι 8086 καταχωρητές τμήματος

Οι 8086 επεξεργαστές έχουν 4 ειδικούς καταχωρητές τμημάτων: cs,ds,es και ss. Αυτοί αντιπροσωπεύουν τα code segment (τμήμα κώδικα), data segment (τμήμα δεδομένων), extra segment (επιπλέον τμήμα)  και stack segment (τμήμα στοίβας). Αυτοί οι καταχωρητές είναι όλοι  μεγέθους 16 bits. Ασχολούνται με την επιλογή μπλόκς (τμημάτων) από την κυρίως μνήμη. Ένας καταχωρητής τμήματος (για παράδειγμα ο cs) δείχνει στην αρχή ενός τμήματος στη μνήμη.

Τα τμήματα της μνήμης στους 8086 δεν μπορούν να είναι μεγαλύτερα από 65,536 bytes. Αυτός ο περιορισμός σε 64Κ των τμημάτων έχει ενοχλήσει πολύ τους προγραμματιστές. Θα δούμε μερικά προβλήματα αργότερα που προκαλεί αυτός ο περιορισμός των 64Κ και κάποιες λύσεις σε αυτά.

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

Ο καταχωρητής τμήματος δεδομένων, ds, γενικά δείχνει στις γενικές μεταβλητές του προγράμματος. Πάλι είμαστε περιορισμένοι στα 65,536 bytes δεδομένων στο τμήμα δεδομένων. Αλλά μπορούμε πάντα να αλλάζουμε την αξία του ds για να έχουμε πρόσβαση σε επιπλέον δεδομένα σε άλλα τμήματα.

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

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

Παρόλο που είναι θεωρητικά πιθανό να αποθηκεύονται δεδομένα στους καταχωρητές τμήματος, αυτό δεν είναι ποτέ μια καλή ιδέα. Οι καταχωρητές τμήματος έχουν έναν πολύ ειδικό σκοπό- να δείχνουν σε προσβάσιμα μπλόκ στη μνήμη. Κάθε προσπάθεια για χρήση των καταχωρητών για άλλο σκοπό μπορεί να έχει καταστροφικά αποτελέσματα, ιδιαίτερα αν προσπαθήσουμε να μετακινηθούμε σε μια καλύτερη CPU όπως η 80386.


4.1.3 Οι 8086 καταχωρητές ειδικού σκοπού

 Υπάρχουν  2 ειδικού σκοπού καταχωρητές στις 8086 CPU: ο δείκτης εντολών (instruction pointer, ip), και ο καταχωρητής σημαίας (flags register). Δεν μπορούμε να προσπελάσουμε με τον ίδιο τρόπο αυτούς τους καταχωρητές, όπως τους προηγούμενους 8086 καταχωρητές. Αντίθετα η CPU γενικά χειρίζεται αυτούς τους καταχωρητές άμεσα.

Ο ip καταχωρητής είναι ισοδύναμος με τον ip στους x86 επεξεργαστές- περιέχει τη διεύθυνση της εντολής που εκτελείται κάθε φορά. Αυτός είναι ένας 16bit καταχωρητής, που παρέχει ένα δείκτη στο τρέχων τμήμα κώδικα (τα16bits επιτρέπουν την επιλογή οποιασδήποτε από τις 65,536 διαφορετικές τοποθεσίες). Θα επιστρέψουμε σε αυτόν τον καταχωρητή όταν συζητήσουμε τις εντολές μεταφοράς ελέγχου.

Ο καταχωρητής σημαίας είναι ανόμοιος από τους άλλους καταχωρητές στους 8086. Οι άλλοι καταχωρητές κρατούν αξίες 8 ή 16bit.  Ο καταχωρητής σημαίας είναι απλά μια εκλεκτική συλλογή από αξίες ενός bit, που βοηθούν στον καθορισμό της τρέχουσας κατάστασης του επεξεργαστή. Παρόλο που ο καταχωρητής σημαίας είναι μεγέθους 16bits, ο 8086 χρησιμοποιεί μόνο 9 από αυτά. Από αυτές τις σημαίες θα συναντούμε 4 συνέχεια: μηδέν(zero), κρατούμενο(carry), πρόσημο(sign) και υπερχείλιση(overflow). Αυτές οι σημαίες είναι οι 8086 κωδικοί κατάστασης. Ο καταχωρητής σημαίας εμφανίζεται παρακάτω:
 
 

 
 


4.1.4 Οι 80286 καταχωρητές

Αυτό το κεφάλαιο δεν θα καλύψει τη λειτουργία προστατευόμενης  κατάστασης  για διάφορους λόγους. Πρώτα πρώτα γιατί είναι φτωχά σχεδιασμένη. Δεύτερον γιατί ενδιαφέρει μόνο τους προγραμματιστές που γραφούν το δικό τους λειτουργικό σύστημα ή προγράμματα συστήματος για τέτοια λειτουργικά συστήματα. Ακόμη κι αν κάποιος γράφει λογισμικό για  ένα προστατευόμενης  κατάστασης λειτουργικό σύστημα, όπως το Unix ή το OS/2, δεν θα χρησιμοποιήσει τα χαρακτηριστικά του προστατευόμενης  κατάστασης του 80286. Παρ' όλα αυτά, είναι χρήσιμο να επισημάνουμε τους επιπλέον καταχωρητές και τους καταχωρητές κατάστασης  σημαίας που παρουσιάζονται στους 80286, για την περίπτωση που θα τους συναντήσουμε τυχαία.

Υπάρχουν 3 επιπρόσθετα bit στους καταχωρητές σημαίας του 80286. Το I/O προνομιακό επίπεδο είναι αξίας 2 bits( bits 12 και 13). Ορίζει ένα από τέσσερα διαφορετικά προνομιακά επίπεδα, απαραίτητα για την εκτέλεση I/O λειτουργιών. Αυτά τα δύο bit γενικά περιέχουν 00b, όταν λειτουργούν σε πραγματική κατάσταση  στους 80286 (ο 8086 τρόπος εξομοίωσης). Η σημαία του NT(nested task/ένθετο τμήμα), ελέγχει τη λειτουργία μιας επιστροφής  διακοπής (interrupt return, IRET) εντολής. Το NT είναι φυσιολογικά 0 για προγράμματα πραγματικής κατάστασης.

Εκτός από τα επιπλέον bits στους καταχωρητές σημαίας, ο 80286 έχει ακόμη 5 επιπρόσθετους καταχωρητές , που χρησιμοποιούνται από το λειτουργικό σύστημα για να υποστηρίξουν τη διαχείριση της μνήμης και άλλες διαδικασίες: τη λέξη κατάστασης μηχανής (machine status word, msw), τον καταχωρητή γενικής περιγραφής (global descriptor table register, gdtr), τον καταχωρητή τοπικής περιγραφής (local descriptor table register, ldtr), τον καταχωρητή περιγραφής των διακοπών (interrupt descriptor table register, idtr) και τον καταχωρητή εργασίας (task register, tr).

Μια τυπική εφαρμογή προγράμματος  για την προστατευόμενη κατάσταση στον 80286, είναι η προσπέλαση πάνω από 1 Megabyte RAM. Ωστόσο, καθώς τώρα οι 80286 είναι άχρηστοι και υπάρχουν καλύτεροι τρόποι πρόσβασης περισσότερης μνήμης στους μετέπειτα επεξεργαστές, οι προγραμματιστές σπάνια χρησιμοποιούν αυτή τη λειτουργία προστατευόμενης  κατάστασης.
 


4.1.5 Οι 80386/80486 καταχωρητές

Ο 80386 επεξεργαστής επέκτεινε δραματικά το σετ των καταχωρητών 8086. Εκτός από τους επιπλέον καταχωρητές του 80286, στον 80386 προστέθηκαν διάφοροι νέοι καταχωρητές και επεκτάθηκε ο ορισμός των υπαρχόντων καταχωρητών. Στον 80486 δεν προστέθηκαν περισσότεροι καταχωρητές, αλλά ορίστηκαν κάποια bits σε ορισμένους καταχωρητές, που δεν είχαν οριστεί στον 80386.

Η πιο σημαντική αλλαγή, από την πλευρά των προγραμματιστών, στον 80386 ήταν η εισαγωγή ενός σετ 32bit καταχωρητών. Οι ax, bx, cx, dx, si, di, bp, sp, flags και ip καταχωρητές, όλοι  επεκτάθηκαν σε 32bits. Ο 80386 καλεί αυτές αυτές τις νέες 32bits εκδόσεις eax, ebx, ecx, adx, esi, edi, ebp, esp, eflags και eip για να τις διαφοροποιήσει από τις 16bit εκδόσεις (που είναι ακόμη διαθέσιμες στον 80386). Εκτός από τους 32bit  ο 8086 παρέχει 2 νέους 16 bit καταχωρητές τμήματος, fs και gs, που επιτρέπουν στον προγραμματιστή την ταυτόχρονη πρόσβαση   6 διαφορετικών τμημάτων στη μνήμη χωρίς επαναφόρτωση του καταχωρητής τμήματος. Σημειώνουμε ότι όλοι οι καταχωρητές τμήματος στον 80386 είναι 16bits. Ο 80386 δεν επέκτεινε τους καταχωρητές τμήματος σε 32 bits όπως έκανε στους άλλους καταχωρητές.

Ο 80386 δεν έκανε αλλαγές στα bits του καταχωρητή σημαίας. Αντίθετα τον επέκτεινε σε 32bits (τον 'eflags' καταχωρητή) και καθόρισε τα bits 16 και 17. Το bit 16 είναι η σημαία επανεκκίνησης αποσφαλμάτωσης (debug resume flag, RF) , που χρησιμοποιείται με το σετ των 80386 καταχωρητών αποσφαλματωτών. To bit 17 είναι η εικονική 8086 σημαία κατάστασης (Virtual mode flag, VM) που καθορίζει αν ο επεξεργαστής λειτουργεί σε εικονική-86 κατάσταση (που εξομοιώνει έναν 8086) ή σε πρότυπη προστατευόμενη κατάσταση. O 80486 προσθέτει ένα τρίτο bit στον eflags καταχωρητή στη θέση 18- τη σημαία ελέγχου στοίχισης. Μαζί με τον καταχωρητή ελέγχου μηδέν (Control Register 0, CR0) στον 80486, αυτή η σημαία θέτει μια παγίδα (αναστολή/διακοπή προγράμματος) όποτε ο επεξεργαστής προσπελαύνει μη-στοιχισμένα δεδομένα (για παράδειγμα μια λέξη σε μια περιττή διεύθυνση ή μια διπλή λέξη σε μια διεύθυνση που δεν είναι ένα  πολλαπλάσιο του 4).
 
Στον  80386 προστέθηκαν 4 καταχωρητές ελέγχου: CR0-CR3. Αυτοί οι καταχωρητές επέκτειναν τον msw καταχωρητή του 80286 (ο 80386 εξομοιώνει τον 80286 msw καταχωρητή για συγκρισιμότητα, αλλά η πληροφορία εμφανίζεται πραγματικά στους CRx καταχωρητές). Στους 80386 και 80486 αυτοί οι καταχωρητές ελέγχουν λειτουργίες όπως η διαχείριση της σελιδοποιημένης μνήμης, η λειτουργία ενεργοποίησης και απενεργοποίησης της κρυφής μνήμης (μόνο στους 80486), η λειτουργία της προστατευόμενης κατάστασης και αλλά.

Στους 80386/486 επίσης προστέθηκαν 8 καταχωρητές αποσφαλμάτωσης. Ένα πρόγραμμα αποσφαλμάτωσης όπως το Microsoft Codeview ή ο Turbo Debugger μπορούν να χρησιμοποιήσουν αυτούς τους καταχωρητές για να θέσουν σημεία διακοπής, όταν προσπαθούμε να εξακριβώσουμε λάθη μέσα στο πρόγραμμα. Ενώ δεν χρησιμοποιούνται αυτοί οι καταχωρητές σε ένα πρόγραμμα εφαρμογής, διαπιστώνεται ότι συχνά η χρήση ενός τέτοιου αποσφαλματωτή (Debugger)  μειώνει το χρόνο που απαιτείται για την εξάλλειψη ελαττωμάτων από τα προγράμματα. Φυσικά ένας αποσφαλματωτής που προσπελαύνει αυτούς τους καταχωρητές θα λειτουργεί κατάλληλα μόνο σε έναν 80386 ή μετέπειτα επεξεργαστή.

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

Οι προγραμματιστές σε γλώσσα assembly δεν χρειάζεται να απασχοληθούν με τους επιπλέον καταχωρητές, που έχουν προστεθεί στους 80386/486/pentium επεξεργαστές. Ωστόσο οι 32bits επεκτάσεις και οι επιπλέον καταχωρητές τμημάτων είναι αρκετά χρήσιμοι. Στον προγραμματιστή εφαρμογών, το προγραμματιστικό μοντέλο για τους 80386/486/pentium φαίνεται ως εξής:
 
 

 
 
 
 

 4.2 Η 8086 φυσική οργάνωση της μνήμης
 
Στο κεφάλαιο 3 μελετήσαμε τη βασική οργάνωση του υπολογιστικού συστήματος της αρχιτεκτονικής Von Neumann (VNA). Σε μια τυπική μηχανή VNA, η CPU συνδέεται με τη μνήμη μέσω ενός διαύλου. Ο 8086 επιλέγει μερικά ιδιαίτερα στοιχεία της μνήμης, χρησιμοποιώντας ένα δυαδικό αριθμό στον δίαυλο διευθύνσεων. Ένας άλλος τρόπος θεώρησης της μνήμης είναι ως μια διάταξη από bytes. Μια pascal δομή δεδομένων που πρόχειρα ανταποκρίνεται στη μνήμη θα ήταν :

Memory : array [0..MaxRAM] of byte;

Η τιμή στον δίαυλο διευθύνσεων ανταποκρίνεται στον δείκτη που παρέχεται σ' αυτή τη διάταξη. Για παράδειγμα η εγγραφή δεδομένων στη μνήμη είναι ισοδύναμη με:

Memory [address] := Value_to_Write;

Η ανάγνωση δεδομένων από τη μνήμη είναι ισοδύναμη με :

Value_Read := Memory [address];

Διαφορετικές 80x86 CPUs έχουν διαφορετικούς διαύλους διευθύνσεων που ελέγχουν το μέγιστο αριθμό στοιχείων στη διάταξη της μνήμης. Ωστόσο ανεξάρτητα  από τον αριθμό των γραμμών διευθύνσεων στον δίαυλο, τα περισσότερα υπολογιστικά συστήματα δεν έχουν 1 byte μνήμης για κάθε τοποθεσία, που μπορεί να διευθυνσιοδοτηθεί. Για παράδειγμα οι επεξεργαστές 80386 έχουν 32 γραμμές διευθύνσεων επιτρέποντας περίπου 4 Gigabytes μνήμης. Πολύ λίγα 80386 συστήματα έχουν πραγματικά 4 Gigabytes. Συνήθως βρίσκεται ένα το πολύ στα 256 Megabytes σε ένα σύστημα  80x86.

Το πρώτο Megabyte μνήμης, από τη διεύθυνση 0 ως το 0FFFFh είναι ιδιαίτερο στους 80x86.  Αυτό ανταποκρίνεται σε ολόκληρο το χώρο διευθύνσεων των 8088, 8086, 80186 και 80188 μικροεπεξεργαστών. Τα περισσότερα προγράμματα σε DOS περιορίζουν τις διευθύνσεις του προγράμματος και των δεδομένων σε τοποθεσίες σε συτή την έκταση. Οι διευθύνσεις που περιορίζονται σε αυτή την έκταση ονομάζονται αληθινές διευθύνσεις μετά την 80x86 πραγματική κατάσταση.
 
 


4.3 Τμήματα στους 80x86

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

Λοιπόν αποδεικνύεται ότι η τμηματοποίηση παρέχει ένα άλλο πολύ έξυπνο χαρακτηριστικό : επιτρέπει την επέκταση της δυνατότητας διευθυνσιοδότησης  ενός επεξεργαστή. Στην περίπτωση των 8086, η τμηματοποίηση επέτρεψε στους σχεδιαστές της Intel να επεκτείνουν τη μέγιστη διευθυνσιοδοτούμενη μνήμη από 64K σε  1Megabyte. Η ερώτηση που προκύπτει λοιπόν είναι, γιατί να υπάρχουν παράπονα από τους προγραμματιστές; Ένα μικρό μάθημα ιστορίας είναι απαραίτητο για να καταλάβουμε τι φταίει.

Στα 1976 όταν η Intel άρχισε να σχεδιάζει τον 8086 επεξεργαστή, η μνήμη ήταν πολύ ακριβή. Οι προσωπικοί υπολογιστές, όπως ήταν εκείνη την εποχή, τυπικά είχαν 4000 bytes μνήμης. Ακόμη κι όταν η IBM εισήγαγε τον PC 5 χρόνια μετά, τα 64Κ ήταν ακόμη αρκετή μνήμη, ενώ το 1 Megabyte ήταν τρομερή ποσότητα. Οι σχεδιαστές της Intel ένοιωσαν ότι τα 64Κ μνήμης θα παρέμεναν μια μεγάλη ποσότητα στη διάρκεια ζωής του 8086. Το λάθος τους όμως ήταν ότι υποτίμησαν το χρόνο ζωής του 8086. Υπέθεσαν ότι θα κρατούσε περίπου 5 χρόνια, όπως ο προηγούμενος 8080 επεξεργαστής. Είχαν σχέδια για πολλούς άλλους επεξεργαστές και το "86" δεν ήταν η κατάληξη στα ονόματα οποιουδήποτε από αυτούς τους επεξεργαστές. Σίγουρα 1 Megabyte θα ήταν περισσότερο από αρκετό μέχρι να ανακαλυφθεί κάτι καλύτερο.

Δυστυχώς, η Intel στην αρχή δεν πίστεψε στον IBM PC και στη μαζική ποσότητα λογισμικού, που εμφανίστηκε γι' αυτό. Από το 1983 ήταν φανερό ότι η Intel δεν μπορούσε να παρατήσει την 80x86 αρχιτεκτονική.  Έτσι έδωσε τον 80286, που μπορούσε να διευθυνσιοδοτήσει μέχρι 16 Megabytes μνήμης. Το μόνο πρόβλημα ήταν όλο αυτό το υπέροχο λογισμικό, γραμμένο για τον IBM PC ήταν γραμμένο με τέτοιο τρόπο, ώστε δε μπορούσε να επωφεληθεί από οποιαδήποτε μνήμη πέρα από 1 Megabyte.

 Το αληθινό πρόβλημα είναι ότι ο 8086 ήταν ένας 16bit επεξεργαστής, με 16bit καταχωρητές και 16bit διευθύνσεις. Αυτό περιόρισε τον επεξεργαστή στην διευθυνσιοδότηση 64K μπλοκ μνήμης. Η έξυπνη χρήση της τμηματοποίησης από την Intel το επέκτεινε σε 1 Megabyte, αλλά η διευθυνσιοδότηση περισσότερων από 64K σε μια φορά χρειάζεται κάποια προσπάθεια. Η διευθυνσιοδότηση περισσότερων από 256K σε μια φορά χρειάζεται πολύ προσπάθεια.

Παρόλα τα αρνητικά που μπορεί να ακούγονται η τμηματοποίηση αποτελεί ένα πραγματικά εκπληκτικό σχήμα διαχείρισης της μνήμης. Αυτό που είναι αρνητικό είναι το να χρησιμοποιείται και τώρα από την Intel η εφαρμογή της τμηματοποίησης του 1976. Δεν μπορούμε να κατηγορούμε την Intel γι΄αυτό, αφού τακτοποίησε το πρόβλημα με τον 80386. Ο πραγματικός ένοχος είναι το MS-DOS, που αναγκάζει τους προγραμματιστές να συνεχίσουν να χρησιμοποιούν το στύλ τμηματοποίησης του 1976. Ευτυχώς νεότερα λειτουργικά συστήματα όπως το Linux, UNIX, Windows 9x, Windows NT και OS/2 δεν αντιμετωπίζουν τα προβλήματα του MS-DOS. Επιπλέον οι χρήστες είναι πιο πρόθυμοι να μεταβούν σε αυτά τα νεότερα λειτουργικά συστήματα, έτσι οι προγραμματιστές μπορούν να επωφεληθούν από τα νέα χαρακτηριστικά της οικογένειας των 80x86.

Μετά το μάθημα ιστορίας είναι χρήσιμο το να δούμε τι ακριβώς είναι η τμηματοποίηση. Αν αναλογιστούμε την τρέχουσα όψη της μνήμης, μοιάζει με μια γραμμική διάταξη από Bytes. Ένας απλός δείκτης (διεύθυνση) επιλέγει κάποια ιδιαίτερα byte από τη διάταξη αυτή. Ας ονομάσουμε αυτό τον τύπο διευθυνσιοδότησης γραμμική ή επίπεδη διευθυνσιοδότηση. Η τμηματοποιημένη διευθυνσιοδότηση χρησιμοποιεί δύο συστατικά για να καθορίσει μια τοποθεσία μνήμης : μια αξία τμήματος και ένα offset  μέσα στο τμήμα. Ιδανικά το offset και η αξία του τμήματος είναι ανεξάρτητα το ένα από το άλλο. Ο καλύτερος τρόπος περιγραφής της τμηματοποιημένης διευθυνσιοδότησης είναι με ένα διδιάστατο πίνακα. Το τμήμα παρέχει έναν από τους δείκτες στον πίνακα και το offset παρέχει τον άλλο:
 
 

 
 

Για να αντιληφθείτε το λόγο, που γίνονται τα παραπάνω σκεφτείτε τον τρόπο που γράφεται τυπικά ένα πρόγραμμα. Έστω ότι πρέπει να γράψετε μια ρουτίνα SIN(X) και χρειάζεστε μερικές προσωρινές μεταβλητές. Πιθανότατα δε θα χρησιμοποιούσατε γενικές αλλά τοπικές μεταβλητές μέσα στη συνάρτηση SIN(X). Με μια ευρεία έννοια, αυτό είναι ένα από τα χαρακτηριστικά που προσφέρει η τμηματοποίηση - η ικανότητα να σχετίζει μπλοκ μεταβλητών (ένα τμήμα) σε ένα συγκεκριμένο κομμάτι κώδικα. Θα μπορούσατε για παράδειγμα να έχετε ένα τμήμα που περιλαμβάνει τις τοπικές μεταβλητές για τη SIN, ένα τμήμα για την ρουτίνα SQRT, ένα τμήμα για το DRAWWindow κ.λ.π. Από τη στιγμή που οι μεταβλητές για τη SIN εμφανίζονται στο τμήμα για το SIN είναι λιγότερο πιθανό η SIN ρουτίνα να επηρεάσει τις μεταβλητές που ανήκουν στη ρουτίνα SQRT. Πράγματι στον 80286 και αργότερα λειτουργώντας σε προστατευόμενη κατάσταση, η CPU μπορεί να εμποδίσει μια ρουτίνα από το να μεταβάλλει κατά λάθος τις μεταβλητές σε ένα διαφορετικό τμήμα.

Μια πλήρως τμηματοποιημένη διεύθυνση περιλαμβάνει ένα συστατικό τμήματος και ένα συστατικό απόστασης (offset). Σ' αυτό το κείμενο θα γράφονται οι τμηματοποιημένες διευθύνσεις ως τμήμα :απόσταση(segment:offset). Στον 8086 μέσω του 80286, αυτές οι δύο αξίες είναι σταθερές 16bit. Στον 80386 αργότερα το offset μπορούσε να ήταν μια σταθερά 16 bit ή μια 32 bit σταθερά.

Το μέγεθος του offset περιορίζει το μέγιστο μέγεθος ενός τμήματος. Στον 8086 με 16 bit offsets, ένα τμήμα δεν μπορεί να είναι μεγαλύτερο από 64K, μπορεί να είναι μικρότερο (τα περισσότερα τμήματα είναι) αλλά ποτέ μεγαλύτερο. Ο 80386 και οι μετέπειτα επεξεργαστές επιτρέπουν 32 bits offsets με τμήματα τόσο μεγάλα όσο 4 gigabytes.

Το τμήμα είναι 16bits σε όλους τους 80x86 επεξεργαστές. Αυτό επιτρέπει σε ένα απλό πρόγραμμα να έχει μέχρι και 65,536 διαφορετικά τμήματα στο πρόγραμμα. Τα περισσότερα προγράμματα έχουν λιγότερα από 16 τμήματα, έτσι αυτός δεν είναι ένας πρακτικός περιορισμός.

Φυσικά εκτός από το γεγονός ότι η οικογένεια επεξεργαστών 80x86 χρησιμοποιεί τμηματοποιημένη διευθυνσιοδότηση, η πραγματική (φυσική) μνήμη που συνδέεται με τη CPU είναι ακόμη μια γραμμική διάταξη από bytes. Υπάρχει μια συνάρτηση που μετατρέπει την αξία του τμήματος σε μια φυσική διεύθυνση μνήμης. Ο επεξεργαστής τότε προσθέτει την απόσταση σε αυτή τη φυσική διεύθυνση για να αποκτήσει την πραγματική διεύθυνση των δεδομένων στη μνήμη. Το κείμενο αυτό θα αναφέρεται σε διευθύνσεις στα προγράμματα σας σαν τμηματοποιημένες ή λογικές διευθύνσεις. Η πραγματική γραμμική διεύθυνση που εμφανίζεται στον δίαυλο διευθύνσεων είναι η φυσική διεύθυνση:
 
 

 
 

Στους 8086, 8088, 80186 και 80188 (και σε άλλους επεξεργαστές που λειτουργούν σε πραγματική κατάσταση) η συνάρτηση που χαρτογραφεί ένα τμήμα σε μια φυσική διεύθυνση είναι πολύ απλή. Η CPU πολλαπλασιάζει την αξία του τμήματος με 16 (10h) και προσθέτει την ποσότητα του offset. Για παράδειγμα σκεφτείτε την τμηματοποιημένη διεύθυνση : 1000:1F00. Για να μετατραπεί αυτό σε φυσική διεύθυνση πρέπει να πολλαπλασιαστεί η αξία του τμήματος (1000h) με 16. Ο πολλαπλασιασμός με τη βάση είναι πολύ εύκολος. Απλά προσαρτάται ένα μηδέν στο τέλος του αριθμού. Η προσάρτηση του μηδενός στο 1000h παράγει 10000h. προστίθεται το 1F00h σ' αυτό και προκύπτει 11F00h. Έτσι η φυσική διεύθυνση που ανταποκρίνεται στην τμηματοποιημένη διεύθυνση 1000: 1F00 είναι η 11F00h.
 
 

 
 
 

Προειδοποίηση : ένα κοινό λάθος που γίνεται όταν εκτελείται ο παραπάνω υπολογισμός είναι να ξεχάσετε ότι λειτουργεί σε δεκαεξαδικό και όχι δεκαδικό. Είναι εκπληκτικό το ότι πολλοί προσθέτουν 9+1 και παίρνουν 10h αντί για τη σωστή απάντηση, που είναι 0Ah.

Όταν η Intel σχεδίασε τους 80286 και τους μετέπειτα επεξεργαστές, δεν επέκτεινε τη διευθυνσιόδοτηση προσθέτοντας περισσότερα bits στους καταχωρητές τμήματος. Αντίθετα άλλαξαν τη συνάρτηση, που χρησιμοποιεί η CPU για να μετατρέψει τη λογική σε φυσική διεύθυνση. Αν γράψετε κώδικα που εξαρτάται από την "πολλαπλασιασμό με 16 και πρόσθεση στο offset" συνάρτηση, το πρόγραμμα σας θα λειτουργεί μόνο σε έναν 80x86 επεξεργαστή λειτουργώντας σε πραγματική κατάσταση και θα είστε περιορισμένοι σε 1 Megabyte μνήμης.

Στους 80286 και μετέπειτα επεξεργαστές η Intel εισήγαγε τα τμήματα προστατευόμενης κατάστασης. Ανάμεσα σε άλλες αλλαγές, η Intel ολοκληρωτικά ξαναδημιούργησε τον αλγόριθμο για τη χαρτογράφηση τμημάτων στον χώρο των γραμμικών διευθύνσεων. Αντί τη χρήση μιας συνάρτησης οι επεξεργαστές προστατευόμενης κατάστασης χρησιμοποιούν έναν πίνακα αναζήτησης στοιχείων (lookup table) για να υπολογίσουν τη φυσική διεύθυνση. Στην προστατευόμενη κατάσταση οι 80286 και οι μετέπειτα επεξεργαστές χρησιμοποιούν την αξία του τμήματος ως ένα δείκτη σε ένα πίνακα. Τα περιεχόμενα του επιλεγόμενου πίνακα-στοιχείου παρέχουν (ανάμεσα σε άλλα) την αρχική διεύθυνση για το τμήμα. Η CPU προσθέτει αυτή την αξία στο offset για να αποκτήσει τη φυσική διεύθυνση :
 

 

 
 

Σημειώστε ότι οι εφαρμογές σας δε μπορούν να μετατρέψουν άμεσα τον πίνακα περιγραφής τμήματος (lookup table). Το λειτουργικό σύστημα προστατευόμενης κατάστασης (UNIX, Linux, Windows, OS/2,etc.) χειρίζεται τη λειτουργία αυτή.

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


4.4 Κανονικοποιημένες διευθύνσεις στους 80x86

Όταν λειτουργείτε σε πραγματική κατάσταση προκύπτει ένα ενδιαφέρον πρόβλημα. Μπορεί να αναφέρεστε σε ένα απλό αντικείμενο στη μνήμη χρησιμοποιώντας πολλές διαφορετικές διευθύνσεις. Σκεφτείτε τη διεύθυνση από τα προηγούμενα παραδείγματα, 1000:1F00. Υπάρχουν πολλές διαφορετικές διευθύνσεις μνήμης που αναφέρονται στην ίδια φυσική διεύθυνση. Για παράδειγμα, 11F0:0, 1100:F00, 1080:1700 όλες ανταποκρίνονται στη φυσική διεύθυνση 11F00h. Όταν δουλεύετε με συγκεκριμένους τύπους δεδομένων και ιδιαίτερα όταν συγκρίνετε δείκτες, είναι βολικό αν τμηματοποιημένες διευθύνσεις δείχνουν σε διαφορετικά αντικείμενα στη μνήμη όταν οι bit αναπαραστάσεις τους είναι διαφορετικές. Ξεκάθαρα αυτή δεν είναι πάντα η υπόθεση στην πραγματική  κατάσταση σε έναν επεξεργαστή 80x86.

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

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

Οι κανονικοποιημένοι δείκτες που παίρνουν αυτή τη μορφή είναι πολύ πολύ ευκολό να μετατραπούν σε μία φυσική διεύθυνση. Το μόνο που πρέπει να γίνει είναι να προσαρτηθεί το απλό δεκαεξαδικό ψηφίο του offset στην αξία του τμήματος. Η κανονικοποιημένη μορφή του της 1000:1F00 είναι 11F0:0. Μπορείτε να αποκτήσετε τη φυσική διεύθυνση προσαρτώντας το offset 0 στο τέλος του 11F0 δημιουργώντας το 11F00.

Είναι πολύ εύκολο να μετατραπεί μια αυθαίρετη τιμή σε μια κανονικοποιημένη διεύθυνση. Πρώτα μετατρέπετε την τμηματοποιημένη διεύθυνση σε μια φυσική διεύθυνση χρησιμοποιώντας τη συνάρτηση "πολλαπλασιασμό με 16 και πρόσθεση στο offset". Μετά  βάλτε μια στήλη μεταξύ των 2 τελευταίων ψηφίων από το πενταψήφιο αποτέλεσμα :

1000:1F00f11F00f11F0:0

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


4.5 Καταχωρητές τμήματος στους 80x86 επεξεργαστές

Όταν  η Intel το 1976 σχεδίασε τους 8086, η μνήμη ήταν ένα πολύτιμο αγαθό. Σχεδίασαν το σετ εντολών έτσι ώστε κάθε εντολή να χρησιμοποιεί όσο λιγότερα Byte ήταν δυνατό. Αυτό έκανε τα προγράμματα τους μικρότερα, έτσι τα υπολογιστικά συστήματα που απασχολούσαν τους επεξεργαστές της Intel χρησιμοποιούσαν λιγότερη μνήμη. Επομένως αυτά τα υπολογιστικά συστήματα είχαν μικρότερο κόστος παραγωγής. Ένα πράγμα που ήθελε να αποφύγει η Intel ήταν να προσαρτήσει μια διεύθυνση 32 bit (segment :offset) στο τέλος των εντολών που απευθύνονταν στη μνήμη. Μπόρεσαν να το μειώσουν σε 16  bit (offset μόνο) κάνοντας συγκεκριμένες  υποθέσεις όσον αφορά το σε ποιά τμήματα στη μνήμη, θα μπορούσε να έχει πρόσβαση μια εντολή.

Οι 8086 και οι 80286 επεξεργαστές έχουν 4 καταχωρητές τμήματος : cs, ds, ss και es. Οι 80386 και οι μεταγενέστεροι επεξεργαστές έχουν αυτούς τους καταχωρητές τμήματος και επιπλέον τους fs και gs. Ο cs (code segment, τμήμα κώδικα) καταχωρητής δείχνει στο τμήμα που περιέχει τον τρέχοντα εκτελέσιμο κώδικα. Η CPU πάντα ανακαλεί εντολές από τη διεύθυνση που δίνεται από τους cs:ip. Η CPU περιμένει να προσπελάσει τις περισσότερες μεταβλητές στο τμήμα δεδομένων (data segment). Συγκεκριμένες μεταβλητές και άλλες λειτουργίες λαμβάνουν χώρα στο τμήμα στοίβας (stack segment). Όταν γίνεται η πρόσβαση δεδομένων σ' αυτές τις ιδιαίτερες περιοχές, δεν είναι απαραίτητη η αξία κανενός τμήματος. Για να προσπελαστούν δεδομένα σε ένα από τα επιπλέον τμήματα (es, fs ή gs) είναι απαραίτητο μόνο ένα byte για να επιλεχθεί ο κατάλληλος καταχωρητής τμήματος. Μόνο λίγες εντολές μεταφοράς ελέγχου σας επιτρέπουν να καθορίσετε μια πλήρη 32 bit τμηματοποιημένη διεύθυνση.

Τώρα αυτό μπορεί να φανεί λίγο περιοριστικό. Με 4 καταχωρητές τμήματος στους 8086 μπορείτε να διευθυνσιοδοτήσετε ένα μέγιστο των 256 Kilobytes (64K σε κάθε τμήμα) και όχι ένα Megabyte. Ωστόσο μπορείτε να αλλάξετε τους καταχωρητές τμήματος υπό τον έλεγχο του προγράμματος, έτσι είναι δυνατό να διευθυνσιοδοτηθεί οποιοδήποτε byte αλλάζοντας την αξία σε έναν καταχωρητή τμήματος.

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


 
ΚΕΦΑΛΑΙΟ 4 ΔΙΑΤΑΞΗ ΚΑΙ ΠΡΟΣΒΑΣΗ ΜΝΗΜΗΣ

4.0 Περίληψη κεφαλαίου
4.1 Οι 80x86 CPUs : Από την πλευρά του προγραμματιστή
4.1.1 Οι 8086 καταχωρητές γενικού σκοπού
4.1.2 Οι 8086 καταχωρητές τμήματος
4.1.3 Οι 8086 καταχωρητές ειδικού σκοπού
4.1.4 Οι 80286 καταχωρητές
4.1.5 Οι 80386/80486 καταχωρητές
4.2 Η 8086 φυσική οργάνωση της μνήμης
4.3 Τμήματα στους 80x86
4.4 Κανονικοποιημένες διευθύνσεις στους 80x86
4.5 Καταχωρητές τμήματος στους 80x86 επεξεργαστές
4.6. The 80x86 Addressing Mode
4.6.1. Register Addressing Modes
4.6.2. 8086 Memory Addressing Modes
4.6.2.1. Ο τύπος Displacement Only
4.6.2.2. Οι έμμεσοι τύποι διευθυνσιοδότησης καταχωρητών.
4.6.2.3. Δεικτοδοτούμενοι τύποι διευθυνσιοδότησης
4.6.2.4. Based Indexed Addressing Modes
4.6.2.5. Based Indexed Plus Displacement Addressing Modes
4.6.2.6. Ένας εύκολος τρόπος για να θυμάστε τους 8086 τύπους διευθυνσιοδότησης μνήμης .
4.6.2.7. Τελευταίες Παρατηρήσεις για τους 8086 Addressing Modes.
4.6.3. Οι 80386 Τύποι Διευθυνσιοδότησης Καταχωρητή.
4.6.4. Οι 80386 Τύποι Διευθυνσιοδότησης Μνήμης .
4.6.4.1. Register Indirect Addressing Modes
4.6.4.2. 80386 Indexed, Base / Indexed and Base / Indexed / Disp Addressing Modes.
4.6.4.3. Οι 80386 Scaled Indexed Addressing Modes
4.6.4.4. Μερικές Τελευταίες Παρατηρήσεις για τον 80386 Τύπο         Διευθυνσιοδότησης Μνήμης.
4.7. Η Εντολή MOV του 80x86
4.8. Τελευταίες Παρατηρήσεις πάνω στην εντολή MOV

[Contents][Next] [Art of Assembly][Randall Hyde]