ΗΥ 232 Οργάνωση και Σχεδίαση Υπολογιστών. Intel x86 ISA. Νίκος Μπέλλας Τμήμα Ηλεκτρολόγων Μηχανικών και Μηχανικών ΗΥ

Σχετικά έγγραφα
Αρχιτεκτονικές Συνόλου Εντολών (ΙΙ)

Αρχιτεκτονική x86(-64) 32-bit και 64-bit λειτουργία. Αρχιτεκτονική x86(-64) Αρχιτεκτονική επεξεργαστών x86(-64) Αρχιτεκτονικές Συνόλου Εντολών (ΙΙ)

ΜΥΥ- 402 Αρχιτεκτονική Υπολογιστών ARM και x86

; Γιατί είναι ταχύτερη η λήψη και αποκωδικοποίηση των εντολών σταθερού μήκους;

ΟΡΓΑΝΩΣΗ ΚΑΙ ΣΧΕΔΙΑΣΗ Η/Υ

Αρχιτεκτονική Υπολογιστών

Εισαγωγή στους Η/Υ. Γιώργος Δημητρίου. Μάθημα 6 ο και 7 ο. Πανεπιστήμιο Θεσσαλίας - Τμήμα Πληροφορικής

Αρχιτεκτονικές Συνόλου Εντολών (ΙΙ)

Σύγχρονες Αρχιτεκτονικές Υπολογιστών

Προηγμένοι Μικροεπεξεργαστές. Έλεγχος Ροής Προγράμματος

6. Επιστροφή ελέγχου στο σημείο εκκίνησης

MIPS functions and procedures

Υποστήριξη διαδικασιών στο υλικό των υπολογιστών

Αρχιτεκτονική Υπολογιστών

Εντολές γλώσσας μηχανής

Οργάνωση επεξεργαστή (1 ο μέρος) ΜΥΥ-106 Εισαγωγή στους Η/Υ και στην Πληροφορική

Αρχιτεκτονική υπολογιστών

EPL475:Εργαστήριο 5, GDB

Κεντρική Μονάδα Επεξεργασίας (ΚΜΕ) Τμήματα ΚΜΕ (CPU) Ένα τυπικό υπολογιστικό σύστημα σήμερα. Οργάνωση Υπολογιστών (Ι)

Οργάνωση Υπολογιστών (Ι)

ΑΡΧΙΤΕΚΤΟΝΙΚΗ HARDWARE ΥΠΟΛΟΓΙΣΤΙΚΩΝ ΣΥΣΤΗΜΑΤΩΝ

Διαδικασίες Ι. ΗΥ 134 Εισαγωγή στην Οργάνωση και στον Σχεδιασμό Υπολογιστών Ι. Διάλεξη 4

Εργαστήριο 3 ΟΡΓΑΝΩΣΗ ΤΗΣ ΚΜΕ. Εισαγωγή

Εργαστήριο 4. Εαρινό Εξάμηνο ΠΡΟΣΟΧΗ: Αρχίστε νωρίς το Εργαστήριο 4. Οι ασκήσεις είναι πιο απαιτητικές από τα προηγούμενα εργαστήρια.

Στοιχεία από Assembly Γιώργος Μανής

Εισαγωγή στους Η/Υ. Γιώργος Δημητρίου. Μάθημα 2 ο. Πανεπιστήμιο Θεσσαλίας - Τμήμα Πληροφορικής

Αρχιτεκτονικές Συνόλου Εντολών

Οργάνωση Η/Υ. Γιώργος ηµητρίου. Μάθηµα 2 ο. Πανεπιστήµιο Θεσσαλίας - Τµήµα Μηχανικών Η/Υ, Τηλεπικοινωνιών και ικτύων

Μικροεπεξεργαστές - Μικροελεγκτές Ψηφιακά Συστήματα

-Επεξεργαστής: datapath (δίοδος δεδοµένων) (1) και control (2) -Μνήµη (3) -Συσκευές Εισόδου (4), Εξόδου (5) (Μεγάλη ποικιλία!!)

