ΤΜΗΜΑ ΗΛΕΚΤΡΟΛΟΓΩΝ ΜΗΧΑΝΙΚΩΝ Τ.Ε., ΣΧΟΛΗ ΤΕΧΝΟΛΟΓΙΚΩΝ ΕΦΑΡΜΟΓΩΝ, ΤΕΙ ΔΥΤΙΚΗΣ ΕΛΛΑΔΑΣ ΑΡΧΙΤΕΚΤΟΝΙΚΗ & ΛΕΙΤΟΥΡΓΙΑ Η/Υ ΟικογένειαΜικροεπεξεργαστών Intel8086, ΕργαστηριακέςΑσκήσεις Δρ. Τοπάλης Ευάγγελος (Δρ. Ηλεκτρολόγος Μηχανικός & Τεχνολογίας Υπολογιστών) Εργαστήριο Μικροϋπολογιστικών Συστημάτων v. 4.0 ‐ 2013‐14 Εργαστήριο Μικροϋπολογιστικών Συστημάτων | Εργαστήριο Μικροϋπολογιστικών Συστημάτων | 3 ΕΡΓΑΣΤΗΡΙΟ ΑΡΧΙΤΕΚΤΟΝΙΚΗΣ & ΛΕΙΤΟΥΡΓΙΑΣ Η/Υ Διδ άσκων: Ε υάγ γελος Τ οπ άλης Δρ. Ηλ εκτρολ όγ ος Μηχ αν ικ ός & Τεχν ολ ογ ία ς Υ πολ ογ ιστών ΑΣΚΗΣΗ 1 Εισαγωγικό για το εργαστήριο: MASM MASM Είναι ο µακροσυµβολοµεταφραστής της Microsoft για τους επεξεργαστές της οικογένειας 80x86 της Intel. Ο MASM συναρµολογεί προγράµµατα σε συµβολική γλώσσα και δηµιουργεί µεταθέσιµα αντικειµενικά αρχεία που µπορούν να συνδεθούν και να εκτελεστούν κάτω από το λειτουργικό σύστηµα MS-DOS. Εργαστήριο Μικροϋπολογιστικών Συστημάτων | 4 Κατάληξη αρχείων asm Φάκελος αποθήκευσης c:/masm/bin/ Project/Compile Project/Build (συγχρόνως κάνει και compile) Run/Execute Run/Debug Στην επιλογή Windows εµφανίζω ή αποκρύβω παράθυρα πληροφοριών (registers, memory, watch ) Με F8 (trace) µπαίνω και µέσα στις συναρτήσεις Με F10 (step by step) εντολή εντολή Με F9(Breakpoint)βάζω breakpoints, µε το ίδιο βγαίνει Run / Restart Watch-Data/add watch Breakpoint–Data/add breakpoint/edit breakpoint Εικόνα 1 Περιβάλλον Masm Εργαστήριο Μικροϋπολογιστικών Συστημάτων | 5 Εικόνα 2 Περιβάλλον Masm Εικόνα 3 Περιβάλλον Masm Εργαστήριο Μικροϋπολογιστικών Συστημάτων | 6 Εικόνα 4 Περιβάλλον Masm Εικόνα 5 Περιβάλλον Masm Εργαστήριο Μικροϋπολογιστικών Συστημάτων | 7 Εικόνα 6 Περιβάλλον Masm Εργαστήριο Μικροϋπολογιστικών Συστημάτων | 8 ΕΡΓΑΣΤΗΡΙΟ ΑΡΧΙΤΕΚΤΟΝΙΚΗΣ & ΛΕΙΤΟΥΡΓΙΑΣ Η/Υ Διδ άσκων: Ε υάγ γελος Τ οπ άλης Δρ. Ηλ εκτρολ όγ ος Μηχ αν ικ ός & Τεχν ολ ογ ία ς Υ πολ ογ ιστών ΑΣΚΗΣΗ 2 ΕΝΤΟΛΕΣ ΜΕΤΑΦΟΡΑΣ, ΤΟΠΟΘΕΤΗΣΗΣ ΔΕΔΟΜΕΝΩΝ, ΑΡΙΘΜΗΤΙΚΩΝ ΠΡΑΞΕΩΝ ΠΑΡΑ∆ΕΙΓΜΑ 1 Παράδειγµα προγράµµατος μεταφοράς δεδομένων. Εργαστήριο Μικροϋπολογιστικών Συστημάτων | 9 ; * ** ** * ** * ** * ** ** * ** * ** ** * ** * ** ** * ** * ** ** * ** * ** ** * ** * ** ** * ** * ** ** ; παράδειγμα προγράμματ ος με ταφοράς δεδομένων ; * ** ** * ** * ** * ** ** * ** * ** ** * ** * ** ** * ** * ** ** * ** * ** ** * ** * ** ** * ** * ** ** . 3 86 ;χ ρή ση της ντ ιρεκτ ίβας γ ια ν α αν αγν ωρίζει ο assemb ler εντολές γ ια 80 38 6 STACK_SEG segment para STACK ;ορισμός τµήµατος στοίβας µε όνοµα stack_seg d b 2 56 dup ( 0) ;ορισ µ ός χ ώ ρ ο υ στοίβ ας (256 α ν τ ί γ ραφ α λ έ ξεων ) (D ef in e D UP licat es) με συγκε κ ριµέ ν ο πε ριεχόµε ν ο (0) STACK_SEG ends ;τέλος του τµήµατος της στοίβας µε όνοµα stack_seg code SE GME NT USE16 PARA P U BLIC 'CODE' ό ν οµα c ode ASSUME CS: code st art: Word – ;έναρξη τ ο υ τµή µατ ος κώδ ικα µε ;ο ρ ί ζ ε ι ποιοι καταχωρητέ ς σχετ ίζοντ α ι µε ποια τµήµ ατ α ;σ ηµ ε ίο (δ ιε ύθ υν ση) έναρξη ς/εισόδ ου τ ου προγ ράµ µ ατ ος M O V BH, 0 9h ;φ ό ρτω σε τη στα θε ρά 09h στ ο h igh by te ( BH) τ ο υ κ ατ αχ ω ρητή B X M O V BL, 0 F Fh ; φόρτω σε τη σταθερά 0F Fh στ ο low byt e ( BL ) τ ο υ κατ αχω ρητή B X M O V C X, B X ; φ όρ τω σε τα περιεχ όµε ν α του καταχω ρη τή BX στ ο καταχ ω ρητή C X M OV AH , 4 Ch INT 21h ; ρουτ ίνα τε ρµ ατ ισ µ ού ε ργ ασ ία ς ( 4C h: process term in at ion ) ;τ ε ρµ ατισ µ ός code ENDS ; τέλ ος τ ο υ τµή µατ ος κώδ ικα με όνομα c o d e END start ; τέλ ος τ ο υ assembly προγ ράµ µατος Σ η µε ίω ση 1.1: Ο συµβ ο λοµεταφραστής ( as s em bl e r ) δέχεται µ όν ο 80 8 6/ 80 8 8 ε ντ ολέ ς. Η ν τ ιρε κ τ ίβ α . 38 6 (γ ια real mode) κ α ι .386P (γ ια p ro t ect e d m od e ) ενη µε ρώνε ι τ ον a s s em b l e r να χ ρη σ ιµ οποιήσει το σύνολο τ ων ε ντολώ ν γ ια 8 0 38 6 ε πεξεργαστή ( 8 03 86 in st ru ct ion s et ). Σ η µε ίω ση 1.2: Γ ια τ ο υς 8 03 86 μέχ ρι και τους P ent iu m υπάρχει ακ όμα η ν τ ιρε κτ ίβ α U SE 1 6 ή U SE 3 2 που µ πορε ί ν α χ ρη σ ιµο π ο ι η θε ί µ ε τ ο τµήµ α τ ου κώδ ικα, η οποία ε ν ηµε ρώ νε ι τ ον assemb ler να χ ρη σ ιµ ο πο ι ή σε ι αντίστοιχα 1 6- b i t ή 32-bit τ ύ πους εντολών (in st ru ct ion mod es) γ ια τ ον ε πε ξε ργα στ ή. Σ η µε ίω ση 1.3 : Γ ια να χ ρη σ ι μ ο π ο ιή σε τ ε κλή σεις σ υν α ρτή σε ω ν τ ου D OS , θα π ρέ πε ι ν α τ οποθετήσετε τ ον α ρ ι θ μ ό κ λήσης της σ υν ά ρτη ση ς στον κ ατ αχ ω ρη τή AH κ α ι να τ οποθετήσετε όλες τ ις σχε τικ ές πλ ηροφορίε ς ω ς δεδ ομένα ε ισ όδου σ ε κ ατ αχ ω ρητές όπως αυτό περιγράφεται στον πίνακ α. Όταν ε π ιτε υχ θε ί αυτ ό, κ αλέσ τε τ ο INT 21H γ ι α ν α εκτε λέ σετε τ η ν συνάρτηση τ ο υ D O S. Η εντολή IN T 2 1H ε ίναι έ να πα ρά θ υρο ε πικοινω νίας µε τ ο D O S, κ α ι όταν τε λε ιώ σε ι η υ πο ρ ο υ τ ίν α που καλέσα µε ο έλεγχ ος τ ου συστήµ ατος ε π ιστ ρέφ ε ι καν ον ικά στη ν εντολή που ακ ολ ουθ ε ί µε τά τη ν INT 21 H. Αυτή η γε ν ικ ή ρουτ ίνα που κ α λούµε µ ε τ η ν INT 2 1H σε πρώτη φ άσ η ε λέγχει τ ο ν κ αταχ ω ρητή AH γ ια ν α δε ι ποιον κ ωδ ικ ό έχ ουµε τ οποθ ε τή σε ι προ τ ο υ καλέ σµ ατ ος. Α υτ ός ο κ ωδ ικ ός θ α µ ας οδηγ ήσε ι στη ν κατάλλη λη I / O ρουτ ίνα (π.χ. 02H –d i s pl ay c h a r ac t e r r ou t i n e). Μ π ο ρο ύ µε λ ο ιπόν γ ια δ ιάφ ορες δ ιε ργα σ ίες I/ O να κ αλ ούµ ε µ ια έ τ ο ιµη ρουτ ίνα του συστήµ ατος µε την εντολή INT n. Εργαστήριο Μικροϋπολογιστικών Συστημάτων | 10 4CH TERMINATE A PROCESS Entry AH = 4CH AL = error code Exit Returns control to DOS Notes This function returns control to DOS with the error code saved so it can be obtained using DOS ERROR LEVEL batch processing system. We normally use this function with an error code of 00H to return to DOS. ΠΑΡΑ∆ΕΙΓΜΑ 2 Παράδειγµα προγράµµατος που εµφανίζει το χαρακτήρα “Α” στην οθόνη. ; * ** ** * ** * ** * ** ** * ** * ** ** * ** * ** ** * ** * ** ** * ** * ** ** * ** * ** ** * ** * ** ** ; Π αράδε ιγ µα προγρά µ µατ ος που ε µφαν ίζε ι τ ο χαρακτήρα “ Α” στη ν οθόνη ; * ** ** * ** * ** * ** ** * ** * ** ** * ** * ** ** * ** * ** ** * ** * ** ** * ** * ** ** * ** * ** ** . 3 86 ;χ ρή ση της ντ ιρεκτ ίβας γ ια ν α αν αγν ωρίζει ο assemb ler εντολές γ ια 80 38 6 STACK_SEG segment para STACK ;ορισμός τµήµατος στοίβας µε όνοµα stack_seg d b 2 56 dup ( 0) ;ορισ µ ός χ ώ ρ ο υ στοίβ ας (256 α ν τ ί γ ραφ α λ έ ξεων ) (D ef in e D UP licat es) με συγκε κ ριµέ ν ο πε ριεχόµε ν ο (0) Word – ;τέλος του τµήµατος της στοίβας µε όνοµα stack_seg STACK_SEG ends code SE GME NT 'CODE ' ;έ να ρ ξη του τ µή µατος κώδ ικα µε όν οµα c od e ASSUME CS: code ;κ αθ ο ρ ισ µ ός τ ο υ ον όµ ατ ος που συνδέεται µε τ ο τ µή µα st art: ;σ ηµ ε ίο (δ ιε ύθ υν ση) έναρξη ς/εισόδ ου τ ου προγ ράµ µ ατ ος M OV DL, 41h κ ατ αχ ω ρητή ;β άζ ε ι τον A SC I I κ ωδ ικό τ ο υ ‘Α ’ (που ε ίν α ι τ ο 41h) σ τ ον DL M OV AH , 0 2h ;προετοιµάζε ι τ ον AH µε πε ριεχόµ ε ν ο τ ον κωδ ικ ό της ρουτ ίνα ς ε µφ άν ισης χ α ρακ τή ρα ( 02h : dis pl ay ch aract er) INT 21h ;η εντολή που κ αλεί τη ρουτ ίνα τ ο υ M S-D O S, και π ρ οβά λ ε ι το χαρα κτήρα ‘ Α ’ στην οθ όνη M OV AH , 4 Ch INT 21h ; ρουτ ίνα τε ρµ ατ ισ µ ού ε ργ ασ ία ς ( 4C h: process term in at ion ) ;τ ε ρµ ατισ µ ός code ENDS ; τέλ ος τ ο υ τµή µατ ος κώδ ικα με όνομα c o d e END start ; τέλ ος τ ο υ assembly προγ ράµ µατος Σηµείωση2.1: Δεδομένα κωδικοποιημένα σε ASCII (American Standard Code for Information Interchange: Αμερικανικός Πρότυπος Κώδικας Ανταλλαγής Εργαστήριο Μικροϋπολογιστικών Συστημάτων | 11 Πληροφοριών) αντιπροσωπεύουν αλφαριθμητικούς χαρακτήρες στη μνήμη ενός συστήματος υπολογιστή. ASCII Δεδο μένα Σ η µε ίω ση 2.2: Γ ια να χ ρη σ ιμ ο π ο ιή σε τ ε κλή σε ις συναρτήσεων τ ο υ DOS, θα π ρέ πε ι να τ οποθετήσετε τ ον α ρ ι θ μ ό κ λήσης της σ υν ά ρτη ση ς στον κ ατ αχ ω ρη τή AH κ α ι να τ οποθετήσετε όλες τ ις σχε τικ ές πλ ηροφορίε ς ω ς δεδ ομένα ε ισ όδου σ ε κ ατ αχ ω ρητές όπως αυτό περιγράφεται στον πίνακ α. Όταν ε π ιτε υχ θε ί αυτ ό, κ αλέσ τε τ ο INT 21H γ ι α ν α εκτε λέ σετε τ η ν συνάρτηση τ ο υ D O S. Η εντολή IN T 2 1H ε ίναι έ να πα ρά θ υρο ε πικοινω νίας µε τ ο D O S, κ α ι όταν τε λε ιώ σε ι η υ πο ρ ο υ τ ίν α που καλέσα µε ο έλεγχ ος τ ου συστήµ ατος ε π ιστ ρέφ ε ι καν ον ικά στη ν εντολή που ακ ολ ουθ ε ί µε τά τη ν INT 21 H. Αυτή η γε ν ικ ή ρουτ ίνα που κ α λούµε µ ε τ η ν INT 2 1H σε πρώτη φ άσ η ε λέγχει τ ο ν κ αταχ ω ρητή AH γ ια ν α δε ι ποιον κ ωδ ικ ό έχ ουµε τ οποθ ε τή σε ι προ τ ο υ καλέ σµ ατ ος. Α υτ ός ο κ ωδ ικ ός θ α µ ας οδηγ ήσε ι στη ν κατάλλη λη I / O ρουτ ίνα (π.χ. 02H –d i s pl ay c h a r ac t e r r ou t i n e). Μ π ο ρο ύ µε λ ο ιπόν γ ια δ ιάφ ορες δ ιε ργα σ ίες I/ O να κ αλ ούµ ε µ ια έ τ ο ιµη ρουτ ίνα του συστήµ ατος µε την εντολή INT n. 02H Entry WRITE TO STANDARD OUTPUT DEVICE AH = 02H DL = ASCII character to be displayed Notes This function call normally displays data on the video display. Εργαστήριο Μικροϋπολογιστικών Συστημάτων | 12 4CH TERMINATE A PROCESS Entry AH = 4CH AL = error code Exit Returns control to DOS Notes This function returns control to DOS with the error code saved so it can be obtained using DOS ERROR LEVEL batch processing system. We normally use this function with an error code of 00H to return to DOS. ΠΑΡΑ∆ΕΙΓΜΑ 3 Παράδειγµα προγράµµατος που εµφανίζει το µήνυµα “Hello World” στην οθόνη. ; * ** ** * ** * ** * ** ** * ** * ** ** * ** * ** ** * ** * ** ** * ** * ** ** * ** * ** ** * ** * ** ** ; Π αράδε ιγ µα προγρά µ µατ ος που ε µφαν ίζε ι τ ο µήν υµα “Hello World” στ ην οθόνη ; * ** ** * ** * ** * ** ** * ** * ** ** * ** * ** ** * ** * ** ** * ** * ** ** * ** * ** ** * ** * ** ** . 3 86 ;χ ρήσ η τ η ς ν τ ιρε κ τ ίβ α ς γ ια να αναγνωρίζει ο as s e mb ler εντολές γ ια 80 38 6 c od e SE GME NT USE1 6 PA RA P U BL IC 'CODE' code ;έναρξη τ ο υ τµή µα τ ος κώδ ικ α µε όν οµα ASSUME CS:code,DS:data,SS:stack ;ορίζε ι ποιοι κατ αχ ω ρητ έ ς σχετ ίζοντ α ι µε ποια τ µή µατα s t ar t : ; ση µε ίο (δ ιεύθ υνσ η) έναρξη ς/ε ισ ό δου τ ο υ προγ ρά µµ ατ ος M OV AX, data M OV DS, AX ;φόρτω σε τη δ ιε ύθ υν ση τ ου τ µήµ ατ ος δεδοµ ένων ; στον καταχω ρη τή τ µή µατος δεδ οµ ένων D S (D at a S eg ment Regist er) M O V D X, O F FSE T s tr in g ; φόρτω σε τη δ ιε ύθ υν ση (απόσταση) της µεταβλη τής st rin g σ τ ον DX, τ υ πώ νε ι από τη θέ ση τ ου D X μέχ ρι ν α β ρε ι $ M OV AH , 0 9h INT 21h ; φόρτ ωσε τη στ α θερά 09h (d i s pl ay st rin g) στ ον AH ;γ ια ν α την εµ φα ν ίσε ι M OV AH , 4 Ch INT 21h code ENDS ;φ ό ρτ ωσε τ ον κωδ ικό τ ε ρµα τ ισ µ ού δ ιε ργ α σ ία ς ( 4C h ) σ τ ον AH ;γ ια τον τε ρµ ατ ισµ ό τ ο υ π ρο γ ρά µ µατος ;τέ λ ος τ ο υ τ µήµ ατ ος τ ο υ κώδ ικ α µε όν οµα cod e data SE GME NT para public ;τ µή µα δεδ οµ ένων µε όνοµα d at a st rin g D B "H ello World", 13, 10, " $" L F ( 1 0) data ENDS ; συµβ ολοσε ιρά που τ ελε ιώνε ι µε CR (13) ; και ;τέλ ος τ ο υ τµ ήµ ατ ος δεδ οµένων µ ε όν οµ α data s t ack SE GME NT ST ACK ;τµ ήµ α στ οίβας µε όνοµα stack D W 6 4 D UP (0 ) ;ορισ µ ός χ ώ ρ ο υ στ οίβ ας ( 6 4 αν τ ίγ ραφ α λέ ξεω ν) (D ef in e Word – D UP licat es) με συγκε κ ριµέ ν ο πε ριεχόµε ν ο (0) st ack ENDS END start ;τέλ ος τ ο υ τµ ήµ ατ ος της στοίβας µε όνοµα stack ;τ έ λος σ υµβολικ ού προγρά µ µατ ος Εργαστήριο Μικροϋπολογιστικών Συστημάτων | 13 Σ η µε ίω ση 3.1: Γ ια να χ ρη σ ιμ ο π ο ιή σε τ ε κλή σε ις συναρτήσεων τ ο υ DOS, θα π ρέ πε ι να τ οποθετήσετε τ ον α ρ ι θ μ ό κ λήσης της σ υν ά ρτη ση ς στον κ ατ αχ ω ρη τή AH κ α ι να τ οποθετήσετε όλες τ ις σχε τικ ές πλ ηροφορίε ς ω ς δεδ ομένα ε ισ όδου σ ε κ ατ αχ ω ρητές όπως αυτό περιγράφεται στον πίνακ α. Όταν ε π ιτε υχ θε ί αυτ ό, κ αλέσ τε τ ο INT 21H γ ι α ν α εκτε λέ σετε τ η ν συνάρτηση τ ο υ D O S. Η εντολή IN T 2 1H ε ίναι έ να πα ρά θ υρο ε πικοινω νίας µε τ ο D O S, κ α ι όταν τε λε ιώ σε ι η υ πο ρ ο υ τ ίν α που καλέσα µε ο έλεγχ ος τ ου συστήµ ατος ε π ιστ ρέφ ε ι καν ον ικά στη ν εντολή που ακ ολ ουθ ε ί µε τά τη ν INT 21 H. Αυτή η γε ν ικ ή ρουτ ίνα που κ α λούµε µ ε τ η ν INT 2 1H σε πρώτη φ άσ η ε λέγχει τ ο ν κ αταχ ω ρητή AH γ ια ν α δε ι ποιον κ ωδ ικ ό έχ ουµε τ οποθ ε τή σε ι προ τ ο υ καλέ σµ ατ ος. Α υτ ός ο κ ωδ ικ ός θ α µ ας οδηγ ήσε ι στη ν κατάλλη λη I / O ρουτ ίνα (π.χ. 02H –d i s pl ay c h a r ac t e r r ou t i n e). Μ π ο ρο ύ µε λ ο ιπόν γ ια δ ιάφ ορες δ ιε ργα σ ίες I/ O να κ αλ ούµ ε µ ια έ τ ο ιµη ρουτ ίνα του συστήµ ατος µε την εντολή INT n. 09H DISPLAY A CHARACTER STRING Entry AH = 09H DS:DX = address of the character string Notes The character string must end with an ASCII $ (24H). The character string can be of any length and may contains control characters such as carriage return (0DH) and line feed (0AH). 4CH TERMINATE A PROCESS Entry AH = 4CH AL = error code Exit Returns control to DOS Notes This function returns control to DOS with the error code saved so it can be obtained using DOS ERROR LEVEL batch processing system. We normally use this function with an error code of 00H to return to DOS. ΠΑΡΑ∆ΕΙΓΜΑ 4 Παράδειγµα προγράµµατος που υπολογίζει το άθροισμα δύο αριθμών ; * ** ** * ** * ** * ** ** * ** * ** ** * ** * ** ** * ** * ** ** * ** * ** ** * ** * ** ** * ** * ** ** ; Π αράδε ιγ µα προγρά µ µατ ος που υ πο λ ο γ ί ζ ε ι το ά θ ρ ο ι σμ α δ ύο αριθμών ; * ** ** * ** * ** * ** ** * ** * ** ** * ** * ** ** * ** * ** ** * ** * ** ** * ** * ** ** * ** * ** ** . 3 86 ;χ ρήσ η τ η ς ν τ ιρε κ τ ίβ α ς γ ια να αναγνωρίζει ο as s e mb ler εντολές γ ια 80 38 6 mycode SE GMENT USE16 P ARA P U BLIC ό ν οµα myc od e ASSUME CS: mycode, DS:mydat a τ µή µατα ‘C ODE’ ;έ να ρ ξη του τ µή µατος κώδ ικα µε ; ορίζε ι ποιοι καταχ ωρητές σχε τ ίζον τα ι µ ε ποια star t: ;σ ηµ ε ίο (δ ιε ύθ υν ση) έ να ρ ξης /ε ισόδ ο υ τ ο υ π ρ ο γ ρά µµα τ ος Εργαστήριο Μικροϋπολογιστικών Συστημάτων | 14 M O V A X , m y da ta ; φόρτω σε τη δ ιε ύθ υν ση τ ου τµ ήµ ατ ος δεδ οµένων M O V DS , A X ;στον καταχωρητή τ µήµα τ ος δεδ οµ έ ν ω ν DS SUB DX, DX ; µηδέν ισε τ ον κ ατ αχ ω ρητή υπερχ είλ ισης DX M O V A X , N UM 1 ;τοποθέ τησε έ να αριθµ ό σ τ ον καταχ ωρητή A X M O V B X, N UM 2 ;τοποθέ τησε έ να αριθµ ό σ τ ον καταχ ωρητή BX ; πρόσ θεσε στον Α Χ τον ΒΧ κ α ι τ ο α π ο τ έ λ ε σμ α β άλτ ο σ τ ον Α Χ ADD AX, BX MOV ANS, AX ;τ ο ποθ έ τη σε το αποτέλεσµ α στ ο AN S M OV AH , 4 Ch ;φ όρ τω σε τ ον κωδ ικ ό τε ρµατ ισ µ ού δ ιεργα σ ία ς INT 21h ; γ ια τ ον τε ρµατ ισ µ ό της mycode ENDS ;τέλ ος τ ο υ τ µήµ ατ ος τ ο υ κώδ ικ α µε όν οµα mycode my data SE GMEN T PA R A P U BLI C ‘DA TA ’ ;έ να ρ ξη του τ µή µατος δεδ ομένων µε όνοµ α mydata N UM 1 D W 12 3 4h ; καθορισ µός δε καε ξαδικ ού δεδ οµ έ ν ο υ (D ef in e Word) N UM 2 D W 00 0 1h ANS DW ? ;δεσ µε ύε ι µ ια λέ ξη (w ord) στη µνή µη χωρίς κ ά π οιο συγκεκριµ έ ν ο περιεχ ό µε ν ο, όπου θ α τ οποθετη θε ί τ ο αποτέλεσ µα τ ο οποίο θα π ρ οκύ ψ ε ι mydata ENDS ;τέλ ος τ ο υ τ µήµ ατ ος δεδοµ ένων µε όν οµα my data s t ack SE GME NT ST ACK ;τµ ήµ α στ οίβας µε όνοµα stack D W 6 4 D UP (0 ) ;ορισ µ ός χ ώ ρ ο υ στ οίβ ας ( 6 4 αν τ ίγ ραφ α λέ ξεω ν) (D ef in e Word – D UP licat es) με συγκε κ ριµέ ν ο πε ριεχόµε ν ο (0) st ack ENDS END start ;τέλ ος τ ο υ τµ ήµ ατ ος της στοίβας µε όνοµα stack τέ λος συµβ ο λ ικ ο ύ προγ ρά µµ ατ ος ΠΑΡΑ∆ΕΙΓΜΑ 5 Παράδειγµα προγράµµατος που υπολογίζει το γινόμενο δύο αριθμών ; * ** ** * ** * ** * ** ** * ** * ** ** * ** * ** ** * ** * ** ** * ** * ** ** * ** * ** ** * ** * ** ** ; Π αράδε ιγ µα προγρά µ µατ ος που υ πο λ ο γ ί ζ ε ι το γ ιν όμεν ο δ ύο αριθμών ; * ** ** * ** * ** * ** ** * ** * ** ** * ** * ** ** * ** * ** ** * ** * ** ** * ** * ** ** * ** * ** ** . 3 86 ;χ ρήσ η τ η ς ν τ ιρε κ τ ίβ α ς γ ια να αναγνωρίζει ο as s e mb ler εντολές γ ια 80 38 6 mycode SE GMENT USE16 P ARA P U BLIC ‘C ODE ’ ό ν οµα myc od e ASSUME CS: mycode, DS:mydat a τ µή µατα ;έναρξη τ ου τ µή µατος κώδ ικα µ ε ; ορίζε ι ποιοι καταχ ωρητές σχε τ ίζον τα ι µ ε ποια star t: ;σ ηµ ε ίο (δ ιε ύθ υν ση) έ να ρ ξης /ε ισόδ ο υ τ ο υ π ρ ο γ ρά µµα τ ος M O V A X , m y da ta ; φόρτω σε τη δ ιε ύθ υν ση τ ου τµ ήµ ατ ος δεδ οµένων σ τ ον Α Χ M O V DS , A X ;φ ό ρτ ωσε τ ον Α Χ σ τ ον καταχ ωρητή τµή µ ατ ος δεδοµέ ν ω ν DS SUB DX, DX ; µηδέν ισε τ ον κ ατ αχ ω ρητή υπερχ είλ ισης DX M O V A X , N UM 1 M UL NU M2 ;τοποθέ τησε έ να αριθµ ό σ τ ον καταχ ωρητή A X ; πολλαπλασίασέ τον µε τ ον δε ύτε ρο αριθµ ό NUM2 Εργαστήριο Μικροϋπολογιστικών Συστημάτων | 15 MOV ANS, AX ;τ ο ποθ έ τη σε το αποτέλεσµ α στ ο AN S M OV AH , 4 Ch ;φ όρ τω σε τ ον κωδ ικ ό τε ρµατ ισ µ ού δ ιεργα σ ία ς INT 21h ; γ ια τ ον τε ρµατ ισ µ ό της mycode ENDS ;τέλ ος τ ο υ τ µήµ ατ ος τ ο υ κώδ ικ α µε όν οµα mycode my data SE GMEN T PA R A P U BLI C mydata ‘DA TA ’ ;έναρξη τ ο υ τµή µατ ος δεδ ομένων µε όν οµα N UM 1 D W 12 3 4h ; καθορισ µός δε καε ξαδικ ού δεδ οµ έ ν ο υ (D ef in e Word) N UM 2 D W 00 C D h ANS DW ? ;δεσ µε ύε ι µ ια λέ ξη (w ord) στη µνή µη χωρίς κ ά π οιο συγκεκριµ έ ν ο περιεχ ό µε ν ο, όπου θ α τ ο α π οτέ λε σµ α το οποίο θα προκύψε ι ( E 93 A 4) mydata ENDS ;τέλ ος τ ο υ τ µήµ ατ ος δεδοµ ένων µε όν οµα my data s t ack SE GME NT ST ACK ;τµ ήµ α στ οίβας µε όνοµα stack D W 6 4 D UP (0 ) ;ορισ µ ός χ ώ ρ ο υ στ οίβ ας ( 6 4 αν τ ίγ ραφ α λέ ξεω ν) (D ef in e Word – D UP licat es) με συγκε κ ριµέ ν ο πε ριεχόµε ν ο (0) st ack ENDS END start ;τέλ ος τ ο υ τµ ήµ ατ ος της στοίβας µε όνοµα stack τέ λος συµβ ο λ ικ ο ύ προγ ρά µµ ατ ος Σ η µε ίω ση 5.1: Στ ο π ρ ό γ ρα µµ α αυτ ό το αποτέλεσ µ α που προκ ύπτε ι α π ό τ ο γ ινόµ ε ν ο των δ ύο 16-bit δεκ αεξαδ ικώ ν αριθ µ ών είναι α ρκ ε τ ά µεγάλο γ ια να χωρέ σε ι σ τ ον κ ατ αχ ω ρητή A X ( στον οποίο κ ατ αχ ω ρε ίτε µ όνο το 9 3 A 4) και έ τ σ ι έχουµε υπερχε ίλ ιση, µ ε συνέ πε ια τ ο τελ ικ ό αποτέλεσµ α (E 93 A4 ) να δ ίν ετ α ι α π ό τ ο συνδυα σ µ ό τ ο υ κ ατ αχ ω ρητή υπε ρχείλ ισης D X ( όπου έχε ι κ ατ αχ ωρ η θε ί τ ο 0 0 0E ) κ α ι τ ο υ κατ αχω ρη τή AX ( όπου έχει καταχ ωρη θε ί τ ο 93A4). Εργαστήριο Μικροϋπολογιστικών Συστημάτων | 16 ΠΡΟΒΛΗΜΑΤΑ ΑΣΚΗΣΗΣ 2 ΕΝΤΟΛΕΣ ΜΕΤΑΦΟΡΑΣ, ΤΟΠΟΘΕΤΗΣΗΣ ΔΕΔΟΜΕΝΩΝ, ΑΡΙΘΜΗΤΙΚΩΝ ΠΡΑΞΕΩΝ ΠΡΟΒΛΗΜΑ 1 Ν α γ ρ αφε ί πρόγ ρα µµ α σε assemb ly των ε πεξε ργα σ τών της In tel τ ο οποίο ν α ε µφ αν ίζε ι τ ο χ α ρα κτή ρα « Ζ» στη ν οθόνη. ΠΡΟΒΛΗΜΑ 2 Ν α γ ρ αφε ί πρόγ ρα µµ α σε assemb ly των ε πεξε ργα σ τών της In tel τ ο οποίο ν α ε µφ αν ίζε ι τ ο ονοµα τ ε πώ ν υµ ό σ α ς ( στη ν αγγ λ ική γ λώ σσ α) στην οθ όνη. ΠΡΟΒΛΗΜΑ 3 Ν α γ ρ αφε ί πρόγ ρα µµ α σε assemb ly της In tel τ ο οποίο ν α υπολογ ίζει τ ο αποτέλε σμ α της αφαίρεσης δ ύο αριθμών ( 1 5 µε τ ο 5). ΠΡΟΒΛΗΜΑ 4 Ν α γ ρ αφε ί πρόγ ρα µµ α σε assemb ly της In tel τ ο οποίο ν α υπολογ ίζει τ ο αποτέλε σμ α της δ ια ίρε σης δ ύο αριθμών ( 15 µε το 5). Εργαστήριο Μικροϋπολογιστικών Συστημάτων | 17 ΕΡΓΑΣΤΗΡΙΟ ΑΡΧΙΤΕΚΤΟΝΙΚΗΣ & ΛΕΙΤΟΥΡΓΙΑΣ Η/Υ Διδ άσκων: Ε υάγ γελος Τ οπ άλης Δρ. Ηλ εκτρολ όγ ος Μηχ αν ικ ός & Τεχν ολ ογ ία ς Υ πολ ογ ιστών ΑΣΚΗΣΗ 3 ΛΟΓΙΚΕΣ ΠΡΑΞΕΙΣ, ΕΝΤΟΛΕΣ ΕΠΑΝΑΛΗΨΗΣ, ΕΝΤΟΛΕΣ ΣΥΓΚΡΙΣΗΣ, ΕΝΤΟΛΕΣ ΔΙΑΚΛΑΔΩΣΗΣ, ΑΜΕΣΗ ΠΡΟΣΒΑΣΗ ΣΤΗ VGA, ΔΟΜΗΣΗ ΥΠΟΡΟΥΤΙΝΑΣ ΠΑΡΑ∆ΕΙΓΜΑ 1 Παράδειγµα προγράµµατος λογικών πράξεων Εργαστήριο Μικροϋπολογιστικών Συστημάτων | 18 ; * ** ** * ** * ** * ** ** * ** * ** ** * ** * ** ** * ** * ** ** * ** * ** ** * ** * ** ** * ** * ** ** ; Παράδε ιγ µα προγρά µ µατ ος λ ογ ικώ ν πρά ξεων ; * ** ** * ** * ** * ** ** * ** * ** ** * ** * ** ** * ** * ** ** * ** * ** ** * ** * ** ** * ** * ** ** . 3 86 ;χ ρήσ η τ η ς ν τ ιρε κ τ ίβ α ς γ ια να αναγνωρίζει ο as s e mb ler εντολές γ ια 80 38 6 c od e SE GME NT USE1 6 PA RA P U BL IC 'CODE' ;έναρξη τ ο υ τµ ήµ ατ ος κώδ ικα µε ό ν οµα code ASSUME CS:code,DS:data,SS:stack ; καθορισ µ ός τ ο υ ον όµατ ος που συνδέε τα ι µ ε τ ο τ µή µα star t: ;σ ηµ ε ίο (δ ιε ύθ υν ση) έ να ρ ξης /ε ισόδ ο υ τ ο υ π ρ ο γ ρά µµα τ ος P USH DS ; αποθήκευση τη ς θέ σης τ ο υ κ ατ αχ ω ρητή DS SUB AX, AX ; µηδέ ν ισ ε τ ο ν κ ατ αχ ω ρητή A X P USH A X ; τ οπ ο θέτησ η τ ο υ A X στη στοίβα M O V A X , d a ta ;τ ο ποθ έ τη σε στ ον AX τη θέ ση τ ων δεδ οµέ ν ω ν M O V DS , A X ;τ ο π ο θέτ η σέ την δ ιε ύθ υν ση αυτή στον καταχω ρη τή τ ου τ µή µατος των δεδ οµ ένων DS M OV A L, IN 1 ;φ ό ρτω σε την πρώτ η ε ίσ οδ ο στ ον καταχ ωρητή AL N O T A L ; αν τ ιστ ροφή των bits σ τ ον AL (πράξη N OT ) M OV AH , IN 2 ;φ ό ρτω σε την δε ύτε ρη ε ίσ ο δο στο κ ατ αχ ω ρητή AH A ND AL , AH ;εφάρµοσ ε τη λ ογ ική πράξη AND σε αυτές τ ις δ ύο M O V BL, IN 3 ;φ ό ρτω σε την τρίτ η ε ίσ οδο στ ον κατ αχω ρητή BL N O T BL ;αν τ ιστ ροφή των bits σ τ ον ΒL (πράξη N OT ) O R BL, I N 4 ;ε φά ρµοσ ε τ η λ ογ ική πράξη OR σε αυτές τ ις δ ύο XOR AL, BL ;ε φ ά ρµ οσ ε τ η λ ογ ική πράξη XOR σ τ ις ε ξόδ ο υς MOV ANS, AL ;αποθήκευσε τ ο α πο τ έ λ ε σµ α ( που προέκ υψε σ τ ον AL ) σ τ ο AN S M OV AH , 4 Ch ; ρουτίνα τε ρµ ατ ισ µ ού ε ργ α σ ία ς ( 4C h :p r oc e ss t e rmi n at i on) INT 21h ;τε ρµατισµός C ODE E ND S ; τέλ ος του τ µήµα τ ος κώδ ικ α d a ta SE GME NT para pub lic ;κ αθ ο ρ ισ µ ός τ ο υ τ µήµ ατ ος δεδοµ ένων I N 1 D B 0 01 1 10 1 1 B ; καθορισ µός δεδ οµένων ε ν ό ς b y t e µε δεδ οµένη τιµ ή, τ α οποία δ ίνοντ αι σε δ υαδ ικ ή ( B in a ry) µορφή I N 2 D B 1 01 1 11 0 1 B I N 3 D B 1 10 1 01 0 0 B I N 4 D B 1 01 1 00 1 0 B Εργαστήριο Μικροϋπολογιστικών Συστημάτων | 19 A N S D B ? ;δε σ µε ύε ι έ ν α byt e στη µνή µη χ ωρίς κάποιο συγκε κ ριµέ ν ο πε ριεχόµε ν ο, όπου θ α αποθηκευτεί τ ο α ποτ έλ εσµ α τ ο οποίο θ α π ροκ ύ ψ ε ι α π ό τ ις λ ογ ικές πράξε ις data ENDS ; τέλ ος του τ µή µατος δεδ οµένων µε όνοµ α dat a s t ack SE GME NT ST ACK ;τ µήµ α στ οίβας µε όν οµα st ack D B 6 4 D U P ( 0) ; ορισ µ ός χώρου στ οίβα ς ( 6 4 α ν τ ί γ ρα φα λέ ξεων ) (Def in e Word – D UP licat es) με συγκε κ ριµέ ν ο πε ριεχόµε ν ο (0) s t ack E ND S ; τέλ ος του τ µή µατος της στοίβ ας µε όν οµα st ack E N D S T A RT ;τέ λ ος του assemb ly προγ ρά µ µατος ΠΑΡΑ∆ΕΙΓΜΑ 2 Παράδειγµα προγράµµατος που εµφανίζει στην οθόνη όλους τους χαρακτήρες και σύµβολα της µηχανής. ; * ** ** * ** * ** * ** ** * ** * ** ** * ** * ** ** * ** * ** ** * ** * ** ** * ** * ** ** * ** * ** ** ; Παράδε ιγ µα προγρά µ µατ ος που ε µφαν ίζε ι στ ην ο θ όνη όλους τους χαρακτήρες ; και σ ύµβ ολ α τη ς µ ηχαν ής. ; * ** ** * ** * ** * ** ** * ** * ** ** * ** * ** ** * ** * ** ** * ** * ** ** * ** * ** ** * ** * ** ** .386 ;χρήση της ντιρεκτίβας για να αναγνωρίζει ο assembler εντολές για 80386 code SEGMENT USE16 PARA PUBLIC 'CODE' ;έναρξη του τµήµατος κώδικα µε όνοµα code ASSUME CS:code,DS:data,SS:stack ; καθορισ µ ός τ ο υ ον όµατ ος που συνδέε τα ι µ ε τ ο τ µή µα star t: ;σ ηµ ε ίο (δ ιε ύθ υν ση) έ να ρ ξης /ε ισόδ ο υ τ ο υ π ρ ο γ ρά µµα τ ος MOV CX, 256 ;αρχική τιµή του πλήθους των επαναλήψεων MOV DL, 01h ;ο πρώτος κωδικός του αλφάβητου NEXT: MOV AH, 02h ;η ρουτίνα εµφάνισης χαρακτήρα που βρίσκεται στον DL INT 21h ;εµφάνιση στην οθόνη του χαρακτήρα INC DL ;προετοιµασία του καταχωρητή για τον επόµενο κωδικό LOOP NEXT ;µειώνει το µετρητή CX κατά 1 και όσο δεν είναι 0 M OV AH , 4 Ch ; ρουτίνα τε ρµ ατ ισ µ ού ε ργ α σ ία ς ( 4C h :p r oc e ss t e rmi n at i on) INT 21h ;τερµατισµός code ENDS ;τέλος του τµήµατος κώδικα data SEGMENT para public ;καθορισµός του τµήµατος δεδοµένων data ENDS ; τέλ ος του τ µή µατος δεδ οµένων µε όνοµ α dat a stack SEGMENT STACK ;τµήµα στοίβας µε όνοµα stack DB 64 DUP (0) ;ορισµός χώρου στοίβας (64 αντίγραφα λέξεων) (Define Word – DUPlicates) με συγκεκριµένο περιεχόµενο (0) stack ENDS ;τέλος του τµήµατος της στοίβας µε όνοµα stack E N D S T A RT ;τέ λ ος του assemb ly προγ ρά µ µατος Σ η µε ίω ση 3 .1 : Εργαστήριο Μικροϋπολογιστικών Συστημάτων | 20 02H Entry WRITE TO STANDARD OUTPUT DEVICE AH = 02H DL = ASCII character to be displayed Notes This function call normally displays data on the video display. Σ η µε ίω ση 3 .2 : LOOP/LOOPD Loop until CX = 0 or ECX = 0 11100010 disp Format Example Microprocessor Clocks LOOP label LOOP NEXT 8086 17/5 LOOPD label LOOP BACK 8088 17/5 LOOPD LOOPS 80286 8/4 80386 11 80486 7/6 Pentium 5/6 Pentium Pro LOOPE/LOOPED Loop while equal 11100001 disp Format Example Microprocessor Clocks LOOPE label LOOPE AGAIN 8086 18/6 LOOPED label LOOPED UNTIL 8088 18/6 LOOPZ label LOOPZ ZORRO 80286 8/4 LOOPE label LOOPE AGAIN 80386 11 80486 9/6 Pentium 7/8 Pentium Pro LOOPNE/LOOPNED Loop while not equal 11100000 disp Εργαστήριο Μικροϋπολογιστικών Συστημάτων | 21 Format Example Microprocessor Clocks LOOPNE label LOOPNE FORWARD 8086 19/5 LOOPNED label LOOPNED UPS 8088 19/5 LOOPNZ label LOOPNZ TRY_AGAIN 80286 8/4 LOOPNZD label LOOPNZD WOO 80386 11 80486 9/6 Pentium 7/8 Pentium Pro ΠΑΡΑ∆ΕΙΓΜΑ 3 Παράδειγµα προγράµµατος το οποίο διαβάζει ένα πλήκτρο (key) και εµφανίζει το χαρακτήρα του πλήκτρου (ενώ µε το πλήκτρο ‘%’ το πρόγραµµα τερµατίζει). ; * ** ** * ** * ** * ** ** * ** * ** ** * ** * ** ** * ** * ** ** * ** * ** ** * ** * ** ** * ** * ** ** ; Παράδε ιγ µα προγρά µ µατ ος τ ο οποίο δ ιαβά ζε ι έ ν α πλή κτ ρο ( k ey) και ε µφ αν ίζε ι τ ο ; χαρα κτήρα τ ο υ πλήκ τ ρου (ε ν ώ µε τ ο πλήκτρο ‘%’ τ ο πρόγ ραµ µα τερµ ατ ίζε ι) . ; * ** ** * ** * ** * ** ** * ** * ** ** * ** * ** ** * ** * ** ** * ** * ** ** * ** * ** ** * ** * ** ** .386 ;χρήση της ντιρεκτίβας για να αναγνωρίζει ο assembler εντολές για 80386 code SEGMENT USE16 PARA PUBLIC 'CODE' ;έναρξη του τµήµατος κώδικα µε όνοµα code ASSUME CS:code,DS:data,SS:stack ; καθορισ µ ός τ ο υ ον όµατ ος που συνδέε τα ι µ ε τ ο τ µή µα star t: ;σ ηµ ε ίο (δ ιε ύθ υν ση) έ να ρ ξης /ε ισόδ ο υ τ ο υ π ρ ο γ ρά µµα τ ος M A IN: M OV AH , 0 6h ; ρουτίνα αν άγνω σης πλήκ τρου (06h: direct con s ole I/O) M O V DL , 0 F Fh ; ρουτ ίνα ανάγνωση ς πλήκ τ ρου , ε άν D L=0F Fh τότε δ ιαβά ζο υμε α π ό τη ν κ ον σ όλ α INT 21h ;δ ιακ ο πή για ανάγνωση πλή κτ ρου α π ό τ ο πλ ηκτ ρολόγ ιο JE MAIN ;ε άν δε ν πα τη θε ί κάποιο πλή κτ ρο (k ey) δ ιάβα σε ξα νά CMP AL, '%' ;ε άν ε ίν α ι ο χαρα κτήρας ‘%’ τ ότε τε ρµατ ίζε ι JE MAIN1 ;ε άν ε ίν α ι ο χ α ρακ τή ρα ς ‘% ’ τ ό τε τε ρµα τ ί ζε ι M OV AH , 0 6h 0 2h ;η ρουτ ίνα εµφ άν ιση ς χαρακτήρα που β ρίσκετ α ι σ τ ον D L ή κ α ι με την M O V DL , A L ;τ ο ποθετ ε ί τον χαρακτήρα σ τ ον καταχω ρη τή DL INT 21h ;εµφάνιση στην οθόνη του χαρακτήρα JMP MAIN ;ε παν άληψη όλη ς της δ ιαδ ικ ασία ς Εργαστήριο Μικροϋπολογιστικών Συστημάτων | 22 M A IN1 : M OV AH , 4 Ch ; ρουτίνα τε ρµ ατ ισ µ ού ε ργ α σ ία ς ( 4C h :p r oc e ss t e rmi n at i on) INT 21h ;τε ρµατισµός code ENDS ;τέλος του τµήµατος κώδικα data SEGMENT para public ;καθορισµός του τµήµατος δεδοµένων data ENDS ; τέλ ος του τ µή µατος δεδ οµένων µε όνοµ α dat a stack SEGMENT STACK ;τµήµα στοίβας µε όνοµα stack DB 64 DUP (0) ορισµός χώρου στοίβας (64 αντίγραφα λέξεων) (Define Word – DUPlicates) με συγκεκριµένο περιεχόµενο (0) stack ENDS ;τέλος του τµήµατος της στοίβας µε όνοµα stack E N D S T A RT ;τέ λ ος του assemb ly προγ ρά µ µατος Σ η µε ίω ση 3 .3 : 06H DIRECT CONSOLE READ/WRITE Entry AH = 06H DL = 0FFH or DL = ASCII character Exit AL = ASCII character Notes If DL = 0FFH on entry, then this function reads the console. If DL = ASCII character, then this function displays the ASCII character on the console (CON) video screen. If a character is read from the console keyboard, the zero flag (ZF) indicates whether a character was typed. A zero condition indicates no key was typed, and a not-zero condition indicates that AL contains the ASCII code of the key or a 00H. If AL = 00H, the function must again be invoked to read an extended ASCII character from the keyboard. Note that the key does not echo to the video screen. Σ η µε ίω ση 3 .4 : 02H Entry WRITE TO STANDARD OUTPUT DEVICE AH = 02H DL = ASCII character to be displayed Notes This function call normally displays data on the video display. Σ η µε ίω ση 3 .5 : Εργαστήριο Μικροϋπολογιστικών Συστημάτων | 23 Jcondition Conditional jump 0111cccc disp Format Example Microprocessor Clocks Jcnd label JA ABOVE 8086 16/4 (8-bit disp) JB BELOW 8088 16/4 JG GREATER 80286 7/3 JE EQUAL 80386 7/3 JZ ZERO 80486 3/1 Pentium 1 Pentium Pro 0000 1111 1000cccc disp Format Example Microprocessor Clocks Jcnd label JNE NOT_MORE 8086 (16-bit disp) JLE LESS_OR_SO 8088 80286 80386 7/3 80486 3/1 Pentium 1 Pentium Pro Condition Codes Mnemonic Description 0000 JO O = 1 Jump if overflow 0001 JNO O = 0 Jump if no overflow 0010 JB/NAE C = 1 Jump if below 0011 JAE/JNB C = 0 Jump if above or equal 0100 JE/JZ Z = 1 Jump if equal/zero 0101 JNE/JNZ Z = 0 Jump if not equal/zero JBE/JNA C = 1 + Z = 1 Jump if below or equal 0111 JA/JNBE C = 0 Z = 0 Jump if above 1000 JS S = 1 Jump if sign 1001 JNS S = 0 Jump if no sign 1010 JP/JPE P = 1 Jump if parity 0110 Εργαστήριο Μικροϋπολογιστικών Συστημάτων | Flag 24 1011 JNP/JPO P = 0 Jump if no parity 1100 JL/JNGE S O Jump if less than JGE/JNL S = 0 Jump if greater than or equal JLE/JNG Z = 1 + S O Jump if less than or equal JG/JNLE Z = 0 + S = O Jump if greater than 1101 1110 1111 ΠΑΡΑ∆ΕΙΓΜΑ 4 Παράδειγµα προγράµµατος το οποίο υπολογίζει το μέγιστο μεταξύ δύο αριθμών και τον αποθηκεύει σε μία μεταβλητή. ; * ** ** * ** * ** * ** ** * ** * ** ** * ** * ** ** * ** * ** ** * ** * ** ** * ** * ** ** * ** * ** ** ; Παράδε ιγ µα προγρά µ µατ ος τ ο οποίο υπολογ ίζει τ ο μέ γ ιστ ο μετ αξύ δ ύο αριθμών ; και τ ο ν α π ο θηκε ύε ι σ ε μ ία με ταβ λητή. ; * ** ** * ** * ** * ** ** * ** * ** ** * ** * ** ** * ** * ** ** * ** * ** ** * ** * ** ** * ** * ** ** . 3 86 ;χ ρήσ η τ η ς ν τ ιρε κ τ ίβ α ς γ ια να αναγνωρίζει ο as s e mb ler εντολές γ ια 80 38 6 mycode SEGMENT USE16 PARA PUBLIC 'CODE' ;έναρξη του τµήµατος κώδικα µε όνοµα code A S SU ME C S : myc o d e,D S: my d at a, S S:s t ac k ; καθορισ µ ός τ ο υ ο ν όµατ ος που συνδέεται µε τ ο τµή µ α star t: ;σ ηµ ε ίο (δ ιε ύθ υν ση) έ να ρ ξης /ε ισόδ ο υ τ ο υ π ρ ο γ ρά µµα τ ος M O V A X , m y da ta ;τοποθέ τησε στ ον AX τη δ ιε ύθ υν ση των δεδ οµένων M O V DS , A X ;τ ο π ο θέτ η σε αυτή τη δ ιε ύθυν ση στ ον κατ αχ ω ρητ ή τ ο υ τµ ήµ ατ ος δεδ οµ ένων DS M O V A L, N UM 1 ; τοποθέ τη σε τ ον πρώτ ο αριθµ ό (N UM 1) στο κ ατ αχ ωρ ητή AL CMP AL, NUM2 ; σύγκ ρινε τον πρώτο α ρ ιθ μ ό ( NUM1 ) µε τον δε ύτε ρο (N UM 2) J A ADR ;εάν ο πρώτος α ρ ι θμ ός (N UM 1) ε ίναι με γαλ ύτερος από τ ον δεύτε ρο α ρ ιθ μ ό ( NUM 2) πήγ α ινε στο ADR M O V A L, N UM 2 ;β άλε τ ον δεύτε ρο α ρ ιθ μ ό ( NUM2 ) στ ον καταχ ωρητή AL M O V A N S , AL ;τοποθέτη σε τ ον καταχωρητή AL, ο οποίος π ε ρ ιέ χ ε ι τον NUM 2, σ τ ο AN S JMP FIN ;π ή γ α ιν ε στ ο F IN ADR: MOV ANS, AL ;τοποθέτη σε τ ον AL, ο οποίος περιέχει τ ον NUM1, στ ο A N S M OV AH , 4 Ch ;ρουτ ίνα τε ρµατισ µού εργασίας (4Ch: proc es s t erm inati on ) F I N: INT 21h ;τε ρµατισµός mycode ENDS ;τέλ ος τ ο υ τ µήµ ατ ος κώδικ α mydata SEGMENT para public 'DATA' ;καθορισµός του τµήµατος δεδοµένων N UM 1 D B 0 0 01 1 01 1B ;καθορισ µ ός δεδ οµ έ ν ω ν ενός by t e µε δεδ οµ ένη τ ιµή , τ α οποία δ ίνοντ αι σε δ υαδ ικ ή ( B in a ry) µορφή Εργαστήριο Μικροϋπολογιστικών Συστημάτων | 25 N UM 2 D B 0 0 00 1 11 0B A N S D B ? ;δε σ µε ύε ι έ ν α byt e στη µνή µη χ ωρίς κάποιο συγκε κ ριµέ ν ο πε ριεχόµε ν ο, όπου θ α αποθηκευτεί ο μέγ ιστ ος αριθμ ός mydata ENDS ;τέλ ος τ ο υ τ µήµ ατ ος δεδοµ ένων µε όν οµα my data s t ack SE GME NT ST ACK ;τ µήµ α στ οίβας µε όν οµα st ack D B 6 4 D U P ( 0) ; ορισ µ ός χώρου στ οίβα ς ( 6 4 α ν τ ί γ ρα φα λέ ξεων ) (Def in e Word – D UP licat es) με συγκε κ ριµέ ν ο πε ριεχόµε ν ο (0) s t ack E ND S ; τέλ ος του τ µή µατος της στοίβ ας µε όν οµα st ack END start ;τέλ ος τ ου as s e mb l y προγ ράµ µ ατ ος ΠΑΡΑ∆ΕΙΓΜΑ 5 Παράδειγµα προγράµµατος που καθαρίζει την οθόνη και τυπώνει ένα μήνυμα με άμεση πρόσβαση στην VGA text memory του υπολογιστή. Επιπλέον χρησιμοποιείται ένα σύνολο πολύ χρήσιμων εντολών και ψευδοεντολών και τέλος παρουσιάζεται ο τρόπος δόμησης μια υπορουτίνας και η κλήση αυτής από το κυρίως πρόγραμμα. ; * ** ** * ** * ** * ** ** * ** * ** ** * ** * ** ** * ** * ** ** * ** * ** ** * ** * ** ** * ** * ** ** ; Παράδε ιγ µα προγρά µ µατ ος που κ αθ αρ ίζ ε ι τη ν οθόνη κ α ι τυπώνε ι έ ν α μ ήν υμα ; με ά μ ε ση πρόσ βαση στ ην V GA t ex t m em o r y τ ο υ υπολογ ιστή. ; * ** ** * ** * ** * ** ** * ** * ** ** * ** * ** ** * ** * ** ** * ** * ** ** * ** * ** ** * ** * ** ** . 4 86 ;χ ρήσ η τ η ς ν τ ιρε κ τ ίβ α ς γ ια να αναγνωρίζει ο as s e mb ler εντολές γ ια 80 48 6 v id mem eq u 0b 80 0h ; α ρχ ή τ η ς V GA t ex t - m e m or y color equ 7 ;co l or at t r i b u t e (χ ρώμ ατ α) , b ack g ro u n d & f o r eg r oun d col o r scrw equ 80*25 ;screen words, ορισμός όλ ης τ η ς οθόνης, τα equ αν τίστ οιχα d ef in e eom eq u 0 ; e n d of m es s ag e, ορισμός του e om ( en d of m es s a g e) S T ACK_SEG seg m ent p a ra S TA C K ; τµή µ α στοίβας µε όν οµα st ack _ s eg db 256 du p (0) ;ορισ µ ός χ ώ ρ ο υ στ οίβ ας ( 25 6 αν τ ίγ ραφ α λέξε ων ) (D ef ine Word – D UP licat es) με συγκε κ ριµέ ν ο πε ριεχόµε ν ο (0) STACK_SEG en ds ;τέλ ος τ ο υ τ µή µατος τη ς στ οίβα ς µε όν οµ α st ac k _s eg DATA_SEG segment para public ;καθορισµός του τµήµατος δεδοµένων lin e dw 160d ; που θ έ λ ο υμε να ξε κ ινή σε ι η εκτύπωση ( 1 60 o by t e από εκε ί που α ρχ ί ζ ε ι, / 2 80 , 2 η γ ραμμή ) m s g d b ' H e l l o W or l d ' ;τ ο μήν υμα που θέ λουμε να τ υ πώ σ ο υμε, (ένας χαρα κτήρας 2 Bytes, 1 byte ο χαρα κτήρας και 1 byt e τ ο χ ρώ μα ) d b e o m ; έ ν α byt e το en d of mes sag e (eom) D AT A_ SEG en ds ;τέλ ος τ ο υ τ µή µατος δεδ οµ ένων C ODE _SEG s eg ment U SE 16 par a pu b lic Εργαστήριο Μικροϋπολογιστικών Συστημάτων | ' c od e' ;έναρξη τ ου τ µή µατος κώδ ικα 26 a s su m e c s: c od e _s e g, ds : d at a _s e g ;καθορισ µ ός τ ου ον όµατος που συνδέεται µε τ ο τ µή µα S T ART : ; ση µε ίο (δ ιεύθ υνσ η) έναρξη ς/ε ισ ό δου τ ο υ προγ ρά µµ ατ ος main proc far ;κ ύ ρ ιο μέ ρος του προγρά μματος mov ax, da t a_ s eg ;τ ο π ο θετε ί τ ο d at a_ se g σ τ ον ax mov ds ,ax ;τοποθετε ί τ ο ν ax στ ον ds, ο ρ ί ζ ε ι δηλαδ ή στ ον d s το data segement mov ax,vid mem ;τ οπ ο θε τε ί την α ρχ ή της V G A t ex t- m emo ry στον ax m o v es, ax ; τ οπ ο θετε ί τ ον ax στ ο es ( ex tr a seg emen t), es ext r a s egmen t ε πιπλέ ον τ μή μ α, κ ρα τά δεδομένα π ρ οορισ μ ο ύ των ε ντ ολώ ν δ ιαχε ίρισης συμβολοσ ειρώ ν s t rin g s call cls ; καλε ί την cls ( καθαρίζε ι την οθόνη ) c a ll p r int st r ;κ αλε ί τη ν pr int st r (τ υ πώνε ι τ ο κ ε ίμε ν ο) M OV AH , 4 Ch ; ρουτίνα τε ρµ ατ ισ µ ού ε ργ α σ ία ς (4Ch:process termin at ion) INT 21h ;τε ρµατισµός main en dp ;τ έ λ ος του κ ύ ρ ιο υ προγ ρά µµ ατ ος ; Su br ou t in e s ( υπορουτίνες ) cls proc near ; Clear screen (κ αθ α ρ ισμ ός ο θ όνη ς) mov di,0 ; καθαρισμός τ ου D I, d i δ ε ίκ της προορισμού mov al,' ' ; τ οπ ο θετώ τ ον χ α ρα κτή ρα s pa c e, τ ο κ ε ν ό στ ον AL mov ah,color ; τ οπ οθ ε τώ τ ον κ ωδ ικ ό του χ ρώμ ατος στ ον AH ; sp a c e ch a ra ct e r + c o l o r = 1 b y t e + 1 b y t e = 2 b y t es mov cx, scrw ; φορτώνε ις τ ο ν ο ύμε ρ ο 80 x2 5 στ ον count er cx rep stosw ;st osw, AX E S:D I, DI D I+ 2, κάνε ι r ep ea t to s tos w όσε ς φ ο ρές λέε ι ο C X, e s ex t r a s eg m e n t ε πιπλέ ον τμήμ α, κρατ ά δεδ ομένα προορισ μ ού τω ν εντολών δ ιαχε ίρισης συμβολοσ ειρώ ν s t rin g s ret ;retu rn fro m p roc ed u r e c l s end p ;τέ λ ος τ η ς cls p r int st r pr o c n e a r ;εκτύπωση χ α ρακ τή ρω ν lea si, msg ;φ όρτωσε τη ν δ ιε ύθ υν ση τ ο υ ms g σ τ ον SI, load eff ect ive address, lea r e g , m e m, s i δ ε ίκ της πηγής mov di, line ; ορίζουμε α π ό που θ α ξεκιν ή σουμε ν α τ υ πώ νου με, d i δε ίκτη ς προ ο ρ ι σ μ ού prints_loop: c m p byt e p t r[ s i] , eom ; συγκρίν ε ι τον χ α ρακ τήρα που δε ίχ νε ι ο S I με τον eom, cmp mem,imm, συγ κρίνε ι τ α δεδ ομέ να της δ ιε ύθ υν σης μνήμ ης που δε ίχνε ι ο s i , μεγέ θους 1 b y t e, με το e o m je prints_exit ;εάν ε ίναι ίσοι τ ό τε κ άνε ι Jmp στη ν print s _exit m o v s b ; αλ λ ιώ ς πάει σ τ ο ν ε πόμε νο χ α ρακ τή ρα, mov e st r in g d a ta , πέ ρν ουμε τα δεδ ομέ να α π ό τ ον ds:si es: d i, di di+ 2, si si+ 2 in c di ;α υξ άν ο υμε τον d i κατά έ να, πάμε στ ην ε πό μεν η θέση jmp prints_loop χαρακτήρες ; πά ε ι στο p r i n t s_ l o op , ώ σ τε να τυπώσουμε και τους ε πό μ ε ν ο υς p r int s_ e x it : ret ;retu rn fro m p roc ed u r e p r int st r en dp ;τέλ ος της p r int st r Εργαστήριο Μικροϋπολογιστικών Συστημάτων | 27 C ODE _SEG en ds ;τέλ ος τ ο υ τ µή µατος κ ώδ ικ α end start ; τέλ ος τ ου as s e mb l y προγ ράµ µ ατ ος Σ η µε ίω ση 3 .6 : Ένας χαρα κτήρας αποτελ ε ίτ α ι α π ό δ ύο b y t e s, τ ο πρώτο byte έχε ι τ ον χαρακτήρα και τ ο δε ύτε ρο b y t e έχε ι τ ον σ υν δ υα σμ ό του background χ ρώ ματ ος και τ ο υ foreground χ ρώμ ατ ος. Η ο θ όνη D O S έχε ι 8 0 * 25 χ αρα κτή ρες . H V GA άρχ ιζε π α λ ιό τ ε ρ α α π ό 0 b 00 0h, σ τ α νε ότ ερα υπολ ογ ισ τ ικ ά συστήματα αρχ ίζε ι α π ό 0b 8 00h . Σ η µε ίω ση 3 .7 : Α ν ά λ ογα με τ ο ν κ ωδ ικό που χ ρησιμ οποιείτε γ ια τ ο χ ρώμ α (color) έχετε κ α ι το αν άλ ογο α π ο τ έ λ ε σμ α στην εκτύπωση. Συνδ υάζοντ ας τ ο f oreground και τ ο b a ck gr oun d κωδ ικό μ π ο ρε ίτε ν α έχετε όποιον σ υν δ υα σμ ό θέλε τε, μεταξύ τ ων χ ρω μάτω ν που θ α εμφανιστούν στο f oreg r oun d και στ ο b ack g ro u n d. Εργαστήριο Μικροϋπολογιστικών Συστημάτων | 28 ΠΡΟΒΛΗΜΑΤΑ ΑΣΚΗΣΗΣ 3 ΛΟΓΙΚΕΣ ΠΡΑΞΕΙΣ, ΕΝΤΟΛΕΣ ΕΠΑΝΑΛΗΨΗΣ, ΕΝΤΟΛΕΣ ΣΥΓΚΡΙΣΗΣ, ΕΝΤΟΛΕΣ ΔΙΑΚΛΑΔΩΣΗΣ, ΑΜΕΣΗ ΠΡΟΣΒΑΣΗ ΣΤΗ VGA, ΔΟΜΗΣΗ ΥΠΟΡΟΥΤΙΝΑΣ ΠΡΟΒΛΗΜΑ 1 Ν α γ ρ αφε ί πρόγ ρα µµ α σε assemb ly των ε πεξε ργα σ τών της In tel τ ο οποίο ν α υ λ ο π ο ιε ί το παρακάτω κύκλω μα. Γ ια ε ισ όδ ου ς β άλ τε τ ις παρακάτω τ ιμέ ς I N S1 0 100 1 10 0 I N S2 0 011 0 01 1 I N S3 1 010 1 01 0 I N S4 0 001 1 10 0 I N S5 1 100 1 11 1 ΠΡΟΒΛΗΜΑ 2 Ν α γ ρ αφε ί πρόγ ρα µµ α σε assemb ly της In tel τ ο οποίο ν α τ ο μέγ ιστο με ταξύ τε σσάρω ν αριθμών και τον α πο θ ηκε ύε ι σ ε μ ία μεταβλητή . Εργαστήριο Μικροϋπολογιστικών Συστημάτων | 29 ΠΡΟΒΛΗΜΑ 3 Ν α γραφεί π ρ ό γ ρ αµ µ α σε as s e mb l y τη ς In tel τ ο οποίο ν α κ αθ αρ ίζ ε ι τ η ν οθόνη , ν α τ υ πώ νε ι έ ν α μ ήν υμα (M y n ame is) με π ρ ά σ ι να γ ρ άμμ ατ α σ ε μ πλε φ όν τ ο, και μ ε τά το μή ν υμα (το ό ν ομα σα ς) με κόκ κ ιν α γ ράμ ματ α σε ά σ π ρ ο φ όν το, χρησιμοποιώντας άμ εση πρόσβ αση στη ν VGA t ext memor y του υπολ ογ ισ τή. ΠΡΟΒΛΗΜΑ 4 Ν α γ ρ αφε ί πρόγ ρα µµ α σε assemb ly των ε πεξε ργα σ τών της In tel τ ο οποίο ν α υ λ ο π ο ιε ί το παρακάτω κύκλω μα. Γ ια ε ισ όδ ου ς β άλ τε τ ις παρακάτω τ ιμέ ς I N S1 1 100 1 10 0 I N S2 1 010 1 01 0 I N S3 0 001 1 10 1 I N S4 1 111 0 00 0 I N S5 1 100 1 10 0 I N S6 0 010 0 10 1 Εργαστήριο Μικροϋπολογιστικών Συστημάτων | 30 ΕΡΓΑΣΤΗΡΙΟ ΑΡΧΙΤΕΚΤΟΝΙΚΗΣ & ΛΕΙΤΟΥΡΓΙΑΣ Η/Υ Διδ άσκων: Ε υάγ γελος Τ οπ άλης Δρ. Ηλ εκτρολ όγ ος Μηχ αν ικ ός & Τεχν ολ ογ ία ς Υ πολ ογ ιστών ΑΣΚΗΣΗ 4 ΡΟΥΤΙΝΕΣ ΚΑΘΥΣΤΕΡΗΣΗΣ, ΑΜΕΣΗ ΠΡΟΣΒΑΣΗ ΣΤΗ VGA text memory ΤΟΥ Η/Υ, ΥΠΟΡΟΥΤΙΝΕΣ, ΠΙΝΑΚΕΣ ΠΑΡΑ∆ΕΙΓΜΑ 1 Παράδειγµα προγράµµατος στο οποίο δημιουργούμε ένα απλό animation με άμεση πρόσβαση στην VGA text memory του υπολογιστή. Για το σκοπό αυτό πρέπει να δημιουργήσουμε timing delay loops. Το τελευταίο γίνεται με δύο τρόπους. Σε έναν από αυτούς Εργαστήριο Μικροϋπολογιστικών Συστημάτων | 31 χρησιμοποιούμε τον timer του bios. ; * ** ** * ** * ** * ** ** * ** * ** ** * ** * ** ** * ** * ** ** * ** * ** ** * ** * ** ** * ** * ** ** ; Παράδε ιγ µα προγρά µ µατ ος σ τ ο οποίο δημιουργούμε έ να απλό animation με στη ν ; V G A t e xt άμε ση πρόσβ α ση memory του υπολ ογ ισ τή ; * ** ** * ** * ** * ** ** * ** * ** ** * ** * ** ** * ** * ** ** * ** * ** ** * ** * ** ** * ** * ** ** . 4 86 ;χ ρήσ η τ η ς ν τ ιρε κ τ ίβ α ς γ ια να αναγνωρίζει ο as s e mb ler εντολές γ ια 80 48 6 v id mem eq u 0b 80 0h ;α ρχ ή της V G A t ex t- m emo ry n o ra equ 2 ;n ora=color at tribut e (χ ρώμα τα ) , b ack g ro und & f o re gr ound c o l o r scrw equ 80*25 ; 2 5= lin es 8 0= ch ars οθόνης, τα equ αν τίστ οιχα d ef in e p er lin e, sc r een w ord s, ορισμός όλης της e o m equ 0 ; en d of m e s sa g e, ο ρ ι σ μ ός του e om ( en d of m es s a g e) S T AC_ SE G s eg m ent U SE 16 p a r a s t ack ;τ µή µα σ τ ο ίβ α ς µε όν οµα st ack _s eg d b 2 56 dup ( ' ' ) ; ορισ µ ός χ ώ ρου στ οίβ ας ( 25 6 αντ ίγ ρα φα λέ ξεων ) (Def in e Word – D UP licat es) με συγκε κ ριµέ ν ο πε ριεχόµε ν ο (0) S T AC_ SE G en ds ;τέλ ος τ ο υ τ µή µατος τη ς στ οίβα ς µε όν οµ α st ac k _s eg D AT A_ SEG s eg ment USE 16 para pu b lic ;καθορισµ ός τ ο υ τµ ήµ ατ ος δεδ οµένων lin b dw 320d ; που θ έ λ ο υμε να ξε κ ινή σε ι η ε κτ ύ πω ση ( 3 2 0o byt e α πό ε κ ε ί που αρχ ίζε ι, /2 160, 2 η γραμμή) m e s s d b ' ( * **. * ** ) ' ;τ ο μήν υμ α που θέλ ουμε να τ υ πώ σ ο υμε, (ένας χαρακτήρας 2 Bytes, 1 byte ο χαρα κτήρας και 1 byt e τ ο χ ρώ μα ) d b e o m ; έ ν α byt e το en d of mes sa g e (eom) D AT A_ SEG en ds ;τέλ ος τ ο υ τ µή µατος δεδ οµ ένων C ODE _SEG s eg ment U SE 16 par a pu b lic 'C ODE' ;έναρξη τ ο υ τµή µα τ ος κώδ ικ α τ µή µα a s su m e c s: c od e _s e g, ds : d at a _s e g ;καθορισ µ ός τ ου ον όµατος που συνδέεται µε τ ο star t: ;σ ηµ ε ίο (δ ιε ύθ υν ση) έ να ρ ξης /ε ισόδ ο υ τ ο υ π ρ ο γ ρά µµα τ ος main proc far ;κ ύ ρ ιο μέ ρος του προγρά μματος mov ax, dat a_ s eg ;τ ο π ο θετε ί τ ο d at a_ se g σ τ ον ax mov ds ,ax ;τοποθετε ί τ ο ν ax στ ον ds, ο ρ ί ζ ε ι δηλαδ ή στ ον d s το data segement mov ax,vid mem ;τ οπ ο θε τε ί την α ρχ ή της V G A t ex t- m emo ry στον ax mov es, ax ;τ ο ποθε τε ί τ ον a x σ τ ο e s ( ex tr a s eg em e nt), es ex tra segment ε πιπλέον τ μή μ α, κ ρα τά δεδομένα π ρ οορισ μ ο ύ των ε ντ ολώ ν δ ιαχε ίρισης συμβολοσ ειρώ ν s t r in gs mov dx,1 ; πόσες φ ορ έ ς θ α ε πα ν α λ η φ θεί τ ο loop aa: mov cx,100 ; πόσους χαρα κτήρες θ α μετ ακ ινη θε ί c mp dx, 0 je p_exit ;ε άν ε ίν α ι ίσοι τ ότε κ άνε ι Jmp στη ν p_ ex it l0: call cls ; καλε ί την cls ( καθαρίζε ι την οθόνη ) call prim ; καλ ε ί την prim ( τ υπ ών ε ι το κε ίμεν ο) call Sleep55 Εργαστήριο Μικροϋπολογιστικών Συστημάτων | 32 in c lin b ; που θα ε κτυπ ω θε ί τ ο μήν υμ α in c lin b ; που θα ε κτυπ ω θε ί τ ο μήν υμ α loop l0 mov cx,100 l1: call cls ; καλε ί την cls ( καθαρίζε ι την οθόνη ) call prim ; καλ ε ί την prim ( τ υπ ών ε ι το κε ίμεν ο) call Sleep55 dec lin b dec lin b loop l1 d e c dx jmp aa p_ex it: mov ah, 4 ch ; ρουτ ίνα τε ρµ ατ ισ µ ού ε ργ ασ ία ς ( 4C h: p r oces s ter m in at ion) int 21h ;τε ρµ ατ ισµ ός main en dp ;τ έ λ ος του κ ύ ρ ιο υ προγ ρά µµ ατ ος ; Su br ou t in e s ( υπορουτίνες ) cls proc near ; Clear screen (κ αθ α ρ ισμ ός ο θ όνη ς) p ush cx mov di,0 ; καθαρισμός τ ου D I, d i δ ε ίκ της προορισμού mov al,' ' ; τ οπ ο θετώ τ ον χ α ρα κτή ρα s pa c e, τ ο κ ε ν ό στ ον AL mov ah,nora ;τοποθετώ τ ον κ ωδ ικ ό του χ ρώμ ατος στ ον AH ; sp a c e ch a ra ct e r + c o l o r = 1 b y t e + 1 b y t e = 2 b y t es mov cx, scrw ; φ ορ τώ νε ις τ ο νούμε ρο 80χ2 5 στ ον count er cx rep stosw ;st osw, AX E S:D I, DI D I+ 2, κάνε ι r ep ea t t o s t os w όσες φ ο ρές λέ ε ι ο C X, e s e x t r a s e g m ent επιπλέον τμή μα, κ ρατ ά δεδ ομένα προορισμού τ ων εντολών δ ιαχε ίρισης συμβολοσ ειρώ ν s t rin g s p o p cx ret ;retu rn f r om p roc ed u r e c l s end p ;τέ λ ος τ η ς cls prim proc near ; εκτύπωση χ αρα κτή ρων lea si,mess ;φ ό ρτ ωσ ε τ η ν δ ιεύθ υνσ η τ ου mess στον SI, load eff ect ive address, lea reg, mem, si δ ε ίκ της πη γής mov di, linb ; ορίζουμε α π ό που θα ξεκ ινή σουμε ν α τυπών ουμε , di δε ίκτης προορισμού msgloo: c m p byt e p t r[ s i ] , eom ; σ υγ κρ ίν ε ι τ ον χαρακτήρα που δε ίχνε ι ο S I μ ε τ ον eom, cmp mem,imm, συγκ ρίνε ι τ α δεδ ομέ να τη ς δ ιε ύθ υνσ ης μν ήμης που δε ίχ νε ι ο s i , με γέθους 1 b y t e, με το eom je priex ;ε άν ε ίναι ίσοι τότε κάνε ι J mp στην priex ex it movsb ; αλ λ ιώ ς πάει σ τ ον ε π όμε νο χ α ρ α κ τ ή ρα, mov e st r in g d at a, πέ ρν ουμε τα δεδ ομέ να α π ό τ ον ds:si es: d i, di di+ 2, si si+ 2 in c di ;α υξ άν ο υμε τον d i κατά έ να, πάμε στ ην ε πό μεν η θέση Εργαστήριο Μικροϋπολογιστικών Συστημάτων | 33 jmp msgloo χαρακτήρες ;πάει στο msgloop, ώστε να τυπώ σουμε και τ ο υς επόμενους priex: r et ; r eturn f r om procedure p r i m end p D e lay p r oc n e ar ;δεν ε ίν α ι σ τ α θε ρή σε κ άθ ε υ πο λ ο γ ι σ τ ικ ό σύσ τημ α push cx m ov cx ,0f ff 0h delay _ loop: loop delay_loop pop cx ret ; re tu rn f rom pr o c edu r e D e lay endp ;τ έ λ ος της delay Sleep55 PROC NEAR push es push ax push cx mov cx, 1d sleep110ms: ;wait s 1 sec (19*52ms), ανε ξάρτη το υπολ ογ ιστ ικού συστήματος mov ax, 4 0h mov es, ax mov ax, es:[ 6 ch] ;RTC t extequ < es:[6ch ]>, 40h Bios data Area 6Ch Timer Count er D WO RD RTC _Mu stC han g e2: ; loops μέχ ρι τ ο RTC ν α αλλ άξε ι cmp ax, es:[ 6 ch] ; RTC je RTC_MustCh an ge2 ;εάν ε ίν α ι ίσοι τότε κ άνει J mp στην RTC _Mus tCh ang e2 ;w aits 52ms loop sleep110ms pop cx pop ax pop es ret ;r etu rn f r om p ro c edu re Sleep55 ENDP ; τέλ ος της sleep55 C ODE _SEG en ds ;τέλ ος τ ο υ τ µή µατος κ ώδ ικ α end start ; τέλ ος τ ου as s e mb l y προγ ράµ µ ατ ος Εργαστήριο Μικροϋπολογιστικών Συστημάτων | 34 Σ η με ίωση : T im ing De lay Loop s Most of the time the computer runs too slow for most people's tastes. However, there are occasions when it actually runs too fast. One common solution is to create an empty loop to waste a small amount of time. In Pascal you will commonly see loops like: for i := 1 to 10000 do ; In assembly, you might see a comparable loop: DelayLp: mov cx, 8000h loop DelayLp By carefully choosing the number of iterations, you can obtain a relatively accurate delay interval. There is, however, one catch. That relatively accurate delay interval is only going to be accurate on your machine. If you move your program to a different machine with a different CPU, clock speed, number of wait states, different sized cache, or half a dozen other features, you will find that your delay loop takes a completely different amount of time. Since there is better than a hundred to one difference in speed between the high end and low end PCs today, it should come as no surprise that the loop above will execute 100 times faster on some machines than on others. The fact that one CPU runs 100 times faster than another does not reduce the need to have a delay loop which executes some fixed amount of time. Indeed, it makes the problem that much more important. Fortunately, the PC provides a hardware based timer which operates at the same speed regardless of the CPU speed. This timer maintains the time of day for the operating system, so it's very important that it run at the same speed whether you're on an 8088 or a Pentium. In the chapter on interrupts you will learn to actually patch into this device to perform various tasks. For now, we will simply take advantage of the fact that this timer chip forces the CPU to increment a 32‐bit memory location (40:6ch) about 18.2 times per second. By looking at this variable we can determine the speed of the CPU and adjust the count value for an empty loop accordingly. The basic idea of the following code is to watch the BIOS timer variable until it changes. Once it changes, start counting the number of iterations through some sort of loop until the BIOS timer variable changes again. Having noted the number of iterations, if you execute a similar loop the same number of times it should require about 1/18.2 seconds to execute The following program demonstrates how to create such a Delay routine: .xlist include includelib .list stdlib.a stdlib.lib ; PPI_B is the I/O address of the keyboard/speaker control ; port. This program accesses it simply to introduce a ; large number of wait states on faster machines. Since the ; PPI (Programmable Peripheral Interface) chip runs at about ; the same speed on all PCs, accessing this chip slows most ; machines down to within a factor of two of the slower ; machines. PPI_B equ 61h ; RTC is the address of the BIOS timer variable (40:6ch). ; The BIOS timer interrupt code increments this 32-bit ; location about every 55 ms (1/18.2 seconds). The code ; which initializes everything for the Delay routine ; reads this location to determine when 1/18th seconds ; have passed. RTC textequ <es:[6ch]> dseg segment para public 'data' ; TimedValue contains the number of iterations the delay ; loop must repeat in order to waste 1/18.2 seconds. TimedValue word 0 ; RTC2 is a dummy variable used by the Delay routine to ; simulate accessing a BIOS variable. Εργαστήριο Μικροϋπολογιστικών Συστημάτων | 35 RTC2 dseg cseg word 0 ends segment para public 'code' assume cs:cseg, ds:dseg ; Main program which tests out the DELAY subroutine. Main proc mov ax, dseg mov ds, ax print byte "Delay test routine",cr,lf,0 ; Okay, let's see how long it takes to count down 1/18th ; of a second. First, point ES as segment 40h in memory. ; The BIOS variables are all in segment 40h. ; ; This code begins by reading the memory timer variable ; and waiting until it changes. Once it changes we can ; begin timing until the next change occurs. That will ; give us 1/18.2 seconds. We cannot start timing right ; away because we might be in the middle of a 1/18.2 ; second period. mov ax, 40h mov es, ax mov ax, RTC RTCMustChange: cmp ax, RTC je RTCMustChange ; Okay, begin timing the number of iterations it takes ; for an 18th of a second to pass. Note that this ; code must be very similar to the code in the Delay ; routine. mov cx, 0 mov si, RTC mov dx, PPI_B TimeRTC: mov bx, 10 DelayLp: in al, dx dec bx jne DelayLp cmp si, RTC loope TimeRTC neg cx ;CX counted down! mov TimedValue, cx ;Save away mov ax, ds mov es, ax printf byte "TimedValue = %d",cr,lf byte "Press any key to continue",cr,lf byte "This will begin a delay of five " byte "seconds",cr,lf,0 dword TimedValue getc mov cx, 90 DelayIt: call Delay18 loop DelayIt Quit: ExitPgm ;DOS macro to quit program. Main endp ; Delay18-This routine delays for approximately 1/18th sec. ; Presumably, the variable "TimedValue" in DS has ; been initialized with an appropriate count down ; value before calling this code. Delay18 proc near push ds push es push ax push bx push cx push dx push si mov ax, dseg mov es, ax mov ds, ax ; The following code contains two loops. The inside ; nested loop repeats 10 times. The outside loop ; repeats the number of times determined to waste ; 1/18.2 seconds. This loop accesses the hardware Εργαστήριο Μικροϋπολογιστικών Συστημάτων | 36 ; port "PPI_B" in order to introduce many wait states ; on the faster processors. This helps even out the ; timings on very fast machines by slowing them down. ; Note that accessing PPI_B is only done to introduce ; these wait states, the data read is of no interest ; to this code. ; ; Note the similarity of this code to the code in the ; main program which initializes the TimedValue variable. mov cx, TimedValue mov si, es:RTC2 mov dx, PPI_B TimeRTC: mov bx, 10 DelayLp: in al, dx dec bx jne DelayLp cmp si, es:RTC2 loope TimeRTC pop si pop dx pop cx pop bx pop ax pop es pop ds ret Delay18 endp cseg ends sseg segment para stack 'stack' stk word 1024 dup (0) sseg ends end Main ΠΑΡΑ∆ΕΙΓΜΑ 2 Παράδειγµα προγράµµατος το οποίο αθροίζει τα στοιχεία 4, 6 και 8 ενός πίνακα, και το αποτέλεσµα τοποθετείται στον AL. ; * ** ** * ** * ** * ** ** * ** * ** ** * ** * ** ** * ** * ** ** * ** * ** ** * ** * ** ** * ** * ** ** ; Παράδε ιγ µα προγρά µ µατ ος τ ο οποίο α θ ρ ο ί ζε ι τα στοιχεία 4, 6 και 8 ε νό ς π ίν ακ α, ; και τ ο αποτέλεσ µα τ ο π οθε τε ίτα ι στ ον AL . ; * ** ** * ** * ** * ** ** * ** * ** ** * ** * ** ** * ** * ** ** * ** * ** ** * ** * ** ** * ** * ** ** . 3 86 ;χ ρήσ η τ η ς ν τ ιρε κ τ ίβ α ς γ ια να αναγνωρίζει ο as s e mb ler εντολές γ ια 80 38 6 c od e SE GME NT USE1 6 PA RA P U BL IC 'CODE' ;έναρξη τ ο υ τµ ήµ ατ ος κώδ ικα µε ό ν οµα code ASSUME CS:code,DS:data,SS:stack ; καθορισ µ ός τ ο υ ον όµατ ος που συνδέε τα ι µ ε τ ο τ µή µα star t: ;σ ηµ ε ίο (δ ιε ύθ υν ση) έ να ρ ξης /ε ισόδ ο υ τ ο υ π ρ ο γ ρά µµα τ ος M O V A X , d a ta ;τ α D at a στ ον A X M O V DS , A X ; ο A X σ τ ον DS MOV AL, 0 ; µηδεν ισ µ ός τ ο υ αθροίσ µατος M OV S I , 4 ;αν αφ ορά σ τ ο στ οιχε ίο 4 ADD AL, ARRAY[SI] ; πρόσθεση τ ου 4 ου στ οιχε ίου Εργαστήριο Μικροϋπολογιστικών Συστημάτων | 37 ADD AL, ARRAY[SI+2] ;πρόσθεση του 6ου στ οιχε ίου ADD AL, ARRAY[SI+4] ;πρόσθεση του 8ου στ οιχε ίου M OV AH , 4 Ch ;ρουτ ίνα τε ρµατισ µού εργασίας (4Ch: proc es s t erm inati on ) INT 21h ; τε ρµ ατ ισµ ός C ODE E ND S ; τέλ ος του τ µήµα τ ος κώδ ικ α data SEGMENT para public ;καθορισµός του τµήµατος δεδοµένων ARRAY DB 10 DUP(1) ;δέσµευση 10 θέσεων µνήµης µε περιεχόµενο 1 data ENDS ; τέλ ος του τ µή µατος δεδ οµένων µε όνοµ α dat a s t ack SE GME NT ST ACK ;τ µήµ α στ οίβας µε όν οµα st ack D B 6 4 D U P ( 0) ; ορισ µ ός χώρου στ οίβα ς ( 6 4 α ν τ ί γ ρα φα λέ ξεων ) (Def in e Word – D UP licat es) με συγκε κ ριµέ ν ο πε ριεχόµε ν ο (0) stack ENDS ;τέλος του τµήµατος της στοίβας µε όνοµα stack E N D S T A RT ;τέ λ ος του assemb ly προγ ρά µ µατος ΠΡΟΒΛΗΜΑΤΑ ΑΣΚΗΣΗΣ 4 ΡΟΥΤΙΝΕΣ ΚΑΘΥΣΤΕΡΗΣΗΣ, ΑΜΕΣΗ ΠΡΟΣΒΑΣΗ ΣΤΗ VGA text memory ΤΟΥ Η/Υ, ΥΠΟΡΟΥΤΙΝΕΣ, ΠΙΝΑΚΕΣ ΠΡΟΒΛΗΜΑ 1 Ν α γ ρ αφε ί πρόγρα µ µα σε a s s e mb l y των επεξεργαστών τη ς Intel τ ο οποίο ν α δημιουργείτε ένα απλ ό an imat ion με ά μ ε ση πρόσβαση στη ν VGA text memory τ ο υ υπολογ ιστή. Θα π ρέ π ε ι ν α αλλ ά ζε ι συνέχε ια χ ρώμ ατ α (back g round και f or e g r oun d) σε κ άθ ε με τάβ αση . Να ξ εκ ινάε ι από την α ρχ ή της τ ρίτ η ς γ ραμμή ς. Τ ο μήν υμα να περιέχει τ ο όνομα σ α ς στην μ ο ρφή ( Όν ομ α.Ε π ίθετ ο ). Θα με τακ ινη θε ί δεξιά 20 0 χ α ρα κ τ ή ρε ς κ α ι θ α ξαναγυρίσε ι πίσω 20 0 χ α ρακ τή ρες. Αυτή τη δ ιαδ ικασία θα τη ν κ άνε ι 2 φ ο ρές . Εργαστήριο Μικροϋπολογιστικών Συστημάτων | 38 ΕΡΓΑΣΤΗΡΙΟ ΑΡΧΙΤΕΚΤΟΝΙΚΗΣ & ΛΕΙΤΟΥΡΓΙΑΣ Η/Υ Διδ άσκων: Ε υάγ γελος Τ οπ άλης Δρ. Ηλ εκτρολ όγ ος Μηχ αν ικ ός & Τεχν ολ ογ ία ς Υ πολ ογ ιστών ΑΣΚΗΣΗ 5 ΠΙΝΑΚΕΣ, ΕΠΕΞΕΡΓΑΣΙΑ ΠΙΝΑΚΩΝ, LOOK UP TABLES, ΜΑΚΡΟΕΝΤΟΛΕΣ, ΥΠΟΡΟΥΤΙΝΕΣ ΠΑΡΑ∆ΕΙΓΜΑ 1 Παράδειγµα προγράµµατος στο οποίο να υλοποιηθεί πρόγραμμα το οποίο θα δέχεται από τον χρήστη τα στοιχεία ενός πίνακα 3*3. Μετά μέσω look up table να μπορεί να ξανά εισάγει στοιχεία (επιλογή 1) ή να βγαίνει από το πρόγραμμα (επιλογή 0). Εργαστήριο Μικροϋπολογιστικών Συστημάτων | 39 . 4 86 ;χ ρήσ η τ η ς ν τ ιρε κ τ ίβ α ς γ ια να αναγνωρίζει ο as s e mb ler εντολές γ ια 80 48 6 D IS P M ACR O X push ax ;α π ο θηκε ύε ι τ ον ax στην στοίβ α push dx ;α π ο θηκε ύε ι τ ον ds στην σ τ ο ί β α mov ah, 09h ;τυπώνε ι ότι έχε ι ο dx μέχρι ν α β ρε ι $ m ov dx , off s et x int 21h pop dx ;καλώ α πό τ η ν στ οίβ α τ ον dx pop ax ;καλώ α πό τ η ν στ οίβ α τ ον a x END M v id mem eq u 0b 80 0h ;α ρχ ή της V G A t ex t- m emo ry color equ 7 ;co l or at t r i b u t e (χ ρώμ ατ α) , b ack g ro u n d & f o r eg r oun d col o r scrw equ 80*25 ; 2 5= lin es 80=ch ars per lin e, screen w ords, ορισμός όλ ης της οθόνης, τα equ αν τίστ οιχα d ef in e e o m equ 0 ; en d of m e s sa g e, ο ρ ι σ μ ός του e om ( en d of m es s a g e) S T AC_ SE G s eg m ent U SE 16 p a r a s t ack ;τ µή µα σ τ ο ίβ α ς µε όν οµα st ack _s eg d b 2 56 dup ( ' ' ) ; ορισ µ ός χ ώ ρου στ οίβ ας ( 25 6 αντ ίγ ρα φα λέ ξεων ) S T AC_ SE G en ds ;τέλ ος τ ο υ τ µή µατος σ τ ο ίβ α ς D AT A_ SEG s eg ment USE 16 para pu b lic ;καθορισµ ός τ ο υ τµ ήµ ατ ος δεδ οµένων b uff er db 4 d up( 0) ; 4 byt e s και ο ε πόμεν ος χαρα κτήρας ε ίναι $ db '$' ;ο ε π όμεν ο ς χαρακτήρας ε ίν α ι $ mes db 10 , 13, 1 3 ;α λ λ ά ζε ι γραμμή και ο ε π όμ ενο ς χ α ρακ τή ρα ς ε ίναι $ db '$' me1 db ' ' ;κεν ός χαρακτήρας και ο ε πό μ ε ν ο ς χαρακτήρας ε ίναι $ db '$' lin e dw 160d ; 0 cont ain 1'st ch ar BUT 1 cont ain color lin e1 dw 3 2 0d m e s s d b 'D os t e t a st o ix e ia tou 3 *3 p inak a: ' db eom mes1 db ' 1) Gia n a doset e kain ou rgia st oix eia st o pin a ka.' db eom mes0 db ' 0) Gia exodo apo to programma.' db eom b u f 1 d b 25 7 du p ( ?) ; dh miou rgei en an apith ik eytik o x oro 257 th eseon db eom array dw 1 8 du p ( 0) ; p e r i e x ei s e b in a ry m o rfh t a st o ix e i a t o y b u f 1 db eom D AT A_ SEG en ds ;τέλ ος τ ο υ τ µή µατος δεδ οµ ένων C ODE _SEG s eg ment U SE 16 par a pu b lic 'c od e' ; έναρξη τ ο υ τµή µα τ ος κώδ ικ α Εργαστήριο Μικροϋπολογιστικών Συστημάτων | 40 a s su m e c s: c od e _s e g, ds : d at a _s e g ;καθορισ µ ός τ ου ον όµατος που συνδέεται µε τ ο τ µή µα star t: ;σ ηµ ε ίο (δ ιε ύθ υν ση) έ να ρ ξης /ε ισόδ ο υ τ ο υ π ρ ο γ ρά µµα τ ος main proc far ;κ ύ ρ ιο μέ ρος του προγρά μματος push ds ;α π ο θηκε ύε ι τ ον ds στην σ τ ο ίβ α mov ax,0 ;β ά ζε ι τ ο 0 στ ον ax push ax ;α π ο θηκε ύε ι τ ον a x στην σ τ ο ίβ α mov ax, dat a_ s eg ;τ ο π ο θετε ί τ ο d at a_ se g σ τ ον ax mov ds ,ax ;τοποθετε ί τ ο ν ax στ ον ds, ο ρ ί ζ ε ι δηλαδ ή στ ον d s το data segement mov ax,vid mem ;τ οπ ο θε τε ί την α ρχ ή της V G A t ex t- m emo ry στον ax mov es, ax ;τ ο ποθε τε ί τ ον a x σ τ ο e s ( ex tr a s eg em e nt), es ex tra segment ε πιπλέον τ μή μ α, κ ρα τά δεδομένα π ρ οορισ μ ο ύ των ε ντ ολώ ν δ ιαχε ίρισης συμβολοσ ειρώ ν s t r in gs star t1: call cls mov di,0 ;καλε ί την cls (καθαρίζε ι την ο θ όνη) ; μετρητής στ οιχε ίων , ν ο ύμε ρα, τ ο π ο θετε ί τ ο 0 στ ον d i ; παίρνε ι τα ν ο ύμε ρα α πό τ ο πλη κτ ρολ όγ ιο k s ana: ; και τ α βάζε ι σ τ ο arr a y push di ; απο θη κε ύε ι τον d ι στην στοίβα call cls ; καλ ε ί τη ν c ls (καθαρίζε ι την οθ όνη ) lea s i,mess ;ε κτ υ πώνει τ ο πρώτο μή ν υμα , το mess1 mov di,320d ; πηγ α ίν ω δ ύο γ ραμμές πα ρα κά τω dose: movsb ;( M OVSB , E S:[D I] = D S:[SI]; D I = DI ± 1; SI = SI ± 1 (byte t r an sf e rr ed , Η ε ντ ολή M OV S με ταφέ ρε ι έ να by t e, μ ια λέ ξη ή μ ια δ ιπλή λέξη α πό μ ια θ έ ση μν ήμη ς τ ο υ τμή ματος δεδ ομέ νων που δ ιε υθυν σ ιοδ οτείτ α ι α π ό τον SI, σε μ ια θέ ση μ νήμης τ ου έ ξτ ρα τμή ματος που δ ιε υθ υν σ ιοδ οτε ίτα ι α πό τ ον DI.) in c di ;α υξ άν ε ι τ ο di κατά ένα c mp byt e p t r[s i] ,eom j n e d os e ;ju mp if not e qu a l p o p d i ;καλ ώ α π ό την στοίβα τον d i mov cx,10 ;β ά ζω το 10 στον cx ;α ρχ ι κ ο π ο ίη ση κ ά ποιων καταχ ωρητώ ν mov bx,0 ;β ά ζω το ο στ ον bx ;αρχ ικοποίη ση κάποιω ν κ ατ αχω ρη τών readn1: mov ah,1 ;μετ αφέ ροντ ας τ ο 1 στ ον ah και σ ε συνδ υασ μό με τ ο Int 2 1 τη συνάρτηση τ ου d os “ r ead t h e k ey b oard” , πχ πα τάω σ υν ο λ ικά τ ο 52 , πρώτ α το “5”, με τη δε ύτε ρη φ ορ ά δ ι α β ά ζε ι τ ο 2 in t 21h mov ah,0 ;β ά ζω στ ον ah τ ο 0 c m p a l, ' 0' ;έλεγχ ος αριθμού να ε ίναι μετ αξύ 0 και 9, (σύγκριση τ ου al με τ ο 0) ;δε ν κ άνε ι έ λεγχ ο ότ αν π α τ ά τ ο en t er και β ά ζε ι μηδέ ν , αφού πάε ι στην rea dn 2 ; τ ο ent er έχε ι κωδ ικό σε ascii OD ;ε άν πατήσεις κ άπ ο ιο χ αρακ τήρα εκτός 0 έ ω ς 9 τότε δεν σου βγάζε ι μή ν υμα να τ ο ξαν αβ άλε ις α λ λ ά β άζ ε ι 0 Εργαστήριο Μικροϋπολογιστικών Συστημάτων | 41 jb readn2 ; ju m p if b e low ;γ ια τ ο ε πό μεν ο στ οιχε ί ο τ ο υ π ί ν α κ α. c m p a l, ' 9' ;έλεγχ ος αριθμού να ε ίναι μετ αξύ 0 και 9 ja readn2 ; ju m p if a b ov e ;γ ια τ ο ε πό μεν ο στ οιχε ί ο τ ο υ π ί ν α κ α sub al,'0' ; σε h ex μορφή τ ο νούμε ρο που πατά ; π.χ. πα τάω 5 23 4 ε άν έχω πα τή σε ι τ ο 5, ο a l θ α έχε ι τ ο “35” ( ascii κωδ ικ οποίη ση τ ο υ 5 ) , εάν αφ α ιρέ σω τ ο “0” ( σε ascii κ ωδ ικ ο π ο ίησ η ε ίν α ι 30 ), οπότ ε η αφαίρεση θ α δ ώσε ι 5, ν α έχ ουμε δηλαδή τον δεκαδ ικό αριθμ ό που πα τήθηκ ε , ο οποίος τελ ικά πε ριέχε τα ι στ ον a l , τ ο 5 στη συγκεκριμένη πε ρίπτω ση τ ο υ παραδε ίγμ ατ ος, ; την δε ύτε ρη φ ο ρά που θ α έχω πατήσε ι το 2, ο al θα περ ιέχε ι τ ο “32” (ascii κ ωδ ικ ο π οίη ση του 2) , ε άν α φα ι ρέσ ω τ ο “ 0” ( σε as ci i κ ωδικοποίη ση είναι 30), οπότε η αφαί ρεση θ α δ ώσε ι 2, ν α έχ ουμε δηλαδή τ ον δεκαδ ικό αριθμ ό που πα τή θηκε, ο οποί ος τε λικ ά περ ιέχε τα ι στ ον al, το 2 στη συγκεκριμένη πε ρί πτωση τ ο υ παραδείγματος, push ax ;α π ο θηκε ύε ι τ ον a x στην σ τ ο ίβ α mov ax,bx ;βάζε ι τον bx στ ον ax, ;δηλαδή στη ν πρώτη πε ρίπτωση που έχε ι πατ ηθε ί μόνο τ ο 5, ε ίναι 0 τ ο bx ε ίναι 0, άρα ax ; στ ην δε ύτε ρη πε ρ ίπτω ση που έχε ι πα τη θεί τ ο “ 2”, o b x περ ιέχε ι α π ό πριν τ ο “5”, άρα ο ax έχ ει το “ 5” mul cx ; πολ λ α πλ ασ ι ά ζ ε ι τον cx με τον ax και β άζ ει τ ο αποτέλε σμ α στ ον ax, ο cx ε ίναι 10, ά ρ α, ; ά ρα στην πρώτη περίπτ ωσ η που έχε ι πατη θε ί τ ο “5” ο ax έχε ι “ 0” ; ά ρα στη ν δε ύτερη π ε ρ ί πτω ση που έχε ι πατηθεί το “ 2” ο ax έχε ι “ 5 0” mov bx,ax ;β ά ζε ι τ ον ax στον bx, ; ά ρα στην πρώτη περίπτ ωσ η που έχε ι πατη θε ί τ ο “5” ο bx έχε ι “ 0” ; ά ρα στη ν δε ύτερη π ε ρ ί πτω ση που έχε ι πατηθεί το “ 2” ο bx έχε ι “ 5 0” p o p ax ;καλώ α πό την στοίβα τον ax, ο οποίος περιέχει τ η ν πρώτη φορά τ ο “ 5” ; καλ ώ α πό τ η ν στ οίβ α τ ον ax, ο οποίος πε ριέχε ι τη ν δε ύτερη φ ο ρά το “ 2” mov ah,0 ;β ά ζε ι τ ο 0 στ ον ah ad d bx, ax ;προσθέτει τ ον bx με τ ον ax , ; ά ρα ο bx έχε ι τ η ν πρώτη φ ορ ά τ ο “ 5”, ότ αν πατήθηκε τ ο “ 5” ; ά ρα ο bx έχε ι τ η ν δε ύτε ρη φορά το “2”, ότα ν πατή θη κε τ ο “ 2”. ... ..τα ίδ ια γ ια τ ο υς ε π όμεν ο υς δύο α ρι θ μ ού ς τ ο υ πρώτου στ οιχεί ου, ε άν έχε ι 4, αλ λιώ ς με en t er πάε ι γ ι α τ ο ε π όμεν ο στ οιχεί ο τ ου πίν ακ α, μέ σω των παραπάνω c om p ar e που έχω γ ι α abov e “0” κ αι b e l ow “ 9” . jmp readn1 ; πάω στη ν r e adn 1 ξα νά readn2: mov ax,bx ; ο bx περιέχε ι τ ο ν π ρα γ μ α τ ικ ό α ρ ι θμ ό που πα τήθ ηκε mov array[di] ,ax ; d i ο count er, το array ε ίναι δ ομημέ νο σ ε word, ο di σ ε byt e, τ ο π ο θετε ί τε λ ικ ά α υτ ά που έχουμε πατήσει στο array Εργαστήριο Μικροϋπολογιστικών Συστημάτων | 42 inc di ; α υξ άν ω τ ον δείκτη, τελ ικ ά τ ό σες φ ο ρές μέχρι να ορίσω πόσους αριθμούς π ρ έ πε ι να δ ιαβά σω μέ σω της πα ρακ άτω cmp inc di ;δ ύο φ ο ρές γ ιατ ί έχω και το χρώμα cmp di,18 ; σύγκριση ώ σ τε ν α δε ι πόσ ους αριθμούς π ρέ πε ι να δ ιαβά σε ι je f yge ; ju mp equ a l ;ε άν φτ άσουν τα 1 8/ 2 , 9 στοιχεία δεν θ α π ρέ πε ι να δεχ τε ί άλλ α κ α ι θ α φ ύγε ι jmp k san a ;ξ αν α παίρνε ι κ α ιν ο ύ ργ ιου ς αριθμούς γ ια τα στοιχεία του π ίν ακ α f yg e: call cls ; καθαρίζω την οθ όνη ; μέσω τ ων παρα κάτω εντολών , θα ε κτ υπ ώ σω τα στοιχεία του πίνακ α, 4 ψη φ ία, μέχ ρι κ α ι χ ιλ ιάδες mov bx,1 ;β ά ζω το 1 στ ον bx ; ο bx δ ε ίχνε ι πόσα στοιχεία του πίνακ α θα τ υ πώ σω σε κάθε γραμμ ή mov si,0 ;β άζ ω τ ο 0 στ ον si ; ο s i μ ο υ δε ίχ νε ι τ ο στ οιχε ίο τ ο υ πίνακα θ γ ι ατ ο οποίο μ ιλάω piso: mov ax, array[ s i] ; πα ίρν ουμε έναν έναν τους αριθμούς mov dx,0 ;β ά ζω το 0 στ ον dx mov cx,1000d ;β άζ ω τ ο 1 0 00 στ ον cx div cx ;δ ια ιρούμε τον ax με το 10 0 0, d iv c x τ ο περιεχ όμενο του dx -ax δ ια ι ρ ε ί τ α ι με τ ο πε ριεχ όμε νο του cx, το μη προσημ ασ μέν ο πηλ ίκ ο τοποθετε ίται σ τ ον ax και το υπόλοιπο σ τ ον dx ; την πρώτη φ ορ ά ο ax πε ριέχε ι τ ο πρώτο στ οιχε ίο τ ο υ πίνακα , ά ρ α τ ο δ ια ιρώ με τ ο 1 0 00 γ ια ν α δω πόσες χ ιλ ιάδες έχω, τ ο π ηλ ίκ ο μ παίνε ι στ ον ax , ά ρ α o ax έχε ι το ν ο ύμε ρ ο τω ν χ ιλ ιάδω ν, κ α ι ο dx τ ο υπόλ οιπο της δ ια ίρε σης push ax ;α π ο θηκε ύε ι τ ον a x στην σ τ ο ίβ α ; σώ ζω τ ο ν ο ύμε ρ ο τω ν χ ιλ ιάδω ν στην στ οίβα, περιέχ εται στον ax push ax ;γ ια τ ί η c a ll h ex 2a sc i i τ ο πε ριμέν ε ι α πό το st ack , πε ρν άε ι τ ο πε ριεχ όμενο τ ο υ ax στην h ex 2ascii μέ σω του s t ack call h ex2ascii ; καλ ώ την h ex2ascii ; μετ ατ ρέ πω δ ηλαδ ή τ ον αριθμό τ ων χ ιλ ιάδ ων σε ascii αριθμό , ώστε να τ ο στε ίλω να τ υ πω θε ί μετ ά μ έ σ ω τη ς display p o p ax ;καλώ α πό την στοίβα τον ax, ; καλ ώ δηλαδή το νούμε ρο τω ν χ ιλ ιάδω ν α π ό την στοίβα , τ ο ε ίχε ο ax d i s p buf f er [ 3] ;τ ο δεδ ομέ νο που γ υ ρνά ε ι η h ex2ascii τ ο α π ο θηκε ύε ι στην 4η θ έ ση τ ο υ B uf f er , οπότε , 0,1,2, 3 ;δηλαδή τυπώνε ται ο αριθμ ός των χ ιλ ιάδω ν x chg dx , ax ; ο dx περιέχε ι τ ο υπόλοιπο τη ς προηγούμενης διαίρε σης που κ άν αμε, η δ ια ίρεση που κάναμε ή ταν γ ια να βρούμε τ ις χιλιάδες, ; ά ρα μετ ά την exchange, ο ax θ α πε ριέχε ι τ ο υπόλ οιπο της δ ια ίρε σης κ α ι ο dx το ν ο ύμε ρ ο τω ν χ ιλ ιάδω ν mov cl,100d ;βάζω τ ο 1 00 στον c l div cl ;δ ιαιρούμε τ ον ax με τ ο 10 0, d iv c l τ ο περιεχ όμενο του ax δ ι α ι ρ ε ί τ αι με τ ο πε ριεχ όμενο τ ου cl, το μη π ρο σ η μ α σμ έ ν ο πη λ ίκ ο τοποθετε ίτ αι στον al και τ ο υπόλοιπο σ τ ον ah ; ο ax πε ριέχε ι τ ο υπόλοιπο της δ ια ίρε σης που κάναμε γ ια τ ις χ ιλ ιάδε ς, δ ια ιρώ αυτ όν τ ον αριθμό με το 10 0 γ ια ν α δω πόσ ες ε κατο ντ άδες έχω , τ ο πηλ ίκ ο μ π α ίνε ι στ ον al, ά ρ α o al έχε ι το ν ο ύμε ρ ο τω ν εκατοντάδων και ο ah τ ο υπόλοιπο της δ ια ίρε σης Εργαστήριο Μικροϋπολογιστικών Συστημάτων | 43 mov dx,0 ;β ά ζω το 0 στ ον dx mov dl, al ;β ά ζω το al στ ον d l , ; ά ρα ο dl θ α έχε ι το ν ο ύμε ρ ο των εκατοντάδων push ax ;α π ο θηκε ύε ι τ ον a x στην σ τ ο ίβ α push dx ;α π ο θηκε ύε ι τ ον dx στην σ τ ο ίβ α call h ex2ascii ; καλ ώ την h ex2ascii ; μετ ατ ρέ πω δ ηλαδ ή τ ον αριθμό τ ων ε κατ ον τάδ ων σ ε ascii αριθμ ό, ώστε ν α τ ο στε ίλω να τ υ πω θε ί μετ ά μ έ σ ω τη ς display p o p ax ;καλώ α πό την στοίβα τον ax ; καλ ώ δηλαδή το νούμε ρο τω ν εκατοντάδων α πό τ η ν στ οίβ α, τ ο ε ίχε ο ax d i s p buf f er [ 3] ;τ ο δεδ ομέ νο που γ υ ρν άει η h ex 2 ascii τ ο α πο θ ηκε ύε ι στην 4 η θέ ση τ ο υ Bu ff er, οπότ ε, 0, 1, 2, 3 ;δηλαδή τυπώνε ται ο αριθμ ός των εκατοντάδων x chg al, ah ; ο ah περιέχε ι τ ο υπόλοιπο τη ς προηγούμενης διαίρε σης που κ άν αμε, η δ ια ίρεση που κάναμε ή ταν γ ια να βρούμε τ ις εκατοντάδες , ; ά ρα μετ ά την exchange, ο a l θα περιέχε ι τ ο υπόλοιπο της διαίρε σης και ο ah τ ο ν ο ύμε ρ ο τω ν εκατοντάδων mov ah,0 ;β ά ζω το 0 στ ον ah mov cl,10d ;β ά ζω το 10 στον c l div cl ;δ ιαιρούμε τ ον ax με τ ο 10 , d iv c l το περιεχόμενο τ ο υ ax δ ια ι ρ ε ί τ α ι με τ ο πε ριεχ όμενο τ ου cl, το μη π ρο σ η μ α σμ έ ν ο πη λ ίκ ο τοποθετε ίτ αι στον al και τ ο υπόλοιπο σ τ ον ah ; ο ax πε ριέχε ι τ ο υπόλοιπο της δ ια ίρε σης που κάναμε γ ια τ ις εκατοντάδ ες, δ ια ιρώ α υτ όν τ ον αριθμό με τ ο 10 γ ια να δω πόσες δεκάδες έχω , τ ο πηλ ίκ ο μ παίνε ι στ ον al, ά ρ α o a l έχε ι τ ο νούμε ρο των δεκάδ ων και ο ah το υπόλοιπο της δ ια ίρε σης mov dx,0 ;β ά ζω το 0 στ ον dx mov dl,al;β άζ ω τ ο al σ τ ον d l, ; ά ρα ο dl θ α έχε ι το ν ο ύμε ρ ο των δε κάδων push ax ;α π ο θηκε ύε ι τ ον a x στην σ τ ο ίβ α push dx ;α π ο θηκε ύε ι τ ον dx στην σ τ ο ίβ α call h ex2ascii ; καλ ώ την h ex2ascii ; μετ ατ ρέ πω δ ηλαδ ή τ ον αριθμό τ ων δε κάδ ων σε ascii αριθμό , ώστε να τ ο στε ίλω να τ υ πω θε ί μετ ά μ έ σ ω τη ς display p o p ax ;καλώ α πό την στοίβα τον ax ; καλ ώ δηλαδή το νούμε ρο τω ν δεκάδων α π ό την στοίβα , τ ο ε ίχε ο ax d i s p buf f er [ 3] ;τ ο δεδ ομέ νο που γ υ ρν άει η h ex 2 ascii τ ο α πο θ ηκε ύε ι στην 4 η θέ ση τ ο υ Bu ff er, οπότ ε, 0, 1, 2, 3 ;δηλαδή τυπώνε ται ο αριθμ ός των δε κάδων x chg al, ah ; ο ah περιέχε ι τ ο υπόλοιπο τη ς προηγούμενης διαίρε σης που κ άν αμε, η δ ια ίρεση που κάναμε ή ταν γ ια να βρούμε τ ις δεκάδες , ; ά ρα μετ ά την exchange, ο a l θα περιέχε ι τ ο υπόλοιπο της διαίρε σης και ο ah τ ο ν ο ύμε ρ ο τω ν δεκάδων mov ah,0 ;β ά ζω το 0 στ ον ah push ax ;α π ο θηκε ύε ι τ ον a x στην σ τ ο ίβ α, ο ax πε ριέχ ε ι τελ ικά μ όν ο τ ις μ ονάδ ε ς ( ο a l θα πε ριέχ ε ι το υπόλ οιπο της δ ια ίρε σης , δηλαδ ή τ ις μ ον άδ ε ς και ο ah το “0” ) push ax ;α π ο θηκε ύε ι τ ον a x στην σ τ ο ίβ α Εργαστήριο Μικροϋπολογιστικών Συστημάτων | 44 call h ex2ascii ; καλ ώ την h ex2ascii ; μετ ατ ρέ πω δ ηλαδ ή τ ον αριθμό τ ων μ ο νάδ ων σε ascii αριθμό , ώστε να τ ο στε ίλω να τ υ πω θε ί μετ ά μ έ σ ω τη ς display p o p ax ;καλώ α πό την στοίβα τον ax, ; ο ax πε ριέχε ι τε λ ικά μ όν ο τ ις μονάδε ς) d i s p buf f er [ 3] ;τ ο δεδ ομέ νο που γ υ ρν άει η h ex 2 ascii τ ο α πο θ ηκε ύε ι στην 4 η θέ ση τ ο υ Bu ff er, οπότ ε, 0, 1, 2, 3 ;δηλαδή τυπώνε ται ο αριθμ ός των μονάδω ν d i s p m e1 ; τ υπ ώνω τ ο m e 1 in c si ;point er τ ο υ array, πάω στ ο επόμενο στοιχείο τ ο υ π ίν ακ α in c si ;δ ύο φ ο ρές γιατ ί έχω και το χρώμα in c bx ;α υξ άν ω τ ον bx κ ατ ά έ ν α, η προηγ ούμ ενη τ ιμή που είχε ήταν 1, θ α πάε ι μέχ ρι 4, ώ στε να μην τ υ πώ σε ι στην ίδ ια γ ραμμή κ α ι 4 ο στοιχείο ; ο bx δ ε ίχνε ι πόσα στοιχεία του πίνακ α θα τ υ πώ σω σε κάθε γραμμ ή c mp bx, 4d ; πότε θα αλλάξε ι γ ραμμή j n e p i s o ;ju mp if not e qu a l ; παίρνε ι και άλλ α στ οιχε ία τ ου πίνακ α, ε άν τυπώσε ι τ ρ ία στ οιχε ία τ ου πίνακ α σ ε μ ία γ ραμμή , τότε θ α α λ λ άξε ι γ ρ αμ μή mov bx,1 ;β ά ζω στ ον bx τ ο 1 ; ξανακ άνω τ ον bx “ 1”, θ α πάε ι μέχ ρι 4, ώ στε να μη ν τ υ πώσ ε ι στην ίδ ια γ ραμμή και 4 ο στοιχείο ; ο bx δ ε ίχνε ι πόσα στοιχεία του πίνακ α θα τ υ πώ σω σε κάθε γραμμ ή d i s p m es ; τ υπ ώνω τ ο mes ; αλλ ά ζε ι γραμμή c m p s i, 18d ; πόσα στ οιχε ία θ α π ρέ πε ι να τυπώσε ι j n e p i s o ;ju mp if not e qu a l ; παίρνε ι και άλλ α στ οιχε ία τ ου πίνακ α, μέχ ρι ν α τυπώ σε ι και τ α 18/2, 9 στ οιχ ε ία τ ο υ π ίν ακ α f in ish: mov lin e1, 0d ;μηδ εν ίζω τ ο lin e1 lea si,mes1 ;τ υ πώ νω τ η ν επιλογή 1 mov di, line1 ;μ ηδενίζω τ ον d i, αφ ού μετ αφέ ρω το lin e1 στον d i ; ο d i δε ίχνε ι στη ν αρχή της πρώτ ης γ ραμμής m1: movsb ;( M OVSB , E S:[D I] = D S:[SI]; D I = DI ± 1; SI = SI ± 1 (byte t r an sf e rr ed , Η ε ντ ολή M OV S με ταφέ ρε ι έ να by t e, μ ια λέ ξη ή μ ια δ ιπλή λέξη α πό μ ια θ έ ση μν ήμη ς τ ο υ τμή ματος δεδ ομέ νων που δ ιε υθυν σ ιοδ οτείτ α ι α π ό τον SI, σε μ ια θέ ση μ νήμης τ ου έ ξτ ρα τμή ματος που δ ιε υθ υν σ ιοδ οτε ίτα ι α πό τ ον DI.) in c di ;α υξ άν ω τ ον d i c mp byt e p t r[s i] ,eom ;έ αν δεν έχω eom τ ό τε θα ξα να πά ω σ τ ο m1, ώστε να τ υ πώ σω όλ ο τ ο μήνυμ α τη ς επιλογής 1 jne m1 ; ju mp if n ot equ a l ;ε άν έχω eom τ ότε θ α πάω τελ ικά ν α τ υπ ώ σω την ε π όμε νη ε πιλογή lea si,mes0 ; τυπώνω την ε π ιλ ογ ή 0 add lin e1,160d ;έχει σαν α π οτέ λε σμα να δε ίχ νουμε στην αρχή της επόμενη ς γ ραμμή ς Εργαστήριο Μικροϋπολογιστικών Συστημάτων | 45 mov di, line1 ; ο d i δε ίχ νε ι στην α ρχ ή της δε ύτε ρης γ ραμ μής m0: movsb ;( M OVSB , E S:[D I] = D S:[SI]; D I = DI ± 1; SI = SI ± 1 (byte t r an sf e rr ed , Η ε ντ ολή M OV S με ταφέ ρε ι έ να by t e, μ ια λέ ξη ή μ ια δ ιπλή λέξη α πό μ ια θ έ ση μν ήμη ς τ ο υ τμή ματος δεδ ομέ νων που δ ιε υθυν σ ιοδ οτείτ α ι α π ό τον SI, σε μ ια θέ ση μ νήμης τ ου έ ξτ ρα τμή ματος που δ ιε υθ υν σ ιοδ οτε ίτα ι α πό τ ον DI.) in c di ;α υξ άν ω τ ον d i c mp byt e p t r[s i] ,eom ;έ αν δεν έχω eom τ ό τε θα ξα να πά ω σ τ ο m1, ώστε να τ υ πώ σω όλ ο τ ο μήνυμ α τη ς επιλογής 0 jne m0 ; ju mp if n ot equ a l ;ε άν έχω eom τ ότε θ α συνεχίσω στ ο πρόγ ραμμα μ ο υ k bd : m o v ah, 6 ; πε ριμέν ε ι ν α δ οθ ε ί επιλογή και με τά κάνε ι ; με ah= 6 έχω direct console read writ e ; AH = 06H, D L=0 FFH o r D L=AS CI I ch a ra c t er ; If DL = 0F FH on ent ry , th e n th is fun ct io n reads th e console. If DL = ASC I I charact er, th en th is fu nct ion displays the ASC II ch aracter on the console (CON ) video screen . mov dl, 0ffh ;α ν αλ όγω ς κ αλε ί κ α ι την κατ άλλ ηλη συν ά ρτη ση in t 21h je kbd ; jump e qu a l c m p a l, ' 1' ;ελέγχ ω τε λ ικ ά ε άν πατήθηκε τ ο “ 1”, δηλαδή ε άν πατήθηκε η ε π ιλ ο γή “ 1” je start1 ; jump equal “ 0” c m p a l, ' 0' ;ελέγχ ω τε λ ικ ά ε άν πατήθηκε τ ο “ 0”, δηλαδή ε άν πατήθηκε η ε π ιλ ο γή je tel ; jump equal j m p f in i s h t el: ret ;retu rn f r om p roc ed u r e main en dp ;τ έ λ ος κύριας ρουτ ίνας cls proc near ; kath ariz ei tn othonh mov di,0 ; καθαρισμός τ ου D I, d i δ ε ίκ της προορισμού mov al,' ' ; τ οπ ο θετώ τ ον χ α ρα κτή ρα s pa c e, τ ο κ ε ν ό στ ον AL mov ah, color τοποθετώ τ ον κ ωδ ικ ό του χ ρώμ ατος στ ον AH ; sp a c e ch a ra ct e r + c o l o r = 1 b y t e + 1 b y t e = 2 b y t es mov cx, sc rw ; φορτώνε ις τ ο ν ο ύμε ρ ο 80 x2 5 στ ον count er cx rep st ow s ;st osw, AX E S:D I, DI DI+ 2, κάνε ι repeat to stosw όσες φ ορ έ ς λέ ε ι ο C X, es ex tr a s eg ment επιπλέον τμή μα, κ ρατ ά δεδ ομένα προορισμού τ ων εντολών δ ιαχε ίρισης συμβολοσ ειρώ ν s t rin g s ret ;retu rn f r om p roc ed u r e c l s end p ;τέ λ ος τ η ς υπορουτίνας c ls k e ys p ro c n e a r ;δ ιαβ ά ζε ι α π ό τ ο πληκ τ ρολ όγ ιο μέχ ρι 25 5 χ α ρα κτή ρες mov buf1,255 ; ή μέχ ρι ν α πα τη θεί τ ο ent er και τ ο υς α π ο θηκε ύε ι σ τ ο mov dx, off s et buf 1 ; buf 1 call lin es ; καλ ώ τη ν L in e s ret ;retu rn f r om p roc ed u r e k eys en dp ;τέλ ος της υπορουτίνας k ey s Εργαστήριο Μικροϋπολογιστικών Συστημάτων | 46 lin es proc n ear ; με χ ρή ση της υπο ρ ο υ τ ίν α ς 0AH τ ο υ D O S mov ah,0ah ; μ πο ρε ί να δ ιαβάσε ι μέχ ρι 2 5 5 χ αρακ τή ρες in t 21h ; α π ό το πλη κτ ρολ όγ ιο κ α ι τ ο α π οθη κε ύε ι σ τ ο buf 1 ret ;retu rn f r om p roc ed u r e lin es endp ;τέλ ος της υπορουτίνας lin es H E X2 A SC II P R OC N E AR ; υπορουτ ίνα HE X2ASC II ; C o nv e rts a w or d v a r ia b le to ASC I I ; W r it es th e r esu lt s in t he BUF FER ( 4 by t es) v a r ia b le ; P A R AM E T E R S ; g et s a wor d va r ia ble f ro m the st ac k p u sh b p ;α π οθ ηκε ύε ι τ ο ν b p στη ν στ οίβα mov bp,sp mov ax, [bp+4] ; ta k e in put v a r iab le push cx ; α π οθηκε ύε ι τ ο ν cx στη ν στ οίβα mov cx,4 mov bp, cx H 2A 1: push ax ;α π ο θηκε ύε ι τ ο ν cx στη ν στ οίβα and al,0Fh add al,30h cmp a l , '9 ' jbe H 2A2 add al,7h dec cx mov bp, cx mov buffer[bp],al pop ax ror ax,4 jnz H 2A1 pop cx ; καλ ώ α π ό την στ οίβα τ ον c x pop b p ;καλώ α π ό την στ οίβα τ ον b p H 2A 2: ret 2 ;return from procedure HE X2ASCII ENDP ; τέλ ος υπορουτίνας HE X2ASC II C ODE _SEG en ds ;τέλ ος τ ο υ τ µή µατος κ ώδ ικ α end start ; τέλ ος τ ου as s e mb l y προγ ράµ µ ατ ος Σ η µε ίω ση : Ε πε ξήγ ηση μερικών εν τολών - Εν τολέ ς άλ μα τος υ πό συνθήκη Εργαστήριο Μικροϋπολογιστικών Συστημάτων | 47 Assembly Language Condition Tested Operation JA Z = 0 and C = 0 Jump if above JAE C=0 Jump if above or equal JB C=1 Jump if below JBE Z = 1 or C = 1 Jump if below or equal JC C=1 Jump if carry set JE or JZ Z=1 Jump if equal or jump if zero JG Z = 0 and S = O Jump if greater than JGE S=O Jump if greater than or equal JL S <> O Jump if less than JLE Z = 1 or S <> O Jump if less than or equal JNC C=0 Jump if no carry JNE or JNZ Z=0 Jump if not equal or jump if not zero JNO O=0 Jump if no overflow JNS S=0 Jump if no sign JNP or JPO P=0 Jump if no parity or jump if parity odd JO O=1 Jump if overflow set JP or JPE P=1 Jump if parity set or jump if parity even JS S=1 Jump if sign is set JCXZ CX = 0 Jump if CX is zero JECXZ ECX = 0 Jump if ECX is zero Jcondition Conditional jump 0111cccc disp Format Example Microprocessor Clocks Jcnd label JA ABOVE 8086 16/4 (8-bit disp) JB BELOW 8088 16/4 JG GREATER 80286 7/3 JE EQUAL 80386 7/3 JZ ZERO 80486 3/1 Pentium 1 Pentium Pro 0000 1111 1000cccc disp Format Example Microprocessor Clocks Jcnd label JNE NOT_MORE 8086 (16-bit disp) JLE LESS_OR_SO 8088 80286 80386 7/3 80486 3/1 Pentium 1 Pentium Pro Εργαστήριο Μικροϋπολογιστικών Συστημάτων | 48 Condition Codes Mnemonic Description Flag 0000 JO O = 1 Jump if overflow 0001 JNO O = 0 Jump if no overflow 0010 JB/NAE C = 1 Jump if below 0011 JAE/JNB C = 0 Jump if above or equal 0100 JE/JZ Z = 1 Jump if equal/zero 0101 JNE/JNZ Z = 0 Jump if not equal/zero JBE/JNA C = 1 + Z = 1 Jump if below or equal 0111 JA/JNBE C = 0 Z = 0 Jump if above 1000 JS S = 1 Jump if sign 1001 JNS S = 0 Jump if no sign 1010 JP/JPE P = 1 Jump if parity 1011 JNP/JPO P = 0 Jump if no parity 1100 JL/JNGE S O Jump if less than JGE/JNL S = 0 Jump if greater than or equal JLE/JNG Z = 1 + S O Jump if less than or equal JG/JNLE Z = 0 + S = O Jump if greater than 0110 1101 1110 1111 Σ η µε ίω ση : Ε πε ξήγ ηση μερικών εν τολών - MOVS B MOVSB , ES:[DI] = DS:[SI]; DI = DI ± 1; SI = SI ± 1 (byte transferred, Η εντολή MOVS μεταφέρει ένα byte, μια λέξη ή μια διπλή λέξη από μια θέση μνήμης του τμήματος δεδομένων που διευθυνσιοδοτείται από τον SI, σε μια θέση μνήμης του έξτρα τμήματος που διευθυνσιοδοτείται από τον DI.) MOVS Move string data 1010010w Format Example Clocks MOVSB MOVSB 8086 18 MOVSW MOVSW 8088 26 MOVSD MOVSD 80286 5 MOVS DATA1,DATA2 80386 7 80486 7 Εργαστήριο Μικροϋπολογιστικών Συστημάτων | Microprocessor 49 Pentium 4 Pentium Pro Σ η µε ίω ση : Ρουτίνες Λε ιτουργίας ( D OS funct io n c a lls) 06H DIRECT CONSOLE READ/WRITE Entry AH = 06H DL = 0FFH or DL = ASCII character Exit AL = ASCII character Notes If DL = 0FFH on entry, then this function reads the console. If DL = ASCII character, then this function displays the ASCII character on the console (CON) video screen. If a character is read from the console keyboard, the zero flag (ZF) indicates whether a character was typed. A zero condition indicates no key was typed, and a not-zero condition indicates that AL contains the ASCII code of the key or a 00H. If AL = 00H, the function must again be invoked to read an extended ASCII character from the keyboard. Note that the key does not echo to the video screen. 09H DISPLAY A CHARACTER STRING Entry AH = 09H DS:DX = address of the character string Notes The character string must end with an ASCII $ (24H). The character string can be of any length and may contains control characters such as carriage return (0DH) and line feed (0AH). Εργαστήριο Μικροϋπολογιστικών Συστημάτων | 50 ΠΡΟΒΛΗΜΑΤΑ ΑΣΚΗΣΗΣ 5 ΠΙΝΑΚΕΣ, ΕΠΕΞΕΡΓΑΣΙΑ ΠΙΝΑΚΩΝ, LOOK UP TABLES, ΜΑΚΡΟΕΝΤΟΛΕΣ, ΥΠΟΡΟΥΤΙΝΕΣ ΠΡΟΒΛΗΜΑ 1 Ν α γ ρ αφε ί π ρ ό γ ρα µµ α σε as semb ly τ ων ε πε ξε ργα σ τών τ η ς Intel τ ο οποίο ν α υ λ ο π ο ιη θε ί π ρ ό γ ραμ μ α τ ο οποίο θ α δέχεται α π ό τ ον χ ρήστη τ α στ οιχε ία ενός πίνακα 4* 4 . Μετ ά μέ σω lo o k u p tab l e ν α μπορε ί ν α ξ ανά ε ισ άγε ι στοιχεία (ε πιλ ο γή 1) ή να βγαίνε ι α π ό τ ο π ρ ό γ ραμ μ α (ε π ιλ ογή 0) , ή να υπολ ογ ίζε ι τ ο άθροισμ α όλ ων των στ οιχε ίων του πίνακα. Εργαστήριο Μικροϋπολογιστικών Συστημάτων | 51 ΕΡΓΑΣΤΗΡΙΟ ΑΡΧΙΤΕΚΤΟΝΙΚΗΣ & ΛΕΙΤΟΥΡΓΙΑΣ Η/Υ Διδ άσκων: Ε υάγ γελος Τ οπ άλης Δρ. Ηλ εκτρολ όγ ος Μηχ αν ικ ός & Τεχν ολ ογ ία ς Υ πολ ογ ιστών ΑΣΚΗΣΗ 6 Bubble Sort αλγόριθμος ΠΑΡΑ∆ΕΙΓΜΑ 1 Παράδειγµα προγράµµατος στο οποίο υλοποιείται η βασική έκδοση του Bubble Sort αλγορίθμου, ενός από τους πιο γνωστούς αλγόριθμους ταξινόμησης. Δίνεται στο φοιτητή ένας πίνακας αριθμών των οποίον καλείται να ταξινομήσει κατά αύξουσα σειρά. Επιπλέον δίνεται μια υπορούτινα απεικόνισης του πίνακα η οποία αφού μετατρέψει έναν αριθμό σε ASCII κωδικοποίηση, με τη βοήθεια μιας δεύτερης υπορουτίνας, τον απεικονίζει στην οθόνη καλώντας κατάλληλη συνάρτηση του DOS. Στην βασική έκδοση του αλγορίθμου γίνεται διαδοχική σύγκριση των γειτονικών στοιχείων του πίνακα και εναλλαγή αυτών όταν το στοιχείο στην υψηλότερη θέση στον πίνακα είναι μικρότερος αριθμός από το αντίστοιχο Εργαστήριο Μικροϋπολογιστικών Συστημάτων | 52 στοιχείο στην χαμηλότερη θέση. Η διαδοχική σύγκριση συνεχίζεται έως ότου σε ένα ολόκληρο πέρασμα δεν γίνει καμία εναλλαγή στοιχείων που σημαίνει ότι τα στοιχεία είναι σωστά ταξινομημένα. . 4 86 ;χ ρήσ η τ η ς ν τ ιρε κ τ ίβ α ς γ ια να αναγνωρίζει ο as s e mb ler εντολές γ ια 80 48 6 D IS P M ACR O X push ax ;α π ο θηκε ύε ι τ ον ax στην στοίβ α push dx ;α π ο θηκε ύε ι τ ον ds στην σ τ ο ί β α mov ah, 0 9h ; τ υπ ών ε ι ότ ι έχε ι ο dx μέχ ρι ν α β ρε ι $ mov dx ,offset X int 21h pop dx ;καλώ α πό τ η ν στ οίβ α τ ον dx pop ax ;καλώ α πό τ η ν στ οίβ α τ ον a x END M S T ACK_SEG seg m ent p a ra S TA C K ; τµή µ α στοίβας µε όν οµα st ack _ s eg d b 2 56 dup ( 0) ;ορισ µ ός χ ώ ρου στ οίβ ας ( 25 6 αντ ίγ ρα φα λέ ξεων ) STACK_SEG en ds ;τέλ ος τ ο υ τ µή µατος σ τ ο ίβ α ς D AT A_ SE G s eg m ent p a r a p u b l i c ; καθορισ µός τ ου τ µή µατος δεδ οµ ένων a r ra y dw 9, 18 , 1 1 8, 6, 32 5, 4, - 9 , 2,1 ;κ αθ ο ρ ισ μ ός τ ο υ a r ra y a r ra y_ st r e qu ( ($ -a r r ay )/ 2) ; καθορισμός τ ου a r ray _s t r ; -/- /-/ -/- /- /-/ -/- /-/ -/ -/- /-/ -/- /- /-/ -/- /-/ -/ -/- /-/ -/; -/- /-/ -/- /- /-/ -/- /-/ -/ -/- /-/ -/- /- /-/ -/- /-/ -/ -/- /-/ -/; -/- /-/ -/- /- /-/ -/- /-/ -/ -/- /-/ -/- /- /-/ -/- /-/ -/ -/- /-/ -/;arr_sz db 255 ; καθορισμ ός τ ο υ array_sz ; a rray_ st r db 1 du p( 0) ;κ α θ ορ ι σμ ός του a rr ay _s t r ; a rray dw 10 0 du p(0 ) ;καθορι σμ ός τ ου array ; -/- /-/ -/- /- /-/ -/- /-/ -/ -/- /-/ -/- /- /-/ -/- /-/ -/ -/- /-/ -/; -/- /-/ -/- /- /-/ -/- /-/ -/ -/- /-/ -/- /- /-/ -/- /-/ -/ -/- /-/ -/; -/- /-/ -/- /- /-/ -/- /-/ -/ -/- /-/ -/- /- /-/ -/- /-/ -/ -/- /-/ -/in_mes db 'Inser t number' db '$' ο επόμενος χαρακτήρας ε ίν α ι $ buff er db 4 dup (0 ) ; καθορισμός τ ου buf fer db '$' ο επόμενος χαρακτήρας ε ίν α ι $ mes d b 10 , 13 ;κ αθορ ισ μ ός του m es db '$' ο επόμενος χαρακτήρας ε ίν α ι $ sw ap _c oun t d b 1 d up( 1) ;καθορισμ ός του sw ap_c oun t D AT A_ SEG en ds ;τέλ ος τ ο υ τ µή µατος δεδ οµ ένων Εργαστήριο Μικροϋπολογιστικών Συστημάτων | 53 C ODE _SEG s eg ment U SE 16 par a pu b lic 'C ODE' τ µή µα ;έ να ρ ξη του τ µή µατος κώδ ικα a s su m e c s: c od e _s e g, ds : d at a _s e g ;καθορισ µ ός τ ου ον όµατος που συνδέεται µε τ ο S T ART : ; ση µε ίο (δ ιεύθ υνσ η) έναρξη ς/ε ισ ό δου τ ο υ προγ ρά µµ ατ ος main proc far ; κ ύρ ιο μέρος του προγ ράμματ ος ; S et up st ack f or retu rn push ds ;α π ο θηκε ύε ι τ ον ds στην σ τ ο ίβ α mov ax,0 ;β ά ζε ι τ ο 0 στ ον ax push ax ;α π ο θηκε ύε ι τ ον a x στην σ τ ο ίβ α ; S et DS reg is t er t o cu rr e nt dat a s eg me nt mov ax, dat a_ s eg ;τ ο π ο θετε ί τ ο d at a_ se g σ τ ον ax mov ds ,ax ;τοποθετε ί τ ο ν ax στ ον ds, ο ρ ί ζ ε ι δηλαδ ή στ ον d s το data segement ; -/- /-/ -/- /- /-/ -/- /-/ -/ -/- /-/ -/- /- /-/ -/- /-/ -/ -/- /-/ -/; -/- /-/ -/- /- /-/ -/- /-/ -/ -/- /-/ -/- /- /-/ -/- /-/ -/ -/- /-/ -/; -/- /-/ -/- /- /-/ -/- /-/ -/ -/- /-/ -/- /- /-/ -/- /-/ -/ -/- /-/ -/; push di ; m ov di, 0 ;n ext _ch ar: ; disp in_mes ; m ov ah, 1 ; i nt 21h ; disp m es ; cm p al ,'@' ; je go_srt ; shl di, 1 ; m ov byt e pt r array[di],al ; i nc a r ra y_s t r ; shr di,1 ; i nc di ; jmp n ext _char ; go _ sr t: ; p op di ; -/- /-/ -/- /- /-/ -/- /-/ -/ -/- /-/ -/- /- /-/ -/- /-/ -/ -/- /-/ -/; -/- /-/ -/- /- /-/ -/- /-/ -/ -/- /-/ -/- /- /-/ -/- /-/ -/ -/- /-/ -/; -/- /-/ -/- /- /-/ -/- /-/ -/ -/- /-/ -/- /- /-/ -/- /-/ -/ -/- /-/ -/d i s p m es ; τ υπ ώνε ι τ ο m e s call disp_arr ;κ αλε ί την υπορουτίνα disp _arr d i s p m es ; τ υπ ώνε ι τ ο mes d i s p m es ; τ υπ ώνε ι τ ο mes ; --- actu all sort ing st art s h ere- --- --n ex t_ p as s: Εργαστήριο Μικροϋπολογιστικών Συστημάτων | 54 mov al,swap_count ; τ οπ ο θετώ τ ο sw ap_c oun t στον a l ; μέχ ρι ν α μη ν γ ίνε ι κ αμμ ία αλλ αγή , δηλαδ ή ν α παρα με ίν ε ι ο sw ap _c oun t 0, σε έ ν α ολόκ ληρο π έ ρα σμ α c m p a l, 0 ; συγ κρίνει τ ο 0 με τ ον al, al-0 j e d on e ; ju mp equ al mov swap_count,0 ; τ οπ ο θετώ τ ο 0 στον sw ap _c ou nt mov di,0 ; τ οπ ο θετώ τ ο 0 στον d i n ex t_elm: s h l d i, 1 ;Τ α πε ριεχόμενα του D I ολ ισθαίν ουν λ ογ ικά προς τα αριστερά 1 θέ ση, d i x 2 mov ax, array[di] ;τ ο πε ριεχόμενο τ ο υ array[ di] στ ον ax cmp ax, array[di+ 2] ; σ ύγ κ ρ ισ η τ ο υ περιεχ ομένου τ ο υ array[di+2] με τ ον ax jg swap ; J ump if great er t han, εάν π ρέ πε ι ν α α λ λ αχ θ ο ύν π ά ε ι στ ο sw ap increment: shr di,1 ;Τ α πε ριεχόμενα του D I ολ ισθαίν ουν λ ογ ικά προς τα αριστερά 1 θέ ση in c di ;α ύξ η ση τ ο υ d i mov al, array_st r ;τ ο π ο θετώ τ ο a r r ay _s t r στ ον al and ax,0Fh ;λ ογ ική πράξη AND, cmp di, ax ; σ ύγ κ ρ ισ η τ ο υ ax με τ ον d i , d i - ax je next_pass ; j ump e qu a l jmp n ext _elm swap: in c sw ap _c ou nt ;α ύξ η ση τ ο υ swap_count mov bx,array[di+ 2] ;τ ο στ οιχε ίο array[di+ 2] στ ον bx mov array[ di+ 2] ,ax ;o ax στ ο στ οιχε ίο array[di+2] mov array[ di],bx ; ο bx στ ο στοιχείο ar ra y[ d i] jmp in crement done: ; --- --- - end of sort in g-- --- ---- --- -call disp_arr ;κ αλώ την υπορουτίνα disp _arr d i s p m es ; τ υπ ώνω τ ο m e s d i s p m es ; τ υπ ώνω τ ο m e s r et ; R et urn to D O S main en dp ; End of the main progr H E X2 A SC II P R OC N E AR ; υπορουτ ίνα HE X2ASC II ; C o nv e rts a w or d v a r ia b le to ASC I I ; W r it es th e r esu lt s in t he BUF FER ( 4 by t es) v a r ia b le ; P A R AM E T E R S ; g et s a wor d va r ia ble f ro m the st ac k p u sh b p mov bp,sp Εργαστήριο Μικροϋπολογιστικών Συστημάτων | 55 mov ax, [bp+4] ; ta k e in put v a r iab le push cx mov cx,4 mov bp, cx H 2A 1: push ax and al,0Fh add al,30h cmp a l , '9 ' jbe H 2A2 add al,7h ;al = 0X H2A2: dec cx mov bp, cx mov buffer[bp],al pop ax ror ax,4 jnz H 2A1 pop cx pop bp ret 2 HE X2ASCII ENDP ; τέλ ος υπορουτίνας HE X2ASC II d is p _a r r PR OC NE AR ;υπορουτίνα d i sp _ ar r ; --- --- disp array code--- -- --push di ;τοποθε τώ τον d i στην στοίβα mov di,0 ; τ οπ ο θετώ τ ο 0 στον d i lp1: push di ;τοποθε τώ τον d i στην στοίβα x 2 s h l d i, 1 ;Τ α πε ριεχόμενα του D I ολ ισθαίν ουν λ ογ ικά προς τα αριστερά 1 θέ ση, d i mov ax, array[di] ;τ ο πε ριεχόμενο τ ο υ array[ di] στ ον ax push ax ;τ ο π ο θετώ τ ον ax στην στοίβα call HE X2ASC I I ; καλ ώ τη ν υ πο ρ ο υ τ ίν α HEX2ASCII d i s p buf f er ; τ υπ ώνω τον buff er d i s p m es ; τ υπ ώνω τ ο m e s p o p d i ;καλ ώ τ ον di α π ό την στ οίβα in c di ;α ύξ η ση τ ο υ d i mov al, array_st r ;τοποθε τώ το a rr ay _ s t r στ ον a l and ax,0fh ;λ ογ ική πράξη AND, cmp di, ax ; σ ύγ κ ρ ισ η τ ο υ ax με τ ον d i , d i - ax jb lp1 ;Jump if below p o p d i ;καλ ώ τ ον di α π ό την στ οίβα Εργαστήριο Μικροϋπολογιστικών Συστημάτων | 56 ; --- -- en d of array disp code--- --- -ret disp_arr ENDP ; τέλ ος υπορουτίνας d i s p_a rr C ODE _SEG en ds ;τέλ ος τ ο υ τ µή µατος κ ώδ ικ α E N D S T A RT ;τέ λ ος του assemb ly προγ ρά µ µατος Σ η µε ίω ση : Ρουτίνες Λε ιτουργίας ( D OS funct io n c a lls) 09H DISPLAY A CHARACTER STRING Entry AH = 09H DS:DX = address of the character string Notes The character string must end with an ASCII $ (24H). The character string can be of any length and may contains control characters such as carriage return (0DH) and line feed (0AH). Σ η µε ίω ση : Ε πε ξήγ ηση μερικών εν τολών Assembly Language Condition Tested Operation JA Z = 0 and C = 0 Jump if above JAE C=0 Jump if above or equal JB C=1 Jump if below JBE Z = 1 or C = 1 Jump if below or equal JC C=1 Jump if carry set JE or JZ Z=1 Jump if equal or jump if zero JG Z = 0 and S = O Jump if greater than JGE S=O Jump if greater than or equal JL S <> O Jump if less than JLE Z = 1 or S <> O Jump if less than or equal JNC C=0 Jump if no carry JNE or JNZ Z=0 Jump if not equal or jump if not zero JNO O=0 Jump if no overflow JNS S=0 Jump if no sign JNP or JPO P=0 Jump if no parity or jump if parity odd JO O=1 Jump if overflow set JP or JPE P=1 Jump if parity set or jump if parity even JS S=1 Jump if sign is set JCXZ CX = 0 Jump if CX is zero JECXZ ECX = 0 Jump if ECX is zero Εργαστήριο Μικροϋπολογιστικών Συστημάτων | 57 AND Logical AND 001000dw oorrrmmm disp O D I T 0 Format AND reg,reg Example S Z A P C * * ? * 0 Microprocesso r Clocks AND CX,BX 8086 3 AND DL,BL 8088 3 AND ECX,EBX 80286 2 AND BP,SI 80386 2 AND EDX,EDI 80486 1 Pentium 1 or 3 Pentium Pro AND mem,reg AND BIT,AL 8086 16 + ea AND LIST,DI 8088 24 + ea AND DATAZ[BX],CL 80286 7 AND [EAX],BL 80386 7 AND [ESI+4*ECX],EDX 80486 3 Pentium 1 or 3 Pentium Pro AND reg,mem AND BL,DATAW 8086 9 + ea AND SI,LIST 8088 13 + ea AND CL,DATAQ[SI] 80286 7 AND CX,[EAX] 80386 6 AND ESI,[ECX+43H] 80486 2 Pentium 1 or 2 Pentium Pro Εργαστήριο Μικροϋπολογιστικών Συστημάτων | 58 100000sw oo100mmm disp data Format AND reg,imm Examples Microprocesso r Clocks AND BP,1 8086 4 AND DI,10H 8088 4 AND DL,34H 80286 3 AND EBP,1345H 80386 2 AND SP,1834H 80486 1 Pentium 1 or 3 Pentium Pro AND mem,imm AND DATA4,33 8086 17 + ea AND LIST,’A’ 8088 23 + ea AND DATA3[DI],2 80286 7 AND BYTE PTR[EBX],3 80386 7 AND DWORD PTR[DI],66H 80486 3 Pentium 1 or 3 Pentium Pro AND acc,imm AND AX,3 8086 4 AND AL,1AH 8088 4 AND AH,34H 80286 3 AND EAX,2 80386 2 AND AL,’r’ 80486 1 Pentium 1 Pentium Pro Ολισθήσεις (Shifts) Οι εντολές ολίσθησης τ ο π οθετ ο ύν ή μετ ακ ιν ο ύν προς τ α αριστε ρά ή προς τ α δ ε ξ ιά αριθμούς που β ρίσκοντ αι σε καταχ ωρητή ή σε θέσ η μ νήμης . Ε π ίσης , ε κτελ ο ύν απλή Εργαστήριο Μικροϋπολογιστικών Συστημάτων | 59 αριθμητ ική ό πω ς π ολ λα πλ ασ ιασ μ ό με δ υν άμε ις τ ου 2 + n (αριστερή ο λ ίσ θ η ση ) κ αι δ ια ίρε ση με δ υνάμεις τ ο υ 2 - n (δε ξιά ολ ίσ θ ηση ). Εντολές Ολίσθησης Γλώσσα assembly SHL AX,1 Λειτουργία Τα περιεχόμενα του AX ολισθαίνουν λογικά προς τα αριστερά 1 θέση Τα περιεχόμενα του BX κυλίονται λογικά προς τα δεξιά 12 θέσεις Τα περιεχόμενα του ECX κυλίονται λογικά προς τα δεξιά 10 θέσεις Τα περιεχόμενα της θέσης μνήμης του τμήματος δεδομένων με το όνομα DATA1 κυλίονται αριθμητικά προς τα αριστερά τόσες θέσεις όσες ορίζει με τα περιεχόμενα του ο CL Τα περιεχόμενα του SI κυλίονται αριθμητικά προς τα αριστερά 1 θέση Τα περιεχόμενα του EDX κυλίονται αριθμητικά προς τα αριστερά 1 θέση SHL BX,12 SHR ECX,10 SAL DATA1,CL SAR SI,2 SAR EDX,14 SAL/SAR/SHL/SHR Shift 1101000w ooTTTmmm disp O D I T * S Z A P C * * ? * * TTT = 100 = SHL/SAL , TTT = 101 = SHR, and TTT = 111 = SAR Format Example Microprocessor Clocks SAL reg,1 SAL CL,1 8086 2 SHL reg,1 SHL DX,1 8088 2 SHR reg,1 SAR CH,1 80286 2 SAR reg,1 SHR SI,1 80386 3 80486 3 Pentium 1 or 3 Pentium Pro SAL mem,1 SAL DATA1,1 8086 15 + ea SHL mem,1 SHL BYTE PTR [DI],1 8088 23 + ea SHR mem,1 SAR NUMB,1 80286 7 SAR mem,1 SHR WORD PTR[EDI],1 80386 7 80486 4 Εργαστήριο Μικροϋπολογιστικών Συστημάτων | 60 Pentium 1 or 3 Pentium Pro 1101001w ooTTTmmm disp Format Example Microprocessor Clocks SAL reg,CL SAL CH,CL 8086 8 + 4n SHL reg,CL SHL DX,CL 8088 8 + 4n SAR reg,CL SAR AL,CL 80286 5 + n SHR reg,CL SHR ESI,CL 80386 3 80486 3 Pentium 4 Pentium Pro SAL mem,CL SAL DATAU,CL 8086 20 + 4n SHL mem,CL SHL BYTE PTR [ESI],CL 8088 28 + 4n SAR mem,CL SAR NUMB,CL 80286 8 + n SHR mem,CL SHR TEMP,CL 80386 7 80486 4 Pentium 4 Pentium Pro 1100000w ooTTTmmm disp data Format Example Microprocessor Clocks SAL reg,imm SAL CH,4 8086 SHL reg,imm SHL DX,10 8088 SAR reg,imm SAR AL,2 80286 5 + n SHR reg,imm SHR ESI,23 80386 3 80486 2 Pentium 1 or 3 Pentium Pro SAL mem,imm SAL DATAU,3 8086 SHL mem,imm SHL BYTE PTR [ESI],15 8088 Εργαστήριο Μικροϋπολογιστικών Συστημάτων | 61 SAR mem,imm SAR NUMB,3 80286 8 + n 80386 7 80486 4 Pentium 1 or 3 Pentium Pro ΠΡΟΒΛΗΜΑΤΑ ΑΣΚΗΣΗΣ 6 Bubble Sort αλγόριθμος ΠΡΟΒΛΗΜΑ 1 Ν α γ ραφ ε ί πρόγ ραµµ α σ ε as semb ly των ε πεξεργαστών τη ς Intel τ ο οποίο να τροποποιεί τ ο πρόγ ρα μμα τη ς ά σ κ η σης 6 , ώ στε οι α ρ ι θ μ ο ί ν α τ υπώ νονται στην δεκαδ ική τ ο υς μ ο ρφή και όχ ι στην ascii κωδ ικ οποίη ση τ ο υς . Εργαστήριο Μικροϋπολογιστικών Συστημάτων | 62 ΕΡΓΑΣΤΗΡΙΟ ΑΡΧΙΤΕΚΤΟΝΙΚΗΣ & ΛΕΙΤΟΥΡΓΙΑΣ Η/Υ Διδ άσκων: Ε υάγ γελος Τ οπ άλης Δρ. Ηλ εκτρολ όγ ος Μηχ αν ικ ός & Τεχν ολ ογ ία ς Υ πολ ογ ιστών ΑΣΚΗΣΗ 7 ΥΠΟΛΟΓΙΣΜΟΣ ΜΕΣΟΥ ΟΡΟΥ ΣΕ ΠΙΝΑΚΑ, ΥΠΟΡΟΥΤΙΝΕΣ, ΜΑΚΡΟΕΝΤΟΛΕΣ ΠΑΡΑ∆ΕΙΓΜΑ 1 Παράδειγµα προγράµµατος στο οποίο να υλοποιηθεί πρόγραμμα το οποίο θα δέχεται από τον χρήστη τα στοιχεία ενός πίνακα 3x3. Μετά μέσω look up table να μπορεί να ξανά εισάγει στοιχεία (επιλογή 1), να υπολογίζει τη μέση τιμή και να την τυπώνει (επιλογή 2) ή να βγαίνει από το πρόγραμμα (επιλογή 0). Εργαστήριο Μικροϋπολογιστικών Συστημάτων | 63 . 4 86 ;χ ρήσ η τ η ς ν τ ιρε κ τ ίβ α ς γ ια να αναγνωρίζει ο as s e mb ler εντολές γ ια 80 48 6 D IS P M ACR O X push ax ;α π ο θηκε ύε ι τ ον ax στην στοίβ α push dx ;α π ο θηκε ύε ι τ ον ds στην σ τ ο ί β α mov ah, 09h ;τυπώνε ι ότι έχε ι ο dx μέχρι ν α β ρε ι $ m ov dx , off s et x int 21h pop dx ;καλώ α πό τ η ν στ οίβ α τ ον dx pop ax ;καλώ α πό τ η ν στ οίβ α τ ον a x END M v id mem eq u 0b 80 0h ;α ρχ ή της V G A t ex t- m emo ry color equ 7 ;co l or at t r i b u t e (χ ρώμ ατ α) , b ack g ro u n d & f o r eg r oun d col o r scrw equ 80*25 ; 2 5= lin es 80=ch ars per lin e, screen w ords, ορισμός όλ ης της οθόνης, τα equ αν τίστ οιχα d ef in e e o m equ 0 ; en d of m e s sa g e, ο ρ ι σ μ ός του e om ( en d of m es s a g e) S T AC_ SE G s eg m ent U SE 16 p a r a s t ack ;τ µή µα σ τ ο ίβ α ς µε όν οµα st ack _s eg d b 2 56 dup ( ' ' ) ; ορισ µ ός χ ώ ρου στ οίβ ας ( 25 6 αντ ίγ ρα φα λέ ξεων ) S T AC_ SE G en ds ;τέλ ος τ ο υ τ µή µατος σ τ ο ίβ α ς D AT A_ SEG s eg ment USE 16 para pu b lic ;καθορισµ ός τ ο υ τµ ήµ ατ ος δεδ οµένων b uff er db 4 d up( 0) ; 4 byt e s και ο ε πόμεν ος χαρα κτήρας ε ίναι $ db '$' ;ο ε π όμεν ο ς χαρακτήρας ε ίν α ι $ mes db 10 , 13, 1 3 ;α λ λ ά ζε ι γραμμή και ο ε π όμ ενο ς χ α ρακ τή ρα ς ε ίναι $ db '$' me1 db ' ' ;κεν ός χαρακτήρας και ο ε πό μ ε ν ο ς χαρακτήρας ε ίναι $ db '$' lin e dw 160d ; 0 cont ain 1'st ch ar BUT 1 cont ain color lin e1 dw 3 2 0d m e s s d b 'D os t e t a st o ix e ia tou 3 *3 p inak a: ' db eom mes1 db ' 1) Gia n a doset e kain ou rgia st oix eia st o pin a ka.' db eom ; /// /// /// // /// /// /// // /// /// /// // / m e s 2 db ' 2) G i a mes h t i mh t o y p in ak a. ' db eom ; /// /// /// // /// /// /// // /// /// /// // / mes0 db ' 0) Gia exodo apo to programma.' db eom Εργαστήριο Μικροϋπολογιστικών Συστημάτων | 64 b u f 1 d b 25 7 du p ( ?) ; dh miou rgei en an apith ik eytik o x oro 257 th eseon db eom array dw 1 8 du p ( 0) ; p e r i e x ei s e b in a ry m o rfh t a st o ix e i a t o y b u f 1 db eom ; /// /// /// // /// /// /// // /// /// /// // / ph lik o dw 8 dup (0) ;periex ei t o meso oro db eom ; /// /// /// // /// /// /// // /// /// /// // / D AT A_ SEG en ds ;τέλ ος τ ο υ τ µή µατος δεδ οµ ένων C ODE _SEG s eg ment U SE 16 par a pu b lic 'c od e' ; έναρξη τ ο υ τµή µα τ ος κώδ ικ α τ µή µα a s su m e c s: c od e _s e g, ds : d at a _s e g ;καθορισ µ ός τ ου ον όµατος που συνδέεται µε τ ο star t: ;σ ηµ ε ίο (δ ιε ύθ υν ση) έ να ρ ξης /ε ισόδ ο υ τ ο υ π ρ ο γ ρά µµα τ ος main proc far ;κ ύ ρ ιο μέ ρος του προγρά μματος push ds ;α π ο θηκε ύε ι τ ον ds στην σ τ ο ίβ α mov ax,0 ;β ά ζε ι τ ο 0 στ ον ax push ax ;α π ο θηκε ύε ι τ ον a x στην σ τ ο ίβ α mov ax, dat a_ s eg ;τ ο π ο θετε ί τ ο d at a_ se g σ τ ον ax mov ds ,ax ;τοποθετε ί τ ο ν ax στ ον ds, ο ρ ί ζ ε ι δηλαδ ή στ ον d s το data segement mov ax,vid mem ;τ οπ ο θε τε ί την α ρχ ή της V G A t ex t- m emo ry στον ax mov es, ax ;τ ο ποθε τε ί τ ον a x σ τ ο e s ( ex tr a s eg em e nt), es ex tra segment ε πιπλέον τ μή μ α, κ ρα τά δεδομένα π ρ οορισ μ ο ύ των ε ντ ολώ ν δ ιαχε ίρισης συμβολοσ ειρώ ν s t r in gs star t1: call cls mov di,0 ;καλε ί την cls (καθαρίζε ι την ο θ όνη) ; μετρητής στ οιχε ίων , ν ο ύμε ρα, τ ο π ο θετε ί τ ο 0 στ ον d i ; παίρνε ι τα ν ο ύμε ρα α πό τ ο πλη κτ ρολ όγ ιο k s ana: ; και τ α βάζε ι σ τ ο arr a y push di ; απο θη κε ύε ι τον d ι στην στοίβα call cls ; καλ ε ί τη ν c ls (καθαρίζε ι την οθ όνη ) lea s i,mess ;ε κτ υ πώνει τ ο πρώτο μή ν υμα , το mess1 mov di,320d ; πηγ α ίν ω δ ύο γ ραμμές πα ρα κά τω dose: movsb ;( M OVSB , E S:[D I] = D S:[SI]; D I = DI ± 1; SI = SI ± 1 (byte t r an sf e rr ed , Η ε ντ ολή M OV S με ταφέ ρε ι έ να by t e, μ ια λέ ξη ή μ ια δ ιπλή λέξη α πό μ ια θ έ ση μν ήμη ς τ ο υ τμή ματος δεδ ομέ νων που δ ιε υθυν σ ιοδ οτείτ α ι α π ό τον SI, σε μ ια θέ ση μ νήμης τ ου έ ξτ ρα τμή ματος που δ ιε υθ υν σ ιοδ οτε ίτα ι α πό τ ον DI.) in c di ;α υξ άν ε ι τ ο di κατά ένα c mp byt e p t r[s i] ,eom j n e d os e ;ju mp if not e qu a l p o p d i ;καλ ώ α π ό την στοίβα τον d i mov cx,10 ;β ά ζω το 10 στον cx ;α ρχ ι κ ο π ο ίη ση κ ά ποιων καταχ ωρητώ ν mov bx,0 ;β ά ζω το ο στ ον bx ;αρχ ικοποίη ση κάποιω ν κ ατ αχω ρη τών readn1: Εργαστήριο Μικροϋπολογιστικών Συστημάτων | 65 mov ah,1 ;μετ αφέ ροντ ας τ ο 1 στ ον ah και σ ε συνδ υασ μό με τ ο Int 2 1 τη συνάρτηση τ ου d os “ r ead t h e k ey b oard” , πχ πα τάω σ υν ο λ ικά τ ο 52 , πρώτ α το “5”, με τη δε ύτε ρη φ ορ ά δ ι α β ά ζε ι τ ο 2 in t 21h mov ah,0 ;β ά ζω στ ον ah τ ο 0 c m p a l, ' 0' ;έλεγχ ος αριθμού να ε ίναι μετ αξύ 0 και 9, (σύγκριση τ ου al με τ ο 0) ;δε ν κ άνε ι έ λεγχ ο ότ αν π α τ ά τ ο en t er και β ά ζε ι μηδέ ν , αφού πάε ι στην rea dn 2 ; τ ο ent er έχε ι κωδ ικό σε ascii OD ;ε άν πατήσεις κ άπ ο ιο χ αρακ τήρα εκτός 0 έ ω ς 9 τότε δεν σου βγάζε ι μή ν υμα να τ ο ξαν αβ άλε ις α λ λ ά β άζ ε ι 0 jb readn2 ; ju m p if b e low ;γ ια τ ο ε πό μεν ο στ οιχε ί ο τ ο υ π ί ν α κ α. c m p a l, ' 9' ;έλεγχ ος αριθμού να ε ίναι μετ αξύ 0 και 9 ja readn2 ; ju m p if a b ov e ;γ ια τ ο ε πό μεν ο στ οιχε ί ο τ ο υ π ί ν α κ α sub al,'0' ; σε h ex μορφή τ ο νούμε ρο που πατά ; π.χ. πα τάω 5 23 4 ε άν έχω πα τή σε ι τ ο 5, ο a l θ α έχε ι τ ο “35” ( ascii κωδ ικ οποίη ση τ ο υ 5 ) , εάν αφ α ιρέ σω τ ο “0” ( σε ascii κ ωδ ικ ο π ο ίησ η ε ίν α ι 30 ), οπότ ε η αφαίρεση θ α δ ώσε ι 5, ν α έχ ουμε δηλαδή τον δεκαδ ικό αριθμ ό που πα τήθηκ ε , ο οποίος τελ ικά πε ριέχε τα ι στ ον a l , τ ο 5 στη συγκεκριμένη πε ρίπτω ση τ ο υ παραδε ίγμ ατ ος, ; την δε ύτε ρη φ ο ρά που θ α έχω πατήσε ι το 2, ο al θα περ ιέχε ι τ ο “32” (ascii κ ωδ ικ ο π οίη ση του 2) , ε άν α φα ι ρέσ ω τ ο “ 0” ( σε as ci i κ ωδικοποίη ση είναι 30), οπότε η αφαί ρεση θ α δ ώσε ι 2, ν α έχ ουμε δηλαδή τ ον δεκαδ ικό αριθμ ό που πα τή θηκε, ο οποί ος τε λικ ά περ ιέχε τα ι στ ον al, το 2 στη συγκεκριμένη πε ρί πτωση τ ο υ παραδείγματος, push ax ;α π ο θηκε ύε ι τ ον a x στην σ τ ο ίβ α mov ax,bx ;βάζε ι τον bx στ ον ax, ;δηλαδή στη ν πρώτη πε ρίπτωση που έχε ι πατ ηθε ί μόνο τ ο 5, ε ίναι 0 τ ο bx ε ίναι 0, άρα ax ; στ ην δε ύτε ρη πε ρ ίπτω ση που έχε ι πα τη θεί τ ο “ 2”, o b x περ ιέχε ι α π ό πριν τ ο “5”, άρα ο ax έχ ει το “ 5” mul cx ; πολ λ α πλ ασ ι ά ζ ε ι τον cx με τον ax και β άζ ει τ ο αποτέλε σμ α στ ον ax, ο cx ε ίναι 10, ά ρ α, ; ά ρα στην πρώτη περίπτ ωσ η που έχε ι πατη θε ί τ ο “5” ο ax έχε ι “ 0” ; ά ρα στη ν δε ύτερη π ε ρ ί πτω ση που έχε ι πατηθεί το “ 2” ο ax έχε ι “ 5 0” mov bx,ax ;β ά ζε ι τ ον ax στον bx, ; ά ρα στην πρώτη περίπτ ωσ η που έχε ι πατη θε ί τ ο “5” ο bx έχε ι “ 0” ; ά ρα στη ν δε ύτερη π ε ρ ί πτω ση που έχε ι πατηθεί το “ 2” ο bx έχε ι “ 5 0” p o p ax ;καλώ α πό την στοίβα τον ax, ο οποίος περιέχει τ η ν πρώτη φορά τ ο “ 5” ; καλ ώ α πό τ η ν στ οίβ α τ ον ax, ο οποίος πε ριέχε ι τη ν δε ύτερη φ ο ρά το “ 2” mov ah,0 ;β ά ζε ι τ ο 0 στ ον ah ad d bx, ax ;προσθέτει τ ον bx με τ ον ax , ; ά ρα ο bx έχε ι τ η ν πρώτη φ ορ ά τ ο “ 5”, ότ αν πατήθηκε τ ο “ 5” Εργαστήριο Μικροϋπολογιστικών Συστημάτων | 66 ; ά ρα ο bx έχε ι τ η ν δε ύτε ρη φορά το “2”, ότα ν πατή θη κε τ ο “ 2”. ... ..τα ίδ ια γ ια τ ο υς ε π όμεν ο υς δύο α ρι θ μ ού ς τ ο υ πρώτου στ οιχεί ου, ε άν έχε ι 4, αλ λιώ ς με en t er πάε ι γ ι α τ ο ε π όμεν ο στ οιχεί ο τ ου πίν ακ α, μέ σω των παραπάνω c om p ar e που έχω γ ι α abov e “0” κ αι b e l ow “ 9” . jmp readn1 ; πάω στη ν r e adn 1 ξα νά readn2: mov ax,bx ; ο bx περιέχε ι τ ο ν π ρα γ μ α τ ικ ό α ρ ι θμ ό που πα τήθ ηκε mov array[di] ,ax ; d i ο count er, το array ε ίναι δ ομημέ νο σ ε word, ο di σ ε byt e, τ ο π ο θετε ί τε λ ικ ά α υτ ά που έχουμε πατήσει στο array inc di ; με ιών ω τ ον δείκτη, τελ ικ ά τ ό σες φ ο ρές μέχρι να ορίσω πόσους αριθμούς π ρ έ πε ι να δ ιαβά σω μέ σω της πα ρακ άτω cmp inc di ;δ ύο φ ο ρές γ ιατ ί έχω και το χρώμα cmp di,18 ; σύγκριση ώ σ τε ν α δε ι πόσ ους αριθμούς π ρέ πε ι να δ ιαβά σε ι je f yge ; ju mp equ a l ;ε άν φτ άσουν τα 1 8/ 2 , 9 στοιχεία δεν θ α π ρέ πε ι να δεχ τε ί άλλ α κ α ι θ α φ ύγε ι jmp k san a ;ξ αν α παίρνε ι κ α ιν ο ύ ργ ιου ς αριθμούς γ ια τα στοιχεία του π ίν ακ α f yg e: call cls ; καθαρίζω την οθ όνη ; μέσω τ ων παρα κάτω εντολών , θα ε κτ υπ ώ σω τα στοιχεία του πίνακ α, 4 ψη φ ία, μέχ ρι κ α ι χ ιλ ιάδες mov bx,1 ;β ά ζω το 1 στ ον bx ; ο bx δ ε ίχνε ι πόσα στοιχεία του πίνακ α θα τ υ πώ σω σε κάθε γραμμ ή mov si,0 ;β άζ ω τ ο 0 στ ον si ; ο s i μ ο υ δε ίχ νε ι τ ο στ οιχε ίο τ ο υ πίνακα θ γ ι ατ ο οποίο μ ιλάω piso: mov ax, array[ s i] ; πα ίρν ουμε έναν έναν τους αριθμούς mov dx,0 ;β ά ζω το 0 στ ον dx mov cx,1000d ;β άζ ω τ ο 1 0 00 στ ον cx div cx ;δ ια ιρούμε τον ax με το 10 0 0, d iv c x τ ο περιεχ όμενο του dx -ax δ ια ι ρ ε ί τ α ι με τ ο πε ριεχ όμε νο του cx, το μη προσημ ασ μέν ο πηλ ίκ ο τοποθετε ίται σ τ ον ax και το υπόλοιπο σ τ ον dx ; την πρώτη φ ορ ά ο ax πε ριέχε ι τ ο πρώτο στ οιχε ίο τ ο υ πίνακα , ά ρ α τ ο δ ια ιρώ με τ ο 1 0 00 γ ια ν α δω πόσες χ ιλ ιάδες έχω, τ ο π ηλ ίκ ο μ παίνε ι στ ον ax , ά ρ α o ax έχε ι το ν ο ύμε ρ ο τω ν χ ιλ ιάδω ν, κ α ι ο dx τ ο υπόλ οιπο της δ ια ίρε σης push ax ;α π ο θηκε ύε ι τ ον a x στην σ τ ο ίβ α ; σώ ζω τ ο ν ο ύμε ρ ο τω ν χ ιλ ιάδω ν στην στ οίβα, περιέχ εται στον ax push ax ;γ ια τ ί η c a ll h ex 2a sc i i τ ο πε ριμέν ε ι α πό το st ack , πε ρν άε ι τ ο πε ριεχ όμενο τ ο υ ax στην h ex 2ascii μέ σω του s t ack call h ex2ascii ; καλ ώ την h ex2ascii ; μετ ατ ρέ πω δ ηλαδ ή τ ον αριθμό τ ων χ ιλ ιάδ ων σε ascii αριθμό , ώστε να τ ο στε ίλω να τ υ πω θε ί μετ ά μ έ σ ω τη ς display p o p ax ;καλώ α πό την στοίβα τον ax, ; καλ ώ δηλαδή το νούμε ρο τω ν χ ιλ ιάδω ν α π ό την στοίβα , τ ο ε ίχε ο ax d i s p buf f er [ 3] ;τ ο δεδ ομέ νο που γ υ ρνά ε ι η h ex2ascii τ ο α π ο θηκε ύε ι στην 4η θ έ ση τ ο υ B uf f er , οπότε , 0,1,2, 3 ;δηλαδή τυπώνε ται ο αριθμ ός των χ ιλ ιάδω ν Εργαστήριο Μικροϋπολογιστικών Συστημάτων | 67 x chg dx , ax ; ο dx περιέχε ι τ ο υπόλοιπο τη ς προηγούμενης διαίρε σης που κ άν αμε, η δ ια ίρεση που κάναμε ή ταν γ ια να βρούμε τ ις χιλιάδες, ; ά ρα μετ ά την exchange, ο ax θ α πε ριέχε ι τ ο υπόλ οιπο της δ ια ίρε σης κ α ι ο dx το ν ο ύμε ρ ο τω ν χ ιλ ιάδω ν mov cl,100d ;βάζω τ ο 1 00 στον c l div cl ;δ ιαιρούμε τ ον ax με τ ο 10 0, d iv c l τ ο περιεχ όμενο του ax δ ι α ι ρ ε ί τ α ι με τ ο πε ριεχ όμενο τ ου cl, το μη π ρο σ η μ α σμ έ ν ο πη λ ίκ ο τοποθετε ίτ αι στον al και τ ο υπόλοιπο σ τ ον ah ; ο ax πε ριέχε ι τ ο υπόλοιπο της δ ια ίρε σης που κάναμε γ ια τ ις χ ιλ ιάδε ς, δ ια ιρώ αυτ όν τ ον αριθμό με το 10 0 γ ια ν α δω πόσ ες ε κατο ντ άδες έχω , τ ο πηλ ίκ ο μ π α ίνε ι στ ον al, ά ρ α o al έχε ι το ν ο ύμε ρ ο τω ν εκατοντάδων και ο ah τ ο υπόλοιπο της δ ια ίρε σης mov dx,0 ;β ά ζω το 0 στ ον dx mov dl, al ;β ά ζω το al στ ον d l , ; ά ρα ο dl θ α έχε ι το ν ο ύμε ρ ο των εκατοντάδων push ax ;α π ο θηκε ύε ι τ ον a x στην σ τ ο ίβ α push dx ;α π ο θηκε ύε ι τ ον dx στην σ τ ο ίβ α call h ex2ascii ; καλ ώ την h ex2ascii ; μετ ατ ρέ πω δ ηλαδ ή τ ον αριθμό τ ων ε κατ ον τάδ ων σ ε ascii αριθμ ό, ώστε ν α τ ο στε ίλω να τ υ πω θε ί μετ ά μ έ σ ω τη ς display p o p ax ;καλώ α πό την στοίβα τον ax ; καλ ώ δηλαδή το νούμε ρο τω ν εκατοντάδων α πό τ η ν στ οίβ α, τ ο ε ίχε ο ax d i s p buf f er [ 3] ;τ ο δεδ ομέ νο που γ υ ρν άει η h ex 2 ascii τ ο α πο θ ηκε ύε ι στην 4 η θέ ση τ ο υ Bu ff er, οπότ ε, 0, 1, 2, 3 ;δηλαδή τυπώνε ται ο αριθμ ός των εκατοντάδων x chg al, ah ; ο ah περιέχε ι τ ο υπόλοιπο τη ς προηγούμενης διαίρε σης που κ άν αμε, η δ ια ίρεση που κάναμε ή ταν γ ια να βρούμε τ ις εκατοντάδες , ; ά ρα μετ ά την exchange, ο a l θα περιέχε ι τ ο υπόλοιπο της διαίρε σης και ο ah τ ο ν ο ύμε ρ ο τω ν εκατοντάδων mov ah,0 ;β ά ζω το 0 στ ον ah mov cl,10d ;β ά ζω το 10 στον c l div cl ;δ ιαιρούμε τ ον ax με τ ο 10 , d iv c l το περιεχόμενο τ ο υ ax δ ια ι ρ ε ί τ α ι με τ ο πε ριεχ όμενο τ ου cl, το μη π ρο σ η μ α σμ έ ν ο πη λ ίκ ο τοποθετε ίτ αι στον al και τ ο υπόλοιπο σ τ ον ah ; ο ax πε ριέχε ι τ ο υπόλοιπο της δ ια ίρε σης που κάναμε γ ια τ ις εκατοντάδ ες, δ ια ιρώ α υτ όν τ ον αριθμό με τ ο 10 γ ια να δω πόσες δεκάδες έχω , τ ο πηλ ίκ ο μ παίνε ι στ ον al, ά ρ α o a l έχε ι τ ο νούμε ρο των δεκάδ ων και ο ah το υπόλοιπο της δ ια ίρε σης mov dx,0 ;β ά ζω το 0 στ ον dx mov dl,al;β άζ ω τ ο al σ τ ον d l, ; ά ρα ο dl θ α έχε ι το ν ο ύμε ρ ο των δε κάδων push ax ;α π ο θηκε ύε ι τ ον a x στην σ τ ο ίβ α push dx ;α π ο θηκε ύε ι τ ον dx στην σ τ ο ίβ α call h ex2ascii ; καλ ώ την h ex2ascii ; μετ ατ ρέ πω δ ηλαδ ή τ ον αριθμό τ ων δε κάδ ων σε ascii αριθμό , ώστε να τ ο στε ίλω να τ υ πω θε ί μετ ά μ έ σ ω τη ς display p o p ax ;καλώ α πό την στοίβα τον ax ; καλ ώ δηλαδή το νούμε ρο τω ν δεκάδων α π ό την στοίβα , τ ο ε ίχε ο ax Εργαστήριο Μικροϋπολογιστικών Συστημάτων | 68 d i s p buf f er [ 3] ;τ ο δεδ ομέ νο που γ υ ρν άει η h ex 2 ascii τ ο α πο θ ηκε ύε ι στην 4 η θέ ση τ ο υ Bu ff er, οπότ ε, 0, 1, 2, 3 ;δηλαδή τυπώνε ται ο αριθμ ός των δε κάδων x chg al, ah ; ο ah περιέχε ι τ ο υπόλοιπο τη ς προηγούμενης διαίρε σης που κ άν αμε, η δ ια ίρεση που κάναμε ή ταν γ ια να βρούμε τ ις δεκάδες , ; ά ρα μετ ά την exchange, ο a l θα περιέχε ι τ ο υπόλοιπο της διαίρε σης και ο ah τ ο ν ο ύμε ρ ο τω ν δεκάδων mov ah,0 ;β ά ζω το 0 στ ον ah push ax ;α π ο θηκε ύε ι τ ον a x στην σ τ ο ίβ α, ο ax πε ριέχ ε ι τελ ικά μ όν ο τ ις μ ονάδ ε ς ( ο a l θα πε ριέχ ε ι το υπόλ οιπο της δ ια ίρε σης , δηλαδ ή τ ις μ ον άδ ε ς και ο ah το “0” ) push ax ;α π ο θηκε ύε ι τ ον a x στην σ τ ο ίβ α call h ex2ascii ; καλ ώ την h ex2ascii ; μετ ατ ρέ πω δ ηλαδ ή τ ον αριθμό τ ων μ ο νάδ ων σε ascii αριθμό , ώστε να τ ο στε ίλω να τ υ πω θε ί μετ ά μ έ σ ω τη ς display p o p ax ;καλώ α πό την στοίβα τον ax, ; ο ax πε ριέχε ι τε λ ικά μ όν ο τ ις μονάδε ς) d i s p buf f er [ 3] ;τ ο δεδ ομέ νο που γ υ ρν άει η h ex 2 ascii τ ο α πο θ ηκε ύε ι στην 4 η θέ ση τ ο υ Bu ff er, οπότ ε, 0, 1, 2, 3 ;δηλαδή τυπώνε ται ο αριθμ ός των μονάδω ν d i s p m e1 ; τ υπ ώνω τ ο m e 1 in c si ;point er τ ο υ array, πάω στ ο επόμενο στοιχείο τ ο υ π ίν ακ α in c si ;δ ύο φ ο ρές γιατ ί έχω και το χρώμα in c bx ;α υξ άν ω τ ον bx κ ατ ά έ ν α, η προηγ ούμ ενη τ ιμή που είχε ήταν 1, θ α πάε ι μέχ ρι 4, ώ στε να μην τ υ πώ σε ι στην ίδ ια γ ραμμή κ α ι 4 ο στοιχείο ; ο bx δ ε ίχνε ι πόσα στοιχεία του πίνακ α θα τ υ πώ σω σε κάθε γραμμ ή c mp bx, 4d ; πότε θα αλλάξε ι γ ραμμή j n e p i s o ;ju mp if not e qu a l ; παίρνε ι και άλλ α στ οιχε ία τ ου πίνακ α, ε άν τυπώσε ι τ ρ ία στ οιχε ία τ ου πίνακ α σ ε μ ία γ ραμμή , τότε θ α α λ λ άξε ι γ ρ αμ μή mov bx,1 ;β ά ζω στ ον bx τ ο 1 ; ξανακ άνω τ ον bx “ 1”, θ α πάε ι μέχ ρι 4, ώ στε να μη ν τ υ πώσ ε ι στην ίδ ια γ ραμμή και 4 ο στοιχείο ; ο bx δ ε ίχνε ι πόσα στοιχεία του πίνακ α θα τ υ πώ σω σε κάθε γραμμ ή d i s p m es ; τ υπ ώνω τ ο mes ; αλλ ά ζε ι γραμμή c m p s i, 18d ; πόσα στ οιχε ία θ α π ρέ πε ι να τυπώσε ι j n e p i s o ;ju mp if not e qu a l ; παίρνε ι και άλλ α στ οιχε ία τ ου πίνακ α, μέχ ρι ν α τυπώ σε ι και τ α 18/2, 9 στ οιχ ε ία τ ο υ π ίν ακ α ; /// /// /// // /// /// /// // /// /// /// // / f in ish: mov lin e1, 0d ;μηδ εν ίζω τ ο lin e1 lea si,mes1 ; τυπώνω την ε π ιλ ογ ή 1 mov di, line1 ;μ ηδενίζω τ ον d i, αφ ού μετ αφέ ρω το lin e1 στον d i ; ο d i δε ίχνε ι στη ν αρχή της πρώτ ης γ ραμμής Εργαστήριο Μικροϋπολογιστικών Συστημάτων | 69 m1: movsb ;( M OVSB , E S:[D I] = D S:[SI]; D I = DI ± 1; SI = SI ± 1 (byte t r an sf e rr ed , Η ε ντ ολή M OV S με ταφέ ρε ι έ να by t e, μ ια λέ ξη ή μ ια δ ιπλή λέξη α πό μ ια θ έ ση μν ήμη ς τ ο υ τμή ματος δεδ ομέ νων που δ ιε υθυν σ ιοδ οτείτ α ι α π ό τον SI, σε μ ια θέ ση μ νήμης τ ου έ ξτ ρα τμή ματος που δ ιε υθ υν σ ιοδ οτε ίτα ι α πό τ ον DI.) in c di ;α υξ άν ω τ ον d i c mp byt e p t r[s i] ,eom ;έ αν δεν έχω eom τ ό τε θα ξα να πά ω σ τ ο m1, ώστε να τ υ πώ σω όλ ο τ ο μήνυμ α τη ς επιλογής 1 jne m1 ; ju mp if n ot equ a l ;ε άν έχω eom τ ότε θ α πάω τελ ικά ν α τ υπ ώ σω την ε π όμε νη ε πιλογή lea si,mes2 ; τυπώνω την ε π ιλ ογ ή 2 add lin e1,160d ;έχει σαν α π οτέ λε σμα να δε ίχ νουμε στην αρχή της επόμενη ς γ ραμμή ς mov di, line1 ; ο d i δε ίχ νε ι στην α ρχ ή της ε πό μενης γ ραμ μής m2: movsb ;( M OVSB , E S:[D I] = D S:[SI]; D I = DI ± 1; SI = SI ± 1 (byte t r an sf e rr ed , Η ε ντ ολή M OV S με ταφέ ρε ι έ να by t e, μ ια λέ ξη ή μ ια δ ιπλή λέξη α πό μ ια θ έ ση μν ήμη ς τ ο υ τμή ματος δεδ ομέ νων που δ ιε υθυν σ ιοδ οτείτ α ι α π ό τον SI, σε μ ια θέ ση μ νήμης τ ου έ ξτ ρα τμή ματος που δ ιε υθ υν σ ιοδ οτε ίτα ι α πό τ ον DI.) in c di ;α υξ άν ω τ ον di c mp byt e p t r[s i] ,eom ;έ αν δεν έχω eom τ ό τε θα ξα να πά ω σ τ ο m1, ώστε να τ υ πώ σω όλ ο τ ο μήνυμ α τη ς επιλογής 2 jne m2 ; ju mp if n ot equ a l ;ε άν έχω eom τ ότε θ α πάω τελ ικά ν α τ υπ ώ σω την ε π όμε νη ε πιλογή lea si,mes0 ; τυπώνω την ε π ιλ ογ ή 0 add lin e1,160d ;έχει σαν α π οτέ λε σμα να δε ίχ νουμε στην αρχή της επόμενη ς γ ραμμή ς mov di, line1 ; ο d i δε ίχ νε ι στην α ρχ ή της ε πό μενης γ ραμ μής m0: movsb ;( M OVSB , E S:[D I] = D S:[SI]; D I = DI ± 1; SI = SI ± 1 (byte t r an sf e rr ed , Η ε ντ ολή M OV S με ταφέ ρε ι έ να by t e, μ ια λέ ξη ή μ ια δ ιπλή λέξη α πό μ ια θ έ ση μν ήμη ς τ ο υ τμή ματος δεδ ομέ νων που δ ιε υθυν σ ιοδ οτείτ α ι α π ό τον SI, σε μ ια θέ ση μ νήμης τ ου έ ξτ ρα τμή ματος που δ ιε υθ υν σ ιοδ οτε ίτα ι α πό τ ον DI.) in c di ;α υξ άν ω τ ον d i c mp byt e p t r[s i] ,eom ;έ αν δεν έχω eom τ ό τε θα ξα να πά ω σ τ ο m1, ώστε να τ υ πώ σω όλ ο τ ο μήνυμ α τη ς επιλογής 1 jne m0 ; ju mp if n ot equ a l ;ε άν έχω eom τ ότε θ α συνεχίσω στ ο πρόγ ραμμα μ ο υ k bd : m o v ah, 6 ; πε ριμένε ι να δ ο θε ί ε πιλογή και μ ε τά κάνε ι ; με ah= 6 έχω direct console read write ; AH = 06H, D L=0 FFH o r D L=AS CI I ch a ra c t er ; If DL = 0F FH on ent ry , th e n th is fun ct io n reads th e console. If DL = ASC I I charact er, th en th is fu nct ion displays the ASC II ch aracter on the console (CON ) video screen . mov dl, 0ffh ; ανα λ όγω ς κ αλε ί κ α ι την κατ άλλ ηλη συν ά ρτη ση in t 21h je kbd ; jump e qu a l “ 1” c m p a l, ' 1' ;ελέγχ ω τε λ ικ ά ε άν πατήθηκε τ ο “ 1”, δηλαδή ε άν πατήθηκε η ε π ιλ ο γή je start1 ; jump equal Εργαστήριο Μικροϋπολογιστικών Συστημάτων | 70 cmp al, ' 2' ;ελέγχ ω τε λ ικ ά ε άν πατήθηκε τ ο “ 2”, δηλαδή ε άν πατήθηκε η ε π ιλ ο γή “ 2” j n e i 0 ; jump if not equal call meshti ;κ αλώ την υπορουτ ίνα meshti i0: “ 0” cmp al, ' 0' ;ελέγχ ω τε λ ικ ά ε άν πατήθηκε τ ο “ 0”, δηλαδή ε άν πατήθηκε η ε π ιλ ο γή je tel ; jump equal ; /// /// /// // /// /// /// // /// /// /// // / j m p f in i s h t el: ret ;retu rn f r om p roc ed u r e main en dp ;τ έ λ ος κύριας ρουτ ίνας cls proc near ; kath ariz ei tn othonh mov di,0 ; καθαρισμός τ ου D I, d i δ ε ίκ της προορισμού mov al,' ' ; τ οπ ο θετώ τ ον χ α ρα κτή ρα s pa c e, τ ο κ ε ν ό στ ον AL mov ah, color τοποθετώ τ ον κ ωδ ικ ό του χ ρώμ ατος στ ον AH ; sp a c e ch a ra ct e r + c o l o r = 1 b y t e + 1 b y t e = 2 b y t es mov cx, sc rw ; φορτώνε ις τ ο ν ο ύμε ρ ο 80 x2 5 στ ον count er cx rep st ow s ;st osw, AX E S:D I, DI DI+ 2, κάνε ι repeat to stosw όσες φ ορ έ ς λέ ε ι ο C X, es ex tr a s eg ment επιπλέον τμή μα, κ ρατ ά δεδ ομένα προορισμού τ ων εντολών δ ιαχε ίρισης συμβολοσ ειρώ ν s t rin g s ret ;retu rn f r om p roc ed u r e c l s end p ;τέ λ ος τ η ς υπορουτίνας c ls k e ys p ro c n e a r ;δ ιαβ ά ζε ι α π ό τ ο πληκ τ ρολ όγ ιο μέχ ρι 25 5 χ α ρα κτή ρες mov buf1,255 ; ή μέχ ρι ν α πα τη θεί τ ο ent er και τ ο υς α π ο θηκε ύε ι σ τ ο mov dx, off s et buf 1 ; buf 1 call lin es ; καλ ώ τη ν L in e s ret ;retu rn f r om p roc ed u r e k eys en dp ;τέλ ος της υπορουτίνας k ey s lin es proc n ear ; με χ ρή ση της υπο ρ ο υ τ ίν α ς 0AH τ ο υ D O S mov ah,0ah ; μ πο ρε ί να δ ιαβάσε ι μέχ ρι 2 5 5 χ αρακ τή ρες in t 21h ; α π ό το πλη κτ ρολ όγ ιο κ α ι τ ο α π οθη κε ύε ι σ τ ο buf 1 ret ;retu rn f r om p roc ed u r e lin es endp ;τέλ ος της υπορουτίνας lin es ME SHT I proc n ear ;υπορουτίνα ME SHT I, βρίσκε ι τη μέ ση τ ιμή τ ο υ π ίν ακ α κ α ι την εκτυπώνε ι call cls ;κ αλε ί την c l s (κ αθ α ρ ίζε ι τη ν οθόνη) mov bx, 0 ;β ά ζω τ ο 0 στον bx ;αρχ ικοποίηση κάποιων κατ αχ ω ρητ ών mov di, 0 ; μετρητής στ οιχε ίων, ν ού με ρ α, τ οπ ο θε τε ί τ ο 0 στ ον d i ; παίρνε ι τα ν ο ύμε ρα α πό τ ο πλη κτ ρολ όγ ιο rt y: mov ax ,array[di] ;di ο count er, τ ο arra y ε ίναι δ ομη μέν ο σε word, ο d i σε b y t e, παίρνε ι τελ ικά α ν άλο γ α με τη τ ιμή τ ο υ di, τ ο στ οιχε ίο που έχε ι αποθηκευτεί στον array κ α ι τ ο βάζε ι σ τ ον ax, πα ί ρν ω τελ ικ ά έ ν α έ ν α τα στοιχε ία add bx, ax ; προσ θέ τε ι τ ον bx με τον ax, Εργαστήριο Μικροϋπολογιστικών Συστημάτων | 71 ; ά ρα ο bx έχε ι τ η ν πρώτη φ ορ ά , όπου έχω di=0, το 1 ο στ οιχε ίο τ ο υ π ίν ακ α ; τελ ικά ο bx θα έχε ι το άθροισμα όλων τ ων στ οιχε ίων του array in c di ; αυξά νω τον δε ίκτη, τελ ικ ά τ ό σες φ ο ρές μέχ ρι να ορίσ ω πόσ ους α ρ ι θ μ ο ύς π ρ έ πε ι να δ ιαβά σω μέ σω της πα ρακ άτω cmp in c di ;δ ύο φ ορ έ ς γ ιατ ί έχω και το χ ρώμ α cmp di, 18 ; σύγκριση ώ στε ν α δε ι πόσους α ρι θ μ ο ύς π ρέ πε ι ν α δ ια β ά σε ι j e got it ; jump e qu a l ;ε άν φτ άσουν τα 1 8/ 2 , 9 στοιχεία δεν θ α π ρέ πε ι να δ ιαβ άσε ι άλ λα κ α ι θ α φ ύγε ι jmp rty g o t it : mov dx, 0 ;β ά ζω τ ο 0 στον dx ;αρχ ικοποίηση κάποιων κατ αχ ω ρητ ών mov ax, bx ; ο bx ε ίχε τ ο άθροισμ α όλ ων των στ οιχε ίων τ ο υ ar r ay , τ ο οποίο τ ο σ ώ ζω στ ον ax mov cx, 9 ;βάζω τ ο 9 στον cx div cx ;δ ια ιρούμε τ ον ax με τ ο 9, div c x τ ο πε ριεχ όμενο τ ο υ dx -ax δ ι α ι ρ ε ίτ α ι με τ ο πε ριεχ όμενο τ ου cx , το μη π ρο σ η μ α σμ έ ν ο πη λ ίκ ο τοποθετε ίτ αι στον ax και τ ο υπόλοιπο σ τ ον dx ;δηλαδή διαιρώ τ ο άθροισμα (ήταν στον ax ) με τ ο πλ ήθ ος τω ν στ οιχείω ν (ήταν στ ον cx), τ ο πηλ ίκ ο ( α π οτέ λε σμα, ο ακέ ρα ιος μέ σος όρος) τ ο ποθ ε τε ίτα ι στ ον ax κ α ι το υπόλοιπο σ τ ον dx mov ph lik o[ 0],ax ;βάζω τ ον ακέραιο μέ σο όρο στ ο phlik o[ 0] mov ph lik o[ 2],' ,' ;βάζω τ ον χαρακτήρα “ ,” στ ο ph lik o[2] mov ph lik o[ 3],' $' ;β ά ζω τ ον χαρακτήρα “ $” σ τ ο ph lik o[ 3] cmp dx, 0 ; σύγκριση τ ο υ dx με τ ο 0, ο dx περιέχε ι τ ο υπόλοιπο τη ς δ ια ίρεσ ης που κ άν αμε, εάν ε ίναι 0 τότε πάω στ ο u io ώστε να τ υπ ώ σω τον α ρ ι θμ ό je u io ; jump equal mov cx, 10 ;βάζω τ ο 10 σ τ ον cx mov ax, dx ;βάζω τ ον dx στ ον ax, β άζ ω τ ο υπόλοιπο της προη γούμε νης δ ια ίρε σης σ τ ον ax mu l cx ; τ ο περιεχ όμενο του ax πολ λ α πλ ασ ι ά ζ ε τ α ι με τ ο πε ριεχόμενο τ ο υ cx και τ ο μη προσημ ασ μέν ο αποτέλεσμα τ ο π οθε τε ίτα ι στ ον dx- ax , ; π ολλα πλ α σιά ζω δηλαδή το υπόλοιπο της προη γούμε νης δ ια ίρε σης με τ ο 10 mov cx, 9 ;β ά ζω τ ο 9 στον cx mov dx, 0 ; βάζω τ ο 0 στον dx div cx ;τ ο πε ριεχ όμε νο του dx-ax διαιρε ίται με τ ο 9, div c x τ ο πε ριεχ όμενο τ ο υ dx-ax δια ιρείτα ι με τ ο πε ριεχόμενο τ ο υ cx, τ ο μη προσ ημασμένο πη λίκ ο τ ο π οθετ ε ίτ α ι σ τ ον ax και το υπόλ οιπο στον dx ;δηλαδή διαιρώ τ ο υπόλοιπο – πολλαπλασιασμένο ε π ί 10 (ήταν στον dx- ax ) με τ ο π λ ή θ ος τω ν στ οιχείω ν (ήταν στ ον cx ), το πηλ ίκο (αποτέλεσμα ) τ ο π οθ ε τε ίτα ι στ ον ax κ α ι τ ο υπόλοιπο στον dx mov ph lik o[ 6],ax ;τ ο π οθετ ώ τ ο πηλ ίκ ο – αποτέλεσμα, το οποίο ήταν στον ax στο ph lik o[ 6], πε ριέχε ι τε λ ικ ά το 1 ο δε καδ ικό cmp dx, 0 ; συγκ ρίνω το υπόλοιπο με τ ο 0, ο dx πε ριέχε ι τ ο υπόλοιπο της τε λε υτ αίας δ ια ίρε σης , εάν ε ίναι 0 τ ό τε π ά ω στ ο uio ώστε να τ υ πώ σω τον α ρ ι θμ ό je u io ; jump equal mov cx, 10 ;βάζω τ ο 10 σ τ ον cx Εργαστήριο Μικροϋπολογιστικών Συστημάτων | 72 mov ax, dx ;βάζω τ ον dx στ ον ax, β άζ ω τ ο υπόλοιπο της τελευταίας δ ια ίρε σης σ τ ον ax mu l cx ; τ ο περιεχ όμενο του ax πολ λ α πλ ασ ι ά ζ ε τ α ι με τ ο πε ριεχόμενο τ ο υ cx και τ ο μη προσημ ασ μέν ο αποτέλεσμα τ ο π οθε τε ίτα ι στ ον dx- ax , ; π ολλ α πλ α σιά ζω δηλαδή το υπόλοιπο της τελευταίας δ ια ίρε σης με το 10 mov cx, 9 ;β ά ζω τ ο 9 στον cx mov dx, 0 ; βάζω τ ο 0 στον dx div cx ;τ ο πε ριεχ όμε νο του dx-ax διαιρε ίται με τ ο 9, div c x τ ο πε ριεχ όμενο τ ο υ dx-ax δια ιρείτα ι με τ ο πε ριεχόμενο τ ο υ cx, τ ο μη προσ ημασμένο πη λίκ ο τ ο π οθετ ε ίτ α ι σ τ ον ax και το υπόλ οιπο στον dx ;δηλαδή διαιρώ τ ο υπόλοιπο – πολλαπλασιασμένο ε π ί 10 (ήταν στον dx- ax ) με τ ο π λ ή θ ος τω ν στ οιχείω ν (ήταν στ ον cx ), το πηλ ίκο (αποτέλεσμα ) τ ο π οθ ε τε ίτα ι στ ον ax κ α ι τ ο υπόλοιπο στον dx mov ph lik o[ 8],ax ;τ ο π οθετ ώ τ ο πηλ ίκ ο – αποτέλεσμα, το οποίο ήταν στον ax στο ph lik o[ 8], πε ριέχε ι τε λ ικ ά το 2 ο δε καδ ικό u io: ; ekt ypon et e o pin ak as ph lik o mov ax, ph lik o[ 0] ;παίρνω τη μέση τ ιμή που έχ ω υπολ ογ ίσε ι ώ στε να τη ν τ υ πώ σω mov dx,0 ;β ά ζω το 0 στ ον dx mov cx,1000d ;βάζω τ ο 10 00 στ ον cx div cx ;δ ια ιρούμε τον ax με το 10 0 0, d iv c x τ ο περιεχ όμενο του dx -ax δ ια ι ρ ε ί τ α ι με τ ο πε ριεχ όμε νο του cx, το μη προσημ ασ μέν ο πηλ ίκ ο τοποθετε ίται σ τ ον ax και το υπόλοιπο σ τ ον dx ; την πρώτη φ ορ ά ο ax πε ριέχε ι τ ο πρώτο στ οιχε ίο τ ο υ πίνακα ph liko, ά ρα τ ο δ ια ιρώ με τ ο 1 00 0 για ν α δω πόσες χ ιλ ιάδ ες έχω , το πηλ ίκο μπαίνε ι στ ον ax, άρα o ax έχε ι τ ο ν ο ύμε ρ ο τω ν χ ιλ ιάδω ν, κ α ι ο dx τ ο υπόλ οιπο της δ ια ίρε σης push ax ;α π ο θηκε ύε ι τ ον a x στην σ τ ο ίβ α ; σώ ζω τ ο ν ο ύμε ρ ο τω ν χ ιλ ιάδω ν στην στ οίβα, περιέχ εται στον ax push ax ;γ ια τ ί η c a ll h ex 2a sc i i τ ο πε ριμέν ε ι α πό το st ack , πε ρν άε ι τ ο πε ριεχ όμενο τ ο υ ax στην h ex 2ascii μέ σω του s t ack call h ex2ascii ; καλ ώ την h ex2ascii ; μετ ατ ρέ πω δ ηλαδ ή τ ον αριθμό τ ων χ ιλ ιάδ ων σε ascii αριθμό , ώστε να τ ο στε ίλω να τ υ πω θε ί μετ ά μ έ σ ω τη ς display p o p ax ;καλώ α πό την στοίβα τον ax ; καλ ώ δηλαδή το νούμε ρο τω ν χ ιλ ιάδω ν α π ό την στοίβα , τ ο ε ίχε ο ax d i s p buf f er [ 3] ;τ ο δεδ ομέ νο που γ υ ρν άει η h ex 2 ascii τ ο α πο θ ηκε ύε ι στην 4 η θέ ση τ ο υ Bu ff er, οπότ ε, 0, 1, 2, 3 x chg dx , ax ; ο dx περιέχε ι τ ο υπόλοιπο τη ς προηγούμενης διαίρε σης που κ άν αμε, η δ ια ίρεση που κάναμε ή ταν γ ια να βρούμε τ ις χιλιάδες, ; ά ρα μετ ά την exchange, ο ax θ α πε ριέχε ι τ ο υπόλ οιπο της δ ια ίρε σης κ α ι ο dx το ν ο ύμε ρ ο τω ν χ ιλ ιάδω ν mov cl,100d ;βάζω τ ο 1 00 στον c l div cl ;δ ιαιρούμε τ ον ax με τ ο 10 0, d iv c l τ ο περιεχ όμενο του ax δ ι α ι ρ ε ί τ α ι με τ ο πε ριεχ όμενο τ ου cl, το μη π ρο σ η μ α σμ έ ν ο πη λ ίκ ο τοποθετε ίτ αι στον al και τ ο υπόλοιπο σ τ ον ah ; ο ax πε ριέχε ι τ ο υπόλοιπο της δ ια ίρε σης που κάναμε γ ια τ ις χ ιλ ιάδε ς, δ ια ιρώ αυτ όν τ ον αριθμό με το 10 0 γ ια ν α δω πόσ ες ε κατο ντ άδες έχω , τ ο πηλ ίκ ο μ π α ίνε ι στ ον al, ά ρ α o al έχε ι το ν ο ύμε ρ ο τω ν εκατοντάδων και ο ah τ ο υπόλοιπο της δ ια ίρε σης mov dx,0 ;β ά ζω το 0 στ ον dx Εργαστήριο Μικροϋπολογιστικών Συστημάτων | 73 mov dl, al ;β ά ζω το al στ ον d l , ; ά ρα ο dl θ α έχε ι το ν ο ύμε ρ ο των εκατοντάδων push ax ;α π ο θηκε ύε ι τ ον a x στην σ τ ο ίβ α push dx ;α π ο θηκε ύε ι τ ον dx στην σ τ ο ίβ α call h ex2ascii ; καλ ώ την h ex2ascii ; μετ ατ ρέ πω δ ηλαδ ή τ ον αριθμό τ ων ε κατ ον τάδ ων σ ε ascii αριθμ ό, ώστε ν α τ ο στε ίλω να τ υ πω θε ί μετ ά μ έ σ ω τη ς display p o p ax ;καλώ α πό την στοίβα τον ax ; καλ ώ δηλαδή το νούμε ρο τω ν εκατοντάδων α πό τ η ν στ οίβ α, τ ο ε ίχε ο ax d i s p buf f er [ 3] ;τ ο δεδ ομέ νο που γ υ ρν άει η h ex 2 ascii τ ο α πο θ ηκε ύε ι στην 4 η θέ ση τ ο υ Bu ff er, οπότ ε, 0, 1, 2, 3 ;δηλαδή τυπώνε ται ο αριθμ ός των εκατοντάδων x chg al, ah ; ο ah περιέχε ι τ ο υπόλοιπο τη ς προηγούμενης διαίρε σης που κ άν αμε, η δ ια ίρεση που κάναμε ή ταν γ ια να βρούμε τ ις εκατοντάδες , ; ά ρα μετ ά την exchange, ο a l θα περιέχε ι τ ο υπόλοιπο της διαίρε σης και ο ah τ ο ν ο ύμε ρ ο τω ν εκατοντάδων mov ah,0 ;β ά ζω το 0 στ ον ah mov cl,10d ;β ά ζω το 10 στον c l div cl ;δ ιαιρούμε τ ον ax με τ ο 10 , d iv c l το περιεχόμενο τ ο υ ax δ ια ι ρ ε ί τ α ι με τ ο πε ριεχ όμενο τ ου cl, το μη π ρο σ η μ α σμ έ ν ο πη λ ίκ ο τοποθετε ίτ αι στον al και τ ο υπόλοιπο σ τ ον ah ; ο ax πε ριέχε ι τ ο υπόλοιπο της δ ια ίρε σης που κάναμε γ ια τ ις εκατοντάδ ες, δ ια ιρώ α υτ όν τ ον αριθμό με τ ο 10 γ ια να δω πόσες δεκάδες έχω , τ ο πηλ ίκ ο μ παίνε ι στ ον al, ά ρ α o a l έχε ι τ ο νούμε ρο των δεκάδ ων και ο ah το υπόλοιπο της δ ια ίρε σης mov dx,0 ;β ά ζω το 0 στ ον dx mov dl, al ;β ά ζω το al στ ον d l , ; ά ρα ο dl θ α έχε ι το ν ο ύμε ρ ο των δε κάδων push ax ;α π ο θηκε ύε ι τ ον a x στην σ τ ο ίβ α push dx ;α π ο θηκε ύε ι τ ον dx στην σ τ ο ίβ α call h ex2ascii ; καλ ώ την h ex2ascii ; μετ ατ ρέ πω δ ηλαδ ή τ ον αριθμό τ ων δε κάδ ων σε ascii αριθμό , ώστε να τ ο στε ίλω να τ υ πω θε ί μετ ά μ έ σ ω τη ς display p o p ax ;καλώ α πό την στοίβα τον ax ; καλ ώ δηλαδή το νούμε ρο τω ν δεκάδων α π ό την στοίβα , τ ο ε ίχε ο ax d i s p buf f er [ 3] ;τ ο δεδ ομέ νο που γ υ ρν άει η h ex 2 ascii τ ο α πο θ ηκε ύε ι στην 4 η θέ ση τ ο υ Bu ff er, οπότ ε, 0, 1, 2, 3 ;δηλαδή τυπώνε ται ο αριθμ ός των δε κάδων x chg al, ah ; ο ah περιέχε ι τ ο υπόλοιπο τη ς προηγούμενης διαίρε σης που κ άν αμε, η δ ια ίρεση που κάναμε ή ταν γ ια να βρούμε τ ις δεκάδες , ; ά ρα μετ ά την exchange, ο a l θα περιέχε ι τ ο υπόλοιπο της διαίρε σης και ο ah τ ο ν ο ύμε ρ ο τω ν δεκάδων mov ah,0 ;β ά ζω το 0 στ ον ah push ax ;α π ο θηκε ύε ι τ ον a x στην σ τ ο ίβ α, ο ax πε ριέχ ε ι τελ ικά μ όν ο τ ις μ ονάδ ε ς ( ο a l θα πε ριέχ ε ι το υπόλ οιπο της δ ια ίρε σης , δηλαδ ή τ ις μ ον άδ ε ς και ο ah το “0” ) push ax ;α π ο θηκε ύε ι τ ον a x στην σ τ ο ίβ α call h ex2ascii ; καλ ώ την h ex2ascii Εργαστήριο Μικροϋπολογιστικών Συστημάτων | 74 ; μετ ατ ρέ πω δ ηλαδ ή τ ον αριθμό τ ων μ ο νάδ ων σε ascii αριθμό , ώστε να τ ο στε ίλω να τ υ πω θε ί μετ ά μ έ σ ω τη ς display p o p ax ;καλώ α πό την στοίβα τον ax, ; ο ax πε ριέχε ι τε λ ικά μ όν ο τ ις μονάδε ς) d i s p buf f er [ 3] ;τ ο δεδ ομέ νο που γ υ ρν άει η h ex 2 ascii τ ο α πο θ ηκε ύε ι στην 4 η θέ ση τ ο υ Bu ff er, οπότ ε, 0, 1, 2, 3 ;δηλαδή τυπώνε ται ο αριθμ ός των μονάδω ν ; τελ ικά τ υπ ών ω τ ον ακέ ρα ιο αριθμό disp ph liko[ 2] ;τ υ πώ νω τ ον ph lik o[ 2] , τ υ πώ νω το “ ,” push ph lik o[ 6] ; σώζω τ ο τ ο ph lik o[ 6], το 1 ο δεκαδ ικό call h ex2ascii ; καλ ώ την hex2ascii d i s p buf f er [ 3] ;τ ο δεδ ομέ νο που γ υ ρν άει η h ex 2 ascii τ ο α πο θ ηκε ύε ι στην 4 η θέ ση τ ο υ Bu ff er, οπότ ε, 0, 1, 2, 3 ; τ υπ ώνω τ ον ph lik o[ 6] , τ υ πών ω τ ο 1 ο δεκ αδ ικό push ph lik o[ 8] ; σώζω τ ο τ ο ph lik o[ 8], το 2 ο δεκαδ ικό call h ex2ascii ; καλ ώ την hex2ascii d i s p buf f er [ 3] ;τ ο δεδ ομέ νο που γ υ ρν άει η h ex 2 ascii τ ο α πο θ ηκε ύε ι στην 4 η θέ ση τ ο υ Bu ff er, οπότ ε, 0, 1, 2, 3 ; τ υπ ώνω τ ον ph lik o[ 8] , τ υ πών ω τ ο 2 ο δεκ αδ ικό ret ;retu rn f r om p roc ed u r e ME SHTI en dp ;τέλος υπορουτίνας ME SHT I H E X2 A SC II P R OC N E AR ; υπορουτ ίνα HE X2ASC II ; C o nv e rts a w or d v a r ia b le to ASC I I ; W r it es th e r esu lt s in t he BUF FER ( 4 by t es) v a r ia b le ; P A R AM E T E R S ; g et s a wor d va r ia ble f ro m the st ac k p u sh b p ;α π οθ ηκε ύε ι τ ο ν b p στη ν στ οίβα mov bp,sp mov ax, [bp+4] ; ta k e in put v a r iab le push cx ; α π οθηκε ύε ι τ ο ν cx στη ν στ οίβα mov cx,4 mov bp, cx H 2A 1: push ax ;α π ο θηκε ύε ι τ ο ν cx στη ν στ οίβα and al,0Fh add al,30h cmp a l , '9 ' jbe H 2A2 add al,7h dec cx mov bp, cx H 2A 2: Εργαστήριο Μικροϋπολογιστικών Συστημάτων | 75 mov buffer[bp],al pop ax ror ax,4 jnz H 2A1 pop cx ; καλ ώ α π ό την στ οίβα τ ον c x pop b p ;καλώ α π ό την στ οίβα τ ον b p ret 2 ;return from procedure HE X2ASCII ENDP ; τέλ ος υπορουτίνας HE X2ASC II C ODE _SEG en ds ;τέλ ος τ ο υ τ µή µατος κ ώδ ικ α end start ; τέλ ος τ ου as s e mb l y προγ ράµ µ ατ ος Εργαστήριο Μικροϋπολογιστικών Συστημάτων | 76 ΠΡΟΒΛΗΜΑΤΑ ΑΣΚΗΣΗΣ 7 ΥΠΟΛΟΓΙΣΜΟΣ ΜΕΣΟΥ ΟΡΟΥ ΣΕ ΠΙΝΑΚΑ, ΥΠΟΡΟΥΤΙΝΕΣ, ΜΑΚΡΟΕΝΤΟΛΕΣ ΠΡΟΒΛΗΜΑ 1 Ν α γ ρ αφε ί π ρ ό γ ρα µµ α σε as semb ly τ ων ε πε ξε ργα σ τών τ η ς Intel τ ο οποίο ν α υ λ ο π ο ιη θε ί π ρ ό γ ραμ μ α τ ο οποίο θ α δέχεται α π ό τ ον χ ρήστη τ α στ οιχε ία ενός πίνακα 4* 4 . Μετ ά μέ σω lo o k u p tab l e ν α μπορε ί ν α ξ ανά ε ισ άγε ι στοιχεία (ε πιλ ο γή 1) ή να βγαίνε ι α π ό τ ο π ρ ό γ ραμ μ α (ε π ιλ ογή 0) , ή να υ π ο λ ογ ίζε ι τ ο άθροισμ α όλω ν τω ν στ οιχε ίω ν του π ίν ακ α (ε π ιλ ογή 2 ) , ή ν α υπολογ ίζει τ ο μέ σο όρο (ε π ιλ ογ ή 3) ή να υ π ολο γ ί ζ ε ι τ ο τε τ ράγ ωνο τ ο υ μέσου όρου (ε π ιλ ογ ή 4). Εργαστήριο Μικροϋπολογιστικών Συστημάτων | 77 ΕΡΓΑΣΤΗΡΙΟ ΑΡΧΙΤΕΚΤΟΝΙΚΗΣ & ΛΕΙΤΟΥΡΓΙΑΣ Η/Υ Διδ άσκων: Ε υάγ γελος Τ οπ άλης Δρ. Ηλ εκτρολ όγ ος Μηχ αν ικ ός & Τεχν ολ ογ ία ς Υ πολ ογ ιστών ΑΣΚΗΣΗ 8 ΕΛΕΓΧΟΣ ΣΤΗΝ ΤΑΧΥΤΗΤΑ ΚΑΙ ΣΤΗ ΦΟΡΑ ΕΝΟΣ ΚΙΝΗΤΗΡΑ ΜΕ ΓΡΑΜΜΙΚΟ ΠΟΤΕΝΣΙΟΜΕΤΡΟ Χρησιμοποιήστε κατάλληλα το γραμμικό ποτενσιόμετρο έτσι ώστε να επιτευχθεί έλεγχος στη φορά περιστροφής του κινητήρα. Στο κέντρο της πλήρους διαδρομής του ποτενσιόμετρου, ο κινητήρας θα σταματά να περιστρέφεται. Η φοράς περιστροφής θα καθορίζεται από το αν η τιμή που επιστρέφει ο ADC μετατροπέας βρίσκεται πριν ή μετά το παραπάνω σημείο ακινησίας του κινητήρα. Γνωρίζοντας ότι οι ADC μετατροπείς δεν παρέχουν πάντοτε σταθερή τιμή στην έξοδό τους, συνυπολογίστε την ύπαρξη μιας μικρής ανοχής στο σημείο ακινησίας του κινητήρα. Ανάπτυξη Εργαστήριο Μικροϋπολογιστικών Συστημάτων | 78 Η τάση τροφοδοσίας του κινητήρα προέρχεται απευθείας από την τάση τροφοδοσίας του Flight Application Board χωρίς κάποια σταθεροποίηση, και αυτό για να αποφευχθεί η δημιουργία θορύβου στα κυκλώματα που τροφοδοτούνται από σταθεροποιημένη τάση. Η αλλαγή της φοράς περιστροφής επιτυγχάνεται εφαρμόζοντας ανεστραμμένη τάση στον κινητήρα, με τη βοήθεια του ρελαί Κ1. Για τη σωστή λειτουργία του προγράμματος ο διακόπτης SW4A θα πρέπει να βρίσκεται στη θέση ‘ADC’ και ο SW4B στη θέση ‘MOTOR’. Λαμβάνοντας υπόψιν την ανοχή που πρέπει να δοθεί στο σημείο ακινησίας του κινητήρα, οι εκμεταλλεύσιμες τιμές για τον έλεγχο των στροφών του κινητήρα είναι από 0 ως 42Η, μιας και το σημείο ακινησίας είναι από την τιμή 43Η ως και την τιμή 45Η Αρχικά σχεδιάζουμε το διάγραμμα ροής του προγράμματος: Εργαστήριο Μικροϋπολογιστικών Συστημάτων | 79 Εργαστήριο Μικροϋπολογιστικών Συστημάτων | 80 Εργαστήριο Μικροϋπολογιστικών Συστημάτων | 81 Ακολουθεί το listing του κώδικα: ; In it ia l a sse mb le r s o u rc e f il e fo r FLT ‐8 086 a s su m e c s: CODE , d s: CO DE , es:CODE o rg ; ad d y ou r so u rce code h e re 005 0h:000 0h P O R TA equ 0h P O R TB eq u 2h c ont r o l equ 6h m o v al,99h ;Α ρχικοποίησ η τ ων θυρών: POR TA σαν είσ οδο κα ι POR TB σα ν έξ ο δο ou t c ont r o l, a l c m p al,43h L O O P: c a l l adc ;Κά λεσ ε τη ν υπορουτ ίνα γι α να διαβά σεις τ ον A/D CM P A L,43H ;Σ ύγ κρ ιν ε τ ον AL μ ε τη ν τ ιμή 43 Η JB MO TOR _LEF T ;Ε άν εί ναι μι κρότ ερη τότ ε φ ορά κινητ ήρα αρι στ ερά CM P A L,46H ; Σ ύγκρινε τον A L μ ε τη ν τ ιμή 46 Η JA MO TOR_R I GHT ; Εά ν εί ναι μικρότερη τ ότε φ ορά κινητή ρα δεξ ιά Εργαστήριο Μικροϋπολογιστικών Συστημάτων | 82 JM P MOTOR _OFF ; Σβήσ ε τ ον κινη τήρα MO TOR _OFF : MOV BL, 00H ;Φ όρτ ωσ ε στ ον B L το 00 Η JM P MOTOR _CO NTROL ;Π ήγαι νε στ ον έ λεγ χο του κι νητή ρα MO TOR _ LEFT: MOV BL, 80H ; Φ όρτωσε στον B L τ ο 8 0 Η JM P MOTOR _CO NTROL ; Πήγαι νε στ ον έλεγ χο του κι νητή ρα MO TOR _R I GH T : MOV BL, 40H ; Φόρτ ωσε στ ον B L το 40 Η JM P MOTOR _CO NTROL ; Πήγα ινε σ τον έλεγ χο του κινητ ήρα MO TOR _CON TRO L: MOV A L,B L ; Φόρτωσε τον B L στο ν A L O U T POR TB,A L ;Άνα ψ ε τ ον κι νητή ρα JM P LOO P adc: in a l, PO R TA ; Διάβασ ε τ ην θ ύρα Α κα ι α ποθή κευσ ε την τι μή στ ον AL m o v b l, a l ; Φ όρτωσ ε στ ον B L το ν A L IN AL,PO RTA ; Δ ιάβα σε την θ ύρα Α και α πο θήκε υ σε τη ν τι μή στ ον AL c m p a l , b l ; Σ ύγ κρινε τ ις δυο τιμές jn z adc ; Εά ν είν αι ί δι ες ε πι στρ οφή r et Κατάσταση Διακοπτών: Διακόπτης SW2A SW2B SW3 SW4A SW4B SW4C SW4D Θέση ADC MOTOR VOLTS OFF OFF OFF OFF Εργαστήριο Μικροϋπολογιστικών Συστημάτων | 83 ΕΡΓΑΣΤΗΡΙΟ ΑΡΧΙΤΕΚΤΟΝΙΚΗΣ & ΛΕΙΤΟΥΡΓΙΑΣ Η/Υ Διδ άσκων: Ε υάγ γελος Τ οπ άλης Δρ. Ηλ εκτρολ όγ ος Μηχ αν ικ ός & Τεχν ολ ογ ία ς Υ πολ ογ ιστών ΑΣΚΗΣΗ 9 ΔΙΑΤΗΡΗΣΗ ΣΤΑΘΕΡΗΣ ΘΕΡΜΟΚΡΑΣΙΑΣ ΕΝΤΟΣ ΟΡΙΩΝ ΣΤΗ ΘΕΡΜΟΑΝΤΙΣΤΑΣΗ ΜΕ ΤΗΝ ΒΟΗΘΕΙΑ ΤΟΥ ΚΙΝΗΤΗΡΑ Σκοπός αυτής της άσκησης είναι να διατηρηθεί σταθερή θερμοκρασία εντός ορίων στη θερμοαντίσταση με τη βοήθεια του κινητήρα που βρίσκεται στο Flight Application Board. Η θερμοαντίσταση θα βρίσκεται συνεχώς σε λειτουργία, και με τη βοήθεια του κινητήρα θα γίνει προσπάθεια να διατηρηθεί η θερμοκρασία της σταθερή εντός των ορίων που έχουμε ορίσει. Η θερμοκρασία μετράτε με τη βοήθεια του A/D μετατροπέα που δέχεται ως είσοδο την έξοδο κατάλληλου κυκλώματος που μετρά απ’ ευθείας την θερμοκρασία της αντίστασης. Η θερμοαντίσταση αρχικά θερμαίνεται μέχρι ενός μέγιστου σημείου, και μετά μπαίνει σε λειτουργία ο κινητήρας μέχρι την επιθυμητή τιμή θερμοκρασίας. Αυτό θα γίνει ελέγχοντας τη λειτουργία του κινητήρα. Η επιθυμητή τιμή, είναι η τιμή που διαβάζεται από τον A/D και όχι θερμοκρασία σε °C. Σημείωση: Μετά από αρκετές δοκιμές, παρατηρήθηκε πως η τιμή που επιστρέφει ο A/D, δεν μπορεί να κατέβει κάτω από την τιμή 4FH. Αποκλίσεις προς τα πάνω από την προαναφερθείσα τιμή, οφείλονται στη θερμοκρασία του περιβάλλοντος. Εργαστήριο Μικροϋπολογιστικών Συστημάτων | 84 Ανάπτυξη Σχεδιάζουμε το διάγραμμα ροής του προγράμματος: Εργαστήριο Μικροϋπολογιστικών Συστημάτων | 85 Ακολουθεί το listing του κώδικα: ; In it ia l a sse mb le r s o u rc e f il e fo r FLT ‐8 086 a s su m e c s: CODE , d s: CO DE , es:CODE o rg ; ad d y ou r so u rce code h e re 005 0h:000 h P O R TA equ 0h P O R TB eq u 2h c ont r o l equ 6h m o v al,99h ou t c ont r o l, a l I N IT: CA LL AD CC ; Κά λεσ ε την υ π ορ ο υτ ίνα κα ι δι άβα σε το ν A/D MOV BL, 55H ;Φ όρτω σ ε τ ο 55 Η στο ν B L CM P A L, BL ; Σ ύγ κρινε τ ον A L μ ε τ ον B L JB S TO P ; Εά ν είναι μι κρότ ερος τ ότ ε πήγα ινε σ το Label STO P S TAR T : CA LL S TAR T_ MO TOR ; Κά λεσ ε τη ν υπορουτ ίνα για να α νάψει ς τ ον κινητ ήρα CA LL AD CC ; Κά λ εσ ε τ ην υπορουτί να και δι άβασ ε τ ον A/D MOV BL, 45H ; Φόρ τω σε το 45 Η σ το ν B L CM P A L, BL ; Σ ύγκρι νε τον AL μ ε τον B L JN Z S TAR T ; Εά ν δεν εί ναι ίσοι τ ότ ε κράτα τον κινητ ήρα α νοικτ ό S TO P: CA LL S TO P_MO TOR ; Κά λ εσε τη ν υπορουτ ίνα για να σβή σεις τ ον κινητ ήρα CA LL AD CC ; Κά λ εσ ε τ ην υπορουτί να και δι άβασ ε τ ον A/D MOV BL, 55H ; Φόρτωσε το 55 Η σ το ν B L CM P A L, BL ; Σ ύγκρι νε τον A L μ ε τον BL Εργαστήριο Μικροϋπολογιστικών Συστημάτων | 86 JN Z S TO P ; Εά ν δ εν εί ναι ίσ οι τότ ε κρ άτα το ν κινητ ήρα α νοικτ ό JM P S TAR T ; Ξεκίνα πά λι τον κι νητή ρα AD CC: IN AL,PO RTA ; Διάβ ασ ε τη ν θύρα Α και αποθήκευσ ε την στ ον AL MOV B L, A L ; Φόρτωσε τον AL σ τον B L IN AL,PO RTA ; Διάβ ασ ε τη ν θύρα Α και αποθήκευσ ε την στ ον AL CM P A L, BL ; Σ ύγκρι νε τον A L μ ε τον BL JN Z ADCC ; Επ αν έ λαβ ε όσ ο δ εν εί ναι ίσ οι RET ; Ε πέστρεψε α πό τη ν υπορουτί να S TAR T _MO TOR: MOV A L,0A0 H ; Φό ρτ ωσ ε τ ο Α0 Η στον AL O U T POR TB,A L ; Ξεκίνα τ ον κι νητ ήρα RET ; Ε πέστ ρεψε α πό τη ν υπορουτί να S TO P _MO TOR: MOV A L,020 H ; Φ όρτ ωσ ε το 2 0 Η στ ον A L O U T POR TB,A L ; Ξεκίνα τ ον κι νητ ήρα RET ; Επέσ τρεψε από τ ην υπορουτί να Διακόπτης SW2A SW2B SW3 SW4A SW4B SW4C SW4D Θέση ADC MOTOR TEMP OFF OFF HEAT OFF Εργαστήριο Μικροϋπολογιστικών Συστημάτων | 87 ΕΡΓΑΣΤΗΡΙΟ ΑΡΧΙΤΕΚΤΟΝΙΚΗΣ & ΛΕΙΤΟΥΡΓΙΑΣ Η/Υ Διδ άσκων: Ε υάγ γελος Τ οπ άλης Δρ. Ηλ εκτρολ όγ ος Μηχ αν ικ ός & Τεχν ολ ογ ία ς Υ πολ ογ ιστών ΑΣΚΗΣΗ 10 ΕΛΕΓΧΟΣ ΤΩΝ LEDS ΜΕ ΦΩΤΟΔΙΟΔΟ Ο σκοπός της άσκησης είναι να ανάβουμε τα LEDS ανάλογα με το ποσοστό της φωτεινότητας που υπάρχει στο περιβάλλον. Δηλαδή όσο ποιο πολύ ποσοστό φωτεινότητας έχουμε όλο και λιγότερα LEDS να ανάβουν. Αυτό θα γίνει με την βοήθεια της φωτοδιόδου και των LEDS. Η φωτοδίοδος όταν δεν δέχεται φως η τάση στην έξοδο της γίνεται μηδέν ενώ όταν δέχεται το μέγιστο ποσοστό φωτεινότητας η τάση στην έξοδο της γίνεται 2.55. Η έξοδος της φωτοδιόδου οδηγείται σε ένα A/D o οποίος έχει τα εξής χαρακτηριστικά : είσοδος 0.00 V για 00 hex έξοδο είσοδος 2.50 V για 80 hex έξοδο είσοδος 5.00 V για FF hex έξοδο. Άρα η μέγιστη τιμή που μπορούμε να πάρουμε στην έξοδο του A/D για την μέγιστη τιμή της εξόδου της φωτοδιόδου είναι 80 hex. Λόγω όμως της μικρής ακριβείας της φωτοδιόδου και του A/D η ελάχιστη έξοδος που μπορούμε να πάρουμε από τον A/D Εργαστήριο Μικροϋπολογιστικών Συστημάτων | 88 είναι 10 hex και η μέγιστη είναι 39 hex.Χωρίζουμε το διάστημα 10 – 39 σε οκτώ ίσα διαστήματα όσα είναι και τα LEDS. Παρακάτω ακολουθεί το listing του κώδικα: ; In it ia l a sse mb le r s o u rc e f il e fo r FLT ‐8 086 a s su m e c s: CODE , d s: CO DE , es:CODE o rg ; ad d y ou r so u rce code h e re 005 0h:000 0h P O R TA equ 0h P O R TB eq u 2h c ont r o l equ 6h m o v al,99h ou t c ont r o l, a l ; Α ρχικοποίη ση τ ων θ υρών: POR TA σαν είσοδο κα ι POR TB σα ν έξ ο δο L O O P: MOV BL, 11H ; φορτ ώνω σ τον B L το 11 Η IN AL,PO RTA ; δ ιαβά ζ ω τη ν έξ ο δο το υ A/D CM P A L, BL ; συγκρίνω την τιμ ή τ ου A/ D μ ε τ ο 1 1 Η JA LABE L1 ; εά ν ε ίν αι μεγ αλ ύτ ερο πήγ α ιν ε στη ν ε πόμ ενη σ ύγκριση α λ λι ώς άναψε όλα τα l e d s MOV A L,11111 111B O U T POR TB,A L JB LOOP ; πήγ αινε πά λι στη ν α ρχ ή L AB EL1: MOV BL, 15H ; φο ρτών ω στ ον BL τ ο 15 Η IN AL,PO RTA ; διαβ άζ ω την έξ ο δο το υ A/D CM P A L, BL ; σ υγ κρίνω τη ν τ ιμή του A/D με το 15 Η JA LA BE L2 ; εάν ε ίνα ι μ εγα λ ύτ ερ ο πήγ αιν ε στ ην ε πό μεν η σ ύγκριση α λ λι ώς άναψε τ α 7 le d s MOV A L,11111 11B O U T POR TB,A L JB LOOP ; πήγα ιν ε πά λ ι στ ην αρ χή L AB EL2: MOV BL, 1AH ; φορτ ώνω στ ον BL τ ο 1Α Η IN AL,PO RTA ; δ ιαβά ζω τη ν έξ ο δο το υ A/ D CM P A L, BL ; σ υγκρίνω την τιμή του A/ D μ ε το 1Α Η Εργαστήριο Μικροϋπολογιστικών Συστημάτων | 89 JA LA BE L3 ; εά ν είν αι μεγ αλ ύ τε ρ ο πήγα ιν ε στην ε πόμ εν η σ ύγκρι ση α λ λι ώς άνα ψε τα 6 l e d s MOV A L,11111 1B O U T POR TB,A L JB LOOP ; πήγα ιν ε πά λ ι στ ην αρ χή L AB EL3: MOV B L, 1 FH ; φορτ ώνω στ ον BL τ ο 1F Η IN AL,PO RTA ; δ ιαβά ζω τη ν έξ ο δο το υ A/ D CM P A L, BL ; σ υγκρίνω την τιμή του A/ D μ ε το 1F Η JA LA BE L4 ; εά ν είν αι μεγ αλ ύ τε ρ ο πήγα ιν ε στην ε πόμ εν η σ ύγκρι ση α λ λι ώς άνα ψε τα 5 l e d s MOV A L,11111 B O U T POR TB,A L JB LOOP ; πήγαι νε πά λι στη ν α ρχή L AB EL4: MOV BL, 24H ; φ ορτώνω στον BL τ ο 24 Η IN AL,PO RTA ; δ ιαβά ζω τη ν έξ ο δο το υ A/ D CM P A L, BL ; σ υγκρίνω την τιμή του A/ D μ ε το 24 Η JA LA BE L5 ; εά ν είν αι μεγ αλ ύ τε ρ ο πήγα ιν ε στην ε πόμ εν η σ ύγκρι ση α λ λι ώς άνα ψε τα 4 l e d s MOV A L,1111 B O U T POR TB,A L JB LOOP ; πήγα ιν ε πά λ ι στ ην αρ χή L AB EL5: MOV BL, 29H ; φ ορτώνω στον BL τ ο 29 Η IN AL,PO RTA ; δ ιαβά ζω τη ν έξ ο δο το υ A/ D CM P A L, BL ; σ υγκρίνω την τιμή του A/ D μ ε το 29 Η JA LA BE L6 ; εά ν είν αι μεγ αλ ύ τε ρ ο πήγα ιν ε στην ε πόμ εν η σ ύγκρι ση α λ λι ώς άνα ψε τα 3 l e d s MOV A L,111B O U T POR TB,A L JB LOOP ; πήγα ιν ε πά λ ι στ ην αρ χή L AB EL6: MOV B L, 2 E H ; φορτ ώνω στ ον BL τ ο 2Ε Η IN AL,PO RTA ; δ ιαβά ζω τη ν έξ ο δο το υ A/ D CM P A L, BL ; σ υγκρίνω την τιμή του A/ D μ ε το 2Ε Η JA LA BE L7 ; εά ν είν αι μεγ αλ ύ τε ρ ο πήγα ιν ε στην ε πόμ εν η σ ύγκρι ση α λ λι ώς άνα ψε τα 2 l e d s MOV A L,11B O U T POR TB,A L JB LOOP ; πήγ αι νε πά λι στη ν α ρχ ή L AB EL7: Εργαστήριο Μικροϋπολογιστικών Συστημάτων | 90 MOV BL, 33H ; φ ορτώνω στον BL τ ο 33 Η IN AL,PO RTA ; δ ιαβά ζω τη ν έξ ο δο το υ A/ D CM P A L, BL ; σ υγκρίνω την τιμή του A/ D μ ε το 33 Η JA LA BE L8 ; εά ν είν αι μεγ αλ ύ τε ρ ο πήγα ιν ε στην ε πόμ εν η σ ύγκρι ση α λ λι ώς άνα ψε τ ο 1 led MOV A L,1 B O U T POR TB,A L JB LOOP ; πήγ αι νε πά λι στη ν α ρχ ή L AB EL8: MOV BL, 39H ; φ ορτώνω στον BL τ ο 33 Η IN AL,PO RTA ; δ ιαβά ζω τη ν έξ ο δο το υ A/ D CM P A L, BL ; σ υγκρίνω την τιμή του A/ D μ ε το 39 Η JB LOOP ; εάν είναι μι κρότερη πήγα ινε πά λι στη ν αρχή MOV A L,00 O U T POR TB,A L JM P LA BEL8 ; όσο είναι μεγ αλύτερη ή ίση με τ ο 39 Η κράτ α σβ ηστά όλα τ α l e d s Εργαστήριο Μικροϋπολογιστικών Συστημάτων | 91 ΕΡΓΑΣΤΗΡΙΟ ΑΡΧΙΤΕΚΤΟΝΙΚΗΣ & ΛΕΙΤΟΥΡΓΙΑΣ Η/Υ Διδ άσκων: Ε υάγ γελος Τ οπ άλης Δρ. Ηλ εκτρολ όγ ος Μηχ αν ικ ός & Τεχν ολ ογ ία ς Υ πολ ογ ιστών ΠΑΡΑΡΤΗΜΑ 1 – ASCII CHARACTERS ASCII Characters The ASCII character set defines 128 characters (0 to 127 decimal, 0 to FF hexadecimal, and 0 to 177 octal). The Control Characters The first 32 values are non-printing control characters, such as Return and Line feed. You generate these characters on the keyboard by holding down the Control key while you strike another key. For example, Bell is value 7, Control plus G, often shown in documents as ^G. Notice that 7 is 64 less than the value of G (71); the Control key subtracts 64 from the value of the keys that it modifies. Εργαστήριο Μικροϋπολογιστικών Συστημάτων | 92 Control Characters O c t D e c H e x C o n tr o l-k e y Co n t ro l Ac t i on NUL 0 0 0 ^ @ N u l l c har a c te r SOH 1 1 1 ^ A S t a rt of h e ad i ng, = c o nso l e i n ter r u pt STX 2 2 2 ^ B S t a rt of t e xt , ma i n te n anc e mo d e o n HP con s o le ETX 3 3 3 ^ C E n d o f te x t EOT 4 4 4 ^ D E n d o f tr a n sm i ssi o n , n ot t h e s ame a s E TB ENQ 5 5 5 ^ E E n q ui r y, g o es wit h AC K ; o l d H P fl o w c o ntr o l ACK 6 6 6 ^ F A c k no w led g e , c lea r s E N Q l o g on han g BEL 7 7 7 ^ G B e l l, rin g s t h e b e l l BS 10 8 8 ^ H B a c ks p ace , wo r ks o n H P te r m in a ls/ c o mp u ter s HT 11 9 9 ^ I H o r iz o nta l ta b , m o v e t o n e x t t ab s t op LF 12 10 a ^ J L i n e F eed VT 13 11 b ^ K V e r ti c al t a b FF 14 12 c ^ L F o r m F eed , pa g e e j e ct CR 15 13 d ^ M C a r ri a ge R e tu r n SO 16 14 e ^ N S h i ft Out , al t ern a t e c har a c te r se t SI 17 15 f ^ O S h i ft In, r es u me d e fa u lt c h ar a cte r se t D L E 2 0 1 6 1 0 ^ P D a t a l ink e sc a pe D C 1 2 1 1 7 1 1 ^ Q X O N , w ith X OF F to p au s e l i s ti n gs; & qu o t;o k a y t o s e n d& q uot ; D C 2 2 2 1 8 1 2 ^ R D e v ic e co n t ro l 2, b lo c k-m o d e f low c on t rol D C 3 2 3 1 9 1 3 ^ S X O F F, wit h XO N is T ER M =18 f lo w co n t ro l D C 4 2 4 2 0 1 4 ^ T D e v ic e co n t ro l 4 N A K 2 5 2 1 1 5 ^ U N e g at i ve a c kn o wle d g e S Y N 2 6 2 2 1 6 ^ V S y n ch r ono u s i d le E T B 2 7 2 3 1 7 ^ W E n d t r ans m i ss i on b l oc k , n o t t h e s a m e a s E O T C A N 3 0 2 4 1 8 ^ X C a n ce l li n e , M PE e c ho e s ! ! ! E M 3 1 2 5 1 9 ^ Y E n d o f me d i um , Co n t ro l -Y i n te r rup t S U B 3 2 2 6 1 a ^ Z S u b st i tut e E S C 3 3 2 7 1 b ^ [ E s c ap e , n e x t c har a c te r is n ot ech o e d F S 3 4 2 8 1 c ^ \ F i l e s epa r a to r G S 3 5 2 9 1 d ^ ] G r o up sep a r at o r R S 3 6 3 0 1 e ^ ^ R e c or d se p a ra t or, b lo c k-m o d e t erm i n at o r U S 3 7 3 1 1 f ^ _ U n i t s epa r a to r P r i nt i ng C h ar a cte r s C h ar Oc t a l De c SP 40 32 20 ! 41 33 21 " 42 34 # 43 35 23 $ 44 36 24 % 45 37 25 & 46 38 ' 47 39 27 ( 50 40 28 ) 51 41 29 * 52 42 2a + 53 43 2b , 54 44 2c 55 45 2d . 56 46 2e / 57 47 2f 0 60 48 30 1 61 49 31 2 62 50 32 3 63 51 33 4 64 52 34 5 65 53 35 6 66 54 36 He x D esc r i pt i on S p a ce E x c la m ati o n m a rk 22 Q u o ta t ion m ar k (& a m p; q uot ; in HTM L ) C r o ss hat c h ( n umb e r s i gn) D o l la r si g n P e r ce n t s i g n 26 A m p er s and C l o si n g s i n gl e qu o t e ( apo s t ro p he) O p e ni n g p a r en t hes e s C l o si n g p a r en t hes e s A s t er i sk ( s ta r , m u l ti p ly) Plus C o m ma H y p en , da s h , m inu s P e r io d S l a nt (fo r w ar d sl a s h, div i d e) Zero One Two T h r ee Four Five Six Εργαστήριο Μικροϋπολογιστικών Συστημάτων | 93 7 8 9 : ; < = > ? @ A B C D E F G H I J K L M N O P Q R S T U V W X Y Z [ \ ] ^ _ ` a b c d e f g h i j k l m n o p q r s t u v w x y 67 70 71 72 73 55 56 57 58 59 74 75 61 76 77 100 101 102 103 104 105 106 107 110 111 112 113 114 115 116 117 120 121 122 123 124 125 126 127 130 131 132 133 134 135 136 137 140 141 142 143 144 145 146 147 150 151 152 153 154 155 156 157 160 161 162 163 164 165 166 167 170 171 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 37 38 39 3a 3b 60 3d 62 3f 40 41 42 43 44 45 46 47 48 49 4a 4b 4c 4d 4e 4f 50 51 52 53 54 55 56 57 58 59 5a 5b 5c 5d 5e 5f 60 61 62 63 64 65 66 67 68 69 6a 6b 6c 6d 6e 6f 70 71 72 73 74 75 76 77 78 79 S e v en E i g ht Nine C o l on S e m ic o lon 3c L e s s t han s ig n (& a m p; l t; i n H T ML) E q u al s si g n 3e G r e at e r t h a n s ign ( &a m p;g t ; i n HT M L ) Q u e st i on m a rk A t - si g n U p p er c ase A U p p er c ase B U p p er c ase C U p p er c ase D U p p er c ase E U p p er c ase F U p p er c ase G U p p er c ase H U p p er c ase I U p p er c ase J U p p er c ase K U p p er c ase L U p p er c ase M U p p er c ase N U p p er c ase O U p p er c ase P U p p er c ase Q U p p er c ase R U p p er c ase S U p p er c ase T U p p er c ase U U p p er c ase V U p p er c ase W U p p er c ase X U p p er c ase Y U p p er c ase Z O p e ni n g s q u ar e br a c ke t R e v er s e s l a nt (Ba c k sl a sh) C l o si n g s q u ar e br a c ke t C a r et (Ci r c um f lex ) U n d er s cor e O p e ni n g s i n gl e qu o t e L o w er c ase a L o w er c ase b L o w er c ase c L o w er c ase d L o w er c ase e L o w er c ase f L o w er c ase g L o w er c ase h L o w er c ase i L o w er c ase j L o w er c ase k L o w er c ase l L o w er c ase m L o w er c ase n L o w er c ase o L o w er c ase p L o w er c ase q L o w er c ase r L o w er c ase s L o w er c ase t L o w er c ase u L o w er c ase v L o w er c ase w L o w er c ase x L o w er c ase y Εργαστήριο Μικροϋπολογιστικών Συστημάτων | 94 z { | } ~ DEL 172 122 173 123 174 124 175 125 176 126 177 7a 7b 7c 7d 7e 127 L o w er c ase z O p e ni n g c u r ly bra c e V e r ti c al l i ne C l o si n g c u r ly bra c e T i l de (ap p r ox i mat e ) 7f D e l et e (r u b ou t ), c r os s -ha t c h b ox Εργαστήριο Μικροϋπολογιστικών Συστημάτων | 95 ΕΡΓΑΣΤΗΡΙΟ ΑΡΧΙΤΕΚΤΟΝΙΚΗΣ & ΛΕΙΤΟΥΡΓΙΑΣ Η/Υ Διδ άσκων: Ε υάγ γελος Τ οπ άλης Δρ. Ηλ εκτρολ όγ ος Μηχ αν ικ ός & Τεχν ολ ογ ία ς Υ πολ ογ ιστών ΠΑΡΑΡΤΗΜΑ 2 – ΡΟΥΤΙΝΕΣ ΛΕΙΤΟΥΡΓΙΑΣ DOS Ρουτίνες Λειτουργίας (DOS function calls) Παρακάτω ακολουθεί μία λίστα αυτών των AH κωδικών µε τα ονόµατα της ρουτίνας λειτουργίας (DOS function calls). 00H TERMINATE A PROGRAM Entry AH = 00H CS = program segment prefix address Exit DOS is entered 01H READ THE KEYBOARD Εργαστήριο Μικροϋπολογιστικών Συστημάτων | 96 Entry AH = 01H Exit AL = ASCII character Notes If AL = 00H the function call must be invoked again to read an extended ASCII character. Refer to Chapter 9, Table 9–1, for a listing of the extended ASCII keyboard codes. This function call automatically echoes whatever is typed to the video screen. 02H Entry WRITE TO STANDARD OUTPUT DEVICE AH = 02H DL = ASCII character to be displayed Notes This function call normally displays data on the video display. 03H READ CHARACTER FROM COM1 Entry AH = 03H Exit AL = ASCII character read from the communications port Notes This function call reads data from the serial communications port. 04H WRITE TO COM1 Entry AH = 04H DL = character to be sent out of COM1 Notes This function transmits data through the serial communications port. The COM port assignment can be changed to use other COM ports with functions 03H and 04H by using the DOS MODE command to reassign COM1 to another COM port. 05H WRITE TO LPT1 Entry AH = 05H DL = ASCII character to be printed Notes Prints DL on the line printer attached to LPT1. Note that the line printer port can be changed with the DOS MODE command. 06H DIRECT CONSOLE READ/WRITE Entry AH = 06H DL = 0FFH or DL = ASCII character Exit AL = ASCII character Notes If DL = 0FFH on entry, then this function reads the console. If DL = ASCII character, then this function displays the ASCII character on the console (CON) video screen. If a character is read from the console keyboard, the zero flag (ZF) indicates whether a character was typed. A zero condition indicates no key was typed, and a not-zero condition indicates that AL contains the ASCII code of the key or a 00H. If AL = 00H, the function must again be invoked to read an extended ASCII character from the keyboard. Note that the key does not echo to the video screen. 07H DIRECT CONSOLE INPUT WITHOUT ECHO Entry AH = 07H Εργαστήριο Μικροϋπολογιστικών Συστημάτων | 97 Exit AL = ASCII character Notes This functions exactly as function number 06H with DL = 0FFH, but it will not return from the function until the key is typed. READ STANDARD INPUT WITHOUT ECHO 08H Entry AH = 08H Exit AL = ASCII character Notes Performs as function 07H, except that it reads the standard input device. The standard input device can be assigned as either the keyboard or the COM port. This function also responds to a controlbreak, where function 06H and 07H do not. A control-break causes INT 23H to execute. By default, this functions as does function 07H. 09H DISPLAY A CHARACTER STRING Entry AH = 09H DS:DX = address of the character string Notes The character string must end with an ASCII $ (24H). The character string can be of any length and may contains control characters such as carriage return (0DH) and line feed (0AH). 0AH BUFFERED KEYBOARD INPUT Entry AH = 0AH DS:DX = address of keyboard input buffer Notes The first byte of the buffer contains the size of the buffer (up to 255). The second byte is filled with the number of characters typed upon return. The third byte through the end of the buffer contains the character string typed followed by a carriage return (0DH). This function continues to read the keyboard (displaying data as typed) until either the specified number of characters are typed or until the enter key is typed. 0BH TEST STATUS OF THE STANDARD INPUT DEVICE Entry AH = 0BH Exit AL = status of the input device Notes This function tests the standard input device to determine if data are available. If AL = 00, no data are available. If AL = 0FFH, then data are available that must be input using function number 08H. 0CH CLEAR KEYBOARD BUFFER AND INVOKE KEYBOARD FUNCTION Entry AH = 0CH AL = 01H, 06H, 07H, or 0AH Exit See exit for functions 01H, 06H, 07H, or 0AH Notes The keyboard buffer holds keystrokes while programs execute other tasks. This function empties or clears the buffer and then invokes the keyboard function located in register AL. 0DH FLUSH DISK BUFFERS Entry AH = 0DH Εργαστήριο Μικροϋπολογιστικών Συστημάτων | 98 Notes Erases all file names stored in disk buffers. This function does not close the files specified by the disk buffers, so care must be exercised in its usage. 0EH SELECT DEFAULT DISK DRIVE Entry AH = 0EH DL = desired default disk drive number Exit AL = the total number of drives present in the system Notes Drive A = 00H, drive B = 01H, drive C = 02H, and so forth. 0FH @OPEN FILE WITH FCB Entry AH = 0FH DS:DX = address of the unopened file control block (FCB) Exit AL = 00H if file found AL = 0FFH if file not found Notes The file control block (FCB) is only used with early DOS software and should never be used with new programs. File control blocks do not allow path names as do the newer file access function codes presented later. Figure A–2 (p. 738) illustrates the structure of the FCB. To open a file, the file must either be present on the disk or be created with function call 16H. 10H @CLOSE FILE WITH FCB Entry AH = 10H DS:DX = address of the opened file control block (FCB) Exit AL = 00H if file closed AL = 0FFH if error found Notes Errors that occurs usually indicate either that the disk is full or the media is bad. 11H @SEARCH FOR FIRST MATCH (FCB) Entry AH = 11H DS:DX = address of the file control block to be searched Exit AL = 00H if file found AL = 0FFH if file not found Notes Wild card characters (? or *) may be used to search for a file name. The ? wild card character matches any character and the * matches any name or extension. 12H @SEARCH FOR NEXT MATCH (FCB) Entry AH = 12H DS:DX = address of the file control block to be searched Exit AL = 00H if file found AL = 0FFH if file not found Notes This function is used after function 11H finds the first matching file name. Εργαστήριο Μικροϋπολογιστικών Συστημάτων | 99 13H @DELETE FILE USING FCB Entry AH = 13H DS:DX = address of the file control block to be deleted Exit AL = 00H if file deleted AL = 0FFH if error occurred Notes Errors that most often occur are defective media errors. 14H @SEQUENTIAL READ (FCB) Entry AH = 14H DS:DX = address of the file control block to be read Exit AL = 00H if read successful AL = 01H if end of file reached AL = 02H if DTA had a segment wrap AL = 03H if less than 128 bytes were read 15H @SEQUENTIAL WRITE (FCB) Entry AH = 15H DS:DX = address of the file control block to be written Exit AL = 00H if write successful AL = 01H if disk is full AL = 02H if DTA had a segment wrap 16H @CREATE A FILE (FCB) Entry AH = 16H DS:DX = address of an unopened file control block Exit AL = 00H if file created AL = 01H if disk is full 17H Entry @RENAME A FILE (FCB) AH = 17H DS:DX = address of a modified file control block Exit AL = 00H if file renamed AL = 01H if error occurred Notes Refer to Figure A–3 (p. 738) for the modified FCB used to rename a file. 19H RETURN CURRENT DRIVE Entry AH = 19H Exit AL = current drive Notes AL = 00H for drive A, 01H for drive B, and so forth. 1AH SET DISK TRANSFER AREA Εργαστήριο Μικροϋπολογιστικών Συστημάτων | 100 Entry AH = 1AH DS:DX = address of new DTA Notes The disk transfer area is normally located within the program segment prefix at offset address 80H. The DTA is used by DOS for all disk data transfers using file control blocks. 1BH GET DEFAULT DRIVE FILE ALLOCATION TABLE (FAT) Entry AH = 1BH Exit AL = number of sectors per cluster DS:BX = address of the media–descriptor CX = size of a sector in bytes DX = number of clusters on drive Notes Refer to Figure A–4 (p. 739) for the format of the media–descriptor byte. The DS register is changed by this function, so make sure to save it before using this function. 1CH GET ANY DRIVE FILE ALLOCATION TABLE (FAT) Entry AH = 1CH DL = disk drive number Exit AL = number of sectors per cluster DS:BX = address of the media–descriptor CX = size of a sector in bytes DX = number of clusters on drive 21H @RANDOM READ USING FCB Entry AH = 21H DS:DX = address of opened FCB Exit AL = 00H if read successful AL = 01H if end of file reached AL = 02H if the segment wrapped AL = 03H if less than 128 bytes read 22H @RANDOM WRITE USING FCB Entry AH = 22H DS:DX = address of opened FCB Exit AL = 00H if write successful AL = 01H if disk full AL = 02H if the segment wrapped 23H @RETURN NUMBER OF RECORDS (FCB) Entry AH = 23H DS:DX = address of FCB Exit AL = 00H number of records AL = 0FFH if file not found 24H @SET RELATIVE RECORD SIZE (FCB) Εργαστήριο Μικροϋπολογιστικών Συστημάτων | 101 Entry AH = 24H DS:DX = address of FCB Notes Sets the record field to the value contained in the FCB. 25H SET INTERRUPT VECTOR Entry AH = 25H AL = interrupt vector number DS:DX = address of new interrupt procedure Notes Before changing the interrupt vector, it is suggested that the current interrupt vector first be saved using DOS function 35H. This allows a back-link so the original vector can later be restored. 26H CREATE NEW PROGRAM SEGMENT PREFIX Entry AH = 26H DX = segment address of new PSP Notes Figure A–5 (p. 739) illustrates the structure of the program segment prefix. 27H @RANDOM FILE BLOCK READ (FCB) Entry AH = 27H CX = the number of records DS:DX = address of opened FCB Exit AL = 00H if read successful AL = 01H if end of file reached AL = 02H if the segment wrapped AL = 03H if less than 128 bytes read CX = the number of records read 28H @RANDOM FILE BLOCK WRITE (FCB) Entry AH = 28H CX = the number of records DS:DX = address of opened FCB Exit AL = 00H if write successful AL = 01H if disk full AL = 02H if the segment wrapped CX = the number of records written 29H @PARSE COMMAND LINE (FCB) Entry AH = 29H AL = parse mask DS:SI = address of FCB DS:DI = address of command line Εργαστήριο Μικροϋπολογιστικών Συστημάτων | 102 Exit AL = 00H if no file name characters found AL = 01H if file name characters found AL = 0FFH if drive specifier incorrect DS:SI = address of character after name DS:DI = address first byte of FCB 2AH READ SYSTEM DATE Entry AH = 2AH Exit AL = day of the week CX = the year (1980–2099) DH = the month DL = day of the month Notes The day of the week is encoded as Sunday = 00H through Saturday = 06H. The year is a binary number equal to 1980 through 2099. 2BH SET SYSTEM DATE Entry AH = 2BH CX = the year (1980–2099) DH = the month DL = day of the month 2CH READ SYSTEM TIME Entry AH = 2CH Exit CH = hours (0–23) CL = minutes DH = seconds DL = hundredths of seconds Notes All times are returned in binary form, and hundredths of seconds may not be available. 2DH SET SYSTEM TIME Entry AH = 2DH CH = hours CL = minutes DH = seconds DL = hundredths of seconds 2EH Entry DISK VERIFY WRITE AH = 2EH AL = 00H to disable verify on write AL = 01H to enable verify on write Notes By default, disk verify is disabled. 2FH READ DISK TRANSFER AREA ADDRESS Entry AH = 2FH Εργαστήριο Μικροϋπολογιστικών Συστημάτων | 103 Exit ES:BX = contains DTA address 30H READ DOS VERSION NUMBER Entry AH = 30H Exit AH = fractional version number AL = whole number version number Notes For example, DOS version number 3.2 is returned as a 3 in AL and a 14H in AH. 31H TERMINATE AND STAY RESIDENT (TSR) Entry AH = 31H AL = the DOS return code DX = number of paragraphs to reserve for program Notes A paragraph is 16 bytes and the DOS return code is read at the batch file level with ERRORCODE. 33H TEST CONTROL-BREAK Entry AH = 33H AL = 00H to request current control-break AL = 01H to change control-break DL = 00H to disable control-break DL = 01H to enable control-break Exit DL = current control-break state 34H GET ADDRESS OF InDOS FLAG Entry AH = 34H Exit ES:BX = address of InDOS flag Notes The InDOS flag is available in DOS versions 3.2 or newer and indicates DOS activity. If InDOS = 00H, DOS is inactive or 0FFH if DOS is active and pursuing another operation. 35H READ INTERRUPT VECTOR Entry AH = 35H AL = interrupt vector number Exit ES:BX = address stored at vector Notes This DOS function is used with function 25H to install/remove interrupt handlers. 36H DETERMINE FREE DISK SPACE Entry AH = 36H DL = drive number Εργαστήριο Μικροϋπολογιστικών Συστημάτων | 104 Exit AX = FFFFH if drive invalid AX = number of sectors per cluster BX = number of free clusters CX = bytes per sector DX = number of clusters on drive Notes The default disk drive is DL = 00H, drive A = 01H, drive B = 02H, and so forth. 38H RETURN COUNTRY CODE Entry AH = 38H AL = 00H for current country code BX = 16-bit country code DS:DX = data buffer address Exit AX = error code if carry set BX = counter code DS:DX = data buffer address 39H CREATE SUB-DIRECTORY Entry AH = 39H DS:DX = address of ASCII-Z string subdirectory name Exit AX = error code if carry set Notes The ASCII-Z string is the name of the subdirectory in ASCII code ended with a 00H instead of a carriage return/line feed. 3AH ERASE SUB-DIRECTORY Entry AH = 3AH DS:DX = address of ASCII-Z string subdirectory name Exit AX = error code if carry set 3BH CHANGE SUB-DIRECTORY Entry AH = 3BH DS:DX = address of new ASCII-Z string subdirectory name Exit AX = error code if carry set 3CH CREATE A NEW FILE Entry AH = 3CH CX = attribute word DS:DX = address of ASCII-Z string file name Exit AX = error code if carry set AX = file handle if carry cleared Notes The attribute word can contain any of the following (added together): 01H read-only access, 02H = hidden file or directory, 04H = system file, 08H = volume label, 10H = subdirectory, and 20H = archive bit. In most cases, a file is created with 0000H. 3DH OPEN A FILE Εργαστήριο Μικροϋπολογιστικών Συστημάτων | 105 Entry AH = 3DH AL = access code DS:DX = address of ASCII-Z string file name Exit AX = error code if carry set AX = file handle if carry cleared Notes The access code in AL = 00H for a read-only access, AL = 01H for a write-only access, and AL = 02H for a read/write access. For shared files in a network environment, bit 4 of AL = 1 will deny read/write access, bit 5 of AL = 1 will deny a write access, bits 4 and 5 of AL = 1 will deny read access, bit 6 of AL = 1 denies none, bit 7 of AL = 0 causes the file to be inherited by child; if bit 7 of AL = 1, file is restricted to current process. 3EH CLOSE A FILE Entry AH = 3EH BX = file handle Exit AX = error code if carry set 3FH READ A FILE Entry AH = 3FH BX = file handle CX = number of bytes to be read DS:DX = address of file buffer to hold data read Exit AX = error code if carry set AX = number of bytes read if carry cleared 40H WRITE A FILE Entry AH = 40H BX = file handle CX = number of bytes to write DS:DX = address of file buffer that holds write data Exit AX = error code if carry set AX = number of bytes written if carry cleared 41H DELETE A FILE Entry AH = 41H DS:DX = address of ASCII-Z string file name Exit AX = error code if carry set 42H MOVE FILE POINTER Entry AH = 42H AL = move technique BX = file handle CX:DX = number of bytes pointer moved Exit AX = error code if carry set AX:DX = bytes pointer moved Εργαστήριο Μικροϋπολογιστικών Συστημάτων | 106 Notes The move technique causes the pointer to move from the start of the file if AL = 00H, from the current location if AL = 01H, and from the end of the file if AL = 02H. The count is stored so DX contains the least-significant 16-bits and either CX or AX contains the mostsignificant 16-bits. 43H READ/WRITE FILE ATTRIBUTES Entry AH = 43H AL = 00H to read attributes AL = 01H to write attributes CX = attribute word (see function 3CH) DS:DX = address of ASCII-Z string file name Exit AX = error code if carry set CX = attribute word of carry cleared 44H I/O DEVICE CONTROL (IOTCL) Entry AH = 44H AL = sub function code (see notes) Exit AX = error code (see function 59H) if carry set Notes The sub function codes found in AL are as follows: 00H = read device status Entry: BX = file handle Exit: DX = status 01H = write device status Entry: BX = file handle, DH = 0, DL = device information Exit: AX = error code if carry set 02H = read control data from character device Entry: BX = file handle, CX = number of bytes, DS:DX = I/O buffer address Exit: AX = number of bytes read 03H = write control data to character device Entry: BX = file handle, CX = number of bytes, DS:DX = I/O buffer address Exit: AX = number of bytes written 04H = read control data from block device Entry: BL = drive number (0 = default, 1 = A, 2 = B, etc), CX = number of bytes, DS:DX = I/O buffer address Exit: AX = number of bytes read 05H = write control data to block device Εργαστήριο Μικροϋπολογιστικών Συστημάτων | 107 Entry: BL = drive number, CX = number of bytes, DS:DX = I/O buffer address Exit: AX = number of bytes written 06H = check input status Entry: BX = file handle Exit: AL = 00H ready or FFH not ready 07H = check output status Entry: BX = file handle Exit: AL = 00H ready or FFH not ready 08H = removable media? Entry: BL = drive number Exit: AL = 00H removable, 01H fixed 09H = network block device? Entry: BL = drive number Exit: bit 12 of DX set for network block device 0AH = local or network character device? Entry: BX = file handle Exit: bit 15 of DX set for network character device 0BH = change entry count (must have SHARE.EXE loaded) Entry: CX = delay loop count, DX = retry count Exit: AX = error code if carry set 0CH = generic I/O control for character devices Entry: BX = file handle, CH = category, CL = function Categories: 00H = unknown, 01H = COM port, 02H = CON, 05H = LPT ports Function: CL = 45H; set iteration count CL = 4AH; select code page CL = 4CH; start code page preparation CL = 4DH; end code page preparation CL = 5FH; set display information CL = 65H; get iteration count CL = 6AH; query selected code page CL = 6BH; query preparation list Εργαστήριο Μικροϋπολογιστικών Συστημάτων | 108 CL = 7FH; get display information 0DH = generic I/O control for block devices Entry: BL = drive number, CH = category, CL = function, DS:DX = address of parameter block Category: 08H = disk drive Function: CL = 40H; set device parameters CL = 41H; write track CL = 42H; format and verify track CL = 46H, set media ID code CL = 47H; set access flag CL = 60H; get device parameters CL = 61H; read track CL = 62H; verify track CL = 66H; get media ID code CL = 67H; get access code 0EH = return logical device map Entry: BL = drive number Exit: AL = number of last device 0FH = change logical device map Entry: BL = drive number Exit: AL = number of last device 45H DUPLICATE FILE HANDLE Entry AH = 45H BX = current file handle Exit AX = error code if carry set AX = duplicate file handle 46H FORCE DUPLICATE FILE HANDLE Entry AH = 46H BX = current file handle CX = new file handle Exit AX = error code if carry set Notes This function works like function 45H except that function 45H allows DOS to select the new handle, while this function allows the user to select the new handle. Εργαστήριο Μικροϋπολογιστικών Συστημάτων | 109 47H READ CURRENT DIRECTORY Entry AH = 47H DL = drive number DS:SI = address of a 64 byte buffer for directory name Exit DS:SI addresses current directory name if carry cleared Notes Drive A = 00, drive B = 01, and so forth 48H ALLOCATE MEMORY BLOCK Entry AH = 48H BX = number of paragraphs to allocate CX = new file handle Exit BX = largest block available if carry cleared 49H RELEASE ALLOCATED MEMORY BLOCK Entry AH = 49H ES = segment address of block to be released CX = new file handle Exit Carry indicates an error if set 4AH MODIFY ALLOCATED MEMORY BLOCK Entry AH = 4AH BX = new block size in paragraphs ES = segment address of block to be modified Exit BX = largest block available if carry cleared 4BH LOAD OR EXECUTE A PROGRAM Entry AH = 4BH AL = function code ES:BX = address of parameter block DS:DX = address ASCII-Z string command Exit Carry indicates an error if set Notes The function codes are AL = 00H to load and execute a program, AL = 01H to load a program but not execute it, AL = 03H to load a program overlay, and AL = 05H to enter the EXEC state. Figure A–6 (p. 740) shows the parameter block used with this function. 4CH TERMINATE A PROCESS Entry AH = 4CH AL = error code Exit Returns control to DOS Notes This function returns control to DOS with the error code saved so it can be obtained using DOS ERROR LEVEL batch processing system. We normally use this function with an error code of 00H to return to DOS. 4DH READ RETURN CODE Εργαστήριο Μικροϋπολογιστικών Συστημάτων | 110 Entry AH = 4DH Exit AX = return error code Notes This function is used to obtain the return status code created by executing a program with DOS function 4BH. The return codes are AX = 0000H for a normal-no error-termination, AX = 0001H for a controlbreak termination, AX = 0002H for a critical device error, and AX = 0003H for a termination by an INT 31H. 4EH FIND FIRST MATCHING FILE Entry AH = 4EH CX = file attributes DS:DX = address ASCII-Z string file name Exit Carry is set for file not found Notes This function searches the current or named directory for the first matching file. Upon exit, the DTA contains the file information. See Figure A–7 (p. 740) for the disk transfer area (DTA). 4FH FIND NEXT MATCHING FILE Entry AH = 4FH Exit Carry is set for file not found Notes This function is used after the first file is found with function 4EH. 50H SET PROGRAM SEGMENT PREFIX (PSP) ADDRESS Entry AH = 50H BX = offset address of the new PSP Notes Extreme care must be used with this function because no error recovery is possible. 51H GET PSP ADDRESS Entry AH = 51H Exit BX = current PSP segment address 54H READ DISK VERIFY STATUS Entry AH = 54H Exit AL = 00H if verify off AL = 01H if verify on 56H Entry RENAME FILE AH = 56H ES:DI = address of ASCII-Z string containing new file name DS:DX = address of ASCII-Z string containing file to be renamed Exit Carry is set for error condition 57H READ FILE’S DATE AND TIME STAMP Εργαστήριο Μικροϋπολογιστικών Συστημάτων | 111 Entry AH = 57H AL = function code BX = file handle CX = new time DX = new date Exit Carry is set for error condition CX = time if carry cleared DX = date if carry cleared Notes AL = 00H to read date and time or 01H to write date and time. 59H GET EXTENDED ERROR INFORMATION Entry AH = 59H BX = 0000H for DOS version 3.X AX = extended error code Exit BH = error class BL = recommended action CH = locus Notes Following are the extended error codes found in AX: 0001H = invalid function number 0002H = file not found 0003H = path not found 0004H = no file handles available 0005H = access denied 0006H = file handle invalid 0007H = memory control block failure 0008H = insufficient memory 0009H = memory block address invalid 000AH = environment failure 000BH = format invalid 000CH = access code invalid 000DH = data invalid 000EH = unknown unit 000FH = disk drive invalid 0010H = attempted to remove current directory 0011H = not same device 0012H = no more files Εργαστήριο Μικροϋπολογιστικών Συστημάτων | 112 0013H = disk write-protected 0014H = unknown unit 0015H = drive not ready 0016H = unknown command 0017H = data error (CRC check error) 0018H = bad request structure length 0019H = seek error 001AH = unknown media type 001BH = sector not found 001CH = printer out of paper 001DH = write fault 001EH = read fault 001FH = general failure 0020H = sharing violation 0021H = lock violation 0022H = disk change invalid 0023H = FCB unavailable 0024H = sharing buffer exceeded 0025H = code page mismatch 0026H = handle end of file operation not completed 0027H = disk full 0028H–0031H reserved 0032H = unsupported network request 0033H = remote machine not listed 0034H = duplicate name on network 0035H = network name not found 0036H = network busy 0037H = device no longer exists on network 0038H = netBIOS command limit exceeded 0039H = error in network adapter hardware 003AH = incorrect response from network 003BH = unexpected network error 003CH = remote adapter is incompatible 003DH = print queue is full Εργαστήριο Μικροϋπολογιστικών Συστημάτων | 113 003EH = not enough room for print file 003FH = print file was deleted 0040H = network name deleted 0041H = network access denied 0042H = incorrect network device type 0043H = network name not found 0044H = network name exceeded limit 0045H = netBIOS session limit exceeded 0046H = temporary pause 0047H = network request not accepted 0048H = print or disk redirection pause 0049H–004FH reserved 0050H = file already exists 0051H = duplicate FCB 0052H = cannot make directory 0053H = failure in INT 24H (critical error) 0054H = too many re-directions 0055H = duplicate redirection 0056H = invalid password 0057H = invalid parameter 0058H = network write failure 0059H = function not supported by network 005AH = required system component not installed 0065H = device not selected Following are the error class codes as found in BH: 01H = no resources available 02H = temporary error 03H = authorization error 04H = internal software error 05H = hardware error 06H = system failure 07H = application software error Εργαστήριο Μικροϋπολογιστικών Συστημάτων | 114 08H = item not found 09H = invalid format 0AH = item blocked 0BH = media error 0CH = item already exists 0DH = unknown error Following is the recommended action as found in BL: 01H = retry operation 02H = delay and retry operation 03H = user retry 04H = abort processing 05H = immediate exit 06H = ignore error 07H = retry with user intervention Following is a list of locus in CH: 01H = unknown source 02H = block device error 03H = network area 04H = serial device error 05H = memory error 5AH CREATE UNIQUE FILE NAME Entry AH = 5AH CX = attribute code DS:DX = address of the ASCII-Z string directory path Exit Carry is set for error condition AX = file handle if carry cleared DS:DX = address of the appended directory name Notes The ASCII-Z file directory path must end with a backslash (\). On exit, the directory name is appended with a unique file name. 5BH CREATE A DOS FILE Εργαστήριο Μικροϋπολογιστικών Συστημάτων | 115 Entry AH = 5BH CX = attribute code DS:DX = address of the ASCII-Z string contain the file name Exit Carry is set for error condition AX = file handle if carry cleared Notes The function only works in DOS version 3.X or higher. It is almost identical to function 3CH, except that function 3CH erases the file, if it already exists, while function 5BH reports that the file exists without erasing it. 5CH LOCK/UNLOCK FILE CONTENTS Entry AH = 5CH BX = file handle CX:DX = offset address of locked/unlocked area SI:DI = number of bytes to lock or unlock beginning at offset Exit Carry is set for error condition 5DH SET EXTENDED ERROR INFORMATION Entry AH = 5DH AL = 0AH DS:DX = address of the extended error data structure Notes This function is used by DOS version 3.1 or higher to store extended error information. 5EH NETWORK/PRINTER Entry AH = 5EH AL = 00H (get network name) DS:DX = address of the ASCII-Z string containing network name Exit Carry is set for error condition CL = netBIOS number if carry cleared Entry AH = 5EH AL = 02H (define network printer) BX = redirection list CX = length of setup string DS:DX = address of printer setup buffer Exit Carry is set for error condition Entry AH = 5EH AL = 03H (read network printer setup string) BX = redirection list DS:DX = address of printer setup buffer Exit Carry is set for error condition CX = length of setup string if carry cleared ES:DI = address of printer setup buffer 62H GET PSP ADDRESS Εργαστήριο Μικροϋπολογιστικών Συστημάτων | 116 Entry AH = 62H Exit BX = segment address of the current program Notes The function only works in DOS version 3.0 or higher. 65H GET EXTENDED COUNTRY INFORMATION Entry AH = 65H AL = function code ES:DI = address of buffer to receive information Exit Carry is set for error condition CX = length of country information Notes The function only works in DOS version 3.3 or higher. 66H GET/SET CODE PAGE Entry AH = 66H AL = function code BX = code page number Exit Carry is set for error condition BX = active code page number DX = default code page number Notes A function code in AL of 01H gets the code page number, and a code of 02H sets the code page number. 67H SET HANDLE COUNT Entry AH = 67H BX = number of handles desired Exit Carry is set for error condition Notes This function is available for DOS version 3.3 or higher. 68H COMMIT FILE Entry AH = 68H BX = handle number Exit Carry is set for error condition; otherwise, the date and time stamp is written to directory Notes This function is available for DOS version 3.3 or higher. 6CH EXTENDED OPEN FILE Entry AH = 6CH AL = 00H BX = open mode CX = attributes DX = open flag DS:SI = address of ASCII-Z string file name Εργαστήριο Μικροϋπολογιστικών Συστημάτων | 117 Exit AX = error code if carry is set AX = handle if carry is cleared CX = 0001H file existed and was opened CX = 0002H file did not exist and was created Notes This function is available for DOS version 4.0 or higher. Εργαστήριο Μικροϋπολογιστικών Συστημάτων | 118 ΕΡΓΑΣΤΗΡΙΟ ΑΡΧΙΤΕΚΤΟΝΙΚΗΣ & ΛΕΙΤΟΥΡΓΙΑΣ Η/Υ Διδ άσκων: Ε υάγ γελος Τ οπ άλης Δρ. Ηλ εκτρολ όγ ος Μηχ αν ικ ός & Τεχν ολ ογ ία ς Υ πολ ογ ιστών ΠΑΡΑΡΤΗΜΑ 3 – ΣΥΝΟΛΟ ΕΝΤΟΛΩΝ 8086 - Pentium ΣΥΝΟΛΟ ΕΝΤΟΛΩΝ 8086 ‐ Pentium Tο τμήμα αυτό περιέχει έναν πλήρη αλφαβητικό κατάλογο όλων των εντολών για τους μικροεπεξεργαστές 8086 έως Pentium Pro. Το σύνολο των εντολών του συνεπεξεργαστή παρουσιάστηκε στο Κεφάλαιο 13 και δεν περιέχεται σε αυτό το Παράρτημα. Κάθε καταχώρηση αναφέρει το μνημονικό κώδικα καθώς και μια σύντομη περιγραφή της λειτουργίας της εντολής. Παρουσιάζεται επίσης η δυαδικά κωδικοποιημένη γλώσσα μηχανής κάθε εντολής, και ότι άλλα δεδομένα απαιτούνται για την διαμόρφωση της εντολής, όπως το displacement ή immediate δεδομένα. Δεξιά της δυαδικά κωδικοποιημένης γλώσσας μηχανής κάθε εντολής είναι τα bit σημαίας και ότι αλλαγή μπορεί να παρουσιαστεί για την εντολή. Τα flag bits και οποιεσδήποτε αλλαγές συμβούν κατά την εκτέλεση της εντολής. Οι σημαίες περιγράφονται με τον εξής τρόπο: ένα κενό δηλώνει καμιά επίδραση ή αλλαγή, ένα ? δηλώνει ότι μια αλλαγή έχει ένα μη προβλέψιμο αποτέλεσμα, ένα * δηλώνει αλλαγή με προβλέψιμο αποτέλεσμα, ένας 1 δηλώνει ότι το bit σημαία τίθεται, και ένα 0 δηλώνει ότι το αντίστοιχο bit σημαία καθαρίζεται. Σε περίπτωση που τα bits σημαίας ODITSZAPC δεν αναγράφονται με την εντολή, η εντολή δεν μεταβάλλει κανένα από τα bits σημαίας. Πριν την καταγραφή του συνόλου των εντολών, πρέπει να παρουσιαστούν μερικές πληροφορίες σχετικά με τις ρυθμίσεις των bits της δυαδικά κωδικοποιημένης γλώσσας μηχανής κάθε εντολής. Ο Πίνακας Β‐1 παρουσιάζει τα modifier bit, συμβολιζόμενα ως οο στον κατάλογο των εντολών. Εργαστήριο Μικροϋπολογιστικών Συστημάτων | 119 ΠΙΝΑΚΑΣ Β-1. oo Function 00 If mmm = 110, then a displacement follows the opcode; otherwise, no displacement is used 01 An 8‐bit signed displacement follows the opcode 10 A 16‐bit signed displacement follows the opcode (unless it is a 11 32‐bit displacement) mmm specifies a register instead of an addresing mode Ο Πίνακας Β‐2 καταγράφει τους τρόπους διευθυνσιοδότησης της μνήμης που είναι διαθέσιμοι χρησιμοποιώντας το σύμβολο mmm για την κωδικοποίηση του πεδίου καταχωρητών (register field coding). Ο πίνακας αυτός μπορεί να εφαρμοστεί σε όλες τις εκδόσεις των μικροεπεξεργαστών αρκεί ο τρόπος λειτουργίας να είναι των 16‐bits. Ο Πίνακας Β‐3 καταγράφει την επιλογή των καταχωρητών σύμφωνα με το rrr πεδίο μιας εντολής. Ο πίνακας αυτός περιέχει επιλογές καταχωρητών για 8‐, 16‐, και 32‐bit καταχωρητές. Ο Πίνακας Β‐4 παρουσιάζει το segment register bit assignment (rrr) για τις εντολές MOV, PUSH και POP. Όταν χρησιμοποιείται ο 80386‐Pentium Pro, μερικοί από τους ορισμούς που παρέχονται στους πίνακες Β‐1 έως Β‐3 αλλάζουν. Αναφερθείτε στους Πίνακες Β‐5 και Β‐6 για τις αλλαγές όπως αυτές παρουσιάζονται στους μικροεπεξεργαστές 80386‐Pentium Pro. ΠΙΝΑΚΑΣ Β‐2. mmm Function 000 DS:[BX+SI] 001 DS:[BX+DI] 010 SS:[BP+SI] 011 SS:[BP+DI] 100 DS:[SI] 101 DS:[DI] 110 SS:[BP] 111 DS:[BX] rrr W=0 W=1 (16‐bit) 000 AL AX EAX 001 CL CX ECX 010 DL DX EDX 011 BL BX EBX ΠΙΝΑΚΑΣ Β-3. Εργαστήριο Μικροϋπολογιστικών Συστημάτων | W=1 (32‐bit) 120 100 AH SP ESP 101 CH BP EBP 110 DH SI ESI 111 BH DI EDI ΠΙΝΑΚΑΣ Β-4. rrr Segment Register 000 ES 001 CS 010 SS 011 DS 100 FS 101 GS ΠΙΝΑΚΑΣ Β-5. rrr Index Register 000 DS:[EAX] 001 DS:[ECX] 010 DS:[EDX] 011 DS:[EBX] 100 No index (see Table B–6) 101 SS:[EBP] 110 DS:[ESI] 111 DS:[EDI] Προκειμένου να χρησιμοποιηθούν οι τρόποι διευθυνσιοδότησης scaled index, όπως παρουσιάζονται στον Πίνακα Β-6, οι κώδικες το οο και mmm τοποθετούνται στο δεύτερο byte του opcode. Το scaled index byte είναι συνήθως το τρίτο byte και περιέχει τρία πεδία. Τα δύο πιο αριστερά bits καθορίζουν τον παράγονται scaling (00=X1, 01=X2, 10=X3 ή 11=X8).Τα επόμενα τρία bits προς τα δεξιά περιέχουν τον αριθμό του scaled index register (αυτός ο αριθμός λαμβάνεται από τον Πίνακα Β-5). Τα τρία δεξιότερα bits λαμβάνονται από το πεδίο rrr όπως παρουσιάζεται στον Πίνακα Β-6. Για παράδειγμα, η εντολή MOV AL, [EBX +2*ECX] έχει ένα scaled index 01001011 όπου 01=Χ2, 001= ECX, και 011= EBX. ΠΙΝΑΚΑΣ Β-6. oo mmm rrr (base in scaled index byte) 00 000 — 00 001 — DS:[ECX] 00 010 — DS:[EDX] Εργαστήριο Μικροϋπολογιστικών Συστημάτων | Addressing Mode DS:[EAX] 121 00 011 — 00 100 000 DS:[EAX+scaled index] 00 100 001 DS:[ECX+scaled index] 00 100 010 DS:[EDX+scaled index] 00 100 011 DS:[EBX+scaled index] 00 100 100 SS:[ESP+scaled index] 00 100 101 DS:[disp32+scaled index] 00 100 110 DS:[ESI+scaled index] 00 100 111 DS:[EDI+scaled index] 00 101 — DS:disp32 00 110 — DS:[ESI] 00 111 — DS:[EDI] 01 000 — DS:[EAX+disp8] 01 001 — DS:[ECX+disp8] 01 010 — DS:[EDX+disp8] 01 011 — DS:[EBX+disp8] 01 100 000 DS:[EAX+scaled index+disp8] 01 100 001 DS:[ECX+scaled index+disp8] 01 100 010 DS:[EDX+scaled index+disp8] 01 100 011 DS:[EBX+scaled index+disp8] 01 100 100 SS:[ESP+scaled index+disp8] 01 100 101 SS:[EBP+scaled index+disp8] 01 100 110 DS:[ESI+scaled index+disp8] 01 100 111 DS:[EDI+scaled index+disp8] 01 101 — SS:[EBP+disp8] 01 110 — DS:[ESI+disp8] 01 111 — DS:[EDI+disp8] 10 000 — DS:[EAX+disp32] 10 001 — DS:[ECX+disp32] 10 010 — DS:[EDX+disp32] 10 011 — DS:[EBX+disp32] 10 100 000 DS:[EAX+scaled index+disp32] 10 100 001 DS:[ECX+scaled index+disp32] Εργαστήριο Μικροϋπολογιστικών Συστημάτων | DS:[EBX] 122 10 100 010 DS:[EDX+scaled index+disp32] 10 100 011 DS:[EBX+scaled index+disp32] 10 100 100 SS:[ESP+scaled index+disp32] 10 100 101 SS:[EBP+scaled index+disp32] 10 100 110 DS:[ESI+scaled index+disp32] 10 100 111 DS:[EDI+scaled index+disp32] 10 101 — SS:[EBP+disp32] 10 110 — DS:[ESI+disp32] 10 111 — DS:[EDI+disp32] Notes: disp8 = 8‐bit displacement and disp32 = 32‐bit displacement. Μερικές εντολές έχουν πρόθεμα για να αλλάζουν το εξ ορισμού segment ή να παρακάμψουν (override) το instruction mode. Ο Πίνακας Β‐7 παραθέτει τα override προθέματα των segment και του instruction mode. Για παράδειγμα, η εντολή MOV AL, ES:[BX] χρησιμοποιεί το extra segment λόγω του override προθέματος ES:. Στους μικροεπεξεργαστές 8086 και 8088 ο υπολογισμός της effective διεύθυνσης απαιτεί επιπλέον παλμούς ρολογιού, οι οποίοι προστίθενται στους χρόνους όπως παρουσιάζονται στο συνοπτικό σύνολο των εντολών. Οι επιπλέον αυτοί χρόνοι καταγράφονται στον Πίνακα Β‐8. Δεν απαιτείται η πρόσθεση τέτοιων χρόνων στους μικροεπεξεργαστές 80286 έως Pentium Pro. Σημειώστε ότι δεν ήταν διαθέσιμοι οι χρόνοι ρολογιού για τον Pentium Pro, κατά την συγγραφή αυτού του κεφαλαίου. ΠΙΝΑΚΑΣ Β-7. Prefix Byte Purpose 26H ES: segment override prefix 2EH CS: segment override prefix 36H SS: segment override prefix 3EH DS: segment override prefix 64H FS: segment override prefix 65H GS: segment override prefix 66H Operand size instruction mode override 67H Register size instruction mode override ΠΙΝΑΚΑΣ Β-8. Type Example Instruction Base or index 5 MOV CL,[DI] Displacement 3 MOV AL,DATA1 Base plus index 7 MOV AL,[BP+SI] Εργαστήριο Μικροϋπολογιστικών Συστημάτων | Clocks 123 Displacement plus base or index 9 MOV DH,[DI+20H] Base plus index plus displacement 11 MOV CL,[BX+DI+2] Segment override Ea + 2 MOV AL,ED:[DI] Το Σύνολο των Εντολών AAA ASCII adjust AL after addition 00110111 O D I T S Z A P C ? ? ? * ? * Example Microprocessor Clocks AAA 8086 8 8088 8 80286 3 80386 4 80486 3 Pentium 3 Pentium Pro AAD ASCII adjust AX before division 11010101 00001010 O ? D I T S Z A P C * * ? * ? Example Microprocessor Clocks AAD 8086 60 8088 60 80286 14 80386 19 80486 14 Pentium 10 Pentium Pro AAM ASCII adjust AX after multiplication 11010100 00001010 O I T S Z A P C * * ? * ? Example AAM 8086 83 8088 83 80286 16 Εργαστήριο Μικροϋπολογιστικών Συστημάτων | ? D Microprocessor Clocks 124 80386 17 80486 15 Pentium 18 Pentium Pro AAS ASCII adjust AL after subtraction 00111111 O ? D I T S Z A P C ? ? * ? * Example Microprocessor Clocks AAS 8086 8 8088 8 80286 3 80386 4 80486 3 Pentium 3 Pentium Pro ADC Addition with carry 000100dw oorrrmmm disp O Example I T S Z A P C * * * * * Microprocessor Clocks ADC reg, reg ADC AL,BL 8086 3 ADC EAX,EBX 8088 3 ADC CX,SI 80286 3 ADC ESI,EDI 80386 3 ADC AL,BL 80486 1 Pentium 1 or 3 Pentium Pro ADC mem,reg ADC DATAY,AL 8086 16 + ea ADC LIST,SI 8088 24 + ea ADC DATA2[DI],CL 80286 7 ADC [EAX],BL 80386 7 ADC [EBX+2*ECX],EDX 80486 3 Pentium 1 or 3 Pentium Pro Εργαστήριο Μικροϋπολογιστικών Συστημάτων | * D 125 ADC reg,imm ADC CX,3 8086 9 + ea ADC DI,1AH 8088 13 + ea ADC DL,34H 80286 7 ADC EAX,12345 80386 6 ADC CX,1234H 80486 2 Pentium 1 or 2 Pentium Pro 100000sw oo010mmm disp data Format ADC reg,imm Example Microprocessor Clocks ADC CX,3 8086 4 ADC DI,1AH 8088 4 ADC DL,34H 80286 3 ADC EAX,12345 80386 2 ADC CX,1234H 80486 1 Pentium 1 or 3 Pentium Pro ADC mem,imm ADC DATA4,33 8086 17 + ea ADC LIST,’A’ 8088 23 + ea ADC DATA3[DI],2 80286 7 ADC BYTE PTR[EBX],3 80386 7 ADC WORD PTR[DI],669H 80486 3 Pentium 1 or 3 Pentium Pro ADC AX,3 8086 4 ADC AL,1AH 8088 4 ADC AH,34H 80286 3 ADC EAX,2 80386 2 ADC AL,’Z’ 80486 1 Pentium 1 Pentium Pro ADC acc,imm ADD Addition 000000dw oorrrmmm disp O Εργαστήριο Μικροϋπολογιστικών Συστημάτων | * D I T S Z A P C * * * * * 126 Format Example Microprocessor ADD reg,reg ADD AX,BX 8086 3 ADD AL,BL 8088 3 ADD EAX,EBX 80286 2 ADD CX,SI 80386 2 ADD ESI,EDI 80486 1 Pentium 1 or 3 Pentium Pro ADD mem,reg ADD DATAY,AL 8086 16 + ea ADD LIST,SI 8088 24 + ea ADD DATA6[DI],CL 80286 7 ADD [EDX+4*ECX],EBX 80386 7 ADD [EAX],CL 80486 3 Pentium 1 or 3 Pentium Pro ADD reg,mem ADD BL,DATA2 8086 9 + ea ADD SI,LIST3 8088 13 + ea ADD CL,DATA2[DI] 80286 7 ADD CX,[EDI] 80386 6 ADD ESI,[ECX+200H] 80486 2 Pentium 1 or 2 Pentium Pro 100000sw oo000mmm disp data Format Examples Microprocessor Clocks ADD reg,imm ADD CX,3 8086 4 ADD DI,1AH 8088 4 ADD DL,34H 80286 3 ADD EDX,1345H 80386 2 ADD CX,1834H 80486 1 Pentium 1 or 3 Pentium Pro ADD mem,imm ADD DATA4,33 8086 17 + ea ADD LIST,’A’ 8088 23 + ea Εργαστήριο Μικροϋπολογιστικών Συστημάτων | Clocks 127 ADD DATA3[DI],2 80286 7 ADD BYTE PTR[EBX],3 80386 7 ADD WORD PTR[DI],669H 80486 3 Pentium 1 or 3 Pentium Pro ADD acc,imm ADD AX,3 8086 4 ADD AL,1AH 8088 4 ADD AH,34H 80286 3 ADD EAX,2 80386 2 ADD AL,’Z’ 80486 1 Pentium 1 Pentium Pro AND Logical AND 001000dw oorrrmmm disp O Format I T S Z A P C * * ? * 0 0 Example Microprocessor Clocks AND reg,reg AND CX,BX 8086 3 AND DL,BL 8088 3 AND ECX,EBX 80286 2 AND BP,SI 80386 2 AND EDX,EDI 80486 1 Pentium 1 or 3 Pentium Pro AND mem,reg AND BIT,AL 8086 16 + ea AND LIST,DI 8088 24 + ea AND DATAZ[BX],CL 80286 7 AND [EAX],BL 80386 7 AND [ESI+4*ECX],EDX 80486 3 Pentium 1 or 3 Pentium Pro AND reg,mem AND BL,DATAW 8086 9 + ea AND SI,LIST 8088 13 + ea AND CL,DATAQ[SI] 80286 7 Εργαστήριο Μικροϋπολογιστικών Συστημάτων | D 128 AND CX,[EAX] 80386 6 AND ESI,[ECX+43H] 80486 2 Pentium 1 or 2 Pentium Pro 100000sw oo100mmm disp data Format Examples Microprocessor Clocks AND reg,imm AND BP,1 8086 4 AND DI,10H 8088 4 AND DL,34H 80286 3 AND EBP,1345H 80386 2 AND SP,1834H 80486 1 Pentium 1 or 3 Pentium Pro AND mem,imm AND DATA4,33 8086 17 + ea AND LIST,’A’ 8088 23 + ea AND DATA3[DI],2 80286 7 AND BYTE PTR[EBX],3 80386 7 80486 3 AND DWORD PTR[DI],66H Pentium 1 or 3 Pentium Pro AND acc,imm AND AX,3 8086 4 AND AL,1AH 8088 4 AND AH,34H 80286 3 AND EAX,2 80386 2 AND AL,’r’ 80486 1 Pentium 1 Pentium Pro ARPL Adjust requested privilege level 01100011 oorrrmmm disp O Format I T S Z A P C * Example Microprocessor Clocks ARPL reg,reg ARPL AX,BX 8086 ARPL BX,SI 8088 Εργαστήριο Μικροϋπολογιστικών Συστημάτων | D 129 ARPL AX,DX 80286 10 ARPL BX,AX 80386 20 ARPL SI,DI 80486 9 Pentium 7 Pentium Pro ARPL mem,reg ARPL DATAY,AX 8086 ARPL LIST,DI 8088 ARPL DATA3[DI],CX 80286 11 ARPL [EBX],AX 80386 21 ARPL [EDX+4*ECX],BP 80486 9 Pentium 7 Pentium Pro BOUND Check array against boundary 01100010 oorrrmmm disp Format Example Microprocessor Clocks BOUND reg,mem BOUND AX,BETS 8086 BOUND BP,LISTG 8088 BOUND CX,DATAX 80286 13 BOUND BX,[DI] 80386 10 BOUND SI,[BX+2] 80486 7 Pentium 8 Pentium Pro BSF Bit scan forward 00001111 10111100 oorrrmmm disp O Format I T S Z A P C ? * ? ? ? ? Example Microprocessor Clocks BSF reg,reg BSF AX,BX 8086 BSF BX,SI 8088 BSF EAX,EDX 80286 BSF EBX,EAX 80386 10 + 3n BSF SI,DI 80486 6‐42 Pentium 6‐42 Εργαστήριο Μικροϋπολογιστικών Συστημάτων | D 130 Pentium Pro BSF reg,mem BSF AX,DATAY 8086 BSF SI,LIST 8088 BSF CX,DATA3[DI] 80286 BSF EAX,[EBX] 80386 10 + 3n BSF EBP,[EDX+4*ECX] 80486 7‐43 Pentium 7‐43 Pentium Pro BSF Bit scan forward 00001111 10111101 oorrrmmm disp O Format D I T S Z A P C ? * ? ? ? ? Example Microprocessor Clocks BSR reg,reg BSR AX,BX 8086 BSR BX,SI 8088 BSR EAX,EDX 80286 BSR EBX,EAX 80386 10 + 3n BSR SI,DI 80486 6‐103 Pentium 7‐71 Pentium Pro BSR reg,mem BSR AX,DATAY 8086 BSR SI,LIST 8088 BSR CX,DATA3[DI] 80286 BSR EAX,[EBX] 80386 10 + 3n BSR EBP,[EDX+4*ECX] 80486 7‐104 Pentium 7‐72 Pentium Pro BSWAP Byte swap 00001111 11001rrr Format Example Microprocessor BSWAP reg32 BSWAP EAX 8086 BSWAP EBX 8088 BSWAP EDX 80286 Εργαστήριο Μικροϋπολογιστικών Συστημάτων | Clocks 131 BSWAP ECX 80386 BSWAP ESI 80486 1 Pentium 1 Pentium Pro BT Bit test 00001111 10111010 oo100mmm disp data O Format I T S Z A P C * Example Microprocessor Clocks BT reg,imm8 BT AX,2 8086 BT CX,4 8088 BT BP,10H 80286 BT CX,8 80386 3 BT BX,2 80486 3 Pentium 4 Pentium Pro BT mem,imm8 BT DATA1,2 8086 BT LIST,2 8088 BT DATA2[DI],3 80286 BT [EAX],1 80386 6 BT FROG,6 80486 3 Pentium 4 Pentium Pro 00001111 10100011 disp Format Example Microprocessor Clocks BT reg,reg BT AX,CX 8086 BT CX,DX 8088 BT BP,AX 80286 BT SI,CX 80386 3 BT EAX,EBX 80486 3 Pentium 4 or 9 Pentium Pro 8086 BT mem,reg BT DATA4,AX Εργαστήριο Μικροϋπολογιστικών Συστημάτων | D 132 BT LIST,BX 8088 BT DATA3[DI],CX 80286 BT [EBX],DX 80386 12 BT [DI],DI 80486 8 Pentium 4 or 9 Pentium Pro BTC Bit test and complement 00001111 10111010 oo111mmm disp data O Format Example I T S Z A P C * Microprocessor Clocks BTC reg,imm8 BTC AX,2 8086 BTC CX,4 8088 BTC BP,10H 80286 BTC CX,8 80386 6 BTC BX,2 80486 6 Pentium 7 or 8 Pentium Pro BTC mem,imm8 BTC DATA1,2 8086 BTC LIST,2 8088 BTC DATA2[DI],3 80286 BTC [EAX],1 80386 7 or 8 BTC FROG,6 80486 8 Pentium 8 Pentium Pro 00001111 10111011 disp Format Example Microprocessor BTC reg,reg BTC AX,CX 8086 BTC CX,DX 8088 BTC BP,AX 80286 BTC SI,CX 80386 6 BTC EAX,EBX 80486 6 Pentium 7 or 13 Pentium Pro Εργαστήριο Μικροϋπολογιστικών Συστημάτων | D Clocks 133 BTC mem,reg BTC DATA4,AX 8086 BTC LIST,BX 8088 BTC DATA3[DI],CX 80286 BTC [EBX],DX 80386 13 BTC [DI],DI 80486 13 Pentium 7 or 13 Pentium Pro BTR Bit test and reset 00001111 10111010 oo110mmm disp data O Format Example I T S Z A P C * Microprocessor Clocks BTR reg,imm8 BTR AX,2 8086 BTR CX,4 8088 BTR BP,10H 80286 BTR CX,8 80386 6 BTR BX,2 80486 6 Pentium 7 or 8 Pentium Pro BTR mem,imm8 BTR DATA1,2 8086 BTR LIST,2 8088 BTR DATA2[DI],3 80286 BTR [EAX],1 80386 8 BTR FROG,6 80486 8 Pentium 7 or 8 Pentium Pro 00001111 10110011 disp Format Example Microprocessor BTR reg,reg BTR AX,CX 8086 BTR CX,DX 8088 BTR BP,AX 80286 BTR SI,CX 80386 6 BTR EAX,EBX 80486 6 Pentium 7 or 13 Εργαστήριο Μικροϋπολογιστικών Συστημάτων | D Clocks 134 Pentium Pro BTR mem,reg BTR DATA4,AX 8086 BTR LIST,BX 8088 BTR DATA3[DI],CX 80286 BTR [EBX],DX 80386 13 BTR [DI],DI 80486 13 Pentium 7 or 13 Pentium Pro BTS Bit test and set 00001111 10111010 oo101mmm disp data O Format Example I T S Z A P C * Microprocessor Clocks BTS reg,imm8 BTS AX,2 8086 BTS CX,4 8088 BTS BP,10H 80286 BTS CX,8 80386 6 BTS BX,2 80486 6 Pentium 7 or 8 Pentium Pro Εργαστήριο Μικροϋπολογιστικών Συστημάτων | D 135 BTS mem,imm8 BTS DATA1,2 8086 BTS LIST,2 8088 BTS DATA2[DI],3 80286 BTS [EAX],1 80386 8 BTS FROG,6 80486 8 Pentium 7 or 8 Pentium Pro 00001111 10101011 disp Format Example Microprocessor BTS reg,reg BTS AX,CX 8086 BTS CX,DX 8088 BTS BP,AX 80286 BTS SI,CX 80386 6 BTS EAX,EBX 80486 6 Pentium 7 or 13 Pentium Pro Clocks BTS mem,reg BTS DATA4,AX 8086 BTS LIST,BX 8088 BTS DATA3[DI],CX 80286 BTS [EBX],DX 80386 13 BTS [DI],DI 80486 13 Pentium 7 or 13 Pentium Pro CALL Call procedure (subroutine) 11101000 disp Format Example Microprocessor Clocks CALL label CALL FOR_FUN 8086 19 (near) CALL HOME 8088 23 CALL ET 80286 7 CALL WAITING 80386 3 CALL SOMEONE 80486 3 Εργαστήριο Μικροϋπολογιστικών Συστημάτων | 136 10011010 disp Format Example 1 Pentium Pro Microprocessor CALL FAR PTR DATES 8086 28 (far) CALL WHAT 8088 36 CALL WHERE 80286 13 CALL FARCE 80386 17 CALL WHOM 80486 18 Pentium 4 Pentium Pro 11111111 oo010mmm Format Example Microprocessor CALL AX 8086 16 (near) CALL BX 8088 20 CALL CX 80286 7 CALL DI 80386 7 CALL SI 80486 5 Pentium 2 Pentium Pro CALL mem CALL ADDRESS 8086 21 + ea (near) CALL NEAR PTR [DI] 8088 29 + ea CALL DATA1 80286 11 CALL FROG 80386 10 CALL ME_NOW 80486 5 Pentium 2 Pentium Pro 11111111 oo011mmm Format Example Microprocessor Clocks CALL mem CALL FAR_LIST[SI] 8086 16 (far) CALL FROM_HERE 8088 20 CALL TO_THERE 80286 7 CALL SIXX 80386 7 Εργαστήριο Μικροϋπολογιστικών Συστημάτων | Clocks CALL reg Clocks CALL label Pentium 137 CALL OCT 80486 5 Pentium 2 Pentium Pro CBW Convert byte to word (AL AX) 10011000 Format Example Microprocessor 8086 2 8088 2 80286 2 80386 3 80486 3 Pentium 3 Pentium Pro Clocks CBW CDQ Convert doubleword to quadword (EAX EDX:EAX) 11010100 00001010 Example Microprocessor 8086 8088 80286 80386 2 80486 2 Pentium 2 Pentium Pro Clocks CDQ CLC Clear carry flag 11111000 O Example I T S Z A P C 0 Microprocessor Clocks CLC 8086 2 8088 2 80286 2 80386 2 80486 2 Pentium 2 Εργαστήριο Μικροϋπολογιστικών Συστημάτων | D 138 Pentium Pro CLD Clear direction flag 11111100 O Example D I T S Z A P C 0 Microprocessor Clocks CLD 8086 2 8088 2 80286 2 80386 2 80486 2 Pentium 2 Pentium Pro CLI Clear interrupt flag 11111010 O Example D I T S Z A P C 0 Microprocessor Clocks CLI 8086 2 8088 2 80286 2 80386 2 80486 5 Pentium 7 Pentium Pro CLTS Clear task switched flag (CR0) 00001111 00000110 Example Microprocessor 8086 8088 80286 2 80386 5 80486 7 Pentium 10 Pentium Pro Εργαστήριο Μικροϋπολογιστικών Συστημάτων | Clocks CLTS 139 CMC Complementary carry flag 10011000 O Example D I T S Z A P C * Microprocessor Clocks CMC 8086 2 8088 2 80286 2 80386 2 80486 2 Pentium 2 Pentium Pro CMOVcondition Conditional move 00001111 0100cccc oorrrmmm Format Example Microprocessor 8086 CMOVC EAX,[EDI] 8088 CMOVNC BX,DATA1 80286 CMOVP EBX,WAITING 80386 CMOVNE DI,[SI] 80486 Pentium Pentium Pro Condition Codes Mnemonic Flag Description 0000 CMOVO O = 1 Move if overflow 0001 CMOVNO O = 0 Move if no overflow 0010 CMOVB C = 1 Move if below 0011 CMOVAE C = 0 Move if above or equal 0100 CMOVE Z = 1 Move if equal/zero 0101 CMOVNE Z = 0 Move if not equal/zero 0110 CMOVBE C = 1 + Z = 1 Move if below or equal 0111 CMOVA C = 0 Z = 0 Move if above 1000 CMOVS S = 1 Move if sign 1001 CMOVNS S = 0 Move if no sign 1010 CMOVP P = 1 Move if parity Εργαστήριο Μικροϋπολογιστικών Συστημάτων | Clocks CMOVNZ AX,FROG CMOVcc reg,mem 140 1011 CMOVNP P = 0 Move if no parity 1100 CMOVL S O Move if less than CMOVGE S = 0 Move if greater than or equal 1110 CMOVLE Z = 1 + S O Move if less than or equal 1111 CMOVG Z = 0 + S = O Move if greater than 1101 CMP Compare 001110dw oorrrmmm disp O Format * Example I T S Z A P C * * * * * Microprocessor Clocks CMP reg,reg CMP AX,BX 8086 3 CMP AL,BL 8088 3 CMP EAX,EBX 80286 2 CMP CX,SI 80386 2 CMP ESI,EDI 80486 1 Pentium 1 or 2 Pentium Pro CMP mem,reg CMP DATAY,AL 8086 9 + ea CMP LIST,SI 8088 13 + ea CMP DATA6[DI],CL 80286 7 CMP [EAX],CL 80386 5 CMP [EDX+4*ECX],EBX 80486 2 Pentium 1 or 2 Pentium Pro CMP reg,mem CMP BL,DATA2 8086 9 + ea CMP SI,LIST3 8088 13 + ea CMP CL,DATA2[DI] 80286 6 CMP CX,[EDI] 80386 6 CMP ESI,[ECX+200H] 80486 2 Pentium 1 or 2 Pentium Pro 100000sw oo111mmm disp data Format CMP reg,imm Example CMP CX,3 Εργαστήριο Μικροϋπολογιστικών Συστημάτων | D Microprocessor 8086 Clocks 4 141 CMP DI,1AH 8088 4 CMP DL,34H 80286 3 CMP EDX,1345H 80386 2 CMP CX,1834H 80486 1 Pentium 1 or 2 Pentium Pro CMP mem,imm CMP DATAS,3 8086 10 + ea CMP BYTE PTR[EDI],1AH 8088 14 + ea CMP DADDY,34H 80286 6 CMP LIST,’A’ 80386 5 CMP TOAD,1834H 80486 2 Pentium 1 or 2 Pentium Pro 0001111w data Format Example Microprocessor Clocks CMP acc,imm CMP AX,3 8086 4 CMP AL,1AH 8088 4 CMP AH,34H 80286 3 CMP EAX,1345H 80386 2 CMP AL,’Y’ 80486 1 Pentium 1 Pentium Pro CMPS Compare strings 1010011w O Format Example I T S Z A P C * * * * * Microprocessor Clocks CMPSW CMPSW 8086 32 CMPSD CMPSD 8088 30 CMPSB DATA1,DATA2 80286 8 REPE CMPSB 80386 10 REPNE CMPSW 80486 8 Pentium 5 Pentium Pro Εργαστήριο Μικροϋπολογιστικών Συστημάτων | * D 142 CMPXCHG Compare and exchange 00001111 1011000w 11rrrrrr O Format D I T S Z A P C * * * * * * Example CMPXCHG Microprocessor CMPXCHG EAX,EBX Clocks 8086 reg,reg CMPXCHG ECX,EDX 8088 80286 80386 80486 6 Pentium 6 Pentium Pro 0001111w data Format Example CMPXCHG Microprocessor CMPXCHG DATA, EAX Clocks 8086 mem,reg CMPXCHG DATA2,EDI 8088 80286 80386 80486 7 Pentium 6 Pentium Pro CMPXCHG 8B Compare and exchange 8 bytes 00001111 11000111 oorrrmmm O Format Example CMPXCHG8B CMPXCHG8B DATA3 D I T S Z A P C * * Microprocessor Clocks 8086 Mem64 8088 80286 80386 80486 Pentium 10 Pentium Pro CPUID CPU identification code Εργαστήριο Μικροϋπολογιστικών Συστημάτων | 143 00001111 10100010 Example Microprocessor CPUID Clocks 8086 8088 80286 80386 80486 Pentium 14 Pentium Pro CWD Convert word to doubleword (AX DX:AX) 10011000 Example Microprocessor CWD Clocks 8086 5 8088 5 80286 2 80386 2 80486 3 Pentium 2 Pentium Pro CWDE Convert word to extended doubleword (AX EAX) 10011000 Example Microprocessor CWDE Clocks 8086 8088 80286 80386 3 80486 3 Pentium 3 Pentium Pro DAA Decimal adjust AL after addition 00100111 O Example Εργαστήριο Μικροϋπολογιστικών Συστημάτων | ? D I T S Z A P C * * * * * Microprocessor Clocks 144 DAA 8086 4 8088 4 80286 3 80386 4 80486 2 Pentium 3 Pentium Pro DAS Decimal adjust AL after subtraction 00101111 O Example ? D I T S Z A P C * * * * * Microprocessor DAS Clocks 8086 4 8088 4 80286 3 80386 4 80486 2 Pentium 3 Pentium Pro DEC Decrement 1111111w oo001mmm disp O Format Example I T S Z A P C * * * * Microprocessor Clocks DEC reg8 DEC BL 8086 3 DEC BH 8088 3 DEC CL 80286 2 DEC DH 80386 2 DEC AH 80486 1 Pentium 1 or 3 Pentium Pro DEC mem DEC DATAY 8086 15 + ea DEC LIST 8088 23 + ea DEC DATA6[DI] 80286 7 DEC BYTE PTR [BX] 80386 6 Εργαστήριο Μικροϋπολογιστικών Συστημάτων | * D 145 DEC WORD PTR [EBX] 80486 3 Pentium 1 or 3 Pentium Pro 01001rrr Format Example Microprocessor Clocks DEC reg16 DEC CX 8086 3 DEC reg32 DEC DI 8088 3 DEC EDX 80286 2 DEC ECX 80386 2 DEC BP 80486 1 Pentium 1 Pentium Pro DIV Divide 1111011w oo110mmm disp O Format ? Example D I T S Z A P C ? ? ? ? ? Microprocessor Clocks DIV reg DIV BL 8086 162 DIV BH 8088 162 DIV ECX 80286 22 DIV DH 80386 38 DIV CX 80486 40 Pentium 17‐41 Pentium Pro DIV mem DIV DATAY 8086 168 DIV LIST 8088 176 DIV DATA6[DI] 80286 25 DIV BYTE PTR [BX] 80386 41 DIV WORD PTR [EBX] 80486 40 Pentium 17‐41 Pentium Pro ENTER Create a stack frame 11001000 data Format Example Εργαστήριο Μικροϋπολογιστικών Συστημάτων | Microprocessor Clocks 146 ENTER imm,0 ENTER 4,0 8086 ENTER 8,0 8088 ENTER 100,0 80286 11 ENTER 200,0 80386 10 ENTER 1024,0 80486 14 Pentium 11 Pentium Pro ENTER imm,1 ENTER 4,1 8086 ENTER 10,1 8088 80286 12 80386 15 80486 17 Pentium 15 ENTER imm,imm ENTER 3,6 8086 ENTER 100,3 8088 80286 12 80386 15 80486 17 Pentium 15 + 2n Pentium Pro ESC Escape (obsolete‐see coprocessor) HALT Halt 11110100 Example Microprocessor Clocks HLT 8086 2 8088 2 80286 2 80386 5 80486 4 Pentium varies Pentium Pro IDIV Integer (signed) division Εργαστήριο Μικροϋπολογιστικών Συστημάτων | 147 1111011w oo111mmm disp O Format Example ? D I T S Z A P C ? ? ? ? ? Microprocessor Clocks IDIV reg IDIV BL 8086 184 IDIV BH 8088 184 IDIV ECX 80286 25 IDIV DH 80386 43 IDIV CX 80486 43 Pentium 22‐46 Pentium Pro IDIV mem IDIV DATAY 8086 190 IDIV LIST 8088 194 IDIV DATA6[DI] 80286 28 IDIV BYTE PTR [BX] 80386 46 IDIV WORD PTR [EBX] 80486 44 Pentium 22‐46 Pentium Pro IMUL Integer (signed) multiplication 1111011w oo101mmm disp O Format Example I T S Z A P C ? ? ? ? * Microprocessor Clocks IMUL reg IMUL BL 8086 154 IMUL CX 8088 154 IMUL ECX 80286 21 IMUL DH 80386 38 IMUL AL 80486 42 Pentium 10‐11 Pentium Pro IMUL mem IMUL DATAY 8086 160 IMUL LIST 8088 164 IMUL DATA6[DI] 80286 24 IMUL BYTE PTR [BX] 80386 41 IMUL WORD PTR [EBX 80486 42 Εργαστήριο Μικροϋπολογιστικών Συστημάτων | ? D 148 011010s1 oorrmmm disp data Format Example 10‐11 Pentium Pro Microprocessor Clocks IMUL reg,imm IMUL CX,16 8086 IMUL DI,100 8088 IMUL EDX,20 80286 21 80386 38 80486 42 Pentium 10 Pentium Pro IMUL IMUL DX,AX,2 8086 reg,reg,imm IMUL CX,DX,3 8088 IMUL BX,AX,33 80286 21 80386 38 80486 42 Pentium 10 Pentium Pro IMUL IMUL CXDATAY,99 8086 reg,mem,imm 8088 80286 24 80386 38 80486 42 Pentium 10 Pentium Pro 00001111 10101111 oorrmmm disp Format Example Microprocessor Clocks IMUL reg,reg IMUL CX,DX 8086 IMUL DI,BX 8088 IMUL EDX,EBX 80286 80386 38 80486 42 Εργαστήριο Μικροϋπολογιστικών Συστημάτων | Pentium 149 Pentium 10 Pentium Pro IMUL reg,mem IMUL DX,DATAY 8086 IMUL CX,LIST 8088 IMUL ECX,DATA6[DI 80286 80386 41 80486 42 Pentium 10 Pentium Pro IN Input data from port 1110010w port# Microprocessor Format Example IN acc,pt IN AL,12H 8086 10 IN AX,12H 8088 14 IN AL,0FFH 80286 5 IN AX,0A0H 80386 12 IN EAX,10H 80486 14 Pentium 7 Pentium Pro 1110110w Format Example Clocks IN acc,DX IN AL,DX 8086 8 IN AX,DX 8088 12 IN EAX,DX 80286 5 80386 13 80486 14 Pentium 7 Pentium Pro Clocks Microprocessor INC Increment 1111111w oo000mmm disp O Format INC reg8 Example INC BL Εργαστήριο Μικροϋπολογιστικών Συστημάτων | * D I T S Z A P C * * * * Microprocessor 8086 Clocks 3 150 INC BH 8088 3 INC AL 80286 2 INC AH 80386 2 INC DH 80486 1 Pentium 1 or 3 Pentium Pro INC mem INC DATA3 8086 15 + ea INC LIST 8088 23 + ea INC COUNT 80286 7 INC BYTE PTR [DI] 80386 6 INC WORD PTR [ECX] 80486 3 Pentium 1 or 3 Pentium Pro INC reg16 INC CX 8086 3 INC reg32 INC DX 8088 3 INC BP 80286 2 INC ECX 80386 2 INC ESP 80486 1 Pentium 1 Pentium Pro INS Input string from port 0110110w Format Example Microprocessor Clocks INSB INSB 8086 INSW INSW 8088 INSD INSD 80286 5 INS DATA2 80386 15 REP INSB 80486 17 Pentium 9 Pentium Pro INT Interrupt 11001101 type Εργαστήριο Μικροϋπολογιστικών Συστημάτων | 151 Format Example Microprocessor Clocks INT type INT12H 8086 51 INT15H 8088 71 INT 21H 80286 23 INT 2FH 80386 37 INT 10H 80486 30 Pentium 16‐82 Pentium Pro INT 3 Interrupt 3 11001100 Example Microprocessor Clocks INT3 8086 52 8088 72 80286 23 80386 33 80486 26 Pentium 13‐56 Pentium Pro INTO Interrupt on overflow 11001110 Example Microprocessor Clocks INTO 8086 53 8088 73 80286 24 80386 35 80486 28 Pentium 13‐56 Pentium Pro INVD Invalid data cache 00001111 00001000 Example Microprocessor INVD Εργαστήριο Μικροϋπολογιστικών Συστημάτων | 8086 Clocks 152 8088 80286 80386 80486 4 Pentium 15 Pentium Pro IRET/IRETD Return from interrupt 11001101 data Format Example O D I T S Z A P C * * * * * * * * * Microprocessor Clocks IRET IRET 8086 32 IRETD IRETD 8088 44 IRET 100 80286 17 80386 22 80486 15 Pentium 8‐27 Pentium Pro Jcondition Conditional jump 0111cccc disp Microprocessor Format Example Jcnd label JA ABOVE 8086 16/4 (8‐bit disp) JB BELOW 8088 16/4 JG GREATER 80286 7/3 JE EQUAL 80386 7/3 JZ ZERO 80486 3/1 Pentium 1 Pentium Pro 0000 1111 1000cccc disp Format Example Microprocessor Clocks Clocks Jcnd label JNE NOT_MORE 8086 (16‐bit disp) JLE LESS_OR_SO 8088 80286 80386 7/3 Εργαστήριο Μικροϋπολογιστικών Συστημάτων | 153 80486 3/1 Pentium 1 Pentium Pro Condition Codes Mnemonic Description Flag 0000 JO O = 1 Jump if overflow 0001 JNO O = 0 Jump if no overflow 0010 JB/NAE C = 1 Jump if below 0011 JAE/JNB C = 0 Jump if above or equal 0100 JE/JZ Z = 1 Jump if equal/zero 0101 JNE/JNZ Z = 0 Jump if not equal/zero 0110 JBE/JNA C = 1 + Z = 1 Jump if below or equal 0111 JA/JNBE C = 0 Z = 0 Jump if above 1000 JS S = 1 Jump if sign 1001 JNS S = 0 Jump if no sign 1010 JP/JPE P = 1 Jump if parity 1011 JNP/JPO P = 0 Jump if no parity 1100 JL/JNGE S O Jump if less than 1101 JGE/JNL S = 0 Jump if greater than or equal 1110 JLE/JNG Z = 1 + S O Jump if less than or equal 1111 JG/JNLE Z = 0 + S = O Jump if greater than JCXZ/JECXZ Jump if CX (ECX) equals zero 11100011 Format Example Microprocessor Clocks JCXZ label JCXZ ABOVE 8086 18/6 JECXZ label JCXZ BELOW 8088 18/6 JECXZ GREATER 80286 8/4 JECXZ EQUAL 80386 9/5 JCXZ NEXT 80486 8/5 Pentium 6/5 Pentium Pro JMP Jump 11101011 disp Εργαστήριο Μικροϋπολογιστικών Συστημάτων | 154 Format Example Microprocessor Clocks JMP label JMP SHORT UP 8086 15 (short) JMP SHORT DOWN 8088 15 JMP SHORT OVER 80286 7 JMP SHORT CIRCUIT 80386 7 JMP SHORT JOKE 80486 3 Pentium 1 Pentium Pro 11101001 disp Format Example Microprocessor JMP VERS 8086 15 (near) JMP FROG 8088 15 JMP UNDER 80286 7 JMP NEAR PTR OVER 80386 7 80486 3 Pentium 1 Pentium Pro 11101010 disp Format Example Microprocessor JMP NOT_MORE 8086 15 (far) JMP UNDER 8088 15 JMP AGAIN 80286 11 JMP FAR PTR THERE 80386 12 80486 17 Pentium 3 Pentium Pro 11111111 oo100mmm Format Microprocessor Example Clocks JMP reg JMP AX 8086 11 (near) JMP EAX 8088 11 JMP CX 80286 7 JMP DX 80386 7 Εργαστήριο Μικροϋπολογιστικών Συστημάτων | Clocks JMP label Clocks JMP label 155 80486 3 Pentium 2 Pentium Pro JMP mem JMP VERS 8086 18 + ea (near) JMP FROG 8088 18 + ea JMP CS:UNDER 80286 11 JMP DATA1[DI+2] 80386 10 80486 5 Pentium 4 Pentium Pro 11111111 oo101mmm Format Microprocessor Example Clocks JMP mem JMP WAY_OFF 8086 24 + ea (far) JMP TABLE 8088 24 + ea JMP UP 80286 15 JMP OUT_OF_ 80386 12 80486 13 Pentium 4 Pentium Pro LAHF Load AH from flags 10011111 Example Microprocessor Clocks LAHF 8086 4 8088 4 80286 2 80386 2 80486 3 Pentium 2 Pentium Pro LAR Load access rights byte 00001111 00000010 oorrrmmm disp O D I T S Z A P C * Format Example Εργαστήριο Μικροϋπολογιστικών Συστημάτων | Microprocessor Clocks 156 LAR reg,reg LAR AX,BX 8086 LAR CX,DX 8088 LAR ECX,EDX 80286 14 80386 15 80486 11 Pentium 8 Pentium Pro LAR reg,mem LAR CX,DATA1 8086 LAR AX,LIST3 8088 LAR ECX,TOAD 80286 16 80386 16 80486 11 Pentium 8 Pentium Pro LDS Load far pointer to DS and register 11000101 oorrrmmm Fo rmat Microprocessor Example Clocks LDS reg,mem LDS DI,DATA3 8086 16 + ea LDS SI,LIST2 8088 24 + ea LDS BX,ARRAY_PTR 80286 7 LDS CX,PNTR 80386 7 80486 6 Pentium 4 Pentium Pro LEA Load effective address 10001101 oorrrmmm disp Format Example Microprocessor Clocks LEA reg,mem LEA DI,DATA3 8086 2 + ea LEA SI,LIST2 8088 2 + ea LEA BX,ARRAY_PTR 80286 3 LEA CX,PNT 80386 3 Εργαστήριο Μικροϋπολογιστικών Συστημάτων | 157 80486 2 Pentium 1 Pentium Pro LEAVE Leave high‐level procedure 11001001 Example Microprocessor Clocks LEAVE 8086 8088 80286 5 80386 4 80486 5 Pentium 3 Pentium Pro LES Load far pointer to ES and register 11000100 oorrrmmm Format Microprocessor Example Clocks LES reg,mem LES DI,DATA3 8086 16 + ea LES SI,LIST2 8088 24 + ea LES BX,ARRAY_PTR 80286 7 LES CX,PNTR 80386 7 80486 6 Pentium 4 Pentium Pro LFS Load far pointer to FS and register 00001111 10110100 oorrrmmm disp Format Microprocessor Example Clocks LFS reg,mem LFS DI,DATA3 8086 LFS SI,LIST2 8088 LFS BX,ARRAY_PTR 80286 LFS CX,PNTR 80386 7 80486 6 Pentium 4 Εργαστήριο Μικροϋπολογιστικών Συστημάτων | 158 Pentium Pro LGDT Load global descriptor table 00001111 00000001 oo010mmm disp Format Microprocessor Example Clocks LGDT mem64 LGDT DESCRIP 8086 LGDT TABLED 8088 80286 11 80386 11 80486 11 Pentium 6 Pentium Pro LGS Load far pointer to GS and register Format Example Microprocessor Clocks LGS reg,mem LGS DI,DATA3 8086 LGS SI,LIST2 8088 LGS BX,ARRAY_PTR 80286 LGS CX,PNT 80386 7 80486 6 Pentium 4 Pentium Pro LIDT Load interrupt descriptor table 00001111 00000001 oo011mmm disp Format Example Microprocessor LIDT DATA3 8086 LIDT LIST2 8088 80286 12 80386 11 80486 11 Pentium 6 Pentium Pro Εργαστήριο Μικροϋπολογιστικών Συστημάτων | Clocks LIDT mem64 159 LLDT Load local descriptor table 00001111 00000000 oo010mmm disp Format Example Microprocessor LLDT BX 8086 LLDT DX 8088 LLDT CX 80286 17 80386 20 80486 11 Pentium 9 Pentium Pro LLDT mem LLDT DATA1 8086 LLDT LIST3 8088 LLDT TOAD 80286 19 80386 24 80486 11 Pentium 9 Pentium Pro Clocks LLDT reg LMSW Load machine status word (80286 only) 00001111 00000001 oo110mmm disp Format Example Microprocessor LMSW BX 8086 LMSW DX 8088 LMSW CX 80286 3 80386 10 80486 2 Pentium 8 Pentium Pro LMSW mem LMSW DATA1 8086 LMSW LIST3 8088 LMSW TOAD 80286 6 80386 13 80486 3 Εργαστήριο Μικροϋπολογιστικών Συστημάτων | Clocks LMSW reg 160 Pentium 8 Pentium Pro LOCK Lock the bus 11110000 Format Example Microprocessor Clocks LOCK:inst LOCK:XCHG AX,BX 8086 2 LOCK:ADD AL,3 8088 3 80286 0 80386 0 80486 1 Pentium 1 Pentium Pro LODS Load string operand 1010110w Format Example Microprocessor Clocks LODSB LODSB 8086 12 LODSW LODSW 8088 15 LODSD LODSD 80286 5 LODS DATA3 80386 5 80486 5 Pentium 2 Pentium Pro LOOP/LOOPD Loop until CX = 0 or ECX = 0 11100010 disp Microprocessor Format Example LOOP label LOOP NEXT 8086 17/5 LOOPD label LOOP BACK 8088 17/5 LOOPD LOOPS 80286 8/4 80386 11 80486 7/6 Pentium 5/6 Εργαστήριο Μικροϋπολογιστικών Συστημάτων | Clocks 161 Pentium Pro LOOPE/LOOPED Loop while equal 11100001 disp Format Example Microprocessor Clocks LOOPE label LOOPE AGAIN 8086 18/6 LOOPED label LOOPED UNTIL 8088 18/6 LOOPZ label LOOPZ ZORRO 80286 8/4 LOOPE label LOOPE AGAIN 80386 11 80486 9/6 Pentium 7/8 Pentium Pro LOOPNE/LOOPNED Loop while not equal 11100000 disp Format Example Microprocessor Clocks LOOPNE label LOOPNE FORWARD 8086 19/5 LOOPNED label LOOPNED UPS 8088 19/5 LOOPNZ label LOOPNZ TRY_AGAIN 80286 8/4 LOOPNZD label LOOPNZD WOO 80386 11 80486 9/6 Pentium 7/8 Pentium Pro LSL Load segment limit 00001111 00000011 oorrrmmm disp D I T S Z A P C * Format Example LSL reg,reg LSL AX,BX 8086 LSL CX,BX 8088 LSL EDX,EAX 80286 14 80386 25 80486 10 Pentium 8 Pentium Pro Εργαστήριο Μικροϋπολογιστικών Συστημάτων | O Microprocessor Clocks 162 LSL reg,mem LSL AX,LIMIT 8086 LSL EAX,NUM 8088 80286 16 80386 26 80486 10 Pentium 8 Pentium Pro LSS Load far pointer to SS and register 00001111 10110010 oorrrmmm disp Format Example Microprocessor Clocks LSS reg,mem LSS DI,DATA1 8086 LSS SP,STACK_TOP 8088 LSS CX,ARRAY 80286 80386 7 80486 6 Pentium 4 Pentium Pro LTR Load task register 00001111 00000000 oo001mmm disp Format Example Microprocessor LTR AX 8086 LTR CX 8088 LTR DX 80286 17 80386 23 80486 20 Pentium 10 Pentium Pro LTR mem16 LTR TASK 8086 LTR NUM 8088 80286 19 80386 27 80486 20 Εργαστήριο Μικροϋπολογιστικών Συστημάτων | Clocks LTR reg 163 Pentium 10 Pentium Pro MOVE Move data 100010dw oorrrmmm disp Format Example Microprocessor MOV CL,CH 8086 2 MOV BH,CL 8088 2 MOV CX,DX 80286 2 MOV EAX,EBP 80386 2 MOV ESP,ESI 80486 1 Pentium 1 Pentium Pro MOV mem,reg MOV DATA7,DL 8086 9 + ea MOV NUMB,CX 8088 13 + ea MOV TEMP,EBX 80286 5 MOV [ECX],BL 80386 4 MOV [DI],DH 80486 1 Pentium 1 Pentium Pro MOV reg,mem MOV DL,DATA8 8086 10 + ea MOV DX,NUMB 8088 12 + ea MOV EBX,TEMP+3 80286 5 MOV CH,TEMP[EDI] 80386 4 MOV CL,DATA2 80486 1 Pentium 1 Pentium Pro 1100011w oo000mmm disp data Format Example Microprocessor Clocks MOV mem,imm MOV DATAF,23H 8086 10 + ea MOV LIST,12H 8088 12 + ea MOV BYTE PTR [DI],2 80286 3 MOV NUMB,234H 80386 2 Εργαστήριο Μικροϋπολογιστικών Συστημάτων | Clocks MOV reg,reg 164 MOV DWORD PTR[ECX],1 80486 1 Pentium 1 Pentium Pro 1011wrrr data Format Example Microprocessor MOV BX,22H 8086 4 MOV CX,12H 8088 4 MOV CL,2 80286 3 MOV ECX,123456H 80386 2 MOV DI,100 80486 1 Pentium 1 Pentium Pro 101000dw disp Format Example Microprocessor MOV DATAF,AL 8086 10 MOV LIST,AX 8088 14 MOV NUMB,EAX 80286 3 80386 2 80486 1 Pentium 1 Pentium Pro MOV acc,mem MOV AL,DATAE 8086 10 MOV AX,LIST 8088 14 MOV EAX,LUTE 80286 3 80386 2 80486 1 Pentium 1 Pentium Pro 100011d0 oosssmmm disp Format Example Microprocessor Clocks MOV seg,reg MOV SS,AX 8086 2 MOV DS,DX 8088 2 MOV ES,CX 80286 2 Εργαστήριο Μικροϋπολογιστικών Συστημάτων | Clocks MOV mem,acc Clocks MOV reg,imm 165 MOV FS,BX 80386 2 MOV GS,AX 80486 1 Pentium 1 Pentium Pro MOV seg,mem MOV SS,STACK_TOP 8086 8 + ea MOV DS,DATAS 8088 12 + ea MOV ES,TEMP1 80286 2 80386 2 80486 1 Pentium 2 or 3 Pentium Pro MOV reg,seg MOV BX,DS 8086 2 MOV CX,FS 8088 2 MOV CX,ES 80286 2 80386 2 80486 1 Pentium 1 Pentium Pro MOV mem,seg MOV DATA2,CS 8086 9 + ea MOV TEMP,DS 8088 13 + ea MOV NUMB1,SS 80286 3 MOV TEMP2,GS 80386 2 80486 1 Pentium 1 Pentium Pro 00001111 001000d0 11rrrmmm Format Example Microprocessor Clocks MOV reg,cr MOV EBX,CR0 8086 MOV ECX,CR2 8088 MOV EBX,CR3 80286 80386 6 80486 4 Εργαστήριο Μικροϋπολογιστικών Συστημάτων | 166 4 Pentium Pro MOV cr,reg MOV CR0,EAX 8086 MOV CR1,EBX 8088 MOV CR3,EDX 80286 80386 10 80486 4 Pentium 12‐46 Pentium Pro 00001111 001000d1 11rrrmmm Format Example Microprocessor MOV EBX,DR6 8086 MOV ECX,DR7 8088 MOV EBX,DR1 80286 80386 22 80486 10 Pentium 11 Pentium Pro MOV dr,reg MOV DR0,EAX 8086 MOV DR1,EBX 8088 MOV DR3,EDX 80286 80386 22 80486 11 Pentium 11 Pentium Pro 00001111 001001d0 11rrrmmm Format Example Microprocessor Clocks MOV reg,tr MOV EBX,TR6 8086 MOV ECX,TR7 8088 80286 80386 12 80486 4 Εργαστήριο Μικροϋπολογιστικών Συστημάτων | Clocks MOV reg,dr Pentium 167 Pentium 11 Pentium Pro MOV tr,reg MOV TR6,EAX 8086 MOV TR7,EBX 8088 80286 80386 12 80486 6 Pentium 11 Pentium Pro MOVS Move string data 1010010w Format Example Microprocessor Clocks MOVSB MOVSB 8086 18 MOVSW MOVSW 8088 26 MOVSD MOVSD 80286 5 MOVS DATA1,DATA2 80386 7 80486 7 Pentium 4 Pentium Pro MOVSX Move with sidn extend 00001111 1011111w oorrrmmm disp Format Example Microprocessor MOVSX BX,AL 8086 MOVSX EAX,DX 8088 80286 80386 3 80486 3 Pentium 3 Pentium Pro MOVSX reg,mem MOVSX AX,DATA34 8086 MOVSX EAX,NUMB 8088 80286 Εργαστήριο Μικροϋπολογιστικών Συστημάτων | Clocks MOVSX reg,reg 168 80386 6 80486 3 Pentium 3 Pentium Pro MOVZX Move with zero extend 00001111 1011011w oorrrmmm disp Format Example Microprocessor MOVZX BX,AL 8086 MOVZX EAX,DX 8088 80286 80386 3 80486 3 Pentium 3 Pentium Pro MOVZX reg,mem MOVZX AX,DATA34 8086 MOVZX EAX,NUMB 8088 80286 80386 6 80486 3 Pentium 3 Pentium Pro Clocks MOVZX reg,reg MUL Multiply 1111011w oo100mmm disp O D I T S Z A P C * ? ? ? ? * Format Example Clocks MUL reg MUL BL 8086 118 MUL CX 8088 143 MUL EDX 80286 21 80386 38 80486 42 Pentium 10 or 11 Pentium Pro Εργαστήριο Μικροϋπολογιστικών Συστημάτων | Microprocessor 169 MUL mem MUL DATA9 8086 139 MUL WORD PTR [ESI] 8088 143 80286 24 80386 41 80486 42 Pentium 11 Pentium Pro NEG Negate 1111011w oo011mmm disp O D I T S Z A P C * * * * * * Format Example Microprocessor Clocks NEG reg NEG BL 8086 3 NEG CX 8088 3 NEG EDI 80286 2 80386 2 80486 1 Pentium 1 or 3 Pentium Pro NEG mem NEG DATA9 8086 16 + ea NEG WORD PTR [ESI 8088 24 + ea 80286 7 80386 6 80486 3 Pentium 1 or 3 Pentium Pro NOP No operation 10010000 Format Example Microprocessor Clocks NOP 8086 3 8088 3 80286 3 80386 3 Εργαστήριο Μικροϋπολογιστικών Συστημάτων | 170 80486 3 Pentium 1 Pentium Pro NOT One’s complement 1111011w oo010mmm disp Format Example Microprocessor Clocks NOT reg NOT BL 8086 3 NOT CX 8088 3 NOT EDI 80286 2 80386 2 80486 1 Pentium 1 or 3 Pentium Pro NOT mem NOT DATA9 8086 16 +ea NOT WORD PTR [ESI] 8088 24 +ea 80286 7 80386 6 80486 3 Pentium 1 or 3 Pentium Pro OR Inclusive‐OR 000010dw oorrrmmm disp O D I T S Z A P C 0 * * ? * 0 Format Example Clocks OR reg,reg OR AX,BX 8086 3 OR AL,BL 8088 3 OR EAX,EBX 80286 2 OR CX,SI 80386 2 OR ESI,EDI 80486 1 Pentium 1 or 2 Pentium Pro Εργαστήριο Μικροϋπολογιστικών Συστημάτων | Microprocessor 171 OR mem,reg OR DATAY,AL 8086 16 +ea OR LIST,SI 8088 24 +ea OR DATA2[DI],CL 80286 7 OR [EAX],BL 80386 7 OR [EBX+2*ECX],EDX 80486 3 Pentium 1 or 3 Pentium Pro OR reg,mem OR BL,DATA1 8086 9 +ea OR SI,LIST1 8088 13 +ea OR CL,DATA2[SI] 80286 7 OR CX,[ESI] 80386 6 OR ESI,[2*ECX] 80486 2 Pentium 1 or 3 Pentium Pro 100000sw oo001mmm disp data Format Example Microprocessor OR CX,3 8086 4 OR DI,1AH 8088 4 OR DL,34H 80286 3 OR EDX,1345H 80386 2 OR CX,1834H 80486 1 Pentium 1 or 3 Pentium Pro OR mem,imm OR DATAS,3 8086 9 +ea OR BYTE PTR[EDI],1AH 8088 13 +ea OR DADDY,34H 80286 7 OR LIST,’A’ 80386 6 OR TOAD,1834H 80486 2 Pentium 1 or 3 Pentium Pro 0000110w data Format Example Εργαστήριο Μικροϋπολογιστικών Συστημάτων | Microprocessor Clocks OR reg,imm Clocks 172 OR acc,imm OR AX,3 8086 4 OR AL,1AH 8088 4 OR AH,34H 80286 3 OR EAX,1345H 80386 2 OR AL,’Y’ 80486 1 Pentium 1 or 3 Pentium Pro OUT Output data to port 1110011w port# Format Example Microprocessor Clocks OUT pt,acc OUT 12H,AL 8086 10 OUT 12H,AX 8088 14 OUT 0FFH,AL 80286 3 OUT 0A0H,AX 80386 10 OUT 10H,EAX 80486 10 Pentium 12‐26 Pentium Pro 1110111w Microprocessor Format Example OUT DX,acc OUT DX,AL 8086 8 OUT DX,AX 8088 12 OUT DX,EAX 80286 3 80386 11 80486 10 Pentium 12‐26 Pentium Pro Clocks OUTS Output string to port 0110111w Format Example Microprocessor Clocks OUTSB OUTSB 8086 OUTSW OUTSW 8088 OUTSD OUTSD 80286 5 Εργαστήριο Μικροϋπολογιστικών Συστημάτων | 173 OUTS DATA2 80386 14 REP OUTSB 80486 10 Pentium 13‐27 Pentium Pro POP Pop data from stack 01011rrr Format Example Microprocessor POP CX 8086 8 POP AX 8088 12 POP EDI 80286 5 80386 4 80486 1 Pentium 1 Pentium Pro 10001111 oo000mmm disp Format Example Microprocessor POP DATA1 8086 17 + ea POP LISTS 8088 25 + ea POP NUMBS 80286 5 80386 5 80486 4 Pentium 3 Pentium Pro 00sss111 Format Example Microprocessor POP DS 8086 8 POP ES 8088 12 POP SS 80286 5 80386 7 80486 3 Pentium 3 Pentium Pro Εργαστήριο Μικροϋπολογιστικών Συστημάτων | Clocks POP seg Clocks POP mem Clocks POP reg 174 00001111 10sss001 Format Example Microprocessor Clocks POP seg POP FS 8086 POP GS 8088 80286 80386 7 80486 3 Pentium 3 Pentium Pro POPA/POPAD Pop all registers from stack 01100001 Example Microprocessor Clocks POPA 8086 POPAD 8088 80286 19 80386 24 80486 9 Pentium 5 Pentium Pro POPF/POPFD Pop flags from stack 10010000 Example O D I T S Z A P C * * * * * * * * * Microprocessor Clocks POPF 8086 8 POPFD 8088 12 80286 5 80386 5 80486 6 Pentium 4 or 6 Pentium Pro PUSH Push data into stack 01010rrr Εργαστήριο Μικροϋπολογιστικών Συστημάτων | 175 Format Example Microprocessor PUSH reg PUSH CX 8086 11 PUSH AX 8088 15 PUSH EDI 80286 3 80386 2 80486 1 Pentium 1 Pentium Pro 11111111 oo110mmm disp Format Example Microprocessor PUSH DATA1 8086 16 + ea PUSH LISTS 8088 24 + ea PUSH NUMBS 80286 5 80386 5 80486 4 Pentium 1 or 2 Pentium Pro 00ss110 Format Example Microprocessor PUSH ES 8086 10 PUSH CS 8088 14 PUSH DS 80286 3 80386 2 80486 3 Pentium 1 Pentium Pro 00001111 10sss000 Format Example Microprocessor Clocks PUSH seg PUSH FS 8086 PUSH GS 8088 80286 80386 2 80486 3 Εργαστήριο Μικροϋπολογιστικών Συστημάτων | Clocks PUSH seg Clocks PUSH mem Clocks 176 011010s0 data Pentium 1 Pentium Pro Format Example Microprocessor Clocks PUSH imm PUSH 2000H 8086 PUSH 53220 8088 PUSHW 10H 80286 3 PUSH ‘,’ 80386 2 PUSHD 100000H 80486 1 Pentium 1 Pentium Pro PUSHA/PUSHAD Push all registers onto stack 01100000 Example Microprocessor Clocks PUSHA 8086 PUSHAD 8088 80286 17 80386 18 80486 11 Pentium 5 Pentium Pro PUSHF/PUSHFD Push flags onto stack 10011100 Example Microprocessor Clocks PUSHF 8086 10 PUSHFD 8088 14 80286 3 80386 4 80486 3 Pentium 3 or 4 Pentium Pro RCL/RCR/ROL/ROR Rotate Εργαστήριο Μικροϋπολογιστικών Συστημάτων | 177 1101000w ooTTTmmm disp O D I T S Z A P C * * TTT = 000 = ROL, TTT = 001 = ROR, TTT = 010 = RCL, and TTT = 011 = RCR Format Example Clocks ROL reg,1 ROL CL,1 8086 2 ROR reg,1 ROL DX,1 8088 2 ROR CH,1 80286 2 ROR SI,1 80386 3 80486 3 Pentium 1 or 3 Pentium Pro RCL reg,1 RCL CL,1 8086 2 RCR reg,1 RCL SI,1 8088 2 RCR AH,1 80286 2 RCR EBX,1 80386 9 80486 3 Pentium 1 or 3 Pentium Pro ROL mem,1 ROL DATAY,1 8086 15 +ea ROR mem,1 ROL LIST,1 8088 23 +ea ROR DATA2[DI],1 80286 7 ROR BYTE PTR [EAX],1 80386 7 80486 4 Pentium 1 or 3 Pentium Pro RCL mem,1 RCL DATA1,1 8086 15 +ea RCR mem,1 RCL LIST,1 8088 23 +ea RCR DATA2[SI],1 80286 7 RCR WORD PTR [ESI],1 80386 10 80486 4 Pentium 1 or 3 Pentium Pro Εργαστήριο Μικροϋπολογιστικών Συστημάτων | Microprocessor 178 1101001w ooTTTmmm disp Microprocessor Format Example ROL reg,CL ROL CH,CL 8086 8 + 4n ROR reg,CL ROL DX,CL 8088 8 + 4n ROR AL,CL 80286 5 + n ROR ESI,CL 80386 3 80486 3 Pentium 4 Pentium Pro RCL CH,CL 8086 8 + 4n RCR reg,CL RCL SI,CL 8088 8 + 4n RCR AH,CL 80286 5 + n RCR EBX,CL 80386 9 80486 3 Pentium 7‐27 Pentium Pro ROL mem,CL ROL DATAY,CL 8086 20 + 4n ROR mem,CL ROL LIST,CL 8088 28 + 4n ROR DATA2[DI],CL 80286 8 + n ROR BYTE PTR [EAX],CL 80386 7 80486 4 Pentium 4 Pentium Pro RCL mem,CL RCL DATA1,CL 8086 20 + 4n RCR mem,CL RCL LIST,CL 8088 28 + 4n RCR DATA2[SI],CL 80286 8 + n RCR WORD PTR [ESI],CL 80386 10 80486 9 Pentium 9‐26 Pentium Pro 1100000w ooTTTmmm disp data Format ROL reg,imm Example ROL CH,4 Εργαστήριο Μικροϋπολογιστικών Συστημάτων | Microprocessor 8086 Clocks RCL reg,CL Clocks 179 ROR reg,imm ROL DX,5 8088 ROR AL,2 80286 5 + n ROR ESI,14 80386 3 80486 2 Pentium 1 or 3 Pentium Pro RCL reg,imm RCL CL,2 8086 RCR reg,imm RCL SI,12 8088 RCR AH,5 80286 5 + n RCR EBX,18 80386 9 80486 8 Pentium 8 ‐ 27 Pentium Pro ROL mem,imm ROL DATAY,4 8086 ROR mem,imm ROL LIST,3 8088 ROR DATA2[DI],7 80286 8 + n ROR BYTE PTR [EAX],11 80386 7 80486 4 Pentium 1 or 3 Pentium Pro RCL mem,imm RCL DATA1,5 8086 RCR mem,imm RCL LIST,3 8088 RCR DATA2[SI],9 80286 8 + n RCR WORD PTR [ESI],8 80386 10 80486 9 Pentium 8 ‐ 27 Pentium Pro RDMSR Read model specific register 00001111 00110010 Example Microprocessor Clocks RDMSR 8086 8088 Εργαστήριο Μικροϋπολογιστικών Συστημάτων | 180 80286 80386 80486 Pentium 20‐24 Pentium Pro REP Repeat prefix 11110011 1010010w Microprocessor Format Example REP MOVS REP MOVSB 8086 9 + 17n REP MOVSW 8088 9 + 25n REP MOVSD 80286 5 + 4n REP MOVS DATA1,DATA2 80386 8 + 4n 80486 12 + 3n Pentium 13 + n Pentium Pro 11110011 1010101w Format Example REP STOSB 8086 9 + 10n REP STOSW 8088 9 + 14n REP STOSD 80286 4 + 3n REP STOS ARRAY 80386 5 + 5n 80486 7 + 4n Pentium 9 + n Pentium Pro Format Example Microprocessor Clocks REP INS REP INSB 8086 REP INSW 8088 REP INSD 80286 5 + 4n REP INS ARRAY 80386 12 + 5n 80486 17 + 5n Pentium 25 + 3n Εργαστήριο Μικροϋπολογιστικών Συστημάτων | Clocks REP STOS 1110011 0110110w Clocks Microprocessor 181 Pentium Pro 1110011 0110111w Format Example Microprocessor Clocks REP OUTS REP OUTSB 8086 REP OUTSW 8088 REP OUTSD 80286 5 + 4n REP OUTS ARRAY 80386 12 + 5n 80486 17 + 5n Pentium 25 + 4n Pentium Pro REPE/REPNE Repeat conditional 11110011 1010011w Format Example Microprocessor REPE CMPSB 8086 9 + 22n REPE CMPSW 8088 9 + 30n REPE CMPSD 80286 5 + 9n REPE CMPS DATA1,DATA2 80386 8 + 9n 80486 7 + 7n Pentium 9 + 4n Pentium Pro 11110011 1010111w Microprocessor Format Example REPE SCAS REPE SCASB 8086 9 + 15n REPE SCASW 8088 9 + 19n REPE SCASD 80286 5 + 8n REPE SCAS ARRAY 80386 8 + 8n 80486 7 + 5n Pentium 9 + 4n Pentium Pro 11110010 1010011w Format REPNE CMPS Example REPNE CMPSB Εργαστήριο Μικροϋπολογιστικών Συστημάτων | Microprocessor 8086 Clocks REPE CMPS Clocks Clocks 9 + 22n 182 REPNE CMPSW 8088 9 + 30n REPNE CMPSD 80286 5 + 9n REPNE CMPS ARRAY,LIST 80386 5 + 9n 80486 7 + 7n Pentium 8 + 4n Pentium Pro 11110010 101011w Format Example Microprocessor Clocks REPNE SCAS REPNE SCASB 8086 9 + 15n REPNE SCASW 8088 9 + 19n REPNE SCASD 80286 5 + 8n REPNE SCAS ARRAY 80386 5 + 8n 80486 7 + 5n Pentium 9 + 4n Pentium Pro RET Return from procedure 11000011 Example Microprocessor 8086 16 (near) 8088 20 80286 11 80386 10 80486 5 Pentium 2 Pentium Pro 11000010 data Format Example Microprocessor Clocks RET imm RET 4 8086 20 (near) RET 100H 8088 24 80286 11 80386 10 80486 5 Εργαστήριο Μικροϋπολογιστικών Συστημάτων | Clocks RET 183 11001011 Example Pentium 3 Pentium Pro Microprocessor Clocks RET 8086 26 (far) 8088 34 80286 15 80386 18 80486 13 Pentium 4‐23 Pentium Pro 11001010 data Format Example Microprocessor Clocks RET imm RET 4 8086 25 (far) RET 100H 8088 33 80286 11 80386 10 80486 5 Pentium 4‐23 Pentium Pro RSM Resume from system management mode 00001111 10101010 Example O D I T S Z A P C * * * * * * * * * Microprocessor Clocks RSM 8086 8088 80286 80386 80486 Pentium 83 Pentium Pro SAHF Store AH into flags Εργαστήριο Μικροϋπολογιστικών Συστημάτων | 184 10011110 Example O D I T S Z A P C * * * * * Microprocessor Clocks SAHF 8086 4 8088 4 80286 2 80386 3 80486 2 Pentium 2 Pentium Pro SAL/SAR/SHL/SHR Shift 1101000w ooTTTmmm disp O D I T S Z A P C * * * ? * * TTT = 100 = SHL/SAL , TTT = 101 = SHR, and TTT = 111 = SAR Format Example Microprocessor SAL reg,1 SAL CL,1 8086 2 SHL reg,1 SHL DX,1 8088 2 SHR reg,1 SAR CH,1 80286 2 SAR reg,1 SHR SI,1 80386 3 80486 3 Pentium 1 or 3 Pentium Pro SAL mem,1 SAL DATA1,1 8086 15 + ea SHL mem,1 SHL BYTE PTR [DI],1 8088 23 + ea SHR mem,1 SAR NUMB,1 80286 7 SAR mem,1 SHR WORD PTR[EDI],1 80386 7 80486 4 Pentium 1 or 3 Pentium Pro 1101001w ooTTTmmm disp Format Example SAL reg,CL SAL CH,CL Εργαστήριο Μικροϋπολογιστικών Συστημάτων | Clocks Microprocessor 8086 Clocks 8 + 4n 185 SHL reg,CL SHL DX,CL 8088 8 + 4n SAR reg,CL SAR AL,CL 80286 5 + n SHR reg,CL SHR ESI,CL 80386 3 80486 3 Pentium 4 Pentium Pro SAL mem,CL SAL DATAU,CL 8086 20 + 4n SHL mem,CL SHL BYTE PTR [ESI],CL 8088 28 + 4n SAR mem,CL SAR NUMB,CL 80286 8 + n SHR mem,CL SHR TEMP,CL 80386 7 80486 4 Pentium 4 Pentium Pro 1100000w ooTTTmmm disp data Format Example Microprocessor Clocks SAL reg,imm SAL CH,4 8086 SHL reg,imm SHL DX,10 8088 SAR reg,imm SAR AL,2 80286 5 + n SHR reg,imm SHR ESI,23 80386 3 80486 2 Pentium 1 or 3 Pentium Pro SAL mem,imm SAL DATAU,3 8086 SHL mem,imm SHL BYTE PTR [ESI],15 8088 SAR mem,imm SAR NUMB,3 80286 8 + n 80386 7 80486 4 Pentium 1 or 3 Pentium Pro SBB Subtract with borrow 000110dw oorrrmmm disp O D I T S Z A P C * * * * * * Εργαστήριο Μικροϋπολογιστικών Συστημάτων | 186 Format Example Microprocessor SBB reg,reg SBB CL,DL 8086 3 SBB AX,DX 8088 3 SBB CH,CL 80286 2 SBB EAX,EBX 80386 2 SBB ESI,ED 80486 1 Pentium 1 or 3 Pentium Pro SBB mem,reg SBB DATAJ,CL 8086 16 + ea SBB BYTES,CX 8088 24 + ea SBB NUMBS,ECX 80286 7 SBB [EAX],CX 80386 6 80486 3 Pentium 1 or 3 Pentium Pro SBB reg,mem SBB CL,DATAL 8086 9 + ea SBB CX,BYTES 8088 13 + ea SBB ECX,NUMBS 80286 7 SBB DX,[EBX+EDI] 80386 7 80486 2 Pentium 1 or 2 Pentium Pro 100000sw oo011mmm disp data Format Example Microprocessor SBB CX,3 8086 4 SBB DI,1AH 8088 4 SBB DL,34H 80286 3 SBB EDX,1345H 80386 2 SBB CX,1834H 80486 1 Pentium 1 or 3 Pentium Pro 8086 17 + ea SBB mem,imm SBB DATAS,3 Εργαστήριο Μικροϋπολογιστικών Συστημάτων | Clocks SBB reg,imm Clocks 187 SBB BYTE PTR[EDI],1AH 8088 25 + ea SBB DADDY,34H 80286 7 SBB LIST,’A’ 80386 7 SBB TOAD,1834H 80486 3 Pentium 1 or 3 Pentium Pro 0001110w data Format Example Microprocessor Clocks SBB acc,imm SBB AX,3 8086 4 SBB AL,1AH 8088 4 SBB AH,34H 80286 3 SBB EAX,1345H 80386 2 SBB AL,’Y’ 80486 1 Pentium 1 Pentium Pro SCAS Scan string 1010111w O D I T S Z A P C * * * * * * Format Example Microprocessor Clocks SCASB SCASB 8086 15 SCASW SCASW 8088 19 SCASD SCASD 80286 7 SCAS DATAF 80386 7 REP SCASB 80486 6 Pentium 4 Pentium Pro SETcondition Conditional set Format Example Microprocessor Clocks SETcnd reg8 SETA BL 8086 SETB CH 8088 SETG DL 80286 Εργαστήριο Μικροϋπολογιστικών Συστημάτων | 188 SETE BH 80386 4 SETZ AL 80486 3 Pentium 1 or 2 Pentium Pro SETcnd mem8 SETE DATAK 8086 SETAE LESS_OR_SO 8088 80286 80386 5 80486 3 Pentium 1 or 2 Pentium Pro Condition Codes Mnemonic Flag Description 0000 SETO O = 1 Set if overflow 0001 SETNO O = 0 Set if no overflow 0010 SETB/SETAE C = 1 Set if below 0011 SETAE/SETNB C = 0 Set if above or equal 0100 SETE/SETZ Z = 1 Set if equal/zero 0101 SETNE/SETNZ Z = 0 Set if not equal/zero 0110 SETBE/SETNA C = 1 + Z = 1 Set if below or equal 0111 SETA/SETNBE C = 0 • Z = 0 Set if above 1000 SETS S = 1 Set if sign 1001 SETNS S = 0 Set if no sign 1010 SETP/SETPE P = 1 Set if parity 1011 SETNP/SETPO P = 0 Set if no parity 1100 SETL/SETNGE S • O Set if less than SETGE/SETNL S = 0 Set if greater than or equal 1110 SETLE/SETNG Z = 1 + S • O Set if less than or equal 1111 SETG/SETNLE Z = 0 + S = O Set if greater than 1101 SGDT/SIDT/SLDT Store description table registers 00001111 00000001 oo000mmm disp Format SGDT mem Example SGDT MEMORY Εργαστήριο Μικροϋπολογιστικών Συστημάτων | Microprocessor 8086 Clocks 189 SGDT GLOBAL 8088 80286 11 80386 9 80486 10 Pentium 4 Pentium Pro 00001111 00000001 oo001mmm disp Microprocessor Format Example SIDT mem SIDT DATAS 8086 SIDT INTERRUPT 8088 80286 12 80386 9 80486 10 Pentium 4 Pentium Pro 00001111 00000000 oo000mmm disp Format Example Microprocessor Clocks SLDT CX 8086 SLDT DX 8088 80286 2 80386 2 80486 2 Pentium 2 Pentium Pro SLDT mem SLDT NUMBS 8086 SLDT LOCALS 8088 80286 3 80386 2 80486 3 Pentium 2 Pentium Pro Clocks SLDT reg SHLD/SHRD Double precision shift Εργαστήριο Μικροϋπολογιστικών Συστημάτων | 190 00001111 10100100 oorrrmmm disp data O D I T S Z A P C ? * * ? * * Format Example Microprocessor SHLD SHLD AX,CX,10 8086 reg,reg,imm SHLD DX,BX,8 8088 SHLD CX,DX,2 80286 80386 3 80486 2 Pentium 4 Pentium Pro SHLD SHLD DATAQ,CX,8 8086 mem,reg,imm 8088 80286 80386 7 80486 3 Pentium 4 Pentium Pro 00001111 10101100 oorrrmmm disp data Format Example Microprocessor SHRD CX,DX,2 8086 reg,reg,imm 8088 80286 80386 3 80486 2 Pentium 4 Pentium Pro SHRD SHRD DATAZ,DX,4 8086 mem,reg,imm 8088 80286 80386 7 80486 2 Pentium 4 Εργαστήριο Μικροϋπολογιστικών Συστημάτων | Clocks SHRD Clocks 191 Pentium Pro 00001111 10100101 oorrrmmm disp Format Example Microprocessor SHLD BX,DX,CL 8086 reg,reg,CL 8088 80286 80386 3 80486 3 Pentium 4 or 5 Pentium Pro SHLD SHLD DATAZ,DX,CL 8086 mem,reg,CL 8088 80286 80386 7 80486 3 Pentium 4 or 5 Pentium Pro 00001111 10101101 oorrrmmm disp Format Example Microprocessor SHRD AX,DX,CL 8086 reg,reg,CL 8088 80286 80386 3 80486 3 Pentium 4 or 5 Pentium Pro SHRD SHRD DATAZ,DX,CL 8086 mem,reg,CL 8088 80286 80386 7 80486 3 Pentium 4 or 5 Εργαστήριο Μικροϋπολογιστικών Συστημάτων | Clocks SHRD Clocks SHLD 192 Pentium Pro SMSW Store machine status word (80286) 00001111 00000001 oo100mmm disp Format Example Microprocessor SMSW AX 8086 SMSW DX 8088 SMSW BP 80286 2 80386 10 80486 2 Pentium 4 Pentium Pro SMSW mem SMSW DATAQ 8086 8088 80286 3 80386 3 80486 3 Pentium 4 Pentium Pro Clocks SMSW reg STC Set carry flag 11111001 Example O D I T S Z A P C 1 Microprocessor Clocks STC 8086 2 8088 2 80286 2 80386 2 80486 2 Pentium 2 Pentium Pro STD Set direction flag 11111101 Εργαστήριο Μικροϋπολογιστικών Συστημάτων | O D I T S Z A P C 1 193 Example Microprocessor Clocks STD 8086 2 8088 2 80286 2 80386 2 80486 2 Pentium 2 Pentium Pro STI Set interrupt flag 11111101 Example O D I T S Z A P C 1 Microprocessor Clocks STI 8086 2 8088 2 80286 2 80386 3 80486 5 Pentium 7 Pentium Pro STOS Store string data 1010101w Format Example Microprocessor Clocks STOSB STOSB 8086 11 STOSW STOSW 8088 15 STOSD STOSD 80286 3 STOS DATA_LIST 80386 40 REP STOSB 80486 5 Pentium 3 Pentium Pro STR Store task register 00001111 00000000 oo001mmm disp Format Example Εργαστήριο Μικροϋπολογιστικών Συστημάτων | Microprocessor Clocks 194 STR reg STR AX 8086 STR DX 8088 STR BP 80286 2 80386 2 80486 2 Pentium 2 Pentium Pro STR mem STR DATA3 8086 8088 80286 2 80386 2 80486 2 Pentium 2 Pentium Pro SUB Subtract 000101dw oorrrmmm disp D I T S Z A P C * * * * * * Format Example SUB reg,reg SUB CL,DL 8086 3 SUB AX,DX 8088 3 SUB CH,CL 80286 2 SUB EAX,EBX 80386 2 SUB ESI,EDI 80486 1 Pentium 1 or 2 Pentium Pro Microprocessor Clocks SUB mem,reg SUB DATAJ,CL 8086 16 + ea SUB BYTES,CX 8088 24 + ea SUB NUMBS,ECX 80286 7 SUB [EAX],CX 80386 6 80486 3 Pentium 1 or 3 Pentium Pro Εργαστήριο Μικροϋπολογιστικών Συστημάτων | O 195 SUB reg,mem SUB CL,DATAL 8086 9 + ea SUB CX,BYTES 8088 13 + ea SUB ECX,NUMBS 80286 7 SUB DX,[EBX+EDI] 80386 7 80486 2 Pentium 1 or 2 Pentium Pro 100000sw oo101mmm disp data Format Example Microprocessor SUB CX,3 8086 4 SUB DI,1AH 8088 4 SUB DL,34H 80286 3 SUB EDX,1345H 80386 2 SUB CX,1834H 80486 1 Pentium 1 or 3 Pentium Pro SUB mem,imm SUB DATAS,3 8086 17 + ea SUB BYTE PTR[EDI],1AH 8088 25 + ea SUB DADDY,34H 80286 7 SUB LIST,’A’ 80386 7 SUB TOAD,1834H 80486 3 Pentium 1 or 2 Pentium Pro 0010110w data Format Example Microprocessor SUB AL,3 8086 4 SUB AX,1AH 8088 4 SUB EAX,34H 80286 3 80386 2 80486 1 Pentium 1 Pentium Pro Εργαστήριο Μικροϋπολογιστικών Συστημάτων | Clocks SUB acc,imm Clocks SUB reg,imm 196 TEST Test operands (logical compare) 1000001w oorrrmmm disp Format O D I T S Z A P C 0 * * ? * 0 Example Microprocessor TEST reg,reg TEST CL,DL 8086 5 TEST BX,DX 8088 5 TEST DH,CL 80286 2 TEST EBP,EBX 80386 2 TEST EAX,EDI 80486 1 Pentium 1 or 2 Pentium Pro TEST mem,reg TEST DATAJ,CL 8086 9 + ea reg,mem TEST BYTES,CX 8088 13 + ea TEST NUMBS,ECX 80286 6 TEST [EAX],CX 80386 5 TEST CL,POPS 80486 2 Pentium 1 or 2 Pentium Pro 1111011sw oo000mmm disp data Format Example Microprocessor TEST BX,3 8086 4 TEST DI,1AH 8088 4 TEST DH,44H 80286 2 TEST EDX,1AB345H 80386 2 TEST SI,1834H 80486 1 Pentium 1 or 2 Pentium Pro TEST mem,imm TEST DATAS,3 8086 11 + ea TEST BYTE PTR[EDI],1AH 8088 11 + ea TEST DADDY,34H 80286 6 TEST LIST,’A’ 80386 5 TEST TOAD,1834H 80486 2 Εργαστήριο Μικροϋπολογιστικών Συστημάτων | Clocks TEST reg,imm Clocks 197 1010100w data Format Example Pentium 1 or 2 Pentium Pro Microprocessor Clocks TEST acc,imm TEST AL,3 8086 4 TEST AX,1AH 8088 4 TEST EAX,34H 80286 3 80386 2 80486 1 Pentium 1 Pentium Pro Pentium Pro VERR/VERW Verify read/write 00001111 00000000 oo100mmm disp Format O D I T S Z A P C * Example Microprocessor VERR reg VERR CX 8086 VERR DX 8088 VERR DI 80286 14 80386 10 80486 11 Pentium 7 Pentium Pro VERR mem VERR DATAJ 8086 VERR TESTB 8088 80286 16 80386 11 80486 11 Pentium 7 Pentium Pro 00001111 00000000 oo101mmm disp Format Example Εργαστήριο Μικροϋπολογιστικών Συστημάτων | Clocks Microprocessor Clocks 198 VERW reg VERW CX 8086 VERW DX 8088 VERW DI 80286 14 80386 15 80486 11 Pentium 7 Pentium Pro VERW mem VERW DATAJ 8086 VERW TESTB 8088 80286 16 80386 16 80486 11 Pentium 7 Pentium Pro WAIT Wait for coprocessor 10011011 Example Microprocessor Clocks WAIT 8086 4 FWAIT 8088 4 80286 3 80386 6 80486 6 Pentium 1 Pentium Pro WBINVD Write‐back cache invalidate data cache 00001111 00001001 Example Microprocessor Clocks WAIT 8086 FWAIT 8088 80286 80386 Εργαστήριο Μικροϋπολογιστικών Συστημάτων | 199 80486 5 Pentium 2000+ Pentium Pro WRMSR Write to model specific register 00001111 00110000 Example Microprocessor Clocks WRMSR 8086 8088 80286 80386 80486 Pentium 30‐45 Pentium Pro XADD Exchange and add 00001111 1100000w 11rrrrrr Format O D I T S Z A P C * * * * * * Example Microprocessor XADD reg,reg XADD EBX,ECX 8086 XADD EDX,EAX 8088 XADD EDI,EBP 80286 80386 80486 3 Pentium 3 or 4 Pentium Pro 00001111 1100000w oorrrmmm disp Format Example Microprocessor Clocks XADD mem,reg XADD DATA5,ECX 8086 XADD [EBX],EAX 8088 XADD [ECX+4],EBP 80286 80386 80486 4 Pentium 3 or 4 Εργαστήριο Μικροϋπολογιστικών Συστημάτων | Clocks 200 Pentium Pro XCHG Exchange 1000011w oorrrmmm Example Microprocessor XCHG CL,DL 8086 4 XCHG BX,DX 8088 4 XCHG DH,CL 80286 3 XCHG EBP,EBX 80386 3 XCHG EAX,EDI 80486 3 Pentium 3 Pentium Pro XCHG mem,reg XCHG DATAJ,CL 8086 17 + ea reg,mem XCHG BYTES,CX 8088 25 + ea XCHG NUMBS,ECX 80286 5 XCHG [EAX],CX 80386 5 XCHG CL,POPS 80486 5 Pentium 3 Pentium Pro 10010reg Format Example Microprocessor Clocks XCHG acc,reg XCHG BX,AX 8086 3 reg,acc XCHG AX,DI 8088 3 XCHG DH,AL 80286 3 XCHG EDX,EAX 80386 3 XCHG SI,AX 80486 3 Pentium 2 Pentium Pro Clocks XCHG reg,reg XLAT Translate 11010111 Example Microprocessor Clocks XLAT 8086 11 8088 11 Εργαστήριο Μικροϋπολογιστικών Συστημάτων | 201 80286 5 80386 3 80486 4 Pentium 4 Pentium Pro XOR Exclusive‐OR 000110dw oorrrmmm disp O D I T S Z A P C * * * ? * 0 Format Example Microprocessor XOR reg,reg XOR CL,DL 8086 3 XOR AX,DX 8088 3 XOR CH,CL 80286 2 XOR EAX,EBX 80386 2 XOR ESI,EDI 80486 1 Pentium 1 or 2 Pentium Pro XOR mem,reg XOR DATAJ,CL 8086 16 + ea XOR BYTES,CX 8088 24 + ea XOR NUMBS,ECX 80286 7 XOR [EAX],CX 80386 6 80486 3 Pentium 1 or 3 Pentium Pro XOR reg,mem XOR CL,DATAL 8086 9 + ea XOR CX,BYTES 8088 13 + ea XOR ECX,NUMBS 80286 7 XOR DX,[EBX+EDI] 80386 6 80486 3 Pentium 1 or 3 Pentium Pro 100000sw oo110mmm disp data Format Example Εργαστήριο Μικροϋπολογιστικών Συστημάτων | Clocks Microprocessor Clocks 202 XOR reg,imm XOR CX,3 8086 4 XOR DI,1AH 8088 4 XOR DL,34H 80286 3 XOR EDX,1345H 80386 2 XOR CX,1834H 80486 1 Pentium 1 or 3 Pentium Pro XOR mem,imm XOR DATAS,3 8086 17 + ea XOR BYTE PTR[EDI],1AH 8088 25 + ea XOR DADDY,34H 80286 7 XOR LIST,’A’ 80386 7 XOR TOAD,1834H 80486 3 Pentium 1 or 3 Pentium Pro 0010101w data Format Example Microprocessor Clocks XOR acc,imm XOR AL,3 8086 4 XOR AX,1AH 8088 4 XOR EAX,34H 80286 3 80386 2 80486 1 Pentium 1 Pentium Pro Εργαστήριο Μικροϋπολογιστικών Συστημάτων | 203 Εργαστήριο Μικροϋπολογιστικών Συστημάτων | 204
© Copyright 2024 Paperzz