[Chapter Four][Previous][Chapter Five][Art of Assembly][Randall Hyde]

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


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 του 80χ86
4.8. Τελευταίες Παρατηρήσεις πάνω στην εντολή MOV
 


4.6.3. Οι 80386 Τύποι Διευθυνσιοδότησης Καταχωρητή.

Οι 80386 (και οι μετέπειτα ) επεξεργαστές παρέχουν 32-bit καταχωρητές . Οι 8 καταχωρητές γενικής χρήσης έχουν όλοι 32 bits ισοδύναμα. Αυτοί είναι ¨eax, ebx, ecx, edx, esi, edi, ebp και esp.
 
 
 


4.6.4. Οι 80386 Τύποι Διευθυνσιοδότησης Μνήμης .

Ο 80386 επεξεργαστής γενίκευσε τους τύπους διευθυνσιοδότησης μνήμης. Ενώ ο 8086 επιτρέπει να χρησιμοποιείς τα bx και  bp μόνο ως base register  και τα si και di ως index register, ο 80386 σου δίνει την δυνατότητα να χρησιμοποιείς σχεδόν όλους τους 32-bit καταχωρητές γενικής χρήσης ως base ή index register.Επιπλέον, ο 80386 εισήγαγε νέους, κλιμακωτούς, δεικτοδοτούμενους τύπους διευθυνσιοδότησης που απλοποιούν την πρόσβαση στα στοιχεία ενός πίνακα. Εκτός της μείωσης στα 32 bits , οι νέοι τύποι διευθυνσιοδότησης είναι πιθανότατα η μεγαλύτερη βελτίωση στα chips των σύγχρονων  επεξεργαστών.
 
 


4.6.4.1. Register Indirect Addressing Modes

Στους 80386, μπορείς να καθορίσεις οποιοδήποτε 32-bit καταχωρητή γενικής χρήσης, όταν χρησιμοποιείς τον register indirect addressing mode. Οι [eax], [ebx], [ecx], [edx], [esi] και [edi],  παρέχουν αποστάσεις , εξ’ ορισμού, στο τμήμα δεδομένων. Ο [ebp] και [esp] τύποι διευθυνσιοδότησης χρησιμοποιούν το τμήμα στοίβας, εξ’ ορισμού.

Σημείωσε ότι καθώς «τρέχει» σε 16-bit πραγματική λειτουργία, οι αποστάσεις σ’ αυτούς τους 32-bit καταχωρητές πρέπει να είναι στα όρια 0…0FFFFh. Δεν μπορείς να χρησιμοποιείς τιμές μεγαλύτερες από αυτές για να προσπελάσεις περισσότερα από 64Κ σ’ ένα τμήμα. Επίσης σημείωσε ότι πρέπει να χρησιμοποιείς τα 32-bit ονόματα των καταχωρητών. Οι επόμενες εντολές προβάλουν όλες τις έγκυρες φόρμες :

Mov        al,   [eax]
Mov        al,   [ebx]
Mov        al,   [ecx]
Mov        al,   [edx]
Mov        al,   [esi]
Mov        al,   [edi]
Mov        al,   [ebp]                                 : Χρησιμοποιεί SS εξ’ορισμού
Mov        al,   [esp]                                 :  Χρησιμοποιεί SS εξ’ ορισμού
 
 
 


4.6.4.2. 80386 Indexed, Base / Indexed and Base / Indexed / Disp Addressing Modes.

Οι indexed addressing modes (register indirect plus displacement) σου επιτρέπουν να αναμειγνύεις ένα 32-bit καταχωρητή με μια σταθερά . Οι base/indexed addressing modes δίνουν την δυνατότητα να ζευγαρώσεις δυο 32-bit καταχωρητές . Τέλος , οι base/indexed/displacement addressing modes επιτρέπουν να συνδυάσεις μια σταθερά και καταχωρητές για να διαμορφώσεις την τελική διεύθυνση. Να έχεις μέσα στο μυαλό σου ότι η απόσταση πού δημιουργείται από τον υπολογισμό της τελικής διεύθυνσης πρέπει να έχει 16 bits μήκος όταν αυτό λειτουργεί σε πραγματικό τύπο.