Προηγμένοι Μικροεπεξεργαστές. Φροντιστήριο 3 Έλεγχος Ροής Προγράμματος

Αρχιτεκτονική Υπολογιστών. Αρχιτεκτονική Συνόλου Εντολών (Instruction Set Architecture)

Αρχιτεκτονική Υπολογιστών. Αρχιτεκτονική Συνόλου Εντολών (Instruction Set Architecture)

LANGUAGE OF THE MACHINE. TEI Κρήτης, Τμ. ΕΠΠ, Αρχιτεκτονική Υπολογιστών. Οργάνωση Υπολογιστή. Τυπική οργάνωση υπολογιστή

Συναρτήσεις-Διαδικασίες

Αρχιτεκτονική Υπολογιστών

Αρχιτεκτονική Υπολογιστών

O επεξεργαστής: Η δίοδος δεδομένων (datapath) και η μονάδα ελέγχου (control)

και η µονάδα ελέγχου (control) O επεξεργαστής: Η δίοδος δεδοµένων (datapath) Εντολές διακλάδωσης (branch beq, bne) I Type Σχεδίαση datapath

Κεφάλαιο 3 Αρχιτεκτονική Ηλεκτρονικού Τμήματος (hardware) των Υπολογιστικών Συστημάτων ΕΡΩΤΗΣΕΙΣ ΑΣΚΗΣΕΙΣ

Chapter 2. Εντολές : Η γλώσσα του υπολογιστή. (συνέχεια) Η διασύνδεση Υλικού και λογισμικού David A. Patterson και John L.

Εισαγωγή στην πληροφορική -4

Data-Level Parallelism Linking & Loading

; Τι περιέχεται στη συσκευασία ενός μικροεπεξεργαστή σήμερα;

Chapter 2. Εντολές : Η γλώσσα του υπολογιστή. (συνέχεια) Η διασύνδεση Υλικού και λογισμικού David A. Patterson και John L.

Στοιχεία αρχιτεκτονικής μικροεπεξεργαστή

Αρχιτεκτονική Υπολογιστών

Θ. Ζαχαριάδης Αν. Καθηγητής. Λ. Σαράκης Καθ. Εφαρμογών

Εισαγωγή στους Η/Υ. Γιώργος Δημητρίου. Μάθημα 3-4: Προγραμματισμός MIPS. Πανεπιστήμιο Θεσσαλίας - Τμήμα Πληροφορικής

ΑΣΚΗΣΗ. Ορίζονται μόνο καθολικές ακέραιες μεταβλητές με τη σύνταξη: int varname;

O επεξεργαστής: Η δίοδος δεδομένων (datapath) και η μονάδα ελέγχου (control)

Διαδικασίες ΙI. ΗΥ 134 Εισαγωγή στην Οργάνωση και στον Σχεδιασμό Υπολογιστών Ι. Διάλεξη 5

Chapter 2. Εντολές : Η γλώσσα του υπολογιστή. Η διασύνδεση Υλικού και λογισμικού David A. Patterson και John L. Hennessy

Αρχιτεκτονική Υπολογιστών

Κεφάλαιο 2 Εντολές Η γλώσσα της Μηχανής (Instructions Language of the Computer)

Προγραμματισμός Η/Υ (ΤΛ2007 )

ΠΛΕ- 074 Αρχιτεκτονική Υπολογιστών 2

Εισαγωγή Βασικές εντολές Εκτέλεση βήµα-βήµα Εξέταση/Ανάθεση GDB-101. Νίκος Ντάρµος Τµήµα Πληροφορικής Πανεπιστήµιο Ιωαννίνων

Δομημένος Προγραμματισμός (ΤΛ1006)

Λειτουργικά Συστήματα 7ο εξάμηνο, Ακαδημαϊκή περίοδος

Προηγμένοι Μικροεπεξεργαστές. Εργαστήριο 6 C & Assembly

Chapter 2. Εντολές : Η γλώσσα του υπολογιστή. (συνέχεια) Η διασύνδεση Υλικού και λογισμικού David A. Patterson και John L.

Αρχιτεκτονική υπολογιστών

Προχωρηµένα Θέµατα Αρχιτεκτονικής

Επεξεργαστής Υλοποίηση ενός κύκλου μηχανής

Αρχιτεκτονική Υπολογιστών

Δομημένος Προγραμματισμός

Αρχιτεκτονική Υπολογιστών

Αρχιτεκτονική υπολογιστών

Τελική Εξέταση, Απαντήσεις/Λύσεις

Η διασύνδεση Υλικού και λογισμικού David A. Patterson και John L. Hennessy. Chapter 2. Εντολές : Η γλώσσα του υπολογιστή

«ΜΙΚΡΟΫΠΟΛΟΓΙΣΤΕΣ» ΕΣΩΤΕΡΙΚΗ ΑΡΧΙΤΕΚΤΟΝΙΚΗ ΚΑΙ ΛΕΙΤΟΥΡΓΙΕΣ

Οργάνωση Υπολογιστών ΕΛΛΗΝΙΚΗ ΔΗΜΟΚΡΑΤΙΑ ΠΑΝΕΠΙΣΤΗΜΙΟ ΚΡΗΤΗΣ. Διαλέξεις 6: Κάλεσμα Διαδικασιών, Χρήση και Σώσιμο Καταχωρητών. Μανόλης Γ.Η.

add $t0,$zero, $zero I_LOOP: beq $t0,$s3, END add $t1, $zero,$zero J_LOOP: sub $t2, $s3, $t0 add $t2, $t2, $s1 int i, j, tmp; int *arr, n;

Αρχιτεκτονική Υπολογιστών

Single Cycle Datapath. Αρχιτεκτονική Υπολογιστών. 5ο εξάμηνο ΣΗΜΜΥ ακ. έτος: Νεκ. Κοζύρης

ΠΡΟΗΓΜΕΝΟΙ ΜΙΚΡΟΕΠΕΞΕΡΓΑΣΤΕΣ PROJECT 2: MEMORY MANAGEMENT

Μηχανοτρονική. Τμήμα Μηχανικών Παραγωγής και Διοίκησης 7 ο Εξάμηνο,

Writing kernels for fun and profit

Διάλεξη 12 Καθυστερήσεις (Stalls)

Επεξεργαστής Υλοποίηση ενός κύκλου μηχανής

Εντολές του MIPS (2)

ΠΑΝΕΠΙΣΤΗΜΙΟ ΘΕΣΣΑΛΙΑΣ ΠΟΛΥΤΕΧΝΙΚΗ ΣΧΟΛΗ ΔΕΥΤΕΡΗ ΠΡΟΟΔΟΣ ΣΤΗΝ ΟΡΓΑΝΩΣΗ ΣΤΟΥΣ Η/Y (ΗΥ232)

με έμφαση στο MIPS R2000

ΜΥΥ- 402 Αρχιτεκτονική Υπολογιστών Φροντιστήριο: MIPS assembly

Σημειώσεις για τον 80x86

ΑΡΧΕΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ

Κάθε functional unit χρησιμοποιείται μια φορά σε κάθε κύκλο: ανάγκη για πολλαπλό hardware = κόστος υλοποίησης!

ΠΑΝΕΠΙΣΤΗΜΙΟ ΘΕΣΣΑΛΙΑΣ ΠΟΛΥΤΕΧΝΙΚΗ ΣΧΟΛΗ ΤΜΗΜΑ ΗΛΕΚΤΡΟΛΟΓΩΝ ΜΗΧΑΝΙΚΩΝ ΚΑΙ ΜΗΧΑΝΙΚΩΝ Η/Υ ΠΡΩΤΗ ΠΡΟΟΔΟΣ ΣΤΗΝ «ΟΡΓΑΝΩΣΗ ΚΑΙ ΣΧΕΔΙΑΣΗ Η/Y»

Τεχνολογίες ημιαγωγών. Chapter 2 Instructions: Language of the Computer 1

ΠΑΝΕΠΙΣΤΗΜΙΟ ΘΕΣΣΑΛΙΑΣ ΠΟΛΥΤΕΧΝΙΚΗ ΣΧΟΛΗ ΤΜΗΜΑ ΗΛΕΚΤΡΟΛΟΓΩΝ ΜΗΧΑΝΙΚΩΝ ΚΑΙ ΜΗΧΑΝΙΚΩΝ Η/Υ

1. Οργάνωση της CPU 2. Εκτέλεση εντολών 3. Παραλληλία στο επίπεδο των εντολών 4. Γραμμές διοχέτευσης 5. Παραλληλία στο επίπεδο των επεξεργαστών

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

ΗΥ 232 Οργάνωση και Σχεδίαση Υπολογιστών. Διάλεξη 3 Εντολές του MIPS (2)

ΠΛΕ- 027 Μικροεπεξεργαστές

ΕΠΛ605 Εργασία 1 Ημερομηνία Παράδοσης 12/9/2018 στην αρχή του μαθήματος

Θέµατα Φεβρουαρίου

Αρχιτεκτονικές Υπολογιστών

Αρχιτεκτονικη υπολογιστων

ΗΥ 232 Οργάνωση και Σχεδίαση Υπολογιστών. Διάλεξη 13. Διακλαδώσεις. Νίκος Μπέλλας Τμήμα Ηλεκτρολόγων Μηχανικών και Μηχανικών Η/Υ

Transcript:

ΗΥ 232 Οργάνωση και Σχεδίαση Υπολογιστών Intel x86 ISA Νίκος Μπέλλας Τμήμα Ηλεκτρολόγων Μηχανικών και Μηχανικών ΗΥ

RISC vs. CISC Η assembly των επεξεργαστών ARM, SPARC (Sun), και Power (IBM) είναι όμοιες με την assembly του MIPS. Αρχιτεκτονική RISC (Reduced Instruction Set Architectures) H assembly της σειράς των επεξεργαστών Intel 80x86 είναι κάπως διαφορετική. Αρχιτεκτονική CISC (Complex Instruction Set Architectures) 2

Σύγκριση x86 και MIPS Οι δύο αυτές αρχιτεκτονικές έχουν πολλά κοινά χαρακτηριστικά. Έχουν καταχωρητές και byte-addressable μνήμες. Οι πιο πολλές εντολές είναι όμοιες (αριθμητικές, λογικές, μεταφοράς, διακλάδωσης) Αλλά και διαφορές (διαφορές του x86, 32 bits ή ΙΑ-32) Λιγότεροι καταχωρητές (8) με διαφορετικά ονόματα και λιγότερο γενικού σκοπού. Ο x86-64 έχει 16 καταχωρητές. Η έλλειψη πολλών καταχωρητών έχει ως αποτέλεσμα πολύ μεγαλύτερη χρήση της στοίβας που είναι τμήμα της αρχιτεκτονικής. Ο x86 χρησιμοποιεί 2 I/O operands, ενώ ο MIPS 3 Πράξεις με έμμεση χρήση της μνήμης: Memory + Reg Reg. Κύρια ίσως διαφορά μεταξύ CISC και RISC Εντολές διακλάδωσης με χρήση conditional flags Εντολές με διαφορετικό μήκος (από 1 μέχρι και 17 bytes) 3

Καταχωρητές του IA-32 Λιγότεροι και ειδικού σκοπού 8 καταχωρητές ακεραίων eax, ebx, ecx, edx (γενικού σκοπού) ebp (frame pointer) esp (stack pointer) esi (extended source index) edi (extended destination index) Ειδικού σκοπού eip (Instruction Pointer PC) eflags (Conditional Flags) Αντίθετα με τον MIPS, δεν μπορούν όλες οι εντολές να χρησιμοποιήσουν όλους τους καταχωρητές 4

Καταχωρητές του IA-32 Δεν υπάρχει πολύς χώρος για temporary values σε πράξεις O x86 χρησιμοποιεί κώδικα 2 τελεστέων (operands) op x, y # y = y op x Πολύ δύσκολο για τον compiler (ή τον προγραμματιστή) να αποθηκεύσει όλες τις μεταβλητές σε καταχωρητές. Χρήση της στοίβας για αυτόν τον λόγο. Ο x86-64 έχει 8+8 καταχωρητές των 64 bits rax,.., rdi, r8, r15 5

H στοίβα στον x86 Η στοίβα είναι κομμάτι της μνήμης με ειδικό status O καταχωρητής esp είναι ο stack pointer Εντολές push και pop μόνο για την στοίβα: push # ESP = ESP 4. M[ESP] = EAX pop %ecx # ECX = M[ESP]. ESP = ESP + 4 Όπως ακριβώς και στον MIPS, η στοίβα μεγαλώνει από μεγαλύτερες προς μικρότερες διευθύνσεις. H εντολή call (η αντίστοιχη του jal) σπρώχνει την διεύθυνση επιστροφής στο stack call label # ESP = ESP 4. M[ESP] = EIP+5. EIP = label Η στοίβα χρησιμοποιείται και για να περνούμε παραμέτρους σε συναρτήσεις Δεν υπάρχουν καταχωρητές $a0, $a1, κοκ όπως στον MIPS. O καταχωρητής ebp είναι ο frame pointer (ή base pointer) και δείχνει στην αρχή του frame μιας συνάρτησης Χρησιμοποιείται ευρέως γιατί δεν αλλάζει συχνά τιμή όπως ο esp 6

Ένα απλό παράδειγμα int main() { int one =, two = ; swap(&one, &two);... void swap(int *xp, int *yp) { int t0 = *xp; int t1 = *yp; *xp = t1; *yp = t0; 7

Ένα απλό παράδειγμα int main() { int one =, two = ; swap(&one, &two);... subl movl movl leal pushl leal pushl call... $8, %esp $, -8(%ebp) $, -4(%ebp) -4(%ebp), -8(%ebp), swap 0x124 0x120 Key: sub = subtract l = long (32-bit operation) $8 = literal 8 %esp= stack pointer register ESP = ESP - 8 %ebp,esp 8

Ένα απλό παράδειγμα int main() { int one =, two = ; swap(&one, &two);... subl movl movl leal pushl leal pushl call... $8, %esp $, -8(%ebp) $, -4(%ebp) -4(%ebp), -8(%ebp), swap 0x124 0x120 %ebp %esp Key: mov = data movement l = long (32-bit operation) $ = literal -8(%ebp) = base + offset addressing M[EBP - 8] = 9

Ένα απλό παράδειγμα int main() { int one =, two = ; swap(&one, &two);... subl movl movl leal pushl leal pushl call... $8, %esp $, -8(%ebp) $, -4(%ebp) -4(%ebp), -8(%ebp), swap 0x124 0x120 %ebp %esp 10

Ένα απλό παράδειγμα int main() { int one =, two = ; swap(&one, &two);... subl movl movl leal pushl leal pushl call... $8, %esp $, -8(%ebp) $, -4(%ebp) -4(%ebp), -8(%ebp), swap 0x124 0x120 %ebp %esp Key: (push arguments in reverse order) lea = load effective address (don t do a load, just compute addr.) EAX = EBP - 4 M[ESP - 4] = EAX ESP = ESP - 4 11

Ένα απλό παράδειγμα int main() { int one =, two = ; swap(&one, &two);... 0x124 0x120 %ebp subl movl movl leal pushl leal pushl call... $8, %esp $, -8(%ebp) $, -4(%ebp) -4(%ebp), -8(%ebp), swap %esp 12

Ένα απλό παράδειγμα int main() { int one =, two = ; swap(&one, &two);... subl movl movl leal pushl leal pushl call... $8, %esp $, -8(%ebp) $, -4(%ebp) -4(%ebp), -8(%ebp), swap Key: M[ESP - 4] = next_eip ESP = ESP - 4 EIP = swap 0x124 0x120 0x108 0x104 %ebp swap() parameters. Inverse order %esp 13

Ένα απλό παράδειγμα int main() { int one =, two = ; swap(&one, &two);... 0x124 0x120 %ebp subl movl movl leal pushl leal pushl call... $8, %esp $, -8(%ebp) $, -4(%ebp) -4(%ebp), -8(%ebp), swap RTN ADR 0x108 0x104 %esp 14

Συνάρτηση swap void swap(int *xp, int *yp) { int t0 = *xp; int t1 = *yp; *xp = t1; *yp = t0; swap: pushl %ebp movl %esp,%ebp pushl %ebx movl 12(%ebp),%ecx movl 8(%ebp),%edx movl (%ecx), movl (%edx),%ebx movl,(%edx) movl %ebx,(%ecx) movl -4(%ebp),%ebx movl %ebp,%esp popl %ebp ret Πρόλογος Σώμα Επίλογος 15

Πρόλογος swap void swap(int *xp, int *yp) { int t0 = *xp; int t1 = *yp; *xp = t1; *yp = t0; 0x124 0x120 %ebp swap: pushl %ebp movl %esp,%ebp pushl %ebx RTN ADR 0x108 %esp 0x104 Σώζουμε τον παλιό base pointer στην στοίβα 16

Πρόλογος swap void swap(int *xp, int *yp) { int t0 = *xp; int t1 = *yp; *xp = t1; *yp = t0; 0x124 0x120 %ebp swap: pushl %ebp movl %esp,%ebp pushl %ebx RTN ADR 0x108 0x104 %esp Ο παλιός stack pointer γίνεται ο νέος base pointer 17

Πρόλογος swap void swap(int *xp, int *yp) { int t0 = *xp; int t1 = *yp; *xp = t1; *yp = t0; 0x124 0x120 swap: pushl %ebp movl %esp,%ebp pushl %ebx RTN ADR 0x108 0x104 %ebp,esp 0x100 Σώζουμε τον καταχωρητή ebx γιατί θα γίνει overwrite στην swap (callee saved). 18

Πρόλογος swap void swap(int *xp, int *yp) { int t0 = *xp; int t1 = *yp; *xp = t1; *yp = t0; 0x124 0x120 swap: pushl %ebp movl %esp,%ebp pushl %ebx RTN ADR 0x108 0x104 0x100 %ebp %esp 19

Σώμα της swap void swap(int *xp, int *yp) { int t0 = *xp; Register int t1 = *yp; *xp = t1; %ecx *yp = t0; %edx movl 12(%ebp),%ecx movl 8(%ebp),%edx movl (%ecx), movl (%edx),%ebx movl,(%edx) movl %ebx,(%ecx) %ebx Variable yp xp t1 t0 # ecx = yp # edx = xp # eax = *yp (t1) # ebx = *xp (t0) # *xp = eax # *yp = ebx RTN ADR %edx %ecx %ebx 0x108 0x104 0x100 %ebp %esp 20

Σώμα της swap void swap(int *xp, int *yp) { int t0 = *xp; Register int t1 = *yp; *xp = t1; %ecx *yp = t0; %edx movl 12(%ebp),%ecx movl 8(%ebp),%edx movl (%ecx), movl (%edx),%ebx movl,(%edx) movl %ebx,(%ecx) %ebx Variable yp xp t1 t0 # ecx = yp # edx = xp # eax = *yp (t1) # ebx = *xp (t0) # *xp = eax # *yp = ebx RTN ADR %edx %ecx %ebx 0x108 0x104 0x100 %ebp %esp 21

Σώμα της swap void swap(int *xp, int *yp) { int t0 = *xp; Register int t1 = *yp; *xp = t1; %ecx *yp = t0; %edx movl 12(%ebp),%ecx movl 8(%ebp),%edx movl (%ecx), movl (%edx),%ebx movl,(%edx) movl %ebx,(%ecx) %ebx Variable yp xp t1 t0 # ecx = yp # edx = xp # eax = *yp (t1) # ebx = *xp (t0) # *xp = eax # *yp = ebx RTN ADR %edx %ecx %ebx 0x108 0x104 0x100 %ebp %esp 22

Σώμα της swap void swap(int *xp, int *yp) { int t0 = *xp; Register int t1 = *yp; *xp = t1; %ecx *yp = t0; %edx movl 12(%ebp),%ecx movl 8(%ebp),%edx movl (%ecx), movl (%edx),%ebx movl,(%edx) movl %ebx,(%ecx) %ebx Variable yp xp t1 t0 # ecx = yp # edx = xp # eax = *yp (t1) # ebx = *xp (t0) # *xp = eax # *yp = ebx RTN ADR %edx %ecx %ebx 0x108 0x104 0x100 %ebp %esp 23

Σώμα της swap void swap(int *xp, int *yp) { int t0 = *xp; Register int t1 = *yp; *xp = t1; %ecx *yp = t0; %edx movl 12(%ebp),%ecx movl 8(%ebp),%edx movl (%ecx), movl (%edx),%ebx movl,(%edx) movl %ebx,(%ecx) %ebx Variable yp xp t1 t0 # ecx = yp # edx = xp # eax = *yp (t1) # ebx = *xp (t0) # *xp = eax # *yp = ebx RTN ADR %edx %ecx %ebx 0x108 0x104 0x100 %ebp %esp 24

Σώμα της swap void swap(int *xp, int *yp) { int t0 = *xp; Register int t1 = *yp; *xp = t1; %ecx *yp = t0; %edx movl 12(%ebp),%ecx movl 8(%ebp),%edx movl (%ecx), movl (%edx),%ebx movl,(%edx) movl %ebx,(%ecx) %ebx Variable yp xp t1 t0 # ecx = yp # edx = xp # eax = *yp (t1) # ebx = *xp (t0) # *xp = eax # *yp = ebx RTN ADR %edx %ecx %ebx 0x108 0x104 0x100 %ebp %esp 25

Επίλογος της swap void swap(int *xp, int *yp) { int t0 = *xp; int t1 = *yp; *xp = t1; *yp = t0; 0x124 0x120 movl -4(%ebp),%ebx movl %ebp,%esp popl %ebp ret RTN ADR 0x108 0x104 0x100 %ebp %esp Επαναφέρουμε τον καταχωρητή ebx 26

Επίλογος της swap void swap(int *xp, int *yp) { int t0 = *xp; int t1 = *yp; *xp = t1; *yp = t0; 0x124 0x120 movl -4(%ebp),%ebx movl %ebp,%esp popl %ebp ret RTN ADR 0x108 0x104 0x100 %ebp %esp esp ebp 27

Επίλογος της swap void swap(int *xp, int *yp) { int t0 = *xp; int t1 = *yp; *xp = t1; *yp = t0; movl -4(%ebp),%ebx movl %ebp,%esp popl %ebp ret RTN ADR Επαναφέρουμε τον καταχωρητή ebp στην παλιά του τιμή 0x124 0x120 0x108 0x104 0x100 %ebp,esp 28

Επίλογος της swap void swap(int *xp, int *yp) { int t0 = *xp; int t1 = *yp; *xp = t1; *yp = t0; 0x124 0x120 %ebp movl -4(%ebp),%ebx movl %ebp,%esp popl %ebp ret RTN ADR 0x108 0x104 0x100 %esp Επιστροφή, και pop της διεύθυνσης επιστροφής από την στοίβα 29

Πράξεις με την μνήμη Οι περισσότερες εντολές μπορούν να επεξεργάζονται δεδομένα που είναι στην μνήμη ΧΩΡΙΣ να χρειάζεται να φορτωθούν πρώτα τα δεδομένα σε καταχωρητές addl -8(%ebp), # EAX = EAX + M[EBP - 8] incl -8(%ebp) # M[EBP - 8] = M[EBP - 8] + 1 Πιο πολύπλοκοι τρόποι διευθυνσιοδότησης: off(rb,ri,s) # Mem[Reg[Rb]+S*Reg[Ri]+ off] off: Rb: Ri: Offset μεγέθους από 1 μέχρι 4 bytes Base register: Οποιοσδήποτε από τους 8 ακεραίους καταχωρητές Index register: Οποιοσδήποτε, εκτός του %esp S: Scale: 1, 2, 4, ή 8 Πολύ χρήσιμος για προσπέλαση πινάκων και structs 30

Παραδείγματα υπολογισμού διεύθυνσης %edx %ecx 0xf000 0x100 Expression Computation Address 0x8(%edx) 0xf000 + 0x8 0xf008 (%edx,%ecx) 0xf000 + 0x100 0xf100 (%edx,%ecx,4) 0xf000 + 4*0x100 0xf400 0x80(,%edx,2) 2*0xf000 + 0x80 0x1e080 31

Διακλαδώσεις Ο έλεγχος ροής ενός προγράμματος αποτελείται από δύο βήματα : Θέτουμε ένα condition flag στον καταχωρητή EFLAGS Αυτό γίνεται σαν παρενέργεια των περισσότερων αριθμητικών εντολών ή μέσω της εντολής cmp Διακλαδώνουμε βασιζόμενοι στο condition flag H συνήθης χρήση είναι μέσω της εντολής cmp Είναι ακριβώς σαν την sub, χωρίς να γράφει το αποτέλεσμα cmp 8(%ebx), # set flags based on (EAX - M[EBX + 8]) jg branch_target # taken if (EAX > M[EBX + 8]) 32

Παράδειγμα με διακλαδώσεις int sum(int n) { int i, sum = 0; for (i = 1 ; i <= n ; ++ i) { sum += i; return sum; 33

Παράδειγμα με διακλαδώσεις int sum(int n) { int i, sum = 0; for (i = 1 ; i <= n ; ++ i) { sum += i; return sum; sum: pushl %ebp movl %esp, %ebp movl 8(%ebp), %ecx # n (was argument) movl $1, %edx # i = 1 xorl, # sum = 0 cmpl %ecx, %edx # (i? n), sets cond. codes jg.l8 # branch if (i > n).l6: addl %edx, # sum += i incl %edx # i += 1 cmpl %ecx, %edx # (i? n) jle.l6 # branch if (i <= n).l8: 34

Εντολές μεταβλητού μήκους 08048344 <sum>: 8048344: 55 push %ebp 8048345: 89 e5 mov %esp,%ebp 8048347: 8b 4d 08 mov 0x8(%ebp),%ecx 804834a: ba 01 00 00 00 mov $0x1,%edx 804834f: 31 c0 xor, 8048351: 39 ca cmp %ecx,%edx 8048353: 7f 0a jg 804835f 8048355: 8d 76 00 lea 0x0(%esi),%esi... 804835f: c9 leave 8048360: c3 ret Οι εντολές έχουν μήκος από 1 μέχρι και 17 17 bytes Οι εντολές που χρησιμοποιούνται πολύ συχνά είναι μικρότερες (γιατί;) Σε γενικές γραμμές, ο ίδιος πηγαίος κώδικας έχει μικρότερο μέγεθος στον x86 παρά στον MIPS assembly Πιο δύσκολη η αποκωδικοποίηση του x86 προγράμματος από το hardware 35

Υλοποίηση του IA-32/64 Το μεταβλητό μέγεθος των εντολών κάνει δύσκολο το ΙF, ID και ΕΧ Για αυτό, πριν εκτελεσθούν, οι εντολές x86 σπάνε από το ΗW σε μικρότερες RISC-like micro-operations Η εκτέλεση των microops γίνεται όπως και των εντολών RISC