Συμβατική μηχανή και συμβολική γλώσσα

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

Άξονες σχεδιασμού αρχιτεκτονικής εντολών

Η αρχιτεκτονική εντολών ενός επεξεργαστή σχεδιάζεται γύρω από τους παρακάτω άξονες:

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

Καταχωρητές

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

Σημείωση

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

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

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

Απόδοση εντολών με στοίβα

Παράδειγμα

Συνάρτηση σε C (μια ρίζα δευτεροβάθμιας εξίσωσης):
#include <math.h>

double
root1(double a, double b, double c)
{
	double d;

	d = b * b - 4.0 * a * c;
	return (-b + sqrt(d)) / (2.0 * a);
}
Αντίστοιχος κώδικας σε συμβολική γλώσσα. Η πρόσβαση στη στοίβα γίνεται με τη ST(Ν) όπου Ν ο αριθμός του στοιχείου στη στοίβα.
CONST	SEGMENT
$FOUR	DQ	04010000000000000r		; 4
CONST	ENDS
_TEXT	SEGMENT
_a$ = 8
_b$ = 16
_c$ = 24
_root1	PROC NEAR
	fld	QWORD PTR _c$[esp-4]
	fmul	QWORD PTR _a$[esp-4]
	fld	QWORD PTR _b$[esp-4]
	fmul	ST(0), ST(0)
	fld	QWORD PTR _a$[esp-4]
	fxch	ST(2)
	fmul	QWORD PTR $FOUR
	fxch	ST(2)
	fadd	ST(0), ST(0)
	fxch	ST(2)
	fsubp	ST(1), ST(0)
	fsqrt
	fsub	QWORD PTR _b$[esp-4]
	fxch	ST(1)
	fdivp	ST(1), ST(0)
	ret	0
_root1	ENDP
_TEXT	ENDS
END

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

Κωδικοποίηση εντολών σε επεξεργαστές της Intel


Βασική κωδικοποίηση εντολών


Κωδικοποίηση εντολών ενός byte


Το byte ModR/M προσδιορίζει τις διευθύνσεις των εντολών


Το byte SIB (scale, index, base) επιτρέπει τον ορθόγωνο προσδιορισμό κλίμακας, δείκτη και βάσης.

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

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)
Περιστροφή δεξιά
bsf προορισμός, πηγή
(Bit scan forward)
Εύρεση πρώτου bit με τιμή 1 στην πηγή
bsr προορισμός, πηγή
(Bit scan reverse)
Αντίστροφη εύρεση πρώτου bit με τιμή 1 στην πηγή
bt πηγή, αριθμός
(Bit test)
Έλεγχος bit σε σειρά από bit
btc προορισμός, αριθμός
(Bit test and complement)
Αντιστροφή bit σε σειρά από bit
btr προορισμός, αριθμός
(Bit test and reset)
Μηδενισμός bit σε σειρά από bit
bts προορισμός, αριθμός
(Bit test and set)
Θέτει σε 1 bit σε σειρά από bit

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

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)
Άλμα αν όχι πρόσημο

Παγίδες

Διακοπές

Αποσφαλμάτωση

Οι σύγχρονοι επεξεργαστές έχουν λειτουργικότητα για την αποσφαλμάτωση προγραμμάτων. Μερικά στοιχεία της λειτουργικότητας αυτής είναι: Παράλληλα εντολές επιτρέπουν τον καθαρισμό της κρυφής μνήμης για την υλοποίηση προγραμμάτων που μετατρέπουν τον εαυτό τους.

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

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

Παράδειγμα:
	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 "hello, world\n"

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

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

Βιβλιογραφία και πηγές στο Internet

Ασκήσεις

Στην απάντησή σας να δείξετε πως καταλήξατε σε κάθε αποτέλεσμα.