Στον 80386,οι όροι base και index register  παίρνουν κάποιο νόημα. ΄Όταν συνδυάζεις δυο 32- bit καταχωρητές σε έναν τύπο διευθυνσιοδότησης , ο πρώτος καταχωρητής είναι ο καταχωρητής βάσης και ο δεύτερος είναι ο καταχωρητής δείκτη. Οι επόμενες εντολές παρέχουν αντιπροσωπευτικά δείγματα των ποικίλων base και indexed modes μαζί με συντακτικές παραλλαγές.

Mov        al,   disp[eax]
Mov        al,   [ebx+disp]
Mov        al,   [ecx] [disp]
Mov        al,   disp[edx]
Mov        al,   disp[esi]
Mov        al,   disp[edi]
Mov        al,   disp[ebp]
Mov        al,   disp[esp]

Οι ακόλουθες εντολές χρησιμοποιούν τον base plus indexed τύπο διευθυνσιοδότησης. Ο πρώτος καταχωρητής της δεύτερης διαδικασίας είναι ο base register και o δεύτερος ο index register. Αν ο base register είναι esp ή ebp, η τελική διεύθυνση είναι σχετική με το τμήμα της  στοίβας. Αλλιώς,η τελική διεύθυνση είναι σχετική με το τμήμα δεδομένων. Σημείωση ότι η επιλογή του index register δεν επηρεάζει την επιλογή του εξ’ ορισμού

Mov      al,   [eax] [ebx]           :  base+ indexed addressing modes
Mov      al,   [ebx +ebx]
Mov      al,   [ecx] [edx]
Mov      al,   [edx] [ebp]           : χρησιμοποιεί DS εξ’ ορισμού
Μοv      al,   [esi] [edi]
Mov      al,   [edi] [esi]
Mov      al,   [ebp+ebx]             : χρησιμοποιεί SS εξ’ ορισμού
Μοv      al,   [esp] [ecx]            : χρησιμοποιεί SS εξ’ ορισμού
 

Φυσικά, μπορείς να προσθέσεις displacement στον παραπάνω τύπο διευθυνσιοδότησης για να παράγεις τον base+indexed+displacement addressing mode. Οι επόμενες εντολές προσφέρουν ένα αντιπροσωπευτικό δείγμα των δυνατών τύπων διευθυνσιοδότησης.
 

Mov     al,   disp[eax] [ebx]                  : base+indexed addressing modes
Mov     al,   disp[ebx+ebx]
Mov     al,   [ecx+edx+disp]
Mov     al,   disp[edx+ebp]                  : χρησιμοποιεί DS εξ’ορισμού
Mov     al,   [esi] [edi] [disp]
Mov     al,   [edi] [disp] [esi]
Mov     al,   disp[ebp+ebx]                  : χρησιμοποιεί SS εξ’ορισμού
Mov     al,    [esp+ecx] [disp]               : χρησιμοποιεί SS εξ’ορισμού
 

Υπάρχει ένας περιορισμός που ο 80386 βάζει στον index register. Δεν μπορείς να χρησιμοποιήσεις τoν καταχωρητή esp ως καταχωρητή δείκτη. Μόνο καταχωρητή βάσης.
 


4.6.4.3. Οι 80386 Scaled Indexed Addressing Modes

Οι indexed, base indexed και base/indexed/disp τύποι διευθυνσιοδότησης που περιγράφηκαν πιο πάνω είναι ειδικές περιπτώσεις του 80386 scaled indexed addressing mode. Αυτοί οι τύποι διευθυνσιοδότησης είναι χρήσιμοι για να προσπελάσεις στοιχεία πίνακα , αν και δεν έχουν οριοθετηθεί για τέτοιούς σκοπούς. Αυτοί οι τύποι, σου επιτρέπουν να πολλαπλασιάσεις τον index register με το 1,2,4 και το 8 . Η γενική σύνταξη αυτών των τύπων είναι :

                 Disp [index*n]
                 [Base] [index*n]

or

                 disp [base] [index*n]

όπου «base» και «index» αντιπροσωπεύουν οποιοδήποτε 80386 32-bit καταχωρητή γενικής χρήσης και «ή» είναι η τιμή 1,2,4 ή 8.

Ο 80386 υπολογίζει την τελική διεύθυνση, προσθέτοντας disp, base και index*n μαζί. Π.χ. αν ο ebx περιέχει 1000h και ο esi 4 , τότε

