Προηγμένοι Μικροεπεξεργαστές Εργαστήριο 1 Hello World
Σκοπός του Εργαστηρίου Εκτύπωση του string Hello World στην οθόνη Με χρήση της video memory Και παράλληλα επιβεβαίωση ότι τα εργαλεία μας λειτουργούν Εξοικείωση με τις string εντολές
Video Memory Η οθόνη ελέγχεται μέσω της video memory Για να εμφανίσουμε κάτι στην οθόνη πρέπει να το γράψουμε στην video memory Περιοχή μνήμης για color text mode: Segment: 0x0B800 Offsets:0000 0F9F (4000 Bytes)
Video Memory Η οθόνη έχει 80 στήλες και 25 γραμμές 2000 χαρακτήρες Κάθε χαρακτήρας της οθόνης αντιστοιχεί σε 2 bytes της Video Memory Διαδοχικοί χαρακτήρες αντιστοιχούν σε διαδοχικά words της video memory Το LSByte του κάθε word αντιστοιχεί στον ASCII κωδικό του χαρακτήρα που θέλουμε να απεικονίσουμε Το MSByte του κάθε word κωδικοποιεί το χρώμα του background και του foreground.
Video Memory - Παράδειγμα Γράψτε στην γραμμή 2 και στην στήλη 1 το γράμμα 'Α' με άσπρο χρώμα και μαύρο background Byte xαρακτήρα = 'A' Byte χρώματος = 00000111b = 7 Χρώμα: μαύρο=0000b, άσπρο=0111b Αρχή γραμμής 2 = 2 γραμμές * 80 στήλες = 160 χαρακτήρες Στήλη 1, γραμμή 2 = 160 + 1 = 161ος χαρακτήρας = 322ο byte mov al,'a' -> mov ah,7 -> mov [es:322], ax
String Εντολές movsb, movsw, movsd lodsb, lodsw, lodsd stosb, stosw, stosd String εντολές Μακροεντολές Συμπιέζουν πολλαπλές εντολές σε μία Μικρότερο μέγεθος εκτελέσιμου Πιο συμπαγής κώδικας
movs move string movsb, movsw, movsd Δεν παίρνουν όρισμα Μεταφέρουν αυτόματα την θέση μνήμης [DS:SI] στην [ES:DI] Παράλληλα αυξάνουν τους SI, DI movsb mov [es:edi],[ds:esi] inc esi inc edi
lods load string lodsb, lodsw, lodsd Φορτώνουν αυτόματα στον ΑL(/ΑΧ/ΕΑΧ) από την θέση μνήμης DS:SI και αυξάνουν τον SI lodsb mov al,[ds:esi] inc esi
stos store string stosb, stosw, stosd Αποθηκεύουν αυτόματα τον AL(/AX/EAX) στην θέση μνήμης ES:DΙ και αυξάνουν τον DI stosb mov [es:edi],al inc edi
Ανάλυση Άσκησης Πρέπει να εκυπώσουμε το string 'Hello World' 1. Δεσμεύουμε τις μεταβλητές μας 2. Καθαρίζουμε την οθόνη 3. Εκτυπώνουμε με string εντολές το string msg που έχει αρχικοποιηθεί σε 'Hello World'
Ανάλυση Άσκησης - 0 Στην αρχή του κώδικα δίνουμε κάποιες χρήσιμες σταθερές: vidmem, color, scrw, eom Δήλωση σταθεράς: label equ value Ο nasm πριν κάνει compile θα αντικαταστήσει κάθε label με την τιμή που του έχουμε δώσει
Ανάλυση Άσκησης - 1 Οι μεταβλητές δεσμεύονται στο section.data Τρόπος δέσμευσης: label: db{,dw,dd} initial_value label = το όνομα της μεταβλητής db = define byte, dw = define word, dd = define doubleword initial_value = Αρχική τιμή της μεταβλητής Αν το initial_value είναι πολλαπλές τιμές χωρισμένες με κόμμα ή string, τότε δεσμεύεται πίνακας αντίστοιχου μεγέθους
Ανάλυση Άσκησης - 1 Δεσμεύετε: Το string που θα εκτυπώσουμε (msg) Ένα byte με τιμή eom (End Of Message) ακριβώς μετά ώστε να ξέρουμε που τελειώνει το msg Την θέση της οθόνης από όπου θα αρχίζει η εκτύπωση (print_start) Ότι άλλο χρειαστεί στην πορεία
Ανάλυση Άσκησης - 2 Σετάρουμε το σύστημα και τις μεταβλητές Στην συνάρτηση main όπου υλοποιείται ο αλγόριθμός μας έχουμε αρχικοποιήσει τον ES ώστε να δείχνει στo vidmem
Ανάλυση Άσκησης - 3 Καθαρίζουμε την οθόνη (έτοιμη συνάρτηση cls) Ο πιο εύκολος τρόπος είναι να γράψουμε σε όλη την video memory το ίδιο word που αντιστοιχεί σε κενό χαρακτήρα και μαύρο background χρησιμοποιώντας string store
Ανάλυση Άσκησης - 3 Η συνάρτηση αρχικοποιεί τον di σε 0 (ο es:edi δείχνει στην αρχή της video memory) Φορτώνει στον ecx τον αριθμό των words που αποτελούν την video memory (cx = scrw) Φορτώνει στον ax την τιμή που αντιστοιχεί σε κενό χαρακτήρα (al = ' ') με μαύρο background και λευκο foreground (ah = color) Και κάνει rep stosw (stosw για cx φορές)
Ανάλυση Άσκησης - 4 Εκτυπώνουμε με string εντολές το string msg (συνάρτηση printstr) Θα την γράψετε εσείς Πρέπει να αντιγράφει στην video memory, ξεκινώντας από την θέση print_start το msg, μέχρι να συναντήσει την τιμή eom Προσοχή! Ένα byte του msg -> 2 byte της video memory
Ανάλυση άσκησης Ο κώδικας που θα τα ενώνει όλα τα προηγούμενα μαζί και θα υλοποιεί τον αλγόριθμό μας θα βρίσκεται στην συνάρτηση main