510 likes | 679 Views
Δομή μεταγλωττιστή: backend. Λεξική ανάλυση. Συντακτική ανάλυση. Σημασιολογική ανάλυση. Παραγωγή ενδιάμεσου κώδικα. ενδιάμεσος κώδικας. Βελτιστοποίηση κώδικα. Παραγωγή κώδικα. Η κατασκευή του πρώτου στάδιου επεξεργασίας ( front end ) είναι σε μεγάλο βαθμό αυτοματοποιημένη
E N D
Δομή μεταγλωττιστή: backend Λεξική ανάλυση Συντακτική ανάλυση Σημασιολογική ανάλυση Παραγωγή ενδιάμεσου κώδικα ενδιάμεσος κώδικας Βελτιστοποίηση κώδικα Παραγωγή κώδικα • Η κατασκευή του πρώτου στάδιου επεξεργασίας (front end) είναι σε μεγάλο βαθμό αυτοματοποιημένη • Για το τελικό στάδιο επεξεργασίας (back end) δεδιαθέτουμε γενικά αυτοματοποιημένες τεχνικές κατασκευής, γιατί εξάλλου ο παραγόμενος κώδικας εξαρτάται από τα χαρακτηριστικά της μηχανής στην οποία θα εκτελείται και οι δυνατότητες βελτιστοποιήσεων ποικίλλουν • Η δημιουργία ενδιάμεσου κώδικα επηρεάζει καθοριστικά την απόδοση του back end Τμ. Πληροφορικής, Α.Π.Θ.
Μορφές ενδιάμεσης αναπαράστασης υψηλό επίπεδο γραφική ενδιάμεση αναπαράσταση • Συντακτικά δένδρα • Κατευθυνόμενοι άκυκλοι γράφοι • Γράφοι ροής ελέγχου • Κώδικας μηχανής στοίβας • Κώδικας τριών διευθύνσεων • Υβριδικές προσεγγίσεις που χρησιμοποιούν τεχνικές από τις δύο προαναφερόμενες οικογένειες: • Κάποιοι μεταγλωττιστές χρησιμοποιούν κώδικα τριών διευθύνσεωνκαιγια επαναληπτικούς βρόχους, εντολές if και αναφορές σε array χρησιμοποιούν συντακτικά δένδρα γραμμική ενδιάμεση αναπαράσταση χαμηλό επίπεδο (πιο κοντά στη μηχανή) Τμ. Πληροφορικής, Α.Π.Θ.
Συντακτικά δένδρα Statements if (x < y) x = 5*y +5*y/3; else y = 5; x = x+y; IfStmt AssignStmt + x AssignStmt < AssignStmt x y x y x + y 5 * / 5 y 3 * 5 y Τμ. Πληροφορικής, Α.Π.Θ.
Κατευθυνόμενοι άκυκλοι γράφοι • Όταν γίνεται χρήση κατευθυνόμενων άκυκλων γράφων για την αναπαράσταση εκφράσεων • Για κάθε έκφραση χρησιμοποιείται ένας μόνο κόμβος Statements if (x < y) x = 5*y + 5*y/3; else y = 5; x = x+y; IfStmt AssignStmt < AssignStmt x y + / * 3 Τμ. Πληροφορικής, Α.Π.Θ. 5
Γράφοι ροής ελέγχου • Οι κόμβοι ενός γράφου ροής ελέγχου είναι βασικά block • Βασικό block είναι μία σειρά εντολών που πάντα η εκτέλεσή τους αρχίζει από την πρώτη και τελειώνει στην τελευταία απ΄ αυτές • Τα τόξα σε ένα γράφο ροής ελέγχου αναπαριστούν τη ροή ελέγχου if (x < y) x = 5*y + 5*y/3; else y = 5; x = x+y; B0 if (x < y) goto B1 else goto B2 B1 B2 x = 5*y + 5*y/3 y = 5 B3 • Κάθε βασικό block περιλαμβάνει μία σειρά εντολών • Δεν επιτρέπεται διαφυγή από το μέσο ενός block • Όταν γίνεται εκκίνηση της εκτέλεσης ενός block τότε η εκτέλεση ολοκληρώνεται πάντα στην τελευταία εντολή του x = x+y Τμ. Πληροφορικής, Α.Π.Θ.
Μηχανή στοίβας ωθεί την τιμή της θέσης x στην κορυφήτης στοίβας load x load y iflt L1 goto L2 L1: push 5 load y multiply push 5 load y multiply push 3 divide add store x goto L3 L2: push 5 store y L3: load x load y add store x αφαιρεί δύο στοιχεία από την κορυφή και τα συγκρίνει if (x < y) x = 5*y + 5*y/3; else y = 5; x = x+y; αφαιρεί δύο στοιχεία από την κορυφή, τα πολλαπλασιάζει και τοποθετεί το αποτέλεσμα στην κορυφή JVM: Μία μηχανή στοίβας • Δεξιά φαίνεται συμβολικός κώδικας για την JVM, που μετατρέπεται σε bytecode με τον κατάλληλο συμβο/στή • Ο JVM διερμηνευτήςεκτελεί τον bytecode σε διαφορετικές μηχανές • Η JVM διαθέτει μία στοίβα που χρησιμοποιείται στην αποτίμηση εκφράσεων • Η JVM χρησιμοποιεί 65535 «τοπικές μεταβλητές» • Οι «τοπικές μεταβλητές» λειτουργούν ως καταχωρητές • Κάθε «τοπική μεταβλητή» στην JVM συμβολίζεται με έναν αριθμό μεταξύ 0 και 65535 (στο παράδειγμα αποδίδονται στις x και y μοναδικοί αριθμοί) αποθηκεύει την τιμή της κορυφής της στοίβας στη θέση x Τμ. Πληροφορικής, Α.Π.Θ.
Κώδικας τριών διευθύνσεων Ι • Κάθε εντολή μπορεί να έχει το πολύ τρεις τελεστέους • Εκχώρηση τιμών • x := y • x := y op z op: δυαδικοί αριθμητικοί ή λογικοί τελεστές • x := op y op: μοναδιαίοι τελεστές (-, ΝΟΤ κ.α.) • Διακλάδωση • goto L εκτέλεση της εντολής με την ετικέτα L • Υπό συνθήκη διακλάδωση • if x relop y goto L relop: <, =, <=, >=, ==, != • αν η συνθήκη είναι αληθής τότε εκτελείται η εντολή με την ετικέτα L • αν η συνθήκη δεν είναι αληθής τότε συνεχίζεται η εκτέλεση με την επόμενη εντολή Τμ. Πληροφορικής, Α.Π.Θ.
Κώδικας τριών διευθύνσεων ΙΙ Οι μεταβλητές αναπαριστώνται από τη θέση τους στον πίνακα συμβόλων if (x < y) x = 5*y + 5*y/3; else y = 5; x = x+y; if x < y goto L1 goto L2 L1: t1 := 5 * y t2 := 5 * y t3 := t2 / 3 x := t1 + t2 goto L3 L2: y := 5 L3: x := x + y οι προσωρινές μεταβλητές αντιστοιχούν σε εσωτερικούς κόμβους του συντακτικού δένδρου Οι εντολές του κώδικα τριών διευθύνσεων μπορούν να αναπαρασταθούν σε πίνακα από τετράδες: πράξη, παράμετρος 1, παράμετρος 2, αποτέλεσμα σε πίνακα από τριάδες: πράξη, παράμετρος 1, παράμετρος 2 (κάθε τριάδα θεωρείται ότι αντιστοιχεί σε μία προσωρινή μεταβλητή με πρόσβαση στην τιμή της μέσω αναφοράς στον αριθμό της εντολής) Τμ. Πληροφορικής, Α.Π.Θ.
Παραγωγή κώδικα τριών διευθύνσεων Ιδιότητες: E.place: θέση όπου βρίσκεται η τιμή για τηνέκφρασηE E.code: σειρά εντολών που παράγονται για τηνE Διαδικασίες: newtemp(): επιστρέφει κάθε φορά μία νέα προσωρινή μεταβλητή gen(): δημιουργεί κώδικα(καλείται με τις κατάλληλες παραμέτρους) lookup(id.name): επιστρέφει τη θέση του id στον πίνακα συμβόλων ΠαραγωγέςΣημασιολογικοί κανόνες S id := E id.place lookup(id.name); S.code E.code || gen(id.place ‘:=‘ E.place); E E1 + E2 E.place newtemp(); E.code E1.code || E2.code || gen(E.place ‘:=‘ E1.place ‘+’ E2.place); E E1 * E2 E.place newtemp(); E.code E1.code || E2.code || gen(E.place ‘:=‘ E1.place ‘*’ E2.place); E ( E1 ) E.code E1.code; E.place E1.place; E E1 E.place newtemp(); E.code E1.code || gen(E.place ‘:=‘ ‘uminus’ E1.place); E idE.place lookup(id.name); E.code ‘’ (κενή συμβολοσειρά) Τμ. Πληροφορικής, Α.Π.Θ.
Παραγωγή κώδικα για μηχανή στοίβας Ιδιότητες:E.code: σειρά εντολών που παράγονται για τηνE (δε χρειάζεται ιδιότητα θέσης για την έκφραση, αφού το αποτέλεσμα της έκφρασης αποθηκεύεται στη στοίβα) Διαδικασίες: newtemp(): επιστρέφει κάθε φορά μία νέα προσωρινή μεταβλητή gen(): δημιουργεί κώδικα(καλείται με τις κατάλληλες παραμέτρους) lookup(id.name): επιστρέφει τη θέση του id στον πίνακα συμβόλων ΠαραγωγέςΣημασιολογικοί κανόνες S id := E id.place lookup(id.name); S.code E.code || gen(‘store’ id.place); E E1 + E2 E.code E1.code || E2.code || gen(‘add’); (οι παράμετροι της εντολής add βρίσκονται στην κορυφή της στοίβας) E E1 * E2 E.code E1.code || E2.code || gen(‘multiply’); E ( E1 ) E.code E1.code; E E1 E.code E1.code || gen(‘negate‘); E idE.code gen(‘load’ id.place) Τμ. Πληροφορικής, Α.Π.Θ.
Παραγωγή κώδικα για λογικές εκφράσεις • Δύο προσεγγίσεις: • Αριθμητική αναπαράσταση • Συνεπαγόμενη αναπαράσταση • Αριθμητική αναπαράσταση • Χρησιμοποιούμε 1 για το true και 0 για το false • Σε κώδικα τριών διευθύνσεων αποθηκεύεται το αποτέλεσμα σε προσωρινή μεταβλητή • Σε κώδικα μηχανής στοίβας το αποτέλεσμα αποθηκεύεται στη στοίβα • Συνεπαγόμενη αναπαράσταση • Για λογικές εκφράσεις που χρησιμοποιούνται σε έλεγχο ροής (π.χ. εντολές if, while κλπ.) καιδε χρησιμοποιούνται για τον υπολογισμό ενός αποτελέσματος, • δημιουργούμε κώδικα που απλά διακλαδώνει στην κατάλληλη εντολή ανάλογα με το αποτέλεσμα Τμ. Πληροφορικής, Α.Π.Θ.
Λογικές εκφράσεις: αριθμητική αναπαράσταση Ιδιότητες : E.place: θέση όπου βρίσκεται η τιμή για τηνέκφρασηE E.code: σειρά εντολών που παράγονται για τηνE id.place: θέση του id Καθ. μεταβλητή: nextstat: επιστρέφει τη θέση της νέας εντολής που θα δημιουργηθεί (κάθε κλήση στη gen() αυξάνει τη nextstat κατά 1) ΠαραγωγέςΣημασιολογικοί κανόνες E id1 relop id2E.place newtemp(); E.code gen(‘if’ id1.place relop.op id2.place ‘goto’ nextstat+3); || gen(E.place ‘:=‘ ‘0’) || gen(‘goto’ nextstat+2) || gen(E.place ‘:=‘ ‘1’); E E1 and E2 E.place newtemp(); E.code E1.code || E2.code || gen(E.place ‘:=‘ E1.place ‘and’ E2.place); Τμ. Πληροφορικής, Α.Π.Θ.
Λογικές εκφράσεις: συνεπαγόμενη αναπαράσταση Ιδιότητες : E.code: σειρά εντολών που παράγονται για τηνE E.false: ετικέτα διακλάδωσης αν ηEείναι false E.true: ετικέτα διακλάδωσης αν ηEείναι true (E.codeείναι συνθέσιμηενώ οιE.trueκαιE.falseείναι κληρονομήσιμες) id.place: θέση του id ΠαραγωγέςΣημασιολογικοί κανόνες E id1 relop id2E.code gen(‘if’ id1.place relop.op id2.place ‘goto’ E.true) || gen(‘goto’ E.false); E E1 and E2 E1.true newlabel(); E1.false E. false; E2.true E. true; E2.false E. false; E.code E1.code || gen(E1.true ‘:’) || E2.code ; οποιοσδήποτε τελεστής συσχέτισης:==, <=, >= != Τα συγκεκριμένα σημεία του κώδικα συμπληρώνονται με τις κατάλληλες ετικέτες όταν αυτές γίνουν διαθέσιμες Η δημιουργηθείσα ετικέτα τοποθετείται στη θέση της E1.trueστον κώδικα τηςE1 Τμ. Πληροφορικής, Α.Π.Θ.
Παράδειγμα λογικών εκφράσεων Αριθμητική αναπαράσταση: 100 if x < y goto 103 101 t1 := 0 102 goto 104 103 t1 := 1 104 if a = b goto 107 105 t2 := 0 106 goto 108 107 t2 := 1 108 t3 := t1 and t2 Θέσεις εντολών τριών διευθύνσεων και όχι ετικέτες Λογική έκφραση εισόδου: x < y and a == b Συνεπαγόμενη αναπαράσταση: if x < y goto L1 goto LFalse L1: if a = b goto LTrue goto LFalse ... LTrue: LFalse: Οι ετικέτες αυτές παράγονται σε μεταγενέστερη φάση και τοποθετούνται στη σωστή θέση του κώδικα Τμ. Πληροφορικής, Α.Π.Θ.
έλεγχος σώμα loop έλεγχος επόμενο block Εντολές ελέγχου ροής If-then-else • Διακλάδωση ανάλογα με το αποτέλεσμα λογικής έκφρασης Βρόχοι (loops) • Αποτίμηση συνθηκών πριν από το loop (αν χρειάζεται) • Αποτίμηση συνθήκης μετά από το loop • Διακλάδωση στην αρχή, αν ισχύει η συνθήκη While, for, do καιuntilυλοποιούνται όλα έτσι Τμ. Πληροφορικής, Α.Π.Θ.
Εντολές ελέγχου ροής: δομή κώδικα S if E then S1 else S2 S while E do S1 στοE.true S.begin: στοE.true E.code αν ηEείναι true E.code στοE.false στοE.false αν ηEείναι false E.true: E.true: S1.code S1.code goto S.next goto S.begin E.false: E.false: S2.code S.next: Τμ. Πληροφορικής, Α.Π.Θ.
Εντολές ελέγχου ροής: παραγωγή κώδικα Ιδιότητες : S.code: σειρά εντολών που παράγονται για τηνS S.next: ετικέτα για την εντολή που θα εκτελεστεί αμέσως μετά τηνS (η S.next είναι κληρονομήσιμη ιδιότητα) ΠαραγωγέςΣημασιολογικοί κανόνες S if E then S1 else S2E.true newlabel(); E.false newlabel(); S1.next S. next; S2.next S. next; S.code E.code || gen(E.true ‘:’) || S1.code || gen(‘goto’ S.next) || gen(E.false ‘:’) || S2.code ; S while E do S1 S.begin newlabel(); E.true newlabel(); E.false S. next; S1.next S. begin; S.code gen(S.begin ‘:’) || E.code || gen(E.true ‘:’) || S1.code || gen(‘goto’ S.begin); S S1; S2 S1.next newlabel(); S2.next S.next; S.code S1.code || gen(S1.next ‘:’) || S2.code Τμ. Πληροφορικής, Α.Π.Θ.
Παράδειγμα εντολής ελέγχου ροής L1: if a < b goto L2 goto LNext L2: if c < d goto L3 goto L4 L3: t1 := y + z x := t1 goto L1 L4: t2 := y – z x := t2 goto L1 LNext: ... Απόσπασμα πηγαίου κώδικα: while (a < b) { if (c < d) x = y + z; else x = y – z } Τμ. Πληροφορικής, Α.Π.Θ.
Backpatching • ΟιE.true, E.false, S.next μπορεί να μην είναι εφικτό να υπολογισθούν με ένα πέρασμα (είναι κληρονομήσιμες ιδιότητες) • Το backpatching είναι μία τεχνική δημιουργίας ετικετώνE.true, E.false, S.nextκαι εισαγωγής τους στις κατάλληλες θέσεις κώδικα με ένα μόνο πέρασμα • Βασική ιδέα • Διατηρούμε τις λίστεςE.truelist, E.falselist, S.nextlist • E.truelist: η λίστα των εντολών όπου πρέπει να συμπληρωθεί η ετικέτα για τοE.true όταν αυτή γίνει διαθέσιμη • S.nextlist: η λίστα των εντολών όπου πρέπει να συμπληρωθεί η ετικέτα για τοS.nextόταν αυτή γίνει διαθέσιμη • Όταν γίνουν διαθέσιμες οι τιμές τωνE.true, E.false, S.nextτότε συμπληρώνονται οι ετικέτες στις εντολές που αναφέρονται στις λίστες Τμ. Πληροφορικής, Α.Π.Θ.
Παραγωγή κώδικα στο μεταγλωττιστή της YAPL • Στο μεταγλωττιστή του βιβλίου • παράγεται κώδικας assembly • απευθείας, με μεταδιατεταγμένη διάσχιση του συντακτικού δένδρου από αριστερά προς τα δεξιά • Δε χρησιμοποιείται κώδικας τριών διευθύνσεων ή κάποια άλλη μορφή ενδιάμεσης αναπαράστασηςεκτός του παραγόμενου συντακτικού δέντρου Τμ. Πληροφορικής, Α.Π.Θ.
Συνάρτηση δημιουργίας εντολής void emit_code(char keno,char *optr,char *opd1,char *opd2,char *opd3) { char kodikas[81]; if(keno == 'y') { strcpy(kodikas," "); strcat(kodikas,optr); } else strcpy(kodikas,optr); if(strlen(opd1) > 0) { strcat(kodikas," "); strcat(kodikas,opd1); if(strlen(opd2) > 0) { strcat(kodikas,","); strcat(kodikas,opd2); if(strlen(opd3) > 0) { strcat(kodikas,","); strcat(kodikas,opd3); } } } strcat(kodikas,"\n"); fputs(kodikas,femitc); } Τμ. Πληροφορικής, Α.Π.Θ.
Συνάρτηση διάσχισης δένδρου void CodeGeneration(AstNode *p, int lev, int lvalue, int leftChild) { switch (p->NodeType) { case astEmptyProgram: break; case astProgram: ProcessProgram(p,lev);break; case astEmptyDeclSeq: break; case astDeclSeq:ProcessDeclSeq(p,lev,lvalue);break; case astDecl:ProcessDecl(p,lev,lvalue);break; ..................................................... case astStmtSeq: ProcessStmtSeq(p,lev,lvalue);break; case astIfElseStmt:ProcessIfElseStmt(p,lev,lvalue);break; case astIfStmt:ProcessIfStmt(p,lev,lvalue);break; case astExprStmt: ProcessExprStmt(p,lev,lvalue);break; case astNullStmt:ProcessNullStmt();break; case astReadStmt: ProcessReadStmt(p,lev); break; case astPrintStmt: ProcessPrintStmt(p,lev);break; case astDecimConst: ProcessDecimConst(p); break; ..................................................... case astNotEq: ProcessComp(p,lev,lvalue,leftChild);break; case astAssign: ProcessAssign(p,lev,leftChild);break; default: printf("AGNOSTO=%d\n",p->NodeType); } } Τμ. Πληροφορικής, Α.Π.Θ.
Συνάρτηση επεξεργασίας κόμβου PrintStmt void ProcessPrintStmt(AstNode *p, int lev) { symbol *rhs; CodeGeneration(p->pAstNode[0],lev+1,FALSE,FALSE); rhs=pop_vs(); switch( rhs->sclass ) { case MEMORY: case CONSTANT: emit_code('y',"mov","ax",rhs->name,""); emit_code('y',"push","ax","",""); break; case REGISTER: emit_code('y',"push",rhs->name,"",""); break; } emit_code('y',"push","10","",""); emit_code('y',"call","_PrintInt","",""); emit_code('y',"add","sp","4",""); discard_symbol(rhs); } Τμ. Πληροφορικής, Α.Π.Θ.
31 15 8 7 0 AH AX EAX AL EBX BX BH BL CX CH CL ECX EDX DX DH DL ESP SP EBP BP ESI SI EDI DI CS SS DS ES FS GS EIP IP EFLAGS FLAGS Παραγωγή κώδικα: Αρχιτεκτονική Pentium Ι καταχωρητές δεδομένων δείκτης στοίβας (κορυφή) καταχωρητές διευθύνσεων βάση υπολογισμού διευθύνσεων δείκτες διευθύνσεων σε σχέση με μία βάση βάσεις τμημάτων μνήμης Τμ. Πληροφορικής, Α.Π.Θ.
15 0 Βάση του Τμήματος Μνήμης 0 0 0 0 15 0 offset + 19 0 Διεύθυνση Μνήμης Παραγωγή κώδικα: Αρχιτεκτονική Pentium ΙΙ ΥΠΟΛΟΓΙΣΜΟΣ ΔΙΕΥΘΥΝΣΗΣ ΜΝΗΜΗΣ (real mode): • το περιεχόμενο του καταχωρητή τμήματος μετατοπίζεται τέσσερα bit προς τα αριστερά (δηλ. πολλαπλασιάζεται επί 16) • στην τιμή που προκύπτει προστίθεται η απόκλιση • εντολές: από το τμήμα που υποδεικνύει ο CS (code segment) σε συνδυασμό με τον IP (instruction pointer) • διεύθυνση εντολής: CS:IP • καταχώρηση ή ανάγνωση δεδομένων: από το τμήμα που υποδεικνύει ο DS (data segment) • πράξεις στοίβας: το τμήμα της στοίβας υποδεικνύεται από τον SS (stack segment) Τμ. Πληροφορικής, Α.Π.Θ.
Παραγωγή κώδικα: Αρχιτεκτονική Pentium ΙΙI Επικάλυψη στην εκχώρηση τμημάτων μνήμης Τμ. Πληροφορικής, Α.Π.Θ.
Παραγωγή κώδικα: Αρχιτεκτονική Pentium ΙV • o EFLAGS είναι καταχωρητής σημαιών • Οι εντολές χρησιμοποιούν δεδομένα τα οποία βρίσκονται είτε • σε καταχωρητές δεδομένων • είτε στην ίδια την εντολή • είτε στη μνήμη • Ανάλογα με τον τύπο της εντολής τα δεδομένα μπορεί να είναι • ενός byte • μιας λέξης (word) • μιας διπλής λέξης (double) • Τουλάχιστο ένα από τα δεδομένα πρέπει να βρίσκεται σε καταχωρητή Τμ. Πληροφορικής, Α.Π.Θ.
Παραγωγή κώδικα: Εντολές assembly I MOV προορισμός, αφετηρία Η εντολή MOV καταχωρεί στον προορισμό αντίγραφο του δεύτερου τελεστέου. Αν ο προορισμός είναι ένας από τους καταχωρητές τμήματος (DS, ES, SS, FS, GS), τότε η αφετηρία πρέπει να είναι ένας από τους καταχωρητές δεδομένων. ADD προορισμός,αφετηρία Η εντολή ADD προσθέτει δύο ακεραίους. Ο προορισμός δηλώνει τον προορισμό του αποτελέσματος της πράξης, δηλαδή ότι το άθροισμα καταχωρείται στον καταχωρητή ή στη διεύθυνση προορισμού. SUB προορισμός,αφετηρία Η εντολή SUB αφαιρεί το δεύτερο τελεστέο από τον πρώτο. Η διαφορά καταχωρείται στον καταχωρητή ή στη μνήμη προορισμού. IMUL Προσημασμένος πολλαπλασιασμός σε διάφορες μορφές με ένα ή δύο ορίσματα. Τμ. Πληροφορικής, Α.Π.Θ.
Παραγωγή κώδικα: Εντολές assembly IΙ Η εντολή IMUL εκτελεί προσημασμένο πολλαπλασιασμό. Κάποιες μορφές της εντολής χρησιμοποιούν έμμεσα τελεστέους που βρίσκονται σε καταχωρητές. IDIV Η εντολή IDIV εκτελεί προσημασμένη διαίρεση. Ο διαιρετέος πρέπει να βρίσκεται σε έναν από τους καταχωρητές AL, AX και EAX ανάλογα με τον τύπο του, ενώ το πηλίκο και το υπόλοιπο καταχωρούνται έμμεσα σε συγκεκριμένους καταχωρητές. Ο διαιρέτης δίδεται ως r/m τελεστέος. Τμ. Πληροφορικής, Α.Π.Θ.
Παραγωγή κώδικα: Εντολές assembly IΙI PUSH όρισμα Η εντολή PUSH μειώνει το δείκτη της στοίβας κατά 2 όταν το όρισμα είναι 16 bit ή κατά 4 όταν το όρισμα είναι 32 bit. Η εντολή PUSH τοποθετεί το όρισμα στην κορυφή της στοίβας, την οποία δείχνει ο δείκτης της στοίβας. Τμ. Πληροφορικής, Α.Π.Θ.
Παραγωγή κώδικα: Εντολές assembly IV POP όρισμα Η εντολη POP διαγράφειαπό τη στοίβα το δεδομένο που δείχνει ο καταχωρητής SP ή ESP, και το αποθηκεύει στο όρισμα της εντολής, που μπορεί να είναι θέση μνήμης, καταχωρητής ή καταχωρητής τμήματος. Ο καταχωρητής SP αυξάνεται κατά 2 για 16 bit δεδομένο ή κατά 4 για 32 bit δεδομένο. Τμ. Πληροφορικής, Α.Π.Θ.
astAssign astSub astId (x) astAdd astMult astId (f) astId (e) astMult astMult astId (a) astId (b) astId (c) astId (d) Παραγωγή κώδικα: Παράδειγμα Παραγωγή κώδικα για έκφραση εκχώρησης τιμής x=a*b+c*d-e*f Τμ. Πληροφορικής, Α.Π.Θ.
Παραγωγή κώδικα: Παράδειγμα (συνέχεια) mov ax,_a imul _b push ax mov ax,_c imul _d pop dx add dx,ax push dx mov ax,_e imul _f pop dx sub dx,ax mov _x,dx Τμ. Πληροφορικής, Α.Π.Θ.
Παραγωγή κώδικα: Παράδειγμα ΙΙ .model small .stack 100h .586 ; The Data Segment .data _i sword ? _j sword ? ; The Code Segment .code extrn _print_int:proc extrn _read_int:proc main proc mov ax,@data mov ds,ax mov _i,2 mov _j,-6 mov ax,_i imul _j push ax call _print_int pop cx ; Return to the Operating System mov ax,4c00h int 21h main endp end main { int i,j; i=2; j=-6; print(i*j); } πέρασμα παραμέτρου μέσω της στοίβας κλήση υποπρογράμματος Τμ. Πληροφορικής, Α.Π.Θ.
Απεικόνιση Τύπων & Δεδομένων στη Μνήμη • Τύπος Δεδομένων είναι ένα σύνολο τιμών με τις επιτρεπτές πράξεις επί των τιμών αυτών. • Βασικοί τύποι: ακέραιοι, πραγματικοί, λογικός, χαρακτήρες • Δομημένοι τύποι: πίνακες, εγγραφές, συμβολοσειρές • Τύπος προσπέλασης (δείκτες) • Περιγραφή Τύπου Υψηλού Επιπέδου: χαρακτηριστικά που διακρίνουν τις τιμές του τύπου, τιμές, πράξεις • Περιγραφή Τύπου Χαμηλού Επιπέδου: απεικόνιση (δήλωση) τύπου στην μνήμη, εντολές της γλώσσας του επεξεργαστή που υλοποιούν τις πράξεις του υψηλού επιπέδου Τμ. Πληροφορικής, Α.Π.Θ.
Ακέραιοι Ι Ακέραιοι προσημασμένοι ενός byte από -128 έως +127 και μη προσημασμένοι από 0 έως 255 arithmos sbyte ? ; χωρίς αρχική τιμή apotelesma byte ? ; χωρίς αρχική τιμή με byte δηλώνουμε μη προσημασμένες μεταβλητές και με sbyte δηλώνουμε προσημασμένες μεταβλητές Τμ. Πληροφορικής, Α.Π.Θ.
Ακέραιοι ΙΙ Ακέραιοι δύο byte από -32768 έως +32767 και μη προσημασμένοι από 0 έως 65535 akeraios sword -3456 ; με αρχική τιμή etosword 1998 ; επίσης με αρχική τιμή Ακέραιοι τεσσάρων byte από -2147483648 έως + 2147483647 και μη προσημασμένοι από 0 έως 4294967295 lakeraios sdword -543890 ; με αρχική τιμή poso dword ? ; χωρίς αρχική τιμή Τμ. Πληροφορικής, Α.Π.Θ.
Ακέραιοι ΙΙΙ Αριθμητικές πράξεις: ADD, ADC, INC, SUB, SBB, DEC, MUL, IMUL, DIV, IDIV NEG για την εύρεση του συμπληρωματικού ενός αριθμού CMP για τη σύγκριση δύο ακεραίων Τμ. Πληροφορικής, Α.Π.Θ.
Πραγματικοί Ι • Οι πραγματικοί αριθμοί απεικονίζονται με τη μορφή της κινητής υποδιαστολής. Ο συμβολισμός αυτός βασίζεται στο πρόσημο S, το κλάσμα F, τον εκθέτη E, και αναπαριστά μια τιμή V ως εξής: V=(-1)S * F * 10E Πραγματικός Αριθμός Απλής Ακρίβειας Πραγματικός Αριθμός Διπλής Ακρίβειας Τμ. Πληροφορικής, Α.Π.Θ.
Πραγματικοί ΙΙ arithmos real4 1.5 apotelesma real8 1.0e-25 apotelesmareal10 -1.2594e+10 Αριθμητικές πράξεις: FADD, FSUB, FMUL, FDIV Τμ. Πληροφορικής, Α.Π.Θ.
Λογικές Τιμές Ι Μια λογική μεταβλητή μπορεί να δηλωθεί χρησιμοποιώντας: • ένα bit από ένα byte το οποίο χρησιμοποιείται για την δήλωση περισσότερων λογικών μεταβλητών. • το bit του πρόσημου, αγνοώντας το υπόλοιπο byte. • ένα byte. Όταν περιέχει το 0 τότε παριστάνει την τιμή FALSE, ενώ οποιοσδήποτε άλλος αριθμός παριστάνει τη τιμή TRUE. Τμ. Πληροφορικής, Α.Π.Θ.
Λογικές Τιμές ΙΙ Οι εντολές λογικών πράξεων είναι: AND, OR, XOR, NOT, TEST. Οι εντολές αυτές επηρεάζουν τις σημαίες του καταχωρητή EFLAGS. Αυτό που μας ενδιαφέρει είναι ο τρόπος με τον οποίο οι σημαίες Zero, Carry και Sign παρουσιάζουν το αποτέλεσμα που παράγεται από λογικές πράξεις. Τμ. Πληροφορικής, Α.Π.Θ.
Χαρακτήρες kefalaio byte 'G' ; με αρχική τιμή Τμ. Πληροφορικής, Α.Π.Θ.
Μονοδιάστατοι Πίνακες Ι Pascal: Pinax:array[minindex..maxindex] of element_type; C: element_type Pinax[n]; Τμ. Πληροφορικής, Α.Π.Θ.
Μονοδιάστατοι Πίνακες ΙΙ Για να δεσμευτεί χώρος στη μνήμη αρκετός για την αποθήκευση όλων των στοιχείων του πίνακα πρέπει να γίνει η εξής δήλωση: όνομα-πίνακα βασικός-τύπος n dup (?) xaraktires byte 128 dup (?) ;Πίνακας 128 ;χαρακτήρων χωρίς ;αρχική τιμή. longakeraioi sdword 24 dup (?) ;Πίνακας 24 μεγάλων ;ακεραίων χωρίς αρχική ;τιμή. pragmatikoi real4 8 dup (1.0) ;Πίνακας 8 πραγματικών ;αριθμών με αρχική ;τιμή ίση με 1.0. Τμ. Πληροφορικής, Α.Π.Θ.
Μονοδιάστατοι Πίνακες ΙΙΙ Η δήλωση πινάκων των οποίων τα στοιχεία έχουν διαφορετικές αρχικές τιμές γίνεται ως εξής: όνομα-πίνακα βασικός-τύπος τιμή1,τιμή2,...,τιμήk sqrindex sword 1,4,9,16,25,36,49,64,81,100 Προσπέλαση μονοδιάστατου πίνακα: διεύθυνση iου στοιχείου = διευθ(P1) + ( i-minindex)*μέγεθος_στοιχείου Τμ. Πληροφορικής, Α.Π.Θ.
Μονοδιάστατοι Πίνακες ΙV Άρα η διεύθυνση του 4ου στοιχείου του πίνακα P, που συμβολίζεται ως P[4], βρίσκεται με τον τύπο: διεύθυνση 4ου στοιχείου = P + ( 4-1)*2 = P + 6 mov bx,i ; bx:=i sub bx,1 ; bx:=i-1 add bx,bx ; bx:=(i-1)*2 mov ax,P[bx] ; ax:=περιεχόμενο(P+(i-1)*2) ή mov bx,i ; bx:=i sub bx,1 ; bx:=i-1 shl bx,1 ; bx:=(i-1)*2 mov ax,P[bx] ; ax:=περιεχόμενο(P+(i-1)*2) Τμ. Πληροφορικής, Α.Π.Θ.
Μονοδιάστατοι Πίνακες V Η αρχή του πίνακα αποθηκεύεται στον καταχωρητή βάσης bx και ο δείκτης του στοιχείου στον καταχωρητή si. Ο υπολογισμός της διεύθυνσης γίνεται ως εξής: lea bx,P ; bx:=address of P mov si,i ; si:=i sub si,1 ; si:=i-1 shl si,1 ; si:=(i-1)*2 mov ax,[bx][si] ; ax:=περιεχόμενο(P+(i-1)*2) Η διαφορά φαίνεται στον υπολογισμό της θέσης άλλου στοιχείου του ίδιου πίνακα, όπου ο μόνος υπολογισμός που θα γίνει θα είναι αυτός της θέσης του στοιχείου: mov si,i2 ; si:=i2 sub si,1 ; si:=i2-1 shl si,1 ; si:=(i2-1)*2 mov ax,[bx][si] ; ax:=περιεχόμενο(P+(i2-1)*2) Τμ. Πληροφορικής, Α.Π.Θ.
Πίνακες Πολλών Διαστάσεων Ι Pascal: Pinaxk:array[minindex1..maxindex1,...,minindexκ..maxindexκ] of element_type; C: element_type Pinaxk[n1][n2]...[nk]; Τμ. Πληροφορικής, Α.Π.Θ.
Πίνακες Πολλών Διαστάσεων ΙΙ • Κατάταξη με πρώτη τη γραμμή θέση = διεύθυνση_πρώτου_στοιχειου + ((δείκτης_γραμμής – 1) * πλήθος_στοιχείων_γραμμής + (δείκτης_στήλης – 1)) * μέγεθος_στοιχείου Τμ. Πληροφορικής, Α.Π.Θ.