Προηγμένοι Μικροεπεξεργαστές Φροντιστήριο 2 Addressing
Roadmap Το μοντέλο μνήμης των x86 Γιατί τόσο περίπλοκο; Δομή Εξέλιξη Μέθοδοι διευθυνσιοδότησης Εντολές προσπέλασης μνήμης
Μοντέλο Μνήμης Πριν τους 80386 η x86 αρχιτεκτονική ήταν 16 bit υπεραρκετά για τα PCs της εποχής Εκτός από την διευθυνσιοδότηση 16 bit διευθυνσιοδοτούν άμεσα μόνο 64ΚΒ μνήμης Πολύ λίγο για desktop συστήματα
Μοντέλο Μνήμης Στόχος της intel: Διαθέσιμη μνήμη 1MB Διευθύνσεις των 20 bit Προφανείς επιλογές: Καθαρή 32 bit αρχιτεκτονική Το 1978 αυτή η κίνηση θα ήταν ασύμφορη 8085-like διευθυνσιοδότηση: 2 16-bit registers σχηματίζουν μία 32 bit διεύθυνση 32-bit διεύθυνσης ήταν υπερβολικά πολλά Ο τρόπος διευθυνσιοδότησης του 8085 είναι δύστροπος Λύση(?): πιο περίπλοκο μοντέλο μνήμης
Μοντέλο Μνήμης Η διεύθυνση είναι 20 bits Μνήμη 00000h fffffh
Μοντέλο Μνήμης Η διεύθυνση είναι 20 bits 00000h Μνήμη Seg X 0000h Σχηματίζεται από δύο 16 bit κομμάτια 16*X Seg X 1. Το segment επιλέγει 64KB της μνήμης από το συνολικό 1MB ffffh fffffh
Μοντέλο Μνήμης Η διεύθυνση είναι 20 bits 00000h Μνήμη Seg X 0000h Σχηματίζεται από δύο 16 bit κομμάτια 16*X Seg X offset 1. Το segment επιλέγει 64KB της μνήμης από το συνολικό 1MB 2. To offset επιλέγει μία διεύθυνση μέσα στον χώρο του segment ffffh fffffh
Μοντέλο Μνήμης Η διεύθυνση είναι 20 bits 00000h Μνήμη Seg X 0000h Σχηματίζεται από δύο 16 bit κομμάτια 16*X Seg X offset 1. Το segment επιλέγει 64KB της μνήμης από το συνολικό 1MB 2. To offset επιλέγει μία διεύθυνση μέσα στον χώρο του segment ffffh Η πλήρης διεύθυνση συμβολίζεται segment : offset fffffh
Segment Registers Πως δίνουμε τους δύο 16 bit αριθμούς με μία εντολή; Το offset δίνεται κανονικά από την ίδια την εντολή Tο segment βρίσκεται οπωσδήποτε σε έναν segment register 8086 80286: Code Segment (CS) Data Segment (DS) Extra Segment (ES) Stack Segment (SS) 80386 Pentium4: Δύο επιπλέον registers, οι GS και FS
Segment Registers Δεν είναι όλοι οι segment registers ισοδύναμοι Κάθε ένας χρησιμοποιείται εξ' ορισμού για κάποιους τύπους προσπελάσεων Οι default χρήσεις τους: CS: IP/EIP (Ανάγνωση εντολών) SS: SP/ESP και BP/EBP (χρήση στοίβας) ES: string εντολές DS: Όλες οι άλλες προσπελάσεις μνήμης
Segment Registers Στους πρώτους x86 επιτρεπόταν μόνο η default χρήση των segment registers Όχι πια: Κάθε συνδυασμός segment και offset επιτρέπεται Αν χρησιμοποιούμε έναν segment register για την default χρήση του, τότε μπορούμε να τον παραλήψουμε στην εντολή Πχ mov ax, [1000h] αντί για mov ax, ds:[1000h] Διαφορετικά επιβάλλεται να τον αναφέρουμε
Μοντέλο μνήμης - Πλεονεκτήματα Μεγάλο address space με μικρό overhead Οι διευθύνσεις στον κώδικα είναι μόνο offset (16-bit) Οι μονάδες του επεξεργαστή έχουν πλάτος 16-bit Μόνο τα τελευταία στάδια του address calculation έχουν πλάτος 20-bit
Μοντέλο μνήμης - Πλεονεκτήματα Multiprogramming Jumps και moves μπορούν να αναφέρονται μόνο στο offset Το πρόγραμμα δεν χρειάζεται να ξέρει που θα τοποθετηθεί στην μνήμη Segment = επιλογή του OS στο runtime Μπορούμε να φορτώσουμε πολλαπλά προγράμματα στην μνήμη και να τα εκτελέσουμε
Μοντέλο μνήμης - Μειονεκτήματα Τα προγράμματα μπορούν να προσπελάσουν άμεσα μόνο 4 segments των 64KB 256KB Δύσκολο να το διαχειριστεί αποδοτικά μία γλώσσα υψηλού επιπέδου Τα 20 bits πολύ γρήγορα αποδείχθηκαν λίγα
Εξέλιξη 80386 Pentium 4: 32 bit καταχωρητές Μόνο με το offset μπορούμε να προσπελάσουμε όλη την μνήμη Δεν χρειαζόμαστε πραγματικά τα segments Μόνο για συμβατότητα προς τα πίσω
Εξέλιξη Core 2 Μέλλον Οι segment registers υπάρχουν ακόμη Αλλά είναι γειωμένοι στο μηδέν Τα segments ξεκινούν από το 0x000 και καλύπτουν όλη την μνήμη Πρακτικά το segmentation της μνήμης δεν υπάρχει πια
Μέθοδοι Διευθυνσιοδότησης Γενικό format μίας προσπέλασης μνήμης: INSTRUCTION destination,source 4 διαφορετικοί τρόποι να ορίσουμε destination & source (addressing modes) Register Addressing Immediate Addressing Direct Addressing Indirect Addressing
Register Addressing Το όρισμα δείχνει σε κάποιον καταχωρητή (8, 16 ή 32 bit) Όρισμα bx Καταχωρητής bx data Διευθυνσιοδότηση Δεδομένα
Register Addressing Παραδείγματα mov ah,bl 8bit μεταφορά mov ds,ax Φόρτωση seg register mov edx,ebp 32bit μεταφορά
Register Addressing Απαγορεύονται: Μίξη καταχωρητών διαφορετικών μεγεθών Για τους segment registers Source και destination με segment registers Destination ο CS Άμεση μεταφορά μεταξύ segment register και μνήμης
Immediate Addressing Το όρισμα (πάντα στο source) είναι σταθερή τιμή που δίνεται από την εντολή 0xf250 Όρισμα 0xf250 Διευθυνσιοδότηση Δεδομένα
Immediate Addressing Παραδείγματα mov cx,0ah Immediate word 10 -> CX mov dl,10 Immediate byte 10 -> DL mov ebx,1010b Immediate dword 10 ->EBX mov bh,color σταθερά color στον bh
Direct Addressing Το όρισμα είναι το σταθερό offset της θέσης μνήμης που προσπελαύνουμε To όρισμα βρίσκεται πάντα σε αγκύλες [] [a0h] Όρισμα a0h Μνήμη ff0a0 DS ff00h Segment ff00 * 10h Διευθυνσιοδότηση Δεδομένα
Direct Addressing Παραδείγματα mov cx,[1000h] DS:1000H -> CX mov dl,[data_1] DS:data_1 -> DL mov [data_1],bh BH -> DS:data_1
Indirect Addressing Το όρισμα είναι ένας συνδυασμός καταχωρητών ή/και σταθερών οι τιμές των οποίων δίνουν το offset της θέσης μνήμης
Indirect Addressing si Όρισμα bx 0x000a 0x1234 Μνήμη 0x000a 0x0022 0x0022 Segment 0x1000 * 0x10 0x11260 Διευθυνσιοδότηση Δεδομένα Καταχωρητές
Indirect Addressing Παραδείγματα mov ax,[bx] Register Indexed mov ah,[bx+si] Base Plus Indexed mov cx,[bp+4] Register Relative mov [bx+si+2],dl Base Relative Plus Indexed
Βασικές εντολές μεταφοράς δεδομένων mov: Η τυπική εντολή μεταφοράς String εντολές: movsb, movsw, movsd: String move lodsb, lodsw, lodsd: String load stosb, stosw, stosd: String store ins: read string from input port outs: write string to output port
String Εντολές String εντολές Μακροεντολές Συμπιέζουν πολλαπλές εντολές σε μία Μικρότερο μέγεθος εκτελέσιμου Πιο συμπαγής κώδικας
movs move string movsb, movsw, movsd Δεν παίρνουν όρισμα Μεταφέρουν αυτόματα την θέση μνήμης [DS:SI] στην [ES:DI] Παράλληλα αυξάνουν τους SI, DI movsb mov [es:di],[ds:si] inc si inc di
movs Παραδείγματα χρήσης Αντιγραφή Πίνακα/String mov si,my_array mov di,new_array mov cx,my_array_length main_loop: mov [es:di],[ds:si] inc si inc di loop main_loop ; main_loop: 8 bytes
movs Παραδείγματα χρήσης Αντιγραφή Πίνακα/String mov si,my_array mov di,new_array mov cx,my_array_length main_loop: rep movsb ;main_loop: 2 bytes mov si,my_array mov di,new_array mov cx,my_array_length main_loop: mov [es:di],[ds:si] inc si inc di loop main_loop ; main_loop: 8 bytes
lods load string lodsb, lodsw, lodsd Φορτώνουν αυτόματα στον ΑL(/ΑΧ/ΕΑΧ) την θέση μνήμης DS:SI και αυξάνουν τον SI lodsb mov ah,[ds:si] inc si
lods Παραδείγματα χρήσης Άθροιση στοιχείων Πίνακα mov si,my_array mov cx,my_array_length main_loop: mov al,[ds:si] inc si add dh,al loop main_loop ; 8 bytes
lods Παραδείγματα χρήσης Άθροιση στοιχείων Πίνακα mov si,my_array mov cx,my_array_length main_loop: lodsb add dh,al loop main_loop ;main_loop: 5 bytes mov si,my_array mov cx,my_array_length main_loop: mov al,[ds:si] inc si add dh,al loop main_loop ; 8 bytes
stos store string stosb, stosw, stosd Αποθηκεύουν αυτόματα τον AL(/AX/EAX) στην θέση μνήμης ES:DΙ και αυξάνουν τον DI stosb mov [es:di],ah inc di
stos Παραδείγματα χρήσης Καθαρισμός Πίνακα mov di,new_array mov cx,new_array_length mov al,0 main_loop: mov [es:di],al inc di loop main_loop ; main_loop: 6 bytes
stos Παραδείγματα χρήσης Καθαρισμός Πίνακα mov di,new_array mov cx,new_array_length mov al,0 mov di,new_array mov cx,new_array_length mov al,0 main_loop: rep stosb ;main_loop: 2 bytes main_loop: mov [es:di],al inc di loop main_loop ; main_loop: 6 bytes
Άλλες εντολές XCHG: exchange source and destination LAHF : load ah from flag register SAHF : store ah to flag register XLAT : translate -> mov ah,[bx+ah] IN, OUT : I/O access MOVSX : Copy source to destination, sign extended MOVZX : Copy source to destination, zero extended BSWAP : Change 32bit register data from big-endian to littleendian Και άλλες