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

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


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 Οι 80x86 τυποι διευθυνσιοδοτησης

Όπως οι x86 επεξεργαστές που περιγράψαμε στο προηγούμενο κεφάλαιο, οι 80χ86 επεξεργαστές σου δίνουν την δυνατότητα να κάνεις προσπελάσεις στην μνήμη με πολλούς διαφορετικούς τρόπους. Οι 80x86 τύποι διευθυνσιοδότησης μνήμης - memory addressing modes παρέχουν ευέλικτη πρόσβαση στην μνήμη, επιτρέποντας σου να προσπελαύνεις μεταβλητές, πίνακες, εγγραφές, δείκτες και άλλους πολύπλοκους τύπους δεδομένων.
 
 
 


4.6.1 Register Addressing Modes

Οι περισσότερες εντολές του 80x86 λειτουργούν σ’ ένα είδος γενικής χρήσης καταχωρητή του 80χ86.

Θεώρησε την εντολή mov του 80x86

Mov    destination, source

Αυτή η εντολή αντιγράφει τα δεδομένα από την πηγή στον προορισμό. Οι 8-bit και 16-bit καταχωρητές  είναι σίγουρα κατάλληλοι γι’ αυτή την εντολή. Ο μόνος περιορισμός είναι ότι και τα δυο τελούμενα θα πρέπει να είναι του ίδιου μεγέθους. Ας δούμε τώρα κάποιες πραγματικές εντολές mov του 80x86.

Mov   ax,   bx   ;Copies the value from BX into AX
Mov   dl,    al    ;Copies the value from AL into DL
Mov   si,    dx   ;Copies the value from DX into SI

Μη ξεχνάς ότι οι καταχωρητές είναι το καλύτερο σημείο για να κρατάς τις μεταβλητές που χρησιμοποιούνται πιο συχνά. Σε αντίθεση με τους καταχωρητές γενικής χρήσης, πολλές 80x86 εντολές (συμπεριλαμβανομένης και της εντολής mov) σου επιτρέπουν να καθορίσεις έναν από τους καταχωρητές τμήματος ως τελούμενο. Υπάρχουν δυο περιορισμοί για τον  καταχωρητή τμήματος όταν αυτός χρησιμοποιεί εντολή mov:

1. Δεν μπορείς να ορίσεις την cs ως τον προορισμό σου.
2. Μόνο ένα από τα τελούμενα μπορεί να είναι διεύθύνση τμήματος.

Δεν πρέπει ποτέ να χρησιμοποιείς τους καταχωρητές τμήματος  ως καταχωρητές δεδομένων οι οποίοι κρατάνε τυχαίες τιμές. Πρέπει να περιέχουν μόνο διευθύνσεις τμήματος.

4.6.2 8086 Memory Addressing Modes


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

Τα addressing modes που υποστηρίζονται από την οικογένεια των 80x86 περιλαμβάνουν displacement-only, base, displacement plus base, base plus indexed και displacement plus base plus indexed και παρέχουν 17 διαφορετικά addressing modes στους 80x86.
 
 
 


4.6.2.1  Ο τύπος Displacement Only

Η πιο διαδεδομένη διευθυνσιοδότηση μνήμης  και η πιο κατανοητή είναι η displacement only. Αυτή αποτελείται από 16-bits σταθερά και καθορίζει την διεύθυνση της θέσης-στόχου. Η εντολή mov   al,ds:[8088h] φορτώνει τον register al , με αντίγραφο του byte στην θέση μνήμης  1234h:
 

 

 
 

Ο τύπος διευθυνσιοδότησης displacement only είναι κατάλληλος για προσπέλαση απλών μεταβλητών. Μια 16-bit σταθερά (απόσταση) ακολουθεί το opcode (κώδικα λειτουργίας) της mov. Είναι περίπου ίδιο με το direct addressing mode στον x86 επεξεργαστή. Υπάρχουν, όμως , τεράστιες διαφορές. Πρώτα απ’ όλα η απόσταση δεν είναι γενικά από κάποιο άλλο σημείο της μνήμης. Στους 80x86 επεξεργαστές είναι η απόσταση από την αρχή ενός τμήματος (το τμήμα δεδομένων είναι το παράδειγμα αυτό). Αυτό σε μπερδεύει. Προς το παρόν μπορείς να θεωρείς την displacement only addressing mode  ως μια direct addressing mode. Τα παραδείγματα αυτού του κεφαλαίου θα προσπελάσουν τυπικά bytes στην μνήμη. Μην ξεχνάς όμως ότι στους 80x86 επεξεργαστές μπορείς να προσπελάσεις και λέξη :
 

 

 
 