Mov          al,8[ebx] [esi*4]               :φορτώνει την AL από την θέση 1018h
Mov          al,1000h[ebx] [ebx*2]     :φορτώνει την AL από την θέση 4000h
Mov          al,1000h[esi*8]                :φορτώνει AL από την θέση 1020h
 

Σημείωσε ότι οι εκτεταμένοι indexed, base/indexed και base/indexed/disp  τύποι διευθυνσιοδότησης του 80386 είναι  ειδικές περιπτώσεις αυτού του scaled indexed addressing mode με n=1. Τα ακόλουθα ζευγάρια εντολών είναι πανομοιότυπα με του 80386 :

Mov      al,   2[ebx] [esi*1]                mov      al,   2[ebx] [esi]
Mov      al,   [ebx] [esi*1]                  mov      al,   [ebx] [esi]
Mov      al,   2[esi*1]                         mov      al,   2[esi]
 


4.6.4.4. Μερικές Τελευταίες Παρατηρήσεις για τον 80386 Τύπο Διευθυνσιοδότησης Μνήμης.

Επειδή οι 80386 τύποι διευθυνσιοδότησης είναι περισσότερο ορθογώνιοι, είναι πιο εύκολο να τους θυμάσαι απ’ ότι τους τύπους του 8086.

Όταν χρησιμοποιείς base/indexed και  base/indexed/disp τύπους στον 80386, χωρίς την επιλογή κλιμάκωσης (αυτό γίνεται όταν αφήνεις την εξ’ ορισμού στο «*1») ο πρώτος καταχωρητής που εμφανίζεται στον τύπο είναι ο base register και ο δεύτερος είναι ο index register. Αυτό είναι ένα σημαντικό σημείο, καθώς η επιλογή του εξ’ ορισμού τμήματος προέρχεται από την επιλογή του base register.
Αν χρησιμοποιείς το scaled index operator (*n) σ’ ένα καταχωρητή, αυτός ο καταχωρητής είναι πάντα ο index register, ανεξαρτήτως από το πού εμφανίζεται αυτός στον τύπο διευθυνσιοδότησης.
 

[ebx] [ebp]           :χρησιμοποιεί DS εξ’ ορισμού
[ebp] [ebx]           :χρησιμοποιεί SS εξ’ ορισμού
[abp*1] [ebx]       :χρησιμοποιεί DS εξ’ ορισμού
[ebx] [ebp*1]       :χρησιμοποιεί DS εξ’ ορισμού
[ebp] [ebx*1]       :χρησιμοποιεί SS εξ’ ορισμού
[ebx*1] [ebp]       :χρησιμοποιεί SS εξ’ ορισμού
es:[ebx] [ebp*1]  :χρησιμοποιεί ES.
 


4.7.  Η Εντολή MOV του 80χ86

Τα παραδείγματα αυτού του κεφαλαίου χρησιμοποιούν πολύ την εντολή mov (move) του 80x86. Επιπλέον η εντολή mov είναι η πιο γνωστή εντολή μηχανής  του 80x86. Γι’ αυτό είναι χρήσιμο να συζητάμε κάποια πράγματα γι’ αυτήν.

Όπως και η αντίστοιχη των x86, η εντολή mov είναι πολύ απλή. Έχει την μορφή :
                                           Mov   Dest, Source.

Η mov φτιάχνει ένα αντίγραφο της source (πηγή) και αποθηκεύει αυτή την τιμή στο Dest (προορισμός). Αυτή η εντολή δεν επηρεάζει τα περιεχόμενα της source. Αντιγράφει την προηγούμενη τιμή στο Dest. Για το μεγαλύτερο τμήμα της , η λειτουργία αυτής της εντολής περιγράφεται από την εξής δήλωση της Pascal
                                            Dest:=Source;

Αυτή η εντολή έχει πολλούς περιορισμούς. Για να κατανοήσεις για πιο λόγο υπάρχουν όλοι αυτοί οι περιορισμοί, θα πρέπει να κοιτάξεις τον κώδικα μηχανής για της ποικίλες μορφές αυτής της εντολής. Δεν ονομάζουν τον 80386 CISC(Complete Instruction Set Computer) για το τίποτα. Η κωδικοποίηση της εντολής mov είναι ίσως και η πιο πολύπλοκη στην ομάδα εντολών. Χωρίς να μελετήσεις τον κώδικα μηχανής για αυτήν την εντολή, δεν θα είσαι σε θέση να το εκτιμήσεις, ούτε θα καταλάβεις πώς να γράψεις έναν άριστο κώδικα, χρησιμοποιώντας αυτή την εντολή.

