Συμβολική γλώσσα και η εκτέλεση γλωσσών υψηλού επιπέδου

Διομήδης Σπινέλλης
Τμήμα Διοικητικής Επιστήμης και Τεχνολογίας
Οικονομικό Πανεπιστήμιο Αθηνών
dds@aueb.gr

Λειτουργίες του συμβολομεταφραστή

Δομή του πηγαίου κώδικα

Παράδειγμα:
        cmp $10,%ebx
        je end
        push %ebx
        mov %ebx, %esi
        inc %esi
        push $intform

Προσδιορισμός σταθερών

Στη συμβολική γλώσσα εκτός από εντολές του επεξεργαστή χρειάζεται να παραστήσουμε και σταθερές. Μπορούμε να εισάγουμε:

Μπορούμε να συνδυάσουμε σταθερές με τελεστές με σημασιολογία ίδια με αυτή της C. Μοναδιαίοι (unary) τελεστές:

Δυαδικοί (binary) τελεστές:
  1. Μέγιστη προτεραιότητα
  2. Ενδιάμεση προτεραιότητα
  3. Ελάχιστη προτεραιότητα
Η εισαγωγή των σταθερών στη μνήμη γίνεται με εντολές του συμβολομεταφραστή: Παράδειγμα:
.byte   'a', 'b'
.short 578
.word 324234
.string "helloworld\n"

Χρήση συμβόλων

Παράδειγμα:
intform.string        "%d\n"
.globl main
main:
        mov  $0, %ebx
loop:
        cmp $10,%ebx

Το περιβάλλον εκτέλεσης της C

Για να τους σκοπούς του μαθήματος τα προγράμματα σε συμβολική γλώσσα θα γράφονται και θα συνδέονται στο περιβάλλον εκτέλεσης των προγραμμάτων της C. Αυτό μας δίνει τις παρακάτω δυνατότητες: Παράδειγμα:
hi.string "helloworld\n"
.globl main
main:
        push $hi
        call printf
        addl $5, %sp
        pushl $0
        call exit

Κλήση συναρτήσεων

Χρήση καταχωρητών

Στο περιβάλλον λειτουργίας της 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             // Yesfinish
        push    %eax            // Pass it on
        call    putchar         // Print character pushed
        addl    $4, %esp        // Adjust back stack
        jmp     loop
end:    pushl   $             // Exit code
        call    exit

Βιβλιογραφία