Εξ’ ορισμού, όλες οι displacement-only τιμές παρέχουν offsets στο τμήμα δεδομένων. Αν θέλεις μια απόσταση σε διαφορετικό τμήμα, πρέπει να χρησιμοποιήσεις ένα τμήμα που το καταλαμβάνει ένα πρόθεμα, πριν την διεύθυνση.
 
 


4.6.2.2  Οι έμμεσοι τύποι διευθυνσιοδότησης καταχωρητών.

Η CPU του 80x86 σου δίνει την δυνατότητα να προσπελάσεις την μνήμη έμμεσα, μέσω ενός καταχωρητή, χρησιμοποιώντας register indirect addressing mode. Υπάρχουν τέσσερις μορφές αυτού του addressing mode στον 80x86, οι οποίες επιδεικνύονται καλύτερα από τις ακόλουθες εντολές:

Mov      al,   [bx]
Mov      al,   [bp]
Mov      al,   [si]
Mov      al,   [di]

Όπως και στον x86 [bx] addressing mode, αυτές οι 4 εντολές παραπέμπουν το byte στο offset που υπάρχει στον bx,bp,si ή di καταχωρητή, αντίστοιχα. Οι [bx],[si] και [di] modes χρησιμοποιούν το τμήμα δεδομένων (ds segment), εξ’ ορισμού. Ο [bp] addressing mode χρησιμοποιεί το τμήμα στίβας  (ss).

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

Mov        al,   cs:[bx]
Mov        al,   ds:[bp]
Mov        al,   ss:[si]
Mov        al,   es:[di]

Η Intel αναφέρεται στον [bx] και στον [bp] ως βάση των addressing modes και bx και bp ως base register (το bp στην πραγματικότητα λειτουργεί ως βάση δείκτη). Η Intel αναφέρεται στους [si] και [di] addressing modes ως δεικτοδοτούμενους addressing modes (si --- source index, di--- destination index).
 

 

 
 
 

Παρατήρηση

Οι [si] και [di] addressing modes δουλεύουν ακριβώς με τον ίδιο τρόπο. Απλά, αντικατέστησε si και di με το bx παραπάνω.
 


4.6.2.3  Δεικτοδοτούμενοι τύποι διευθυνσιοδότησης

Οι δεικτοδοτούμενοι τύποι διευθυνσιοδότησης χρησιμοποιούν την ακόλουθη σύνταξη :

Mov     al,   disp[bx]
Mov     al,   disp[bp]
Mov     al,   disp[si]
Mov     al,   disp[di]
 

Αν η bx περιέχει 1000h, τότε η εντολή mov cl,20h[bx] θα φορτώσει το cl από την θέση μνήμης ds:1020h. Παρόμοια, αν η bp περιέχει 2020h, η mov dh,1000h[bp], θα φορτώσει το dh από την θέση ss:3020.

Αυτές οι αποστάσεις που δημιουργήθηκαν από αυτές τις addressing modes είναι το άθροισμα του σταθερού και του καθορισμένου καταχωρητή. Οι addressing modes που σχετίζονται με bx, si και di χρησιμοποιούν το τμήμα δεδομένων και ο disp[bp] addressing mode χρησιμοποιεί ένα πρόθεμα τμήματος για να καθορίσει ένα διαφορετικό τμήμα.
 

Mov    al,   ss:disp[bx]
Mov    al,   es:disp[bp]
Mov    al,   cs:disp[si]
Mov    al,   ss:disp[di]
 


 
 

Μπορείς να αντικαταστήσεις si και di στο παραπάνω σχήμα, για να εξασφαλίσεις τους   [si+disp] και [di+disp] addressing modes.
 
 

4.6.2.4 Based Indexed Addressing Modes


Οι base indexed addressing modes  είναι απλοί συνδυασμοί του register indirect addressing mode. Αυτοί οι addressing modes σχηματίζουν την απόσταση, προσθέτοντας ένα base register (bx ή bp) και έναν indexed register (si ή di). Οι επιτρεπόμενες μορφές για αυτούς τους addressing modes είναι:

Mov    al,   [bx] [si]
Mov    al,   [bx] [di]
Mov    al,   [bp] [si]
Mov    al,   [bp] [di]

Υπέθεσε ότι το  bx περιλαμβάνει 1000h και το si 880h. Τότε η εντολή                  mov al,[bx][si] θα φορτώσει το al από την θέση DS:1880h. Παρόμοια, αν το bp περιλαμβάνει 1598h και το di 1004, τότε η mov ax,[bp+di] θα φορτώσει 16 bits στο ax από τις θέσεις SS:259C και SS:259D.