Υπάρχουν διάφορες εκδόσεις της εντολής mov. Η μνημονική mov περιγράφει μια ντουζίνα διαφορετικών εντολών στον 80386. Η πιο συνηθισμένη φόρμα της εντολής mov έχει την ακόλουθη δυαδική κωδικοποίηση :
 

 
 
 

Ο κώδικας λειτουργίας είναι τα πρώτα 8 bits της εντολής. Τα bits 0 και 1 καθορίζουν το πλάτος της εντολής (8,16,32 bits) και την κατεύθυνση μεταφοράς. Όταν πραγματεύεσαι συγκεκριμένες εντολές , αυτό το κείμενο θα γεμίζει τις τιμές του d και w για σένα.

Ο κώδικας λειτουργίας ακολουθείται από το byte του τύπου διευθυνσιοδότησης, το οποίο αποκαλείται  mod-reg-r/m  byte από τους προγραμματιστές. Αυτό το byte, διαλέγει από τους 256 διαφορετικούς, δυνατούς, λειτουργικούς συνδυασμούς, αυτόν που η γενετική εντολή mov παίρνει τρείς διαφορετικές φόρμες στην assembly:

Mov    reg,  memory
Mov    memory,  reg
Mov    reg,  reg

Σημείωσε ότι τουλάχιστον ένα από τα τελούμενα πρέπει να είναι καταχωρητής γενικής χρήσης . Το reg πεδίο στο mod/reg/rm byte καθορίζει αυτόν τον καταχωρητή. Το d-direction bit στον κώδικα λειτουργίας, αποφασίζει για το αν η εντολή θα αποθηκεύσει δεδομένα στον καταχωρητή (d=1) ή στην μνήμη (d=0).

Τα bits στο πεδίο reg επιτρέπουν να επιλέξεις ένα από τους 8 διαφορετικούς καταχωρητές. Ο 8086 υποστηρίζει 8-bit καταχωρητές και 16-bit καταχωρητές γενικής χρήσης. Η CPU αποκωδικοποιεί το νόημα του πεδίου reg ως εξής :

 
 
REG Bit Encodings
reg w=0 16 bit mode 

w=1

32 bit mode 

w=1

000 AL AX EAX
001 CL CX ECX
010 DL DX EDX
011 BL BX EBX
100 AH SP ESP
101 CH BP EBP
110 DH SI ESI
111 BH DI EDI
 
 

Για να διαφοροποιήσουν τους 16-bit και τους 32-bit καταχωρητές, ο 80386 και οι σύγχρονοί του επεξεργαστές χρησιμοποιούν ένα ειδικό byte προθέματος κωδικού εντολής πριν τις εντολές, χρησιμοποιώντας  32-bit καταχωρητές. Αλλιώς, οι κωδικοποιήσεις των εντολών είναι οι ίδιες και για τους δυο τύπους εντολών.

Το πεδίο r/m σε συνδυασμό με το πεδίο mod, διαλέγει τον τύπο διευθυνσιοδότησης. Η κωδικοποίηση του πεδίου mod είναι η ακόλουθη :
 
 
 
MOD Encoding
MOD Meaning
00 The r/m field denotes a register indirect memory addressing mode or a base/indexed addressing mode (see the encodings for r/m) unless the r/m field contains 110. If MOD=00 and r/m=110 the mod and r/m fields denote displacement-only (direct) addressing.
01 The r/m field denotes an indexed or base/indexed/displacement addressing mode. There is an eight bit signed displacement following the mod/reg/rm byte.
10 The r/m field denotes an indexed or base/indexed/displacement addressing mode. There is a 16 bit signed displacement (in 16 bit mode) or a 32 bit signed displacement (in 32 bit mode) following the mod/reg/rm byte .
11 The r/m field denotes a register and uses the same encoding as the reg field
 
 

