Συμβολική γλώσσα και η εκτέλεση γλωσσών υψηλού επιπέδου
Διομήδης Σπινέλλης
Τμήμα Διοικητικής Επιστήμης και Τεχνολογίας
Οικονομικό Πανεπιστήμιο Αθηνών
dds@aueb.gr
Λειτουργίες του συμβολομεταφραστή
- Χρήση συμβολικών εντολών
- Χρήση συμβολικών τελεστέων
- Αυτόματη ανάθεση διευθύνσεων
- Δημιουργία αρχείων συνδέτη
- Σχόλια
- Υπολογισμός σταθερών
Δομή του πηγαίου κώδικα
- Ο πηγαίος κώδικας της συμβολικής γλώσσας είναι δομημένος με βάση ξεχωριστές
γραμμές κώδικα.
- Κάθε γραμμή μπορεί να περιέχει μία και μόνο μία εντολή.
- Οι εντολές δεν απαιτείται να τερματίζονται με κάποιον ειδικό χαρακτήρα.
- Τα σχόλια γράφονται με τη μορφή της C++:
// This is a comment
- Ο συμβολομεταφραστής δέχεται και ειδικές εντολές. Αυτές αρχίζουν
πάντα με μια τελεία:
.text
- Οι εντολές χωρίζονται από τις παραμέτρους και τους τελεστέους με κενά.
- Οι τελεστέοι χωρίζονται μεταξύ τους με κόμμα.
Παράδειγμα:
cmp $10,%ebx
je end
push %ebx
mov %ebx, %esi
inc %esi
push $intform
Προσδιορισμός σταθερών
Στη συμβολική γλώσσα εκτός από εντολές του επεξεργαστή χρειάζεται
να παραστήσουμε και σταθερές.
Μπορούμε να εισάγουμε:
- ακέραιους στο δεκαδικό σύστημα (π.χ. 10, 454, 23)
- ακέραιους στο δεκαεξαδικό (hexadecimal)
σύστημα αρχίζοντάς τους με 0x (π.χ. 0x5e, 0x34, 0xa23f)
- χαρακτήρες αρχίζοντάς τους με ένα μονό εισαγωγικό (π.χ. 'a, '4, '\n)
Μπορούμε να συνδυάσουμε σταθερές με τελεστές με σημασιολογία ίδια με
αυτή της C.
Μοναδιαίοι (unary) τελεστές:
Δυαδικοί (binary) τελεστές:
- Μέγιστη προτεραιότητα
- Ενδιάμεση προτεραιότητα
- Ελάχιστη προτεραιότητα
Η εισαγωγή των σταθερών στη μνήμη γίνεται με εντολές του συμβολομεταφραστή:
-
Στο συμβολομεταφραστή gas οι σταθερές εισάγονται με τις παρακάτω
εντολές:
- .byte
- Εισαγωγή σταθερών με μήκος 1 byte
- .short
- Εισαγωγή σταθερών με μήκος 2 byte
- .word
- Εισαγωγή σταθερών με μήκος 4 byte
- .string
- Εισαγωγή συμβολοσειρών
- Μετά από κάθε εντολή μπορούν να γραφούν μια ή περισσότερες σταθερές
χωρισμένες με κόμμα.
Παράδειγμα:
.byte 'a', 'b'
.short 578
.word 324234
.string "hello, world\n"
Χρήση συμβόλων
- Σε αρχεία πηγαίου κώδικα του συμβολομεταφραστή μπορούμε να αναφερθούμε με
συμβολικό τρόπο σε διευθύνσεις μνήμης (memory addresses)
δεδομένων ή κώδικα.
- Ο κώδικας και τα δεδομένα που γράφουμε καταχωρούνται σε αυξανόμενες
διευθύνσεις μνήμης.
- Μπορούμε να αποδώσουμε την τρέχουσα διεύθυνση μνήμης σε μια συμβολική
σταθερά (ετικέτα (label)))
γράφοντας στην αρχή της γραμμής το όνομα της σταθεράς (σύμφωνα με τους
κανόνες ονομασίας μεταβλητών της C) ακολουθούμενο από μια άνω κάτω τελεία:
thisaddress:
Παράδειγμα:
intform: .string "%d\n"
.globl main
main:
mov $0, %ebx
loop:
cmp $10,%ebx
Το περιβάλλον εκτέλεσης της C
Για να τους σκοπούς του μαθήματος τα προγράμματα σε συμβολική γλώσσα θα
γράφονται και θα συνδέονται στο περιβάλλον εκτέλεσης των προγραμμάτων της
C.
Αυτό μας δίνει τις παρακάτω δυνατότητες:
- Έναρξη του προγράμματος από την ετικέτα main
- Κλήσεις των συναρτήσεων της βιβλιοθήκης της C με την εντολή call.
- Τερματισμός του προγράμματος με κλήση της συνάρτησης exit.
Παράδειγμα:
hi: .string "hello, world\n"
.globl main
main:
push $hi
call printf
addl $5, %sp
pushl $0
call exit
Κλήση συναρτήσεων
- Η κλήση των συναρτήσεων της C γίνεται τοποθετώντας τις παραμέτρους
τις συνάρτησης από δεξιά προς τα αριστερά στη στοίβα (με την εντολή push).
- Κατά την επιστροφή από τη συνάρτηση ο δείκτης της στοίβας (%sp)
πρέπει να λάβει την αρχική του τιμή με τη χρήση της εντολής
addl $N, %sp όπου N ο αριθμός των byte που είχαν προστεθεί στη στοίβα.
- Η τιμή που επιστρέφει μια συνάρτηση βρίσκεται στον καταχωρητή %eax.
Χρήση καταχωρητών
Στο περιβάλλον λειτουργίας της C τα προγράμματα σε συμβολική γλώσσα
πρέπει να χρησιμοποιούν τους καταχωρητές με συγκεκριμένο τρόπο:
Ένα ολοκληρωμένο πρόγραμμα
Το παρακάτω πρόγραμμα αντιγράφει την είσοδό του στην έξοδο μέχρι να
συναντήσει τέλος του αρχείου (τη σταθερά -1).
// Copy standard input to standard output until EOF is read
.globl main
main: // Entry point
loop: call getchar // Read a character in %eax
cmpl $-1, %eax // EOF
je end // Yes, finish
push %eax // Pass it on
call putchar // Print character pushed
addl $4, %esp // Adjust back stack
jmp loop
end: pushl $0 // Exit code
call exit
Βιβλιογραφία
- Free Software Foundation.
Using as, 1999.
http://www.gnu.org/manual/gas-2.9.1/.