Art of Assembly: Κεφαλαιο 4
Όπως οι 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. Μόνο ένα από τα τελούμενα μπορεί να είναι διεύθύνση τμήματος.
Δεν πρέπει ποτέ να χρησιμοποιείς τους καταχωρητές τμήματος ως καταχωρητές δεδομένων οι οποίοι κρατάνε τυχαίες τιμές. Πρέπει να περιέχουν μόνο διευθύνσεις τμήματος.
Τα 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.
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.
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.
[Chapter Four][Previous] [Next] [Art of Assembly][Randall Hyde]