Οι addressing modes που δεν σχετίζονται με το bp, χρησιμοποιούν το τμήμα δεδομένων, εξ’ ορισμού. Αυτές που έχουν το bp ωs τελούμενη χρησιμοποιούν το τμήμα στοίβας, εξ’ ορισμού.
 
 

 
 

Αντικαθιστάς  το di στο παραπάνω σχήμα για να δημιουργήσεις τον [bx+di] addressing mode.
 

 
 
 

Αντικαθιστάς  το di στο παραπάνω σχήμα για τον [bp+di] addressing mode.
 
 

4.6.2.5 Based Indexed Plus Displacement Addressing Mode


Αυτοί οι addressing modes είναι μια μικρή τροποποίηση του base/indexed addressing mode με την προσθήκη μιας 8-bit ή 16-bit σταθεράς. Τα επόμενα είναι μερικά παραδείγματα αυτών των addressing modes:
 

 

 
                mov     al, disp[bx][si]
                mov     al, disp[bx+di]
                mov     al, [bp+si+disp]
                mov     al, [bp][di][disp]
Μπορείς να αντικαταστήσεις το di στο παραπάνω σχήμα για να παράγεις το [bx+di+disp] addressing mode.
 
 
 
 

Μπορείς να αντικαταστήσεις το di στο σχήμα, για να δημιουργήσεις το [bp+di+disp] addressing mode.

Υπέθεσε ότι το bp περιέχει 1000h, το bx 2000h, το si 120h και το di 5. Τότε, η  mov  al,10h[bx,si] φορτώνει το al από την διεύθυνση SS:112A. Η mov bx,cs:2[bx][di] φορτώνει το bx από την θέση CS:2007.
 
 
 


4.6.2.6. Ένας εύκολος τρόπος για να θυμάστε τους 8086 τύπους διευθυνσιοδότησης μνήμης .

Υπάρχει ένα πλήθος 17 διαφορετικών επιτρεπόμενων addressing modes στον 8086: disp, [bx], [bp], [ si], [di], disp[bx], disp[bp], disp[si], disp[di], [bx] [si], [bx] [di], [bp] [si], [bp] [di], disp[bx][si], disp[bx][di], disp[bp][si] και disp[bp][di]. Πρέπει να θυμάσαι όλες αυτές τις φόρμες, έτσι ώστε να γνωρίζεις ποια είναι έγκυρη ( και ποια όχι). Υπάρχει ένας ευκολότερος τρόπος από το να αποστηθίζεις όλες αυτές τις 17 φόρμες. Θεώρησε το σχεδιάγραμμα :

 

 
 

Αν διαλέξεις κανένα ή ένα αντικείμενο από κάθε μία στήλη και καταλήξεις με τουλάχιστον ένα αντικείμενο, έχεις ένα έγκυρο 8086 τύπο διευθυνσιοδότησης μνήμης. Για παράδειγμα :
 

 
 


4.6.2.7. Τελευταίες Παρατηρήσεις για τους 8086 Addressing Modes.

Η τελική διεύθυνση είναι η τελική απόσταση, παραγόμενη από έναν υπολογισμό του τύπου διευθυνσιοδότησης. Π.χ. αν το bx περιλαμβάνει 10h, η τελική διεύθυνση για το 10h[bx] είναι 20h.

Όλοι οι τύποι διευθυνσιοδότησης δεν δημιουργούνται όμοια. Διαφορετικοί addressing modes μπορεί να απαιτούν περισσότερο χρόνο για να υπολογίσουν την τελική διεύθυνση. Η ακριβής διαφορά πηγάζει από το είδος του επεξεργαστή.

Το πεδίο αντικατάστασης σε όλους τους addressing modes (εκτός απ’ τον displacement-only) μπορεί να είναι μια ενδεικτική 8-bit σταθερά ή μια ενδεικτική 16-bit σταθερά.

Αν ο υπολογισμός της τελικής διεύθυνσης παράγει μια τιμή μεγαλύτερη από το OFFFFh, τότε η CPU αγνοεί την υπερχείλιση (overflow) και το αποτέλεσμα πηγαίνει πίσω στο 0. Π.χ., αν το bx περιλαμβάνει 10h, τότε η mov  al, OFFFFh[bx] θα φορτώσει τον καταχωρητή al από την θέση ds:Ofh και όχι από την θέση ds:1000Fh.
 
 

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

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

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