Το πεδίο mod διαλέγει ανάμεσα στο register- to- register move και στο register-to/from-memory move. Επίσης διαλέγει το μέγεθος της displacement (0,1,2 ή 4 bytes), η οποία ακολουθεί την εντολή για τους τύπους διευθυνσιοδότησης της μνήμης. Αν MOD=00, τότε έχεις έναν από τους τύπους διευθυνδιοδότησης χωρίς displacement. Σημείωσε την ειδική περίπτωση όπου MOD=00 και r/m=110. Aυτό φυσιολογικά θα ανταποκρινόταν στον [bp] τύπο. Ο 8086 χρησιμοποιεί αυτή την κωδικοποίηση για το displacement-only addressing mode. Αυτό σημαίνει ότι δεν υπάρχει πραγματικός [bp] τύπος διευθυνσιοδότησης στον 8086.

Για να καταλάβεις γιατί μπορείς να  χρησιμοποιήσεις τον  [bp] τύπο στα προγράμματα σου, δες το MOD=01 και MOD=10 στον παραπάνω πίνακα. Τα  bits του υποδείγματος ενεργοποιούν τους disp[reg] και disp[reg][reg] τύπους διευθυνσιοδότησης. Θα μου πεις βέβαια ότι αυτό δεν είναι ίδιο με το [bp] τύπο διευθυνσιοδότησης ; Έχεις δίκιο. Αλλά σκέψου τις επόμενες εντολές:

Mov    al,   0[bx]
Mov   ah,   0[bp]
Mov   0[si],   al
Mov   0[di],   ah.

Αυτές οι δηλώσεις, χρησιμοποιώντας τους  δεικτοδοτούμενους τύπους διευθυνσιοδότησης, εκτελούν τις ίδιες διαδικασίες, όπως ο αντίστοιχος register indirect. Η μόνη πραγματική διαφορά ανάμεσα στις δυο μορφές είναι ότι ο δεικτοδοτούμενος τύπος είναι κατά 1 byte μεγαλύτερος (αν MOD=01 και 2bytes μεγαλύτερος αν MOD=10), για να κρατά την μηδενική displacement. Επειδή ακριβώς είναι μεγαλύτεροι , αυτές οι εντολές τρέχουν πιο σιγά.

Αν το MOD δεν είναι ίσο με 11b, το πεδίο r/m κωδικοποιεί τον τύπο διευθυνσιοδότησης μνήμης ως εξής:
 
 
R/M Field Encoding
R/M Addressing mode (Assuming MOD=00, 01, or 10)
000 [BX+SI] or DISP[BX][SI] (depends on MOD)
001 [BX+DI] or DISP[BX+DI] (depends on MOD)
010 [BP+SI] or DISP[BP+SI] (depends on MOD)
011 [BP+DI] or DISP[BP+DI] (depends on MOD)
100 [SI] or DISP[SI] (depends on MOD)
101 [DI] or DISP[DI] (depends on MOD)
110 Displacement-only or DISP[BP] (depends on MOD)
111 [BX] or DISP[BX] (depends on MOD)
 
 


4.8. Τελευταίες Παρατηρήσεις πάνω στην εντολή MOV

Υπάρχουν ορισμένα σημαντικά σημεία που πρέπει πάντα να θυμάσαι για τις εντολές mov. Πρώτα απ’ όλα , δεν είναι μεταφορά από μνήμη σε μνήμη. Δεύτερον, υπάρχουν πολλές διαφορετικές εντολές mov που πραγματοποιούν το ίδιο πράγμα. Παρομοίως , υπάρχουν αρκετοί διαφορετικοί τύποι διευθυνσιοδότησης , που μπορείς να χρησιμοποιήσεις για να προσπελάσεις την ίδια θέση μνήμης. Αν ενδιαφέρεσαι να φτιάξεις το μικρότερο και γρηγορότερο δυνατό πρόγραμμα σε γλώσσα assembly , θα πρέπει να είσαι γνώστης των διαφορών μεταξύ παρόμοιων εντολών.
 
 
 
 
 

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 του 80χ86
4.8. Τελευταίες Παρατηρήσεις πάνω στην εντολή MOV

Art of Assembly: Κεφαλαιο 4 - 26 SEP 1996

[Chapter Four][Previous][Chapter Five] [Art of Assembly][Randall Hyde]