Ε Εργαστήριο ή Α Αρχιτεκτονικής ή ΙΙ Εργαστήριο γ Ι: Βασικέςς γνώσεις γ ς Επιμέλεια: ρ. Ν. Σγούρος ρ. Ι. Κονταξάκης
Στόχοι ομή συμβολικού προγράμματος 8086 Υλοποίηση Αλγοριθμικών δομών ( Επιλογή/Επανάληψη ) Ολοκληρωμένα λ παραδείγματα δί
Δομή προγράμματος Ι Τρία κύρια τμήματα Ορισμός μοντέλου τμημάτων μνήμης και σωρού Ορισμός και αρχικοποίηση τιμών μεταβλητών Τμήμα κώδικα Καθορίζονται με ένα σύνολο οδηγιών προς τον συμβολομεταφραστή οι οποίες ξεκινούν με το πρόθεμα τελεία (.) και δεν μεταφράζονται σε κώδικα μηχανής αλλά επηρεάζουν τον κώδικα που παράγει ο συμβολομεταφραστής.
Δομή προγράμματος ΙΙ.model [είδος].stack [μέγεθος μέγεθος] ].exit
Δομή προγράμματος ΙΙΙ.model [είδος].stack [μέγεθος μέγεθος] ].exit
Μοντέλα μνήμης (.model [είδος] είδος]) Είδος εδομένα Κώδικας Tiny Ενιαίο 64KB Small 64KB 64KB Medium 64KB 64KB/Τμήμα Compact 64KB/Τμήμα 64KB Large* οποιοδήποτε οποιοδήποτε Huge* οποιοδήποτε οποιοδήποτε Ενιαίο τμήμα δεδομένων και κώδικα 1 Τμήμα δεδομένων,, 1 Τμήμα κώδικα 1 Τμήμα δεδομένων, >1 Τμήματα κώδικα >1 Τμήματα δεδομένων, 1 Τμήμα κώδικα >1 Τμήματα δεδομένων, >1 Τμήματα κώδικα >1 Τμήματα δεδομένων, >1 Τμήματα κώδικα * Στο μοντέλο Large το μεγαλύτερο μέγεθος μεταβλητής πρέπει να είναι 64KB ενώ στο μοντέλο Huge δεν υπάρχει ο παραπάνω περιορισμός
Δομή προγράμματος ΙV.model small.stack [μέγεθος].exit
Μοντέλα σωρού (.stack) Το μέγεθος του σωρού καθορίζεται με απευθείας τιμή (σε Bytes). Εξ ορισμού το μέγεθος του σωρού είναι 1024 Bytes (δεν αναφέρεται καθόλου το μέγεθος)
Δομή προγράμματος V.model small.stack (ισοδυναμεί δ ί με.stack 1024).exit
Τμ. Δεδομένων - Ορισμός σταθερών Ο ορισμός των σταθερών γίνεται στο τμήμα δεδομένων () Για τον ορισμό μιας σταθεράς χρησιμοποιείται το πρόθεμα equ (equal)
Τμ. Δεδομένων - Ορισμός Μεταβλητών Ο ορισμός των μεταβλητών γίνεται στο τμήμα () Για τις μεταβλητές εκτός από τον ορισμό του τύπου ορίζεται το μέγεθος (π.χ. για πίνακες) και οι ενδεχόμενες αρχικές τιμές Για τις σταθερές ορίζεται η τιμή αντικατάστασης
Τύποι δεδομένων - μεταβλητών Τύπος Λειτουργία db (define byte) Ορίζεται τύπος μεταβλητής με μέγεθος κάθε στοιχείου της μεταβλητής ένα byte dw (define word) dd (define doubleword) Οδηγία Ορίζεται τύπος μεταβλητής με μέγεθος κάθε στοιχείου της μεταβλητής δύο bytes Ορίζεται τύπος μεταβλητής με μέγεθος κάθε στοιχείου της μεταβλητής τέσσερα bytes Λειτουργία dup (duplicate) Καθορισμός πλήθους στοιχείων μεταβλητής dup (?) Ητιμή στην παρένθεση καθορίζει την αρχική τιμή των στοιχείων της μεταβλητής. Όταν η παρένθεση περιέχει το? Η αρχική τιμή των στοιχείων της μεταβλητής είναι αδιάφορη.
Δομή προγράμματος VI.model small.stack len equ 20 var1 1db50d dup (30) var2 db len dup(?).exit
Τμήμα κώδικα () Το Τμήμα αυτό περιέχει τις εντολές του προγράμματος και κλήσεις προς μακροεντολές και διαδικασίες Στην αρχή του κώδικα πραγματοποιείται αρχικοποίηση τμημάτων δεδομένων με αρχικοποίηση του καταχωρητή DS ( ιαδικασία δ ί δύο βημάτων για αποφυγή λάθους!!!) mov AX, @data mov DS,AX ή mov AX, seg [ον. μεταβλ.] mov DS, AX
Δομή προγράμματος VII.model small.stack len equ 20 var1 db 50 dup (30) var2 db len dup(?) mov AX, seg var2 mov DS, AX.exit
Έξοδος στο λειτουργικό σύστημα(.exit) Η συγκεκριμένη οδηγία προς το συμβολομεταφραστή ισοδυναμεί με το τμήμα εντολών:.exit mov AX,4C00h Int 21h δηλαδή με την κλήση της διακοπής λογισμικού που επιστρέφει τον έλεγχο στο Λ.Σ.
Δομή προγράμματος VIII.model small.stack len equ 20 var1 db 50 dup (30) var2 db len dup(?) mov AX, seg var2 mov DS, AX.exit
Βασικές αλγοριθμικές δομές μς
Ακολουθία ΑΡΧΗ a = 10 b = 2 AL = a AH = b AL=AL+AH c= AL.model small.stack a db 10 b db 2 c db? MOV AX, @data MOV DS, AX MOV AL, a MOV AH, b ADD AL, AH ΤΕΛΟΣ MOV c, AL MOV AX, 4C00H INT 21H
Επιλογή Ι ΑΡΧΗ a = 150 AL = a AL > 100 ΝΑΙ AL = AL/2 ΟΧΙ.model small.stack a db 50 c db? MOV AX, @data MOV DS, AX MOV AL, a CMP AL, 100 JBE VAL_to_MEM SHR AL, 1 c = AL VAL_to_MEM: MOV c, AL ΤΕΛΟΣ MOV AX, 4C00H INT 21H
Επιλογή ΙΙ ΑΡΧΗ a = 10 b = 2 AL = a AH = b.model small.stack a db 10 b db 2 c db? MOV AX, @data MOV DS, AX ΝΑΙ AL > AH ΟΧΙ MOV AL, a MOV AH, b c = AH c = AL CMP AL, AH JG CASE2 MOV c, AL JMP TELOS ΤΕΛΟΣ CASE2: MOV c, AH TELOS: MOV AX, 4C00H INT 21H
Επιλογή ΙΙΙ ΝΑΙ ΑΡΧΗ a = 13 AL = a AL <= ΟΧΙ AL <= ΟΧΙ 10 20 ΝΑΙ a db 13 c db?... MOV AL, a CMP AL, 10 JG SEL2 MOV AL, 0 JMP TELOS AL = 0 AL = 10 AL = 20 SEL2: CMP AL, 20 JG SEL3 MOV AL, 10 JMP TELOS c = AL SEL3: MOV AL,20 ΤΕΛΟΣ TELOS: MOV c, AL.exit
Επανάληψη Ι ΑΡΧΗ.model small.stack a db 10 a = 10 MOV AX, @data MOV DS, AX a = a+2 ΝΑΙ a<=100 NEXT: CMP a, 100 JG TELOS ΟΧΙ ADD a, 2 JMP NEXT ΤΕΛΟΣ TELOS: MOV AX, 4C00H INT 21H
Επανάληψη ΙΙ ΑΡΧΗ a = 10.model small.stack a db 10 MOV AX, @data a= a+2 MOV DS, AX ΝΑΙ a<=100 ΟΧΙ ΤΕΛΟΣ NEXT: ADD a, 2 CMP a, 100 JLE NEXT MOV AX, 4C00H INT 21H
Επανάληψη ΙΙΙ ΑΡΧΗ a= 0.model small.stack a db 0 CX = CX-1 CX = 10 MOV AX, @data MOV DS, AX ΝΑΙ a= a+2 CX >0 ΟΧΙ ΤΕΛΟΣ MOV CX, 10 NEXT: ADD a, 2 LOOP NEXT MOV AX, 4C00H INT 21H
Αλγόριθμος Φυσαλίδας
Επανάληψη ΙΙΙ ΑΡΧΗ Α[J 1]<A[J] N I=1.model small loop2: J=5 mov AH,A[di-1] A[di.stack mov BH,A[di] O cmp AH,BH jge nochange A db mov A[di-1],BH 4,5,9,3,1,8 mov A[di],AH temp A[J 1] A[J 1] A[J] N A[J] temp J J 1 J>=I O I I+1 I<=5 N mov AX, seg A mov DS,AX mov si,1 loop1: mov di,5 nochange: dec di cmp di,si jge loop2 inc si cmp si,5 jle loop1.exit 0 O ΤΕΛΟΣ