Φυλλάδιο - Εργαστήριο

ΤΜΗΜΑ ΗΛΕΚΤΡΟΛΟΓΩΝ ΜΗΧΑΝΙΚΩΝ Τ.Ε., ΣΧΟΛΗ ΤΕΧΝΟΛΟΓΙΚΩΝ ΕΦΑΡΜΟΓΩΝ, ΤΕΙ ΔΥΤΙΚΗΣ ΕΛΛΑΔΑΣ ΑΡΧΙΤΕΚΤΟΝΙΚΗ & ΛΕΙΤΟΥΡΓΙΑ Η/Υ ΟικογένειαΜικροεπεξεργαστών
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