Προγραμματισμός σε επίπεδο μηχανής

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

Δομή ενός υπολογιστή

Κεντρική μονάδα επεξεργασίας

O κύκλος εντολών

  1. Ανάκληση εντολής (Instruction fetch)
  2. Αποκωδικοποίηση εντολής (Instruction decode)
  3. Εκτέλεση εντολής (Instruction execution)
  4. Πρόσβαση μνήμης (Memory access)
  5. Εγγραφή

Οικογένειες επεξεργαστών

Η οικογένεια επεξεργαστών iAPX86

Καταχωρητές

Προσδιορισμός τελεστέων

Σημείωση

Η σύνταξη που χρησιμοποιούμε είναι αυτή των συμβολομεταφραστών της AT&T που υποστηρίζονται στο λειτουργικό σύστημα Unix (π.χ. GNU as). Η σύνταξη αυτή διαφέρει σημαντικά από αυτή που χρησιμοποιεί η Intel.

Το μέγεθος του τελεστή ορίζεται από το τελευταίο γράμμα της εντολής:
l
long (4 byte, long ή int)
w
word (2 byte, short)
b
byte (1 byte, char)

Συνδιασμοί τελεστών:

Παράσταση εντολών

Ενδείκτης διακλάδωσης

CF:
(Carry flag)
Κρατούμενο (Carry):
1 αν η πράξη δημιούργησε κρατούμενο.
ZF:
(Zero flag)
Μηδέν:
1 αν το αποτέλεσμα της πράξης είναι 0.
SF:
(Sign flag)
Πρόσημο (sign)
1 αν το αποτέλεσμα είναι αρνητικός αριθμός.
PF:
(Parity flag)
Ισοτιμία
1 αν το αποτέλεσμα έχει μονό αριθμό από bit που είναι 1.
OF:
(Overflow flag)
Υπερχείλιση:
1 αν το αποτέλεσμα δε μπορεί να παρασταθεί ως θετικός η αρνητικός αριθμός.

Εντολές μεταφοράς δεδομένων

mov πηγή, προορισμός
(Move)
Μεταφορά
πηγή -> προορισμό
push πηγή
Μεταφορά στη στοίβα
%esp <- %esp - $4
(%esp) <- πηγή
pop προορισμός
Μεταφορά από τη στοίβα
προορισμός <- (%esp)
%esp <- %esp + $4
xchg προορισμός, πηγή
(Exchange)
Εναλλαγή
προορισμός <- πηγή
πηγή <- προορισμός
(ταυτόχρονα)

Αριθμητικές εντολές

add πηγή, προορισμός
(Add)
Πρόσθεση
προορισμός <- προορισμός + πηγή
inc προορισμός
(Increment)
Αύξηση κατά ένα
προορισμός <- προορισμός + 1
sub πηγή, προορισμός
(Subtract)
Αφαίρεση
προορισμός <- προορισμός - πηγή
dec προορισμός
(Decrement)
Μείωση κατά ένα
προορισμός <- προορισμός - 1
neg προορισμός
(Negate)
Αλλαγή προσήμου
προορισμός <- - προορισμός
cmp πηγή, προορισμός
(Compare)
Σύγκριση
Εκτελείται η πράξη προορισμός - πηγή και ενημερώνονται οι ενδείκτες διακλάδωσης.
mul πηγή
(Multiply)
Πολλαπλασιασμός
%edx:%eax <- %eax * πηγή
div πηγή
(Divide)
Διαίρεση
%eax <- %edx:%eax / πηγή
%edx <- %edx:%eax mod πηγή
Για να μετατρέψουμε τον ακέραιο 32 bit στον καταχωρητή %eax σε ακέραιο διαιρετέο 64 bit στο ζευγάρι καταχωρητών %edx:%eax (όπως απαιτεί η div) χρησιμοποιούμε την εντολή cltd (χωρίς παραμέτρους) (convert long to double long).

Εντολές δυαδικών ψηφίων

and πηγή, προορισμός
Σύζευξη
προορισμός <- προορισμός & πηγή
or πηγή, προορισμός
Διάζευξη
προορισμός <- προορισμός | πηγή
xor πηγή, προορισμός
Αποκλειστική διάζευξη
προορισμός <- προορισμός ^ πηγή
not προορισμός
Αντιστροφή
προορισμός <- ~ προορισμός
test πηγή, προορισμός
Έλεγχος
shl αριθμός, προορισμός
(Shift left)
Ολίσθηση (Shift) αριστερά
προορισμός <- προορισμός << πηγή
shr αριθμός, προορισμός
(Shift right)
Ολίσθηση δεξιά
προορισμός <- προορισμός >> πηγή
sar αριθμός, προορισμός
(Shift arithmetic right)
Αριθμητική ολίσθηση δεξιά
προορισμός <- προορισμός >> πηγή
rol αριθμός, προορισμός
(Rotate left)
Περιστροφή αριστερά
ror αριθμός, προορισμός
(Rotate right)
Περιστροφή δεξιά

Εντολές άλματος

JMP προορισμός
Άλμα
CALL προορισμός
Κλήση
RET
(Return)
Επιστροφή
JA/JNBE προορισμός
(Jump above)
Άλμα αν μεγαλύτερο (χωρίς πρόσημο)
JAE/JNB προορισμός
(Jump above or equal)
Άλμα αν μεγαλύτερο ή ίσο (χωρίς πρόσημο)
JB/JNAE προορισμός
(Jump bellow)
Άλμα αν μικρότερο (χωρίς πρόσημο)
JBE/JNA προορισμός
(Jump below or equal)
Άλμα αν μικρότερο ή ίσο (χωρίς πρόσημο)
JC προορισμός
(Jump carry)
Άλμα αν κρατούμενο
JNC προορισμός
(Jump no carry)
Άλμα αν όχι κρατούμενο
JE/JZ προορισμός
(Jump equal)
Άλμα αν ίσο
JNE/JNZ προορισμός
(Jump not equal)
Άλμα αν όχι ίσο
JG/JNLE προορισμός
(Jump greater)
Άλμα αν μεγαλύτερο (με πρόσημο)
JGE/JNL προορισμός
(Jump greater or equal)
Άλμα αν μεγαλύτερο ή ίσο (με πρόσημο)
JL/JNGE προορισμός
(Jump less)
Άλμα αν μικρότερο (με πρόσημο)
JLE/JNG προορισμός
(Jump less or equal)
Άλμα αν μικρότερο ή ίσο (με πρόσημο)
JO προορισμός
(Jump overflow)
Άλμα αν υπερχείλιση
JNO προορισμός
(Jump no overflow)
Άλμα αν όχι υπερχείλιση
JS προορισμός
(Jump sign)
Άλμα αν πρόσημο
JNS προορισμός
(Jump no sign)
Άλμα αν όχι πρόσημο

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

Ασκήσεις