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

Σχετικά έγγραφα
Προηγμένοι Μικροεπεξεργαστές. Εργαστήριο 4 - Editor

Προηγμένοι Μικροεπεξεργαστές. Εργαστήριο 3 Task Switching in PM

Προηγμένοι Μικροεπεξεργαστές. Εργαστήριο 5 - Editor

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

Προηγμένοι Μικροεπεξεργαστές. Παρουσίαση Projects

Προηγμένοι Μικροεπεξεργαστές. Παρουσίαση Projects

Διεργασίες (μοντέλο μνήμης & εκτέλεσης) Προγραμματισμός II 1

Προηγμένοι Μικροεπεξεργαστές. Παρουσίαση Εργασιών

Προηγμένοι Μικροεπεξεργαστές. Φροντιστήριο 4 Real Mode Interrupts

Προγραμματισμός Ι. Δυναμική Διαχείριση Μνήμης. Δημήτρης Μιχαήλ. Ακ. Έτος Τμήμα Πληροφορικής και Τηλεματικής Χαροκόπειο Πανεπιστήμιο

Μεταγλώττιση και σύνδεση πολλαπλών αρχείων κώδικα. Προγραμματισμός II 1

Προηγμένοι Μικροεπεξεργαστές. Εργαστήριο 1 Hello World

Keyboard. Ασσιούρας Ιωάννης 5593 Βούκας Ιωάννης 5001 Πρωτονοτάριος Ιωάννης 6072

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

Διεργασίες (μοντέλο μνήμης & εκτέλεσης) Προγραμματισμός II 1

Εισαγωγή εκτελέσιμου κώδικα σε διεργασίες

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

Προγραμματισμός Συστημάτων

Εισαγωγή στην Πληροφορική

Κεφάλαιο , 3.2: Συναρτήσεις II. (Διάλεξη 12)

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

Προηγμένοι Μικροεπεξεργαστές. Protected Mode & Multitasking

Το λειτουργικό σύστημα. Προγραμματισμός II 1

ΜΥΥ- 402 Αρχιτεκτονική Υπολογιστών Μεταγλώτιση, σύνδεση

ΗΜΥ Εργαστήριο Οργάνωσης Υπολογιστών και Μικροεπεξεργαστών

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

Το λειτουργικό σύστημα. Προγραμματισμός II 1

Ανάπτυξη και Σχεδίαση Λογισμικού

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

B. Ενσωμάτωση Ιθαγενών Μεθόδων

Μεθόδων Επίλυσης Προβλημάτων

Κεφάλαιο , 3.2: Συναρτήσεις II. ( ιάλεξη 12) ιδάσκων: ηµήτρης Ζεϊναλιπούρ

Εργαστήριο Λειτουργικών Συστημάτων 8o εξάμηνο, Ροή Υ, ΗΜΜΥ

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Κλάσεις και Αντικείμενα Constructors, equals, tostring

Αριθμητικές Μέθοδοι σε Προγραμματιστικό Περιβάλλον (Εργαστήριο 2)

Προγραμματισμός Ι (ΗΥ120)

Υποστήριξη Λ.Σ. ΜΥΥ-106 Εισαγωγή στους Η/Υ και στην Πληροφορική

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

Λειτουργικά Συστήματα (Λ/Σ)

Κεφάλαιο 4 Σύνδεση Μικροεπεξεργαστών και Μικροελεγκτών ΕΡΩΤΗΣΕΙΣ ΑΣΚΗΣΕΙΣ

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

Προγραμματισμός ΙI (Θ)

Λύβας Χρήστος Αρχική επιµέλεια Πιτροπάκης Νικόλαος και Υφαντόπουλος Νικόλαος

Δημήτρης Πρίτσος. ISLAB HACK: Βασικές Έννοιες της Αρχιτεκτονικής

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

Εργαστήριο 5. Εαρινό Εξάμηνο

ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ Η/Υ Ακαδημαϊκό έτος ΤΕΤΡΑΔΙΟ ΕΡΓΑΣΤΗΡΙΟΥ #4

Εισαγωγή στον Προγραμματισμό

Η γλώσσα προγραμματισμού C

Βιβλιοθήκες Αφηρημένοι τύποι δεδομένων. Προγραμματισμός II 1

Μετατροπή χαρακτήρων ASCII σε αριθμό (atoi) & διάβασμα, και αποθήκευση του περιεχομένου του στη μνήμη. (Διάλεξη. Πανεπιστήμιο Κύπρου

Λειτουργικά Συστήματα (ΗΥ321)

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

Writing kernels for fun and profit

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Αντικείμενα με πίνακες. Constructors. Υλοποίηση Στοίβας

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

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

Προγραμματισμός Η/Υ 1 (Εργαστήριο)

ΗΜΥ 213 Εργαστήριο Οργάνωσης Υπολογιστών και Μικροεπεξεργαστών

Προηγμένοι Μικροεπεξεργαστές. Paging & Segmentation

Πληροφορική & Τηλεπικοινωνίες K18 - Υλοποίηση Συστηµάτων Βάσεων εδοµένων Εαρινό Εξάµηνο

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

Ε-85: Ειδικά Θέµατα Λογισµικού

Εργαστήριο 1: Επανάληψη Βασικών Εννοιών στη Γλώσσα C

Προγραμματισμός Ι. Συναρτήσεις. Πανεπιστήμιο Πελοποννήσου Τμήμα Πληροφορικής & Τηλεπικοινωνιών

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

Προγραμματισμός Ι. Είσοδος/Έξοδος. Δημήτρης Μιχαήλ. Ακ. Έτος Τμήμα Πληροφορικής και Τηλεματικής Χαροκόπειο Πανεπιστήμιο

Κλήση Συναρτήσεων ΚΛΗΣΗ ΣΥΝΑΡΤΗΣΕΩΝ. Γεώργιος Παπαϊωάννου ( )

MIPS functions and procedures

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

make Προγραμματισμός II 1

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

Ανάπτυξη και Σχεδίαση Λογισμικού

ΗΜΥ Εργαστήριο Οργάνωσης Υπολογιστών και Μικροεπεξεργαστών

Α' Εξάμηνο ΕΙΣΑΓΩΓΗ ΣΤΟ ΔΟΜΗΜΕΝΟ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟ

7. ΕΙΣΑΓΩΓΗ ΣΤΙΣ ΣΥΝΑΡΤΗΣΕΙΣ

Αρχιτεκτονική Μικροεπεξεργαστών MIPS-32. Αρχείο καταχωρητών και Χάρτης Μνήµης

Σε γενικές γραμμές, είναι καλή πρακτική να γράϕουμε προγράμματα C που αποτελούνται από πολλές και μικρές συναρτήσεις, παρά από λίγες και μεγάλες.

ΗΜΥ 213 Εργαστήριο Οργάνωσης Ηλεκτρονικών Υπολογιστών και Μικροεπεξεργαστών

Ενδεικτική περιγραφή μαθήματος

Το λειτουργικό σύστημα. Προγραμματισμός II 1

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Κλάσεις και Αντικείμενα

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Κλάσεις και Αντικείμενα Αναφορές

Διάλεξη 13η: Δυναμική Διαχείρηση Μνήμης, μέρος 1

(programming interfaceή/και application programming interface API).

Προγραμματισμό για ΗΜΥ

Κεφάλαιο : Εισαγωγή στην C: (Διαλέξεις 3-4)

12. Συναρτήσεις (Μέρος ΙI)

Εισαγωγικά & Βασικές Έννοιες

MIPS Interactive Learning Environment. MILE Simulator. Version 1.0. User's Manual

Προεπεξεργαστής C. Προγραμματισμός Ι 1

ΗΜΥ 213. Εργαστήριο Οργάνωσης Η.Y. και Μικροεπεξεργαστών week 5. Διδάσκων: Δρ. Γιώργος Ζάγγουλος

Εισαγωγή σε αντικειμενοστραφή concepts. Και λίγη C#

Εργαστήριο Λειτουργικών Συστημάτων. Minix Overview

ΗΜΥ 213 Εργαστήριο Οργάνωσης Ηλεκτρονικών Υπολογιστών και Μικροεπεξεργαστών

ΗΜΥ 213 Εργαστήριο Οργάνωσης Ηλεκτρονικών Υπολογιστών και Μικροεπεξεργαστών

ΔΕΙΚΤΕΣ ΚΑΙ ΔΙΕΥΘΥΝΣΕΙΣ

ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ ΜΑΘΗΜΑ 6 Ο. Συναρτήσεις Τοπικές, καθολικές, στατικές μεταβλητές Μεταβλητές τύπου extern και register Αναδρομή

Διαδικασιακός Προγραμματισμός

#include <stdlib.h> Α. [-128,127] Β. [-127,128] Γ. [-128,128]

Transcript:

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

Real World Situation Στον πραγματικό κόσμο, κανείς δεν γράφει αποκλειστικά assembly Κουραστικό Δύσκολα συντηρήσιμος κώδικας Μηδενική φορητότητα Μεγάλη πιθανότητα για σφάλμα, λόγω έλλειψης checking μηχανισμών Οι καλύτεροι compilers σχεδόν πάντα βγάζουν καλύτερο κώδικα από ότι θα μπορούσε ένας άνθρωπος

Niches for assembly Η χρήση της assembly περιορίζεται σε: Τμήματα κώδικα που έχουν απαιτούν άμεση πρόσβαση στο hardware του υπολογιστή Interrupts Στοίβα Ειδικοί καταχωρητές Ι/Ο Bootstrap κώδικα που πρέπει να εκτελεστεί προκειμένου να στηθεί το κατάλληλο περιβάλλον για υψηλότερου επιπέδου γλώσσες Μικρά και τρομερά κρίσιμα κομμάτια κώδικα, τα οποία δεν μπορεί να βελτιστοποιήσει αρκετά ο compiler

Niches for assembly Ακόμη και σε αυτές τις περιπτώσεις, οι προγραμματιστές προσπαθούν να περιορίσουν την χρήση της assembly στα τελείως απαραίτητα Wrapper συναρτήσεις για προσπέλαση του υλικού Φόρτωμα υποτυπώδους C περιβάλλοντος και πέρασμα σε C

Συνδυασμός C & Assembly Ο πιο συνήθης συνδυασμός της assembly είναι με C κώδικα Η C δεν είναι τόσο υψηλού επιπέδου Οι αφαιρέσεις της C είναι πολύ κοντά στην πραγματικότητα του υπολογιστή Παρέχει πολύ καθαρές διεπαφές

Συνδυασμός C & Assembly Για να συνδυάσουμε C & Assembly πρέπει να ακολουθούμε πιστά τις συμβάσεις κλήσεων συναρτήσεων της πλατφόρμας Ορίζουν την διεπαφή μεταξύ διαφορετικών binary αρχείων, ώστε να μπορούν να συνδυαστούν με όποιον τρόπο και αν έχουν δημιουργηθεί

GCC/x86 Calling Conventions Τα ορίσματα περνιούνται μέσω στοίβας με την αντίθετη σειρά, σαν dwords όποιο και αν είναι το μεγεθός τους Το πρώτο πράγμα που κάνει η συνάρτηση είναι να δημιουργήσει καινούργιο stack frame σώζοντας τον ebp και θέτοντάς τον ίσο με τον esp Οι ebx, esi, edi, ebp, esp, ds, es, ss πρέπει να προστατευθούν από αλλαγές Το αποτέλεσμα επιστρέφεται μέσω του eax ή του edx:eax Η στοίβα επαναφέρεται από τον καλόντα και όχι από την συνάρτηση

GCC/x86 Calling Conventions Πέρα από την κλήση αυτήν καθ'αυτήν Κλήσεις από C προς assembly: Για τις assembly συναρτήσεις και μεταβλητές που χρησιμοποιούνται από C κώδικα πρέπει να δωθούν τα πρωτότυπά τους με το keyword extern και να δηλωθούν ως global στα αρχεία τους. Κλήσεις από assembly προς C: Τα συμβολικά ονόματα του C κώδικα, για να χρησιμοποιηθούν πρέπει να είναι όρατα από άλλα αρχεία (global non-static δλδ) και να δηλωθούν ως extern στον assembly κώδικα

Περίληψη εργαστηρίου Επαναϋλοποιούμε τον editor γράφοντας όσο το δυνατόν λιγότερο assembly Δεν μπορούμε να αποφύγουμε: Interrupts και DOS Services Πέρασμα ανάμεσα σε protected και real mode Χρήση και άμεση προσπέλαση segment registers I/O Task Switching

Περίληψη εργαστηρίου Ιδιομορφία: Ο κώδικάς μας είναι ουσιαστικά bootstrap κώδικας Ετοιμάζει και φορτώνει protected mode Δεν έχουμε λειτουργικό σύστημα Επομένως, δεν μπορούμε να δημιουργήσουμε ένα C πρόγραμμα που να μπορεί να τρέξει μέσα από το περιβάλλον μας Αλλά μπορούμε να καλέσουμε C συναρτήσεις από το assembly προγραμμά μας

Περιγραφή κώδικα Assembly: Λίγο πολύ όπως τα ξέραμε stdlib.asm περιέχει αρχικοποιήσεις protected mode stdio_32bit.asm περιέχει την cls, την printline και την hex2ascii main.asm περιέχει την main μας, βοηθητικές assembly συναρτήσεις για την εφαρμογή μας και την ISR του timer Νέο: c_main.asm περιέχει extern δηλώσεις C συναρτήσεων Νέο: x86_int_21.asm δίνει μία συνάρτηση για κλήση του int 0x21 από protected mode (αντί για το task RM)

Περιγραφή κώδικα H main απλώς καλεί την συνάρτηση c_main, στον C κώδικα, η οποία υλοποιεί τον scheduler Επίσης δίνονται στο αρχείο c_main.c: parser() display() time_delay() Κάνουμε ήδη include τα stdio_32bit.h και stdlib.h που μας δηλώνουν assembly συναρτήσεις και χρήσιμες δομές

Συνδυασμός C & Assembly Πως ενώνονται όλα μαζί; Περνάμε ανεξάρτητα το c_main.c από τον gcc και το main.asm από τον nasm gcc: πρέπει να δημιουργήσουμε object file και όχι executable και να απενεργοποιήσουμε όλες τις βιβλιοθήκες και τις αρχικοποιήσεις nasm: πρέπει να παράξουμε elf object αρχείο (default τύπος του linux και του gcc) και όχι flat όπως μέχρι τώρα Περνάμε τα δύο object files από τον linker του gcc (ld), με οδηγίες τέτοιες ώστε το τελικό executable να καλύπτει τις προδιαγραφές των.com αρχείων Όλα αυτά γίνονται αυτόματα, εκτελώντας το script build.sh $./build.sh

Στόχος άσκησης 1 Για τον scheduler, να γραφτεί το context switch αυτό καθ'αυτό με την λιγότερη δυνατή assembly Πρέπει: Να γράφουμε στο backlink του tss_descr τον selector για το κατάλληλο task Να εξασφαλίζουμε ότι ο descriptor του task δεν είναι busy Να κάνουμε iret

Στόχος άσκησης 2 Να υλοποιηθεί η assembly συνάρτηση store_byte_to_linear_space στο main.asm Μας δίνει την δυνατότητα να προσπελάσουμε θέσεις μνήμης εκτός του τρέχοντος segment, από C Χρησιμοποιείται από το display ώστε να γράψει στην video memory Το πρωτότυπό της δίνεται στην αρχή του c_main.c

Στόχος άσκησης 3 Να υλοποιηθεί η C συνάρτηση load_file, η οποία φορτώνει ένα αρχείο σε έναν buffer χρησιμοποιώντας τα DOS Services για άνοιγμα, διάβασμα και κλείσιμο αρχείο Ο ίδιος αλγόριθμος που είχαμε υλοποιήσει και στα προηγούμενα εργαστήρια Διαφορά: Για να μην υλοποιήσουμε την συνάρτηση σε real mode και επομένως σε assembly, χρησιμοποιούμε την assembly συνάρτηση x86_int_21

void x86_int_21(struct regfile *regs) Παίρνει σαν όρισμα έναν pointer προς δομή τύπου regfile (ήδη ορισμένη στο stdlib.h) Η x86_int_21: περνάει σε real mode φορτώνει τους καταχωρητές με τις τιμές που περιέχονται στην δομή προκαλεί ένα int 0x21 σώζει καταχωρητές και flags πίσω στην δομή επιστρέφει σε protected mode

void x86_int_21(struct regfile *regs) Οπότε για να χρησιμοποιήσουμε ένα service: Δηλώνουμε μία δομή τύπου regfile Αρχικοποιούμε τα μέλη της, στις τιμές που απαιτούνται για να καλέσουμε το DOS service Καλούμε το x86_int_21 με όρισμα pointer προς την δομή που δηλώσαμε Όταν επιστρέψει, τα μέλη της δομής περιέχουν τα αποτελέσματα του service Για παράδειγμα μπορείτε να κοιτάξετε και την υλοποίηση του read_keyboard()