Προηγμένοι Μικροεπεξεργαστές Εργαστήριο 4 - Editor
Περιγραφή Υλοποίηση ενός υποτυπώδους editor που θα: Διαβάζει ένα προκαθορισμένο αρχείο Θα το απεικονίζει στην οθόνη Θα κάνει highlight με έναν ελεγχόμενο από το πληκτρολόγιο κέρσορα συγκεκριμένους χαρακτήρες Θα κλείνει όταν πατηθεί το πλήκτρο esc Αυξητικά, θα προσθέσουμε δυνατότητα επεξεργασίας και αποθήκευσης
BIOS services Κάθε ΙΒΜ-PC συμβατό σύστημα παρέχει μία σειρά από χρήσιμες υπηρεσίες μέσω του BIOS Αφορούν χαμηλού επιπέδου χρήση περιφερειακών συσκευών Οθόνη Πληκτρολόγιο Ποντίκι Εκτυπωτής κοκ
DOS services Παράλληλα το DOS παρέχει και αυτό τις δικές του υπηρεσίες που αφορούν: υψηλότερου επιπέδου χρήση περιφερειακών συσκευών υπηρεσίες σχετικές με την διαχείρηση του λειτουργικού συστήματος
BIOS και DOS services Ο μηχανισμός με τον οποίο καλούνται αυτές οι υπηρεσίες είναι τα software interrupts Κυριότερα interrupts: 18h για το BIOS 21h για το DOS Αναλυτική λίστα με τις παρεχόμενες υπηρεσίες μπορείτε να βρείτε στον Brey και εδώ: http://emu8086.comlu.com/assembly_language_tutorial_assembler_reference/8086 http://www.htl-steyr.ac.at/~morg/pcinfo/hardware/interrupts/inte1at0.htm
Χρήσιμα int 0x21 interrupts Μέσω του int 21h παρέχονται πολλαπλές υπηρεσίες Η επιλογή γίνεται μέσω της τιμής που έχει ο ΑΗ πριν το software interrupt Ah = 01h -> keyboard input with echo Ah = 07h -> direct console input without echo Ah = 0ah -> Buffered keyboard input Ah = 3dh -> open file using handle Ah = 3eh -> close file using handle Ah = 3fh -> read file or device using handle Ah = 40h -> write file or device using handle
Services Παρόλη την χρησιμότητά τους: Υλοποιούνται μέσω των real mode interrupts Είναι γραμμένα για real mode Δεν μπορούμε να τα χρησιμοποιήσουμε απευθείας από protected mode
Task RM To task RM υλοποιεί μία λογική εκτέλεσης RM συναρτήσεων μέσα σε protected mode Περνάει σε real mode Εκτελεί την real mode συνάρτηση που του έχει δωθεί μέσα σε ένα περιβάλλον όσο πιο κοντά γίνεται στο περιβάλλον από το οποίο κλήθηκε το task RM Επιστρέφει σε protected mode Επιστρέφει στο task από το οποίο καλέστηκε το περιβάλλον που υπήρχε κατά το τέλος της συνάρτησης
Task RM Πέρασμα σε real mode To πέρασμα υλοποιείται με τον ίδιο τρόπο με τον οποίο επιστρέφαμε σε real mode για να τερματίσουμε την εφαρμογή Απενεργοποίηση interrupts Απενεργοποίηση του PE bit Far jmp με real mode code segment Φόρτωση real mode selectors στους υπόλοιπους segment registers Επαναφορά του real mode IVT Ενεργοποίηση interrupts
Task RM Εκτέλεση της συνάρτησης Μέσω του backlink του, το task RM Βρίσκει το TSS της διεργασίας που το κάλεσε Διαβάζει από εκεί την τιμή του esp και την φορτώνει στον δικό του sp, ώστε να έχει πρόσβαση στην στοίβα του caller Από την στοίβα, διαβάζει και αφαιρεί τον pointer προς την συνάρτηση που πρέπει να εκτελέσει
Task RM Εκτέλεση της συνάρτησης Ακριβώς πριν την κλήση της συνάρτησης φορτώνει από το TSS σε όλους τους general purpose registers τις τιμές που είχαν στο caller task Καλεί την συνάρτηση με τα όποια ορίσματα να βρίσκονται έτοιμα στην στοίβα του caller task Μετά την εκτέλεση της συνάρτησης, αποθηκεύει όλους τους τους general purpose registers πίσω στο TSS του caller, ώστε όταν ενεργοποιηθεί το caller task να έχει την ίδια εικόνα με αυτή που θα είχε αν η συνάρτηση είχε εκτελεστεί άμεσα.
Task RM Επιστροφή σε PM Παρόμοια με την κανονική είσοδο σε protected mode, με εξαίρεση ότι όλες οι δομές είναι σεταρισμένες Ξαναφορτώνουμε gdtr και idtr Ενεργοποίηση PE bit Far jmp με protected mode 16 bit code selector Φόρτωση όλων των segment registers με protected mode 16 bit selectors Unset το busy bit Set το ΝΤ flag Φόρτωση του Task Register με τον selector του task RM Iret στο caller task
Task RM Από την πλευρά της διεργασίας που το καλεί: push των ορισμάτων της συνάρτησης push του real mode offset της συνάρτησης call RM_TASK_TSS_SEL:0 Μετά την επιστροφή το συνολικό state είναι το ίδιο με αυτό που θα είχαμε αν είχε εκτελεστεί άμεσα η συνάρτηση
Task RM Με κατάλληλες κλήσεις στo task RM, θα υλοποιήσουμε real mode συναρτήσεις που θα αξιοποιούν τα DOS services
Task Parser Κατά την αρχικοποίηση του καλεί μία real mode συνάρτηση που: Ανοίγει το αρχείο με το όνομα που περιέχεται στην μεταβλητή file_name Αντιγράφει τα δεδομένα του στην περιοχή μνήμης file_buffer (αρχείο editor.asm) Κλείνει το αρχείο και επιστρέφει Αν παρουσιάστηκε κάποιο σφάλμα, εκτυπώνεται μήνυμα στην οθόνη και τερματίζει το πρόγραμμα Αν όχι, ενεργοποιεί το task display (active2 = 1) και μπαίνει στο κυρίως loop του
Task Parser Στον κυρίως του βρόχο το task διαβάζει συνεχώς το πληκτρολόγιο μέσω μίας real mode συνάρτησης και: Αν πατηθεί κάποιο βέλος, ανανεώνει την θέση του κέρσορα μέσω της μεταβλητής cursor_pos Αν πατηθεί escape το πρόγραμμα τερματίζει
Task Display Διαβάζει τον file buffer και απεικονίζει τα δεδομένα στην οθόνη Κάνει highlight την τρέχουσα θέση του κέρσορα Παρακολουθεί την μεταβλητή redraw, που σετάρεται από τον parser και αν γίνει 1, ανανεώνει την οθόνη Τρέχει καθαρά σε protected mode και χρησιμοποιεί άμεση πρόσβαση στην vga text memory Δίνεται τελείως έτοιμο
Σκοπός Να υλοποιήσετε τις real mode συναρτήσεις που καλεί το task parser, καθώς και την κλήση τους αυτή καθ'αυτή
Διάβασμα αρχείου Int 21h services: Ah = 3dh -> open file using handle Ah = 3eh -> close file using handle Ah = 3fh -> read file or device using handle Η rm συνάρτηση πρέπει να επιστρέφει στον ah 0 αν όλα πήγαν καλά, 1 αν παρουσιάστηκε σφάλμα
Παρακολούθηση πληκτρολογίου Int 21h services: 07h -> direct console input without echo Αν το πλήκτρο που πατήθηκε ήταν extended (non ASCII), τότε επιστρέφει 0 και στην επόμενη κλήση της επιστρέφει τον έξτρα κωδικό του πλήκτρου Η συνάρτηση πρέπει να επιστρέφει στον ah το αν το πλήκτρο ήταν extended ή όχι και τον κώδικό (1o byte για ASCII, 2ο byte για extended) στον al
Extended κωδικοί