Η δομή εντολών της γλώσσας συναρμολόγησης περιέχει: Δομή εντολών στον προγραμματισμό σε επίπεδο γλώσσας assembly. Μορφή δεδομένων και δομή εντολών της γλώσσας assembly

Εντολές γλώσσας συναρμολόγησης (Διάλεξη)

ΣΧΕΔΙΟ ΔΙΑΛΕΞΗΣ

1. Κύριες ομάδες επιχειρήσεων.

Pentium.

1. Κύριες ομάδες επιχειρήσεων

Οι μικροεπεξεργαστές εκτελούν ένα σύνολο εντολών που υλοποιούν τις ακόλουθες κύριες ομάδες λειτουργιών:

Λειτουργίες προώθησης

Αριθμητικές πράξεις,

Λογικές πράξεις

Λειτουργίες βάρδιας

Λειτουργίες σύγκρισης και δοκιμής

Λειτουργίες bit

Λειτουργίες διαχείρισης προγράμματος.

Λειτουργίες ελέγχου επεξεργαστή.

2. Μνημονικοί κώδικες εντολών επεξεργαστή Pentium

Κατά την περιγραφή εντολών, χρησιμοποιούνται συνήθως οι μνημονικοί τους προσδιορισμοί (μνημονικοί κώδικες), οι οποίοι χρησιμοποιούνται για τον καθορισμό της εντολής κατά τον προγραμματισμό σε γλώσσα Assembly. Για διαφορετικές εκδόσεις του Assembler, οι μνημονικοί κωδικοί ορισμένων εντολών ενδέχεται να διαφέρουν. Για παράδειγμα, για την εντολή κλήσης μιας υπορουτίνας, χρησιμοποιείται ο μνημονικός κώδικαςΚΛΗΣΗ ή JSR ("Πηδάω σε Υπορουτίνα"). Ωστόσο, οι μνημονικοί κώδικες για τις περισσότερες εντολές για τους κύριους τύπους μικροεπεξεργαστών είναι οι ίδιοι ή διαφέρουν ελαφρώς, καθώς είναι συντομογραφίες των αντίστοιχων αγγλικών λέξεων που ορίζουν τη λειτουργία που εκτελείται. Ας δούμε την εντολή μνημονικοί κώδικες που υιοθετήθηκαν για επεξεργαστές Pentium.

Εντολές προώθησης. Η κύρια ομάδα αυτού του ομίλου είναι η ομάδαMOV , το οποίο παρέχει μεταφορά δεδομένων μεταξύ δύο καταχωρητών ή μεταξύ ενός καταχωρητή και ενός κελιού μνήμης. Ορισμένοι μικροεπεξεργαστές πραγματοποιούν μεταφορές μεταξύ δύο κυψελών μνήμης, καθώς και μαζικές μεταφορές των περιεχομένων πολλών καταχωρητών από τη μνήμη. Για παράδειγμα, μικροεπεξεργαστές της οικογένειας 68 Motorola xxx εκτελέσει την εντολήΚΙΝΗΣΗ , παρέχοντας μεταφορά από ένα κελί μνήμης σε άλλο και την εντολήMOVEM , που γράφει στη μνήμη ή φορτώνει από τη μνήμη τα περιεχόμενα ενός καθορισμένου συνόλου καταχωρητών (έως 16 καταχωρητές). ΟμάδαXCHG ανταλλάσσει αμοιβαία τα περιεχόμενα δύο καταχωρητών επεξεργαστή ή ενός καταχωρητή και ενός κελιού μνήμης.

Εντολές εισαγωγής ΣΕ και την έξοδο ΕΞΩ εφαρμογή αποστολής δεδομένων από μητρώο επεξεργαστή σε εξωτερική συσκευή ή λήψη δεδομένων από εξωτερική συσκευή σε μητρώο. Αυτές οι εντολές καθορίζουν τον αριθμό της συσκευής διασύνδεσης (θύρα εισόδου/εξόδου) μέσω της οποίας μεταφέρονται τα δεδομένα. Σημειώστε ότι πολλοί μικροεπεξεργαστές δεν έχουν ειδικές εντολές για πρόσβαση σε εξωτερικές συσκευές. Σε αυτήν την περίπτωση, η είσοδος και η έξοδος δεδομένων στο σύστημα πραγματοποιείται χρησιμοποιώντας την εντολήMOV , το οποίο καθορίζει τη διεύθυνση της απαιτούμενης συσκευής διεπαφής. Έτσι, η εξωτερική συσκευή διευθύνεται ως κυψέλη μνήμης και ένα συγκεκριμένο τμήμα εκχωρείται στον χώρο διευθύνσεων στον οποίο βρίσκονται οι διευθύνσεις των συσκευών διασύνδεσης (θύρες) που είναι συνδεδεμένες στο σύστημα.

Εντολές αριθμητικών πράξεων. Οι κύριες εντολές αυτής της ομάδας είναι η πρόσθεση, η αφαίρεση, ο πολλαπλασιασμός και η διαίρεση, οι οποίες έχουν πολλές επιλογές. Εντολές προσθήκης ΠΡΟΣΘΗΚΗ και αφαίρεση ΥΠΟ εκτελέστε τις αντίστοιχες λειτουργίες μεντοκατέχεται από δύο καταχωρητές, έναν καταχωρητή και μια θέση μνήμης, ή χρησιμοποιώντας έναν άμεσο τελεστή. Της ομάδας ΕΝΑ Δ ντο , Σ.Β. σι εκτελέστε πρόσθεση και αφαίρεση λαμβάνοντας υπόψη την τιμή του χαρακτηριστικούντο, που ορίζεται κατά το σχηματισμό μεταφοράς κατά την εκτέλεση της προηγούμενης λειτουργίας. Χρησιμοποιώντας αυτές τις εντολές, υλοποιείται η διαδοχική προσθήκη τελεστών, ο αριθμός των bit των οποίων υπερβαίνει τη χωρητικότητα του επεξεργαστή. Ομάδα Ν.Ε.Γ. αλλάζει το πρόσημο του τελεστή, μετατρέποντάς τον σε συμπλήρωμα δύο.

Οι πράξεις πολλαπλασιασμού και διαίρεσης μπορούν να εκτελεστούν σε υπογεγραμμένους αριθμούς (εντολέςΕγώ MUL, Εγώ DIV ) ή ανυπόγραφο (εντολές MUL, DIV Ένας από τους τελεστές βρίσκεται πάντα σε έναν καταχωρητή, ο δεύτερος μπορεί να είναι σε έναν καταχωρητή, ένα κελί μνήμης ή να είναι ένας άμεσος τελεστής. Το αποτέλεσμα της λειτουργίας βρίσκεται στο μητρώο. Κατά τον πολλαπλασιασμό (εντολέςMUL , IMUL ) το αποτέλεσμα είναι διπλό bit, για το οποίο χρησιμοποιούνται δύο καταχωρητές. Κατά τη διαίρεση (εντολέςDIV , IDIV ) ως μέρισμα, χρησιμοποιείται ένας τελεστής διπλού bit, τοποθετημένος σε δύο καταχωρητές, και ως αποτέλεσμα, το πηλίκο και το υπόλοιπο γράφονται σε δύο καταχωρητές.

Λογικές εντολές λειτουργίας . Σχεδόν όλοι οι μικροεπεξεργαστές εκτελούν λογικές πράξεις AND, OR, Exclusive OR, οι οποίες εκτελούνται στα ίδια bit τελεστών χρησιμοποιώντας εντολές ΚΑΙ, Ή, Χ Ή . Οι λειτουργίες εκτελούνται στα περιεχόμενα δύο καταχωρητών, ενός καταχωρητή και μιας θέσης μνήμης ή χρησιμοποιώντας έναν άμεσο τελεστή. Ομάδα ΔΕΝ αντιστρέφει την τιμή κάθε bit του τελεστή.

Εντολές Shift. Οι μικροεπεξεργαστές εκτελούν αριθμητικές, λογικές και κυκλικές μετατοπίσεις των διευθύνσεων τελεστών κατά ένα ή περισσότερα bit. Ο τελεστής που θα μετατοπιστεί μπορεί να βρίσκεται σε μια θέση καταχωρητή ή μνήμης και ο αριθμός των bit μετατόπισης καθορίζεται από τον άμεσο τελεστή που περιέχεται στην εντολή ή καθορίζεται από τα περιεχόμενα του καθορισμένου καταχωρητή. Το σήμα μεταφοράς συνήθως εμπλέκεται στην υλοποίηση της βάρδιαςντοστο μητρώο κατάστασης (S.R.ή ΕΣΗΜΑΙΑ), το οποίο περιέχει το τελευταίο bit του τελεστή που αφαιρέθηκε από τον καταχωρητή ή το κελί μνήμης.

Εντολές σύγκρισης και δοκιμής . Η σύγκριση των τελεστών γίνεται συνήθως χρησιμοποιώντας την εντολήΔΕΑ , που αφαιρεί τελεστές και ορίζει τιμές χαρακτηριστικών N, Z, V, Cστο μητρώο κατάστασης σύμφωνα με το αποτέλεσμα που προκύπτει. Σε αυτήν την περίπτωση, το αποτέλεσμα της αφαίρεσης δεν αποθηκεύεται και οι τιμές των τελεστών δεν αλλάζουν. Η επακόλουθη ανάλυση των λαμβανόμενων τιμών χαρακτηριστικών μας επιτρέπει να προσδιορίσουμε τη σχετική τιμή (>,<, =) операндов со знаком или без знака. Использование различных способов адресации позволяет производит сравнение содержимого двух регистров, регистра и ячейки памяти, непосредственно заданного операнда с содержимым регистра или ячейки памяти.

Ορισμένοι μικροεπεξεργαστές εκτελούν την εντολή δοκιμής TST , η οποία είναι μια έκδοση ενός τελεστή της εντολής σύγκρισης. Όταν εκτελείται αυτή η εντολή, ορίζονται τα σημάδια Ν, Ζσύμφωνα με το πρόσημο και την τιμή (ίσο ή μη μηδενικό) του τελεστή που απευθύνεται.

Οδηγίες λειτουργίας bit . Αυτές οι εντολές ορίζουν την τιμή του χαρακτηριστικούντοστον καταχωρητή κατάστασης σύμφωνα με την τιμή του bit που ελέγχεταιbn στον τελεστή διεύθυνσης. Σε ορισμένους μικροεπεξεργαστές, με βάση το αποτέλεσμα της δοκιμής bit, το χαρακτηριστικό ορίζεταιΖ. Αριθμός bit δοκιμήςnκαθορίζεται είτε από τα περιεχόμενα του καταχωρητή που καθορίζεται στην εντολή είτε από τον άμεσο τελεστή.

Οι εντολές αυτής της ομάδας εφαρμόζουν διαφορετικές επιλογές για την αλλαγή του bit που ελέγχεται BT διατηρεί την τιμή αυτού του bit αμετάβλητη.Εντολή σι Τ μικρό το posttest ορίζει την τιμή bn=1 και η εντολή σι Τ ντο - νόημα bn=0.Ομάδα σι Τ ντο αντιστρέφει την τιμή του bit bn αφού το δοκιμάσει.

Λειτουργίες διαχείρισης προγράμματος. Για τον έλεγχο του προγράμματος, χρησιμοποιείται ένας μεγάλος αριθμός εντολών, μεταξύ των οποίων είναι:

- εντολές μεταφοράς άνευ όρων ελέγχου.

- εντολές άλματος υπό όρους.

- ομάδες για την οργάνωση κύκλων προγραμμάτων·

- εντολές διακοπής.

- εντολές για αλλαγή χαρακτηριστικών.

Η άνευ όρων μεταφορά του ελέγχου εκτελείται από την εντολήJMP , το οποίο φορτώνεται στον μετρητή προγράμματοςΗ/Υνέο περιεχόμενο που είναι η διεύθυνση της επόμενης εντολής που θα εκτελεστεί. Αυτή η διεύθυνση είτε καθορίζεται απευθείας στην εντολήJMP (άμεση διευθυνσιοδότηση), ή υπολογίζεται ως το άθροισμα του τρέχοντος περιεχομένουΗ/Υκαι η μετατόπιση που καθορίζεται στην εντολή, η οποία είναι ένας υπογεγραμμένος αριθμός (σχετική διευθυνσιοδότηση). ΕπειδήΗ/Υπεριέχει τη διεύθυνση της επόμενης εντολής προγράμματος, η τελευταία μέθοδος καθορίζει τη διεύθυνση μεταπήδησης, μετατόπιση σε σχέση με την επόμενη διεύθυνση κατά έναν καθορισμένο αριθμό byte. Με θετική μετατόπιση, η μετάβαση γίνεται σε επόμενες εντολές του προγράμματος, με αρνητική μετατόπιση - στις προηγούμενες.

Μια υπορουτίνα καλείται επίσης με άνευ όρων μεταφορά ελέγχου χρησιμοποιώντας την εντολήΚΛΗΣΗ JSR ). Ωστόσο, σε αυτή την περίπτωση, πριν από τη φόρτωση σεΗ/Υ νέο περιεχόμενο που καθορίζει τη διεύθυνση της πρώτης εντολής της υπορουτίνας, είναι απαραίτητο να αποθηκεύσετε την τρέχουσα τιμή του (η διεύθυνση της επόμενης εντολής) προκειμένου να διασφαλιστεί η επιστροφή στο κύριο πρόγραμμα μετά την εκτέλεση της υπορουτίνας (ή στην προηγούμενη υπορουτίνα όταν φωλιάζουν υπορουτίνες). Οι εντολές μετάβασης υπό όρους (διακλαδώσεις προγράμματος) φορτώνονται σεΗ/Υνέο περιεχόμενο εάν πληρούνται ορισμένες προϋποθέσεις, οι οποίες συνήθως ορίζονται σύμφωνα με την τρέχουσα τιμή διαφόρων χαρακτηριστικών στο μητρώο κατάστασης. Εάν δεν πληρούται η συνθήκη, τότε εκτελείται η επόμενη εντολή προγράμματος.

Οι εντολές ελέγχου λειτουργιών παρέχουν εγγραφή - ανάγνωση των περιεχομένων του μητρώου κατάστασης στον οποίο αποθηκεύονται τα χαρακτηριστικά, καθώς και αλλαγή των τιμών των μεμονωμένων χαρακτηριστικών. Για παράδειγμα, οι επεξεργαστές Pentium υλοποιούν τις εντολές LAHF Και SAHF , το οποίο φορτώνει το χαμηλό byte, το οποίο περιέχει τα σημάδια, από τον καταχωρητή κατάστασης EFLAGστο χαμηλό byte του μητρώου ΕΑΧκαι συμπληρώνοντας το χαμηλό byte ΕΣΗΜΑΙΑαπό το μητρώο Ε ΑΧ.. Της ομάδας CLC, STCεκτελέστε τη ρύθμιση των τιμών του σήματος μεταφοράς CF=0, CF=1 και της εντολής CMCπροκαλεί την αντιστροφή της τιμής αυτού του χαρακτηριστικού.Δεδομένου ότι τα χαρακτηριστικά καθορίζουν τη ροή της εκτέλεσης του προγράμματος κατά τη διάρκεια μεταβάσεων υπό όρους, οι εντολές αλλαγής χαρακτηριστικών χρησιμοποιούνται συνήθως για τον έλεγχο του προγράμματος.

Εντολές ελέγχου επεξεργαστή . Αυτή η ομάδα περιλαμβάνει εντολές διακοπής, χωρίς εντολές λειτουργίας και έναν αριθμό εντολών που καθορίζουν τον τρόπο λειτουργίας του επεξεργαστή ή των μεμονωμένων μπλοκ του. ΟμάδαHLT σταματά την εκτέλεση του προγράμματος και θέτει τον επεξεργαστή σε κατάσταση διακοπής, η οποία τερματίζεται όταν λαμβάνεται σήμα διακοπής ή επανεκκίνησης (Επαναφορά). Ομάδα ΟΧΙ (εντολή "κενό"), η οποία δεν προκαλεί την εκτέλεση εργασιών, χρησιμοποιείται για την υλοποίηση καθυστερήσεων προγράμματος ή για την κάλυψη κενών που σχηματίζονται στο πρόγραμμα.

Ειδικές ομάδες CLI, STI να απαγορεύσει και να ενεργοποιήσει την εξυπηρέτηση των αιτημάτων διακοπής. Σε επεξεργαστές Pentium Για αυτό χρησιμοποιείται ένα bit ελέγχου (σημαία).ΑΝστο μητρώο ΕΣΗΜΑΙΑ.

Πολλοί σύγχρονοι μικροεπεξεργαστές εκδίδουν μια εντολή αναγνώρισης που επιτρέπει στο χρήστη ή σε άλλες συσκευές να λάβουν πληροφορίες σχετικά με τον τύπο του επεξεργαστή που χρησιμοποιείται σε ένα δεδομένο σύστημα. Σε επεξεργαστές Pentuimη εντολή για αυτό είναι CPUID , κατά την οποία τα απαραίτητα δεδομένα για τον επεξεργαστή εισάγονται στα μητρώα ΕΑΧEBXECXΕΔΧκαι στη συνέχεια μπορεί να διαβαστεί από τον χρήστη ή το λειτουργικό σύστημα.

Ανάλογα με τους τρόπους λειτουργίας που εφαρμόζει ο επεξεργαστής και τους συγκεκριμένους τύπους δεδομένων που επεξεργάζονται, το σύνολο των εκτελούμενων εντολών μπορεί να επεκταθεί σημαντικά.

Ορισμένοι επεξεργαστές εκτελούν αριθμητικές πράξεις με δυαδικούς-δεκαδικούς αριθμούς ή εκτελούν ειδικές οδηγίες για να διορθώσουν το αποτέλεσμα κατά την επεξεργασία τέτοιων αριθμών. Πολλοί επεξεργαστές υψηλής απόδοσης περιλαμβάνουν FPU - μονάδα επεξεργασίας αριθμώνντο «κινητής υποδιαστολής».

Ορισμένοι σύγχρονοι επεξεργαστές εφαρμόζουν ομαδική επεξεργασία πολλών ακεραίων ή αριθμώνντο "κινητής υποδιαστολής" χρησιμοποιώντας μία εντολή σύμφωνα με την αρχή SIMD ("Μία οδηγία – Πολλαπλά δεδομένα" ”) - “Μία εντολή – Πολλά δεδομένα.” Η ταυτόχρονη εκτέλεση λειτουργιών σε πολλούς τελεστές βελτιώνει σημαντικά την απόδοση του επεξεργαστή κατά την εργασία με δεδομένα βίντεο και ήχου. Τέτοιες λειτουργίες χρησιμοποιούνται ευρέως για την επεξεργασία εικόνων, σημάτων ήχου και άλλες εφαρμογές. Για την εκτέλεση αυτών των λειτουργιών, έχουν εισαχθεί ειδικά μπλοκ στους επεξεργαστές που υλοποιούν τα αντίστοιχα σύνολα οδηγιών, τα οποία σε διάφορους τύπους επεξεργαστών ( Pentium, Άθλον) πήρε το όνομαΜΜΧ (“ Μίλτη- Επέκταση πολυμέσων ”) – Επέκταση πολυμέσων,SSE("Επέκταση SIMD ροής") – Ροή SIMD - επέκταση, “3 ρεΕπέκταση– Τρισδιάστατη επέκταση.

Χαρακτηριστικό γνώρισμα των επεξεργαστών της εταιρείας Intel , ξεκινώντας με το μοντέλο 80286, είναι ο έλεγχος προτεραιότητας κατά την πρόσβαση στη μνήμη, ο οποίος παρέχεται όταν ο επεξεργαστής λειτουργεί σε λειτουργία προστατευμένων εικονικών διευθύνσεων - “Προστατευμένη λειτουργία ” (προστατευμένη λειτουργία). Για την υλοποίηση αυτής της λειτουργίας, χρησιμοποιούνται ειδικές ομάδες εντολών, οι οποίες χρησιμεύουν για την οργάνωση της προστασίας της μνήμης σύμφωνα με τον εγκεκριμένο αλγόριθμο πρόσβασης προτεραιότητας.

Δομή εντολών στη γλώσσα συναρμολόγησης Ο προγραμματισμός σε επίπεδο εντολών μηχανής είναι το ελάχιστο επίπεδο στο οποίο είναι δυνατός ο προγραμματισμός υπολογιστή. Το σύστημα εντολών του μηχανήματος πρέπει να είναι επαρκές για την εκτέλεση των απαιτούμενων ενεργειών με την έκδοση οδηγιών στον εξοπλισμό του μηχανήματος. Κάθε εντολή μηχανής αποτελείται από δύο μέρη: ένα λειτουργικό, που καθορίζει το «τι να κάνουμε» και έναν τελεστή, που καθορίζει τα αντικείμενα επεξεργασίας, δηλαδή «τι να κάνουμε». Μια εντολή μηχανής μικροεπεξεργαστή, γραμμένη σε γλώσσα Assembly, είναι μια ενιαία γραμμή που έχει την ακόλουθη μορφή: τελεστές εντολής/οδηγίας ετικέτας. σχόλια Η ετικέτα, η εντολή/οδηγία και ο τελεστής διαχωρίζονται με τουλάχιστον έναν χαρακτήρα διαστήματος ή καρτέλας. Οι τελεστές της εντολής χωρίζονται με κόμματα.

Δομή εντολών γλώσσας Assembly Μια εντολή assembler λέει στον μεταφραστή ποια ενέργεια πρέπει να εκτελέσει ο μικροεπεξεργαστής. Οι οδηγίες συναρμολόγησης είναι παράμετροι που καθορίζονται στο κείμενο του προγράμματος και επηρεάζουν τη διαδικασία συναρμολόγησης ή τις ιδιότητες του αρχείου εξόδου. Ο τελεστής καθορίζει την αρχική τιμή των δεδομένων (στο τμήμα δεδομένων) ή τα στοιχεία στα οποία εκτελείται η ενέργεια εντολής (στο τμήμα κώδικα). Μια εντολή μπορεί να έχει έναν ή δύο τελεστές ή κανέναν τελεστέα. Ο αριθμός των τελεστών καθορίζεται σιωπηρά από τον κώδικα εντολών. Εάν μια εντολή ή οδηγία πρέπει να συνεχιστεί στην επόμενη γραμμή, χρησιμοποιείται ο χαρακτήρας ανάστροφης κάθετο: "" . Από προεπιλογή, το assembler δεν κάνει διάκριση μεταξύ κεφαλαίων και πεζών γραμμάτων κατά τη σύνταξη εντολών και οδηγιών. Παραδείγματα οδηγιών και εντολών Μέτρηση db 1 ; Όνομα, οδηγία, ένας τελεστής mov eax, 0 ; Εντολή, δύο τελεστές

Τα αναγνωριστικά είναι ακολουθίες έγκυρων χαρακτήρων που χρησιμοποιούνται για να υποδηλώσουν ονόματα μεταβλητών και ονόματα ετικετών. Το αναγνωριστικό μπορεί να αποτελείται από έναν ή περισσότερους από τους ακόλουθους χαρακτήρες: όλα τα γράμματα του λατινικού αλφαβήτου. αριθμοί από το 0 έως το 9. ειδικοί χαρακτήρες: _, @, $, ? . Μια κουκκίδα μπορεί να χρησιμοποιηθεί ως ο πρώτος χαρακτήρας της ετικέτας. Τα δεσμευμένα ονόματα συναρμολογητών (οδηγίες, τελεστές, ονόματα εντολών) δεν μπορούν να χρησιμοποιηθούν ως αναγνωριστικά. Ο πρώτος χαρακτήρας του αναγνωριστικού πρέπει να είναι ένα γράμμα ή ένας ειδικός χαρακτήρας. Μέγιστο μήκοςΤο αναγνωριστικό έχει 255 χαρακτήρες, αλλά ο μεταφραστής δέχεται τους πρώτους 32 και αγνοεί τους υπόλοιπους. Όλες οι ετικέτες που είναι γραμμένες σε μια γραμμή που δεν περιέχει οδηγία assembler πρέπει να τελειώνουν με άνω και κάτω τελεία ":". Η ετικέτα, η εντολή (οδηγία) και ο τελεστής δεν χρειάζεται να ξεκινούν από κάποια συγκεκριμένη θέση στη γραμμή. Συνιστάται η εγγραφή τους σε στήλη για μεγαλύτερη αναγνωσιμότητα του προγράμματος.

Ετικέτες Όλες οι ετικέτες που είναι γραμμένες σε μια γραμμή που δεν περιέχει οδηγία assembler πρέπει να τελειώνουν με άνω και κάτω τελεία ":". Η ετικέτα, η εντολή (οδηγία) και ο τελεστής δεν χρειάζεται να ξεκινούν από κάποια συγκεκριμένη θέση στη γραμμή. Συνιστάται η εγγραφή τους σε στήλη για μεγαλύτερη αναγνωσιμότητα του προγράμματος.

Σχόλια Η χρήση σχολίων σε ένα πρόγραμμα βελτιώνει τη σαφήνειά του, ειδικά όταν ο σκοπός ενός συνόλου εντολών είναι ασαφής. Τα σχόλια ξεκινούν σε οποιαδήποτε γραμμή στη μονάδα πηγής με ένα ερωτηματικό (;). Όλοι οι χαρακτήρες στα δεξιά του "; «Στο τέλος της γραμμής είναι ένα σχόλιο. Ένα σχόλιο μπορεί να περιέχει οποιουσδήποτε εκτυπώσιμους χαρακτήρες, συμπεριλαμβανομένου του διαστήματος. Ένα σχόλιο μπορεί να καλύπτει ολόκληρη τη γραμμή ή να ακολουθεί μια εντολή στην ίδια γραμμή.

Δομή προγράμματος συναρμολόγησης γλώσσας Ένα πρόγραμμα γραμμένο σε γλώσσα assembly μπορεί να αποτελείται από πολλά μέρη που ονομάζονται ενότητες, καθένα από τα οποία μπορεί να ορίσει ένα ή περισσότερα τμήματα δεδομένων, στοίβας και κώδικα. Οποιοδήποτε πλήρες πρόγραμμα σε γλώσσα assembly πρέπει να περιλαμβάνει μία κύρια ή κύρια ενότητα από την οποία ξεκινά η εκτέλεσή του. Μια λειτουργική μονάδα μπορεί να περιέχει τμήματα προγράμματος, δεδομένων και στοίβας, που δηλώνονται χρησιμοποιώντας κατάλληλες οδηγίες.

Μοντέλα μνήμης Πριν δηλώσετε τμήματα, πρέπει να καθορίσετε το μοντέλο μνήμης χρησιμοποιώντας μια οδηγία. MODEL modifier memory_model, calling_convention, OS_type, stack_parameter Βασικά μοντέλα μνήμης γλώσσας συναρμολόγησης: Μοντέλο μνήμης Διεύθυνση κωδικού Διεύθυνση δεδομένων Λειτουργικό σύστημα Κωδικός και παρεμβολή δεδομένων TINY NEAR NEAR MS-DOS Acceptable SMALL NEAR NEAR MS-DOS, Windows No MEDIUM MAFD NEAR, Windows COMPACT ΚΟΝΤΑ ΜΑΚΡΙΑ MS-DOS, Windows Όχι ΜΕΓΑΛΑ ΜΑΚΡΙΑ MS-DOS, Windows Όχι ΤΕΡΑΣΤΙΑ ΜΑΚΡΙΑ MS-DOS, Windows Όχι ΚΟΝΤΑ Windows 2000, Windows XP, Αποδεκτά Windows FLAT NEAR NT,

Μοντέλα μνήμης Το μικροσκοπικό μοντέλο λειτουργεί μόνο σε εφαρμογές MS-DOS 16-bit. Σε αυτό το μοντέλο, όλα τα δεδομένα και ο κώδικας βρίσκονται σε ένα φυσικό τμήμα. Το μέγεθος του αρχείου προγράμματος σε αυτήν την περίπτωση δεν υπερβαίνει τα 64 KB. Το μικρό μοντέλο υποστηρίζει ένα τμήμα κώδικα και ένα τμήμα δεδομένων. Κατά τη χρήση αυτού του μοντέλου, τα δεδομένα και ο κώδικας αντιμετωπίζονται όσο πιο κοντά. Το μοντέλο μέσου υποστηρίζει πολλαπλά τμήματα κώδικα και ένα τμήμα δεδομένων, με όλες τις αναφορές σε τμήματα κώδικα να θεωρούνται μακριά από προεπιλογή και τις αναφορές σε ένα τμήμα δεδομένων να θεωρούνται κοντά. Το συμπαγές μοντέλο υποστηρίζει πολλά τμήματα δεδομένων που χρησιμοποιούν διευθυνσιοδότηση δεδομένων μακριά (μακριά) και ένα τμήμα κώδικα που χρησιμοποιεί κοντινή διεύθυνση (κοντά). Το μεγάλο μοντέλο υποστηρίζει πολλαπλά τμήματα κώδικα και πολλαπλά τμήματα δεδομένων. Από προεπιλογή, όλες οι αναφορές σε κώδικα και δεδομένα θεωρούνται μακριά. Το τεράστιο μοντέλο είναι σχεδόν ισοδύναμο με το μοντέλο της μεγάλης μνήμης.

Μοντέλα μνήμης Το επίπεδο μοντέλο λαμβάνει μια μη τμηματοποιημένη διαμόρφωση προγράμματος και χρησιμοποιείται μόνο σε λειτουργικά συστήματα 32 bit. Αυτό το μοντέλο είναι παρόμοιο με το μικροσκοπικό μοντέλο, καθώς τα δεδομένα και ο κώδικας βρίσκονται σε ένα μόνο τμήμα, αλλά είναι 32-bit. Να αναπτυχθεί ένα πρόγραμμα για το επίπεδο μοντέλο πριν από την οδηγία. μοντέλο flat θα πρέπει να τοποθετήσει μία από τις οδηγίες: . 386, . 486, . 586 ή. 686. Η επιλογή της οδηγίας επιλογής επεξεργαστή καθορίζει το σύνολο των διαθέσιμων οδηγιών κατά τη σύνταξη προγραμμάτων. Το γράμμα p μετά την οδηγία επιλογής επεξεργαστή σημαίνει προστατευμένη λειτουργία λειτουργίας. Η διευθυνσιοδότηση δεδομένων και κώδικα είναι κοντά, με όλες τις διευθύνσεις και τους δείκτες να είναι 32-bit.

Μοντέλα μνήμης. MODEL modifier memory_model, calling_convention, OS_type, stack_parameter Η παράμετρος τροποποιητή χρησιμοποιείται για τον καθορισμό τύπων τμημάτων και μπορεί να λάβει τις ακόλουθες τιμές: χρήση 16 (τα τμήματα του επιλεγμένου μοντέλου χρησιμοποιούνται ως 16-bit) χρήση 32 (χρησιμοποιούνται τμήματα του επιλεγμένου μοντέλου ως 32-bit). Η παράμετρος calling_convention χρησιμοποιείται για τον προσδιορισμό της μεθόδου μετάδοσης παραμέτρων κατά την κλήση μιας διαδικασίας από άλλες γλώσσες, συμπεριλαμβανομένων γλωσσών υψηλού επιπέδου (C++, Pascal). Η παράμετρος μπορεί να λάβει τις ακόλουθες τιμές: C, BASIC, FORTRAN, PASCAL, SYSCALL, STDCALL.

Μοντέλα μνήμης. MODEL modifier memory_model, calling_convention, OS_type, stack_parameter Η παράμετρος OS_type είναι OS_DOS από προεπιλογή και είναι προς το παρόν η μόνη υποστηριζόμενη τιμή για αυτήν την παράμετρο. Η παράμετρος stack_parameter έχει οριστεί σε: NEARSTACK (Ο καταχωρητής SS είναι ίσος με DS, οι περιοχές δεδομένων και στοίβας βρίσκονται στο ίδιο φυσικό τμήμα) FARSTACK (ο καταχωρητής SS δεν είναι ίσος με DS, οι περιοχές δεδομένων και στοίβας βρίσκονται σε διαφορετικά φυσικά τμήματα). Η προεπιλεγμένη τιμή είναι NEARSTACK.

Ένα παράδειγμα προγράμματος που δεν κάνει τίποτα. 686 P. MODEL FLAT, STDCALL. ΔΕΔΟΜΕΝΑ. ΚΩΔΙΚΟΣ ΕΝΑΡΞΗ: RET END START RET - εντολή μικροεπεξεργαστή. Διασφαλίζει ότι το πρόγραμμα τερματίζεται σωστά. Το υπόλοιπο πρόγραμμα αφορά τη λειτουργία του μεταφραστή. . 686 P - Επιτρέπονται εντολές προστατευμένης λειτουργίας Pentium 6 (Pentium II). Αυτή η οδηγία επιλέγει το υποστηριζόμενο σύνολο οδηγιών συναρμολόγησης, υποδεικνύοντας το μοντέλο του επεξεργαστή. . MODEL FLAT, stdcall - μοντέλο επίπεδης μνήμης. Αυτό το μοντέλο μνήμης χρησιμοποιείται στο χειρουργείο Σύστημα Windows. stdcall - η διαδικασία κλήσης της σύμβασης που χρησιμοποιείται.

Ένα παράδειγμα προγράμματος που δεν κάνει τίποτα. 686 P. MODEL FLAT, STDCALL. ΔΕΔΟΜΕΝΑ. ΚΩΔΙΚΟΣ ΕΝΑΡΞΗΣ: ΕΠΑΝΑΛΗΨΗ ΤΕΛΟΣ START. Το DATA είναι ένα τμήμα προγράμματος που περιέχει δεδομένα. Αυτό το πρόγραμμα δεν χρησιμοποιεί τη στοίβα, άρα το τμήμα. Το STACK λείπει. . Το CODE είναι ένα τμήμα προγράμματος που περιέχει κώδικα. ΕΝΑΡΞΗ - ετικέτα. END START - το τέλος του προγράμματος και ένα μήνυμα στον μεταγλωττιστή ότι η εκτέλεση του προγράμματος πρέπει να ξεκινά με την ετικέτα START. Κάθε πρόγραμμα πρέπει να περιέχει μια οδηγία ΤΕΛΟΣ για να σηματοδοτήσει το τέλος πηγαίος κώδικαςπρογράμματα. Όλες οι γραμμές που ακολουθούν την οδηγία ΤΕΛΟΣ αγνοούνται.Η ετικέτα που καθορίζεται μετά την οδηγία ΤΕΛΟΣ λέει στον μεταφραστή το όνομα της κύριας μονάδας από την οποία ξεκινά η εκτέλεση του προγράμματος. Εάν το πρόγραμμα περιέχει μία ενότητα, η ετικέτα μετά την οδηγία ΤΕΛΟΣ μπορεί να παραλειφθεί.

Μεταφραστές γλώσσας συναρμολόγησης Ο μεταφραστής είναι ένα πρόγραμμα ή τεχνικό εργαλείο που μετατρέπει ένα πρόγραμμα που παρουσιάζεται σε μία από τις γλώσσες προγραμματισμού σε ένα πρόγραμμα στη γλώσσα στόχο, που ονομάζεται κώδικας αντικειμένου. Εκτός από την υποστήριξη μνημονικών εντολών μηχανής, κάθε μεταφραστής έχει το δικό του σύνολο οδηγιών και εργαλείων μακροεντολών, συχνά ασύμβατα με οτιδήποτε άλλο. Οι κύριοι τύποι μεταφραστών γλωσσών συναρμολόγησης: MASM (Microsoft Assembler), TASM (Borland Turbo Assembler), FASM (Flat Assembler) - ένας ελεύθερα διανεμόμενος assembler πολλαπλών περασμάτων γραμμένος από τον Tomasz Gryshtar (Πολωνός), NASM (Netwide Assembler) - ένα δωρεάν assembler για την αρχιτεκτονική Intel x 86, δημιουργήθηκε από τον Simon Tatham με τον Julian Hall και αυτή τη στιγμή αναπτύσσεται από μια μικρή ομάδα προγραμματιστών στο Source. Σιδηρουργείο. καθαρά.

Src="https://present5.com/presentation/-29367016_63610977/image-15.jpg" alt="Μετάφραση προγράμματος στο Microsoft Visual Studio 2005 1) Δημιουργήστε ένα έργο επιλέγοντας Αρχείο->Νέο- >Μενού έργου Και"> Трансляция программы в Microsoft Visual Studio 2005 1) Создать проект, выбрав меню File->New->Project и указав имя проекта (hello. prj) и тип проекта: Win 32 Project. В дополнительных опциях мастера проекта указать “Empty Project”.!}

Src="https://present5.com/presentation/-29367016_63610977/image-16.jpg" alt="Μετάφραση του προγράμματος στο Microsoft Visual Studio 2005 2) Στο δέντρο του έργου (View->Solution Explorer) Προσθήκη"> Трансляция программы в Microsoft Visual Studio 2005 2) В дереве проекта (View->Solution Explorer) добавить файл, в котором будет содержаться текст программы: Source. Files->Add->New. Item.!}

Μετάφραση του προγράμματος σε Microsoft Visual Studio 2005 3) Επιλέξτε τον τύπο αρχείου Code C++, αλλά καθορίστε το όνομα με την επέκταση. asm:

Μετάφραση του προγράμματος στο Microsoft Visual Studio 2005 5) Ορίστε τις παραμέτρους του μεταγλωττιστή. Κάντε δεξί κλικ στο μενού Custom Build Rules στο αρχείο του έργου...

Μεταφράστε το πρόγραμμα σε Microsoft Visual Studio 2005 και επιλέξτε Microsoft Macro Assembler στο παράθυρο που εμφανίζεται.

Μετάφραση του προγράμματος στο Microsoft Visual Studio 2005 Ελέγξτε με το δεξί κουμπί στο αρχείο hello. asm έργο του μενού Ιδιότητες και εγκαταστήστε Γενικά-> Εργαλείο: Microsoft Macro Assembler.

Src="https://present5.com/presentation/-29367016_63610977/image-22.jpg" alt="Μετάφραση του προγράμματος στο Microsoft Visual Studio 2005 6) Μεταγλωττίστε το αρχείο επιλέγοντας Build->Build hello. prj."> Трансляция программы в Microsoft Visual Studio 2005 6) Откомпилировать файл, выбрав Build->Build hello. prj. 7) Запустить программу, нажав F 5 или выбрав меню Debug->Start Debugging.!}

Προγραμματισμός σε λειτουργικό σύστημα Windows Ο προγραμματισμός στο λειτουργικό σύστημα Windows βασίζεται στη χρήση λειτουργιών API (Διασύνδεση προγράμματος εφαρμογής, δηλ. διεπαφή εφαρμογής λογισμικού). Ο αριθμός τους φτάνει τις 2000. Το πρόγραμμα των Windows αποτελείται σε μεγάλο βαθμό από τέτοιες κλήσεις. Όλες οι αλληλεπιδράσεις με εξωτερικές συσκευέςκαι οι πόροι του λειτουργικού συστήματος εμφανίζονται, κατά κανόνα, μέσω τέτοιων λειτουργιών. Το λειτουργικό σύστημα Windows χρησιμοποιεί ένα μοντέλο επίπεδης μνήμης. Η διεύθυνση οποιουδήποτε κελιού μνήμης θα καθοριστεί από τα περιεχόμενα ενός καταχωρητή 32 bit. Υπάρχουν 3 τύποι δομών προγραμμάτων για τα Windows: διάλογος (το κύριο παράθυρο είναι διάλογος), δομή κονσόλας ή χωρίς παράθυρο, κλασική δομή (με παράθυρο, πλαίσιο).

Κλήση Λειτουργίες Windows API Στο αρχείο βοήθειας, οποιαδήποτε συνάρτηση API παρουσιάζεται ως τύπος function_name (FA 1, FA 2, FA 3) Τύπος – τύπος τιμής επιστροφής. Φαξ – μια λίστα επίσημων ορισμάτων με τη σειρά που εμφανίζονται. Για παράδειγμα, int Message. Box(HWND h. Wnd, LPCTSTR lp. Text, LPCTSTR lp. Caption, UINT u. Type); Αυτή η λειτουργίαεμφανίζει ένα παράθυρο με ένα μήνυμα και ένα κουμπί εξόδου (ή κουμπιά). Σημασία των παραμέτρων: h. Το Wnd είναι ένας περιγραφέας του παραθύρου στο οποίο θα εμφανιστεί το παράθυρο μηνύματος, lp. Κείμενο - κείμενο που θα εμφανιστεί στο παράθυρο, λπ. Λεζάντα - κείμενο στον τίτλο του παραθύρου, u. Τύπος - τύπος παραθύρου· συγκεκριμένα, μπορείτε να προσδιορίσετε τον αριθμό των κουμπιών εξόδου.

Κλήση λειτουργιών του Windows API int Message. Box(HWND h. Wnd, LPCTSTR lp. Text, LPCTSTR lp. Caption, UINT u. Type); Σχεδόν όλες οι παράμετροι συνάρτησης API είναι στην πραγματικότητα ακέραιοι αριθμοί 32 bit: το HWND είναι ένας ακέραιος αριθμός 32 bit, το LPCTSTR είναι ένας δείκτης 32 bit σε μια συμβολοσειρά, το UINT είναι ένας ακέραιος αριθμός 32 bit. Το επίθημα "A" προστίθεται συχνά στο όνομα της συνάρτησης για να μετακινηθεί σε νεότερες εκδόσεις της συνάρτησης.

Κλήση λειτουργιών του Windows API int Message. Box(HWND h. Wnd, LPCTSTR lp. Text, LPCTSTR lp. Caption, UINT u. Type); Όταν χρησιμοποιείτε το MASM, πρέπει να προσθέσετε το @N N στο τέλος του ονόματος - τον αριθμό των byte που καταλαμβάνουν τα περασμένα ορίσματα στη στοίβα. Για συναρτήσεις Win 32 API, αυτός ο αριθμός μπορεί να οριστεί ως ο αριθμός των ορισμάτων n πολλαπλασιασμένος επί 4 (byte σε κάθε όρισμα): N=4*n. Για να καλέσετε μια συνάρτηση, χρησιμοποιήστε την οδηγία CALL του assembler. Σε αυτήν την περίπτωση, όλα τα ορίσματα συνάρτησης μεταβιβάζονται σε αυτήν μέσω της στοίβας (εντολή PUSH). Κατεύθυνση μετάδοσης ορισμάτων: ΑΡΙΣΤΕΡΑ ΠΡΟΣ ΔΕΞΙΑ - ΚΑΤΩ ΠΑΝΩ. Το όρισμα u θα προωθηθεί πρώτα στη στοίβα. Τύπος. Η κλήση προς την καθορισμένη λειτουργία θα μοιάζει με αυτό: Μήνυμα ΚΛΗΣΗΣ. Κουτί. Α@16

Κλήση λειτουργιών του Windows API int Message. Box(HWND h. Wnd, LPCTSTR lp. Text, LPCTSTR lp. Caption, UINT u. Type); Το αποτέλεσμα της εκτέλεσης οποιασδήποτε συνάρτησης API είναι συνήθως ένας ακέραιος που επιστρέφεται στον καταχωρητή EAX. Η οδηγία OFFSET αντιπροσωπεύει μια "μετατόπιση σε ένα τμήμα" ή, μεταφρασμένη σε γλωσσικούς όρους υψηλού επιπέδου, έναν "δείκτη" στην αρχή μιας γραμμής. Η οδηγία EQU, όπως το #define στο SI, ορίζει μια σταθερά. Η οδηγία EXTERN λέει στον μεταφραστή ότι η συνάρτηση ή το αναγνωριστικό είναι εξωτερικό σε αυτήν την ενότητα.

Παράδειγμα προγράμματος "Γεια σε όλους!" . 686 P. MODEL FLAT, STDCALL. STACK 4096. DATA MB_OK EQU 0 STR 1 DB "Το πρώτο μου πρόγραμμα", 0 STR 2 DB "Γεια σε όλους!", 0 HW DD ? ΕΞΩΤΕΡΙΚΟ Μήνυμα. Κουτί. Α@16: ΚΟΝΤΑ. ΚΩΔΙΚΟΣ ΕΝΑΡΞΗΣ: PUSH MB_OK PUSH OFFSET STR 1 PUSH OFFSET STR 2 PUSH HW CALL Μήνυμα. Κουτί. A@16 ΕΠΑΝΑΛΗΨΗ ΤΕΛΟΣ ΕΝΑΡΞΗ

Η οδηγία INVOKE Ο μεταφραστής γλώσσας MASM σάς επιτρέπει επίσης να απλοποιήσετε τις κλήσεις συναρτήσεων χρησιμοποιώντας ένα εργαλείο μακροεντολής - την οδηγία INVOKE: συνάρτηση INVOKE, παράμετρος1, παράμετρος2, ... Δεν χρειάζεται να προσθέσετε @16 στην κλήση συνάρτησης. Οι παράμετροι γράφονται ακριβώς με τη σειρά που δίνονται στην περιγραφή της συνάρτησης. Με τη μακροεντολή του μεταφραστή, οι παράμετροι τοποθετούνται στη στοίβα. Για να χρησιμοποιήσετε την οδηγία INVOKE, πρέπει να έχετε μια περιγραφή του πρωτοτύπου λειτουργίας χρησιμοποιώντας την οδηγία PROTO με τη μορφή: Μήνυμα. Κουτί. A PROTO: DWORD, : DWORD Εάν ένα πρόγραμμα χρησιμοποιεί πολλές λειτουργίες Win 32 API, συνιστάται να χρησιμοποιήσετε την οδηγία include C: masm 32includeuser 32. inc

Δομές στη γλώσσα assembly

Οι πίνακες που εξετάσαμε παραπάνω είναι μια συλλογή στοιχείων του ίδιου τύπου. Αλλά συχνά στις εφαρμογές υπάρχει ανάγκη να ληφθεί υπόψη ένα συγκεκριμένο σύνολο δεδομένων ΔΙΑΦΟΡΕΤΙΚΟΙ ΤΥΠΟΙως κάποιου ενιαίου τύπου.

Αυτό είναι πολύ σημαντικό, για παράδειγμα, για προγράμματα βάσεων δεδομένων, όπου είναι απαραίτητο να συσχετιστεί μια συλλογή δεδομένων διαφορετικών τύπων με ένα αντικείμενο.

Για παράδειγμα, εξετάσαμε προηγουμένως τη Λίστα 4, στην οποία δουλέψαμε με έναν πίνακα στοιχείων τριών byte. Κάθε στοιχείο, με τη σειρά του, αποτελούνταν από δύο στοιχεία διαφορετικών τύπων: ένα πεδίο μετρητή ενός byte και ένα πεδίο δύο byte, το οποίο θα μπορούσε να μεταφέρει κάποιες άλλες πληροφορίες απαραίτητες για αποθήκευση και επεξεργασία. Εάν ο αναγνώστης είναι εξοικειωμένος με μία από τις γλώσσες υψηλού επιπέδου, τότε γνωρίζει ότι ένα τέτοιο αντικείμενο συνήθως περιγράφεται χρησιμοποιώντας έναν ειδικό τύπο δεδομένων - δομές.

Προκειμένου να βελτιωθεί η χρηστικότητα της γλώσσας assembly, αυτός ο τύπος δεδομένων εισήχθη επίσης σε αυτήν.

Α-πριό δομή είναι ένας τύπος δεδομένων που αποτελείται από έναν σταθερό αριθμό στοιχείων διαφορετικών τύπων.

Για να χρησιμοποιήσετε δομές σε ένα πρόγραμμα, πρέπει να εκτελέσετε τρία βήματα:

    Σειρά πρότυπο δομής .

    Στην ουσία, αυτό σημαίνει τον ορισμό ενός νέου τύπου δεδομένων, ο οποίος μπορεί στη συνέχεια να χρησιμοποιηθεί για τον ορισμό μεταβλητών αυτού του τύπου.

    Καθορίζω παράδειγμα δομής .

    Αυτό το στάδιο περιλαμβάνει την προετοιμασία μιας συγκεκριμένης μεταβλητής με μια προκαθορισμένη δομή (με χρήση προτύπου).

    Οργανώνω πρόσβαση σε στοιχεία δομής .

Είναι πολύ σημαντικό να καταλάβετε από την αρχή ποια είναι η διαφορά μεταξύ περιγραφήδομές στο πρόγραμμα και του ορισμός.

Περιγράφω δομή σε ένα πρόγραμμα σημαίνει απλώς να υποδεικνύει το περίγραμμα ή το μοτίβο του. η μνήμη δεν έχει εκχωρηθεί.

Αυτό το πρότυπο μπορεί να θεωρηθεί μόνο ως πληροφορίες για τον μεταφραστή σχετικά με τη θέση των πεδίων και την προεπιλεγμένη τιμή τους.

Καθορίζω δομή σημαίνει εντολή στον μεταφραστή να εκχωρήσει μνήμη και να εκχωρήσει ένα συμβολικό όνομα σε αυτήν την περιοχή μνήμης.

Μια δομή μπορεί να περιγραφεί σε ένα πρόγραμμα μόνο μία φορά, αλλά να οριστεί πολλές φορές.

Περιγραφή του προτύπου δομής

Η περιγραφή του προτύπου δομής έχει την ακόλουθη σύνταξη:

δομή_όνομα STRUC

δομή_όνομα ΤΕΛΟΣ

Εδώ είναι μια ακολουθία οδηγιών περιγραφής δεδομένων db, dw, dd, dqΚαι dt.

Οι τελεστές τους καθορίζουν το μέγεθος των πεδίων και, εάν χρειάζεται, τις αρχικές τιμές. Αυτές οι τιμές πιθανότατα θα αρχικοποιήσουν τα αντίστοιχα πεδία κατά τον καθορισμό της δομής.

Όπως έχουμε ήδη σημειώσει κατά την περιγραφή του προτύπου, η μνήμη δεν εκχωρείται, καθώς πρόκειται απλώς για πληροφορίες για τον μεταφραστή.

ΤοποθεσίαΤο πρότυπο στο πρόγραμμα μπορεί να είναι αυθαίρετο, αλλά, ακολουθώντας τη λογική του μεταφραστή με ένα πέρασμα, πρέπει να βρίσκεται πριν από το μέρος όπου ορίζεται η μεταβλητή με τον τύπο της δεδομένης δομής. Δηλαδή, όταν περιγράφεται μια μεταβλητή με τον τύπο μιας συγκεκριμένης δομής σε ένα τμήμα δεδομένων, το πρότυπό της πρέπει να τοποθετείται στην αρχή του τμήματος δεδομένων ή πριν από αυτό.

Ας εξετάσουμε την εργασία με δομές χρησιμοποιώντας το παράδειγμα της μοντελοποίησης μιας βάσης δεδομένων σχετικά με τους υπαλλήλους ενός συγκεκριμένου τμήματος.

Για λόγους απλότητας, προκειμένου να αποφευχθούν προβλήματα μετατροπής πληροφοριών κατά την εισαγωγή, θα συμφωνήσουμε ότι όλα τα πεδία είναι πεδία χαρακτήρων.

Ας ορίσουμε τη δομή εγγραφής αυτής της βάσης δεδομένων με το ακόλουθο πρότυπο:

Καθορισμός δεδομένων με τύπο δομής

Για να χρησιμοποιήσετε μια δομή που περιγράφεται χρησιμοποιώντας ένα πρότυπο σε ένα πρόγραμμα, πρέπει να ορίσετε μια μεταβλητή με τον τύπο αυτής της δομής. Για αυτό χρησιμοποιείται η ακόλουθη συντακτική κατασκευή:

[όνομα μεταβλητής] δομή_όνομα

    όνομα μεταβλητής- αναγνωριστικό μιας μεταβλητής αυτού του τύπου δομής.

    Ο καθορισμός ονόματος μεταβλητής είναι προαιρετικός. Εάν δεν το καθορίσετε, μια περιοχή μνήμης μεγέθους ίση με το άθροισμα των μηκών όλων στοιχεία δομής.

    λίστα αξιών- μια λίστα αρχικών τιμών των στοιχείων της δομής που περικλείονται σε γωνιακές αγκύλες, διαχωρισμένες με κόμματα.

    Η ανάθεσή του είναι επίσης προαιρετική.

    Εάν η λίστα δεν έχει καθοριστεί πλήρως, τότε όλα τα πεδία της δομής για αυτήν τη μεταβλητή αρχικοποιούνται με τιμές από το πρότυπο, εάν έχουν καθοριστεί.

    Είναι δυνατή η προετοιμασία μεμονωμένων πεδίων, αλλά σε αυτήν την περίπτωση τα πεδία που λείπουν πρέπει να διαχωριστούν με κόμμα. Τα πεδία που παραλείπονται θα αρχικοποιηθούν με τις τιμές από το πρότυπο δομής. Εάν, όταν ορίζουμε μια νέα μεταβλητή με τον τύπο μιας δεδομένης δομής, συμφωνούμε με όλες τις τιμές πεδίων στο πρότυπό της (δηλαδή, αυτές που καθορίζονται από προεπιλογή), τότε πρέπει απλώς να γράψουμε αγκύλες.

    Π.χ: νικητής εργάτης.

Για παράδειγμα, ας ορίσουμε διάφορες μεταβλητές με τον τύπο δομής που περιγράφεται παραπάνω.

Μέθοδοι εργασίας με δομή

Η ιδέα της εισαγωγής ενός δομημένου τύπου σε οποιαδήποτε γλώσσα προγραμματισμού είναι ο συνδυασμός μεταβλητών διαφορετικών τύπων σε ένα αντικείμενο.

Η γλώσσα πρέπει να έχει ένα μέσο πρόσβασης σε αυτές τις μεταβλητές μέσα σε ένα συγκεκριμένο στιγμιότυπο της δομής. Για να αναφερθούμε σε ένα πεδίο κάποιας δομής σε μια εντολή, χρησιμοποιείται ένας ειδικός τελεστής - σύμβολο ". " (τελεία). Χρησιμοποιείται στην ακόλουθη σύνταξη:

    διεύθυνση_έκφραση- Αναγνωριστικό μιας μεταβλητής κάποιου δομικού τύπου ή έκφρασης σε αγκύλες σύμφωνα με τους κανόνες σύνταξης που υποδεικνύονται παρακάτω (Εικ. 1).

    δομή_όνομα_πεδίου- όνομα πεδίου από το πρότυπο δομής.

    Αυτό, στην πραγματικότητα, είναι επίσης μια διεύθυνση, ή μάλλον, η μετατόπιση του πεδίου από την αρχή της δομής.

Έτσι ο χειριστής " . " (dot) αξιολογεί την έκφραση

Ρύζι. 5. Σύνταξη έκφρασης διεύθυνσης σε τελεστή πρόσβασης πεδίου δομής

Ας δείξουμε χρησιμοποιώντας το παράδειγμα της δομής που ορίσαμε. εργάτης μερικές τεχνικές εργασίας με δομές.

Για παράδειγμα, εξαγωγή σε τσεκούριτιμές πεδίου με την ηλικία. Δεδομένου ότι είναι απίθανο η ηλικία ενός εργαζομένου να είναι μεγαλύτερη από 99 έτη, μετά την τοποθέτηση του περιεχομένου αυτού του πεδίου χαρακτήρων στο μητρώο τσεκούριΘα είναι βολικό να το μετατρέψετε σε δυαδική αναπαράσταση με την εντολή aad.

Προσοχή γιατί λόγω της αρχής της αποθήκευσης δεδομένων “Χαμηλό byte σε χαμηλή διεύθυνση”θα τοποθετηθεί το υψηλότερο ψηφίο της ηλικίας al, και ο νεότερος - μέσα αχ.

Για να κάνετε προσαρμογές, απλώς χρησιμοποιήστε την εντολή xchg al,ah:

mov ax,word ptr sotr1.age ;in al age sotr1

ή μπορείτε να το κάνετε ως εξής:

Περαιτέρω εργασία με μια σειρά δομών πραγματοποιείται με τον ίδιο τρόπο όπως με μια μονοδιάστατη διάταξη. Εδώ προκύπτουν διάφορα ερωτήματα:

Τι να κάνετε με το μέγεθος και πώς να οργανώσετε την ευρετηρίαση των στοιχείων του πίνακα;

Παρόμοια με άλλα αναγνωριστικά που ορίζονται στο πρόγραμμα, ο μεταφραστής εκχωρεί ένα χαρακτηριστικό τύπου στο όνομα του τύπου δομής και το όνομα της μεταβλητής με τον τύπο δομής. Η τιμή αυτού του χαρακτηριστικού είναι το μέγεθος σε byte που καταλαμβάνουν τα πεδία αυτής της δομής. Μπορείτε να ανακτήσετε αυτήν την τιμή χρησιμοποιώντας τον τελεστή τύπος.

Από τη στιγμή που είναι γνωστό το μέγεθος μιας παρουσίας δομής, η οργάνωση της ευρετηρίασης σε μια σειρά δομών δεν είναι ιδιαίτερα δύσκολη.

Π.χ:

Πώς να αντιγράψετε ένα πεδίο από μια δομή στο αντίστοιχο πεδίο μιας άλλης δομής; Ή πώς να αντιγράψετε ολόκληρη τη δομή; Ας αντιγράψουμε το πεδίο namτρίτος υπάλληλος στο χώρο namπέμπτος υπάλληλος:

mas_sotr worker 10 dup()

mov bx,offset mas_sotr

mov si, (εργάτης τύπου)*2 ;si=77*2

mov di,(εργάτης τύπου)*4 ;si=77*4

Μου φαίνεται ότι το να είσαι προγραμματιστής αργά ή γρήγορα κάνει έναν άνθρωπο να μοιάζει καλή νοικοκυρά. Αυτός, όπως και εκείνη, ψάχνει συνεχώς πού να σώσει κάτι, να περιορίσει και να φτιάξει ένα υπέροχο δείπνο με ελάχιστα υλικά. Και αν αυτό είναι επιτυχές, τότε η ηθική ικανοποίηση που λαμβάνετε δεν είναι λιγότερη, και ίσως ακόμη μεγαλύτερη, από ένα υπέροχο δείπνο με μια νοικοκυρά. Ο βαθμός αυτής της ικανοποίησης, μου φαίνεται, εξαρτάται από τον βαθμό της αγάπης κάποιου για το επάγγελμα.

Από την άλλη πλευρά, οι επιτυχίες στην ανάπτυξη λογισμικού και υλικού χαλαρώνουν κάπως τον προγραμματιστή και αρκετά συχνά παρατηρείται μια κατάσταση παρόμοια με τη γνωστή παροιμία για μια μύγα και έναν ελέφαντα - για την επίλυση κάποιου μικροπροβλήματος, χρησιμοποιούνται βαριά εργαλεία, η αποτελεσματικότητα της οποίας, στη γενική περίπτωση, είναι σημαντική μόνο όταν υλοποιούνται σχετικά μεγάλα έργα.

Η παρουσία των παρακάτω δύο τύπων δεδομένων στη γλώσσα εξηγείται πιθανώς από την επιθυμία της «νοικοκυράς» να χρησιμοποιήσει την περιοχή εργασίας του τραπεζιού (RAM) όσο το δυνατόν πιο αποτελεσματικά κατά την προετοιμασία φαγητού ή για την τοποθέτηση προϊόντων (δεδομένα προγράμματος ).

Οι εντολές μπορούν να διακριθούν ανάλογα με το σκοπό (παραδείγματα μνημονικών κωδίκων λειτουργίας των εντολών IBM PC assembler δίνονται σε παρένθεση):

l εκτέλεση αριθμητικών πράξεων (ADD και ADC - πρόσθεση και πρόσθεση με μεταφορά, SUB και SBB - αφαίρεση και αφαίρεση με δανεισμό, MUL και IMUL - πολλαπλασιασμός χωρίς υπογραφή και προσημείωση, DIV και IDIV - ανυπόγραφη και υπογεγραμμένη διαίρεση, CMP - συγκρίσεις κ.λπ.).

l εκτέλεση λογικών πράξεων (OR, AND, NOT, XOR, TEST κ.λπ.)

l μεταφορά δεδομένων (MOV - προώθηση, XCHG - ανταλλαγή, IN - είσοδος στον μικροεπεξεργαστή, OUT - έξοδος από τον μικροεπεξεργαστή κ.λπ.)

l μεταφορά ελέγχου (διακλαδώσεις προγράμματος: JMP - άνευ όρων άλμα, CALL - κλήση διαδικασίας, RET - επιστροφή από διαδικασία, J* - άλμα υπό όρους, LOOP - έλεγχος βρόχου κ.λπ.)

l Επεξεργασία συμβολοσειρών χαρακτήρων (MOVS - μεταφορές, CMPS - συγκρίσεις, LODS - φορτώσεις, SCAS - σαρώσεις. Αυτές οι εντολές χρησιμοποιούνται συνήθως με το πρόθεμα (τροποποιητής επανάληψης) ​REP.

l διακοπές προγράμματος (INT - διακοπές λογισμικού, INTO - υπό όρους διακοπή σε υπερχείλιση, IRET - επιστροφή από διακοπή).

l Έλεγχος μικροεπεξεργαστή (ST* και CL* - ρύθμιση και επαναφορά σημαιών, HLT - διακοπή, ΑΝΑΜΟΝΗ - αναμονή, NOP - ρελαντί κ.λπ.).

ΜΕ πλήρης λίσταΟι εντολές συναρμολόγησης βρίσκονται στα έργα.

Εντολές μεταφοράς δεδομένων

l MOV dst, src - μεταφορά δεδομένων (μετακίνηση - αποστολή από src σε dst).

Μεταφορές: ένα byte (εάν το src και το dst είναι σε μορφή byte) ή μια λέξη (εάν το src και το dst είναι σε μορφή word) μεταξύ καταχωρητών ή μεταξύ καταχωρητή και μνήμης και γράφει μια άμεση τιμή σε έναν καταχωρητή ή μνήμη.

Οι τελεστές dst και src πρέπει να έχουν την ίδια μορφή - byte ή λέξη.

Το Src μπορεί να είναι του ακόλουθου τύπου: r (register) - καταχωρητής, m (μνήμη) - μνήμη, i (σύνθετη αντίσταση) - άμεση τιμή. Το Dst μπορεί να είναι τύπου r, m. Δεν μπορείτε να χρησιμοποιήσετε τους ακόλουθους τελεστές σε μία εντολή: rsegm μαζί με i; δύο τελεστές τύπου m και δύο τελεστές τύπου rsegm). Ο τελεστής i μπορεί επίσης να είναι μια απλή έκφραση:

mov AX, (152 + 101B) / 15

Η αξιολόγηση της έκφρασης πραγματοποιείται μόνο κατά τη μετάφραση. Δεν αλλάζει σημαίες.

l PUSH src - σπρώχνοντας μια λέξη στη στοίβα (ώθηση - σπρώξτε μέσα? σπρώξτε στη στοίβα από το src). Τοποθετεί τα περιεχόμενα του src - οποιονδήποτε καταχωρητή 16-bit (συμπεριλαμβανομένου του καταχωρητή τμήματος) ή δύο κελιών μνήμης που περιέχουν μια λέξη 16-bit - στην κορυφή της στοίβας. Οι σημαίες δεν αλλάζουν.

l POP dst - βγάζει μια λέξη από τη στοίβα (pop - pop; μέτρηση από στοίβα σε dst). Αφαιρεί μια λέξη από την κορυφή της στοίβας και την τοποθετεί σε dst - οποιονδήποτε καταχωρητή 16-bit (συμπεριλαμβανομένου του καταχωρητή τμήματος) ή σε δύο κελιά μνήμης. Οι σημαίες δεν αλλάζουν.

Ο προγραμματισμός σε επίπεδο εντολών μηχανής είναι το ελάχιστο επίπεδο στο οποίο μπορούν να γραφτούν προγράμματα. Το σύστημα οδηγιών του μηχανήματος πρέπει να είναι επαρκές για την υλοποίηση των απαιτούμενων ενεργειών με την έκδοση οδηγιών στο υλικό του υπολογιστή.

Κάθε εντολή μηχανής αποτελείται από δύο μέρη:

  • επιχειρησιακό - καθορισμός του "τι πρέπει να γίνει".
  • τελεστής - ορίζοντας αντικείμενα επεξεργασίας, «με τι να κάνουμε».

Η εντολή μηχανής μικροεπεξεργαστή, γραμμένη σε γλώσσα συναρμολόγησης, είναι μία γραμμή με την ακόλουθη συντακτική μορφή:

ετικέτα εντολής/οδηγίας τελεστές ;σχόλια

Σε αυτήν την περίπτωση, το απαιτούμενο πεδίο στη γραμμή είναι μια εντολή ή οδηγία.

Η ετικέτα, η εντολή/οδηγία και οι τελεστές (εάν υπάρχουν) διαχωρίζονται με τουλάχιστον έναν χαρακτήρα διαστήματος ή tab.

Εάν μια εντολή ή οδηγία πρέπει να συνεχιστεί στην επόμενη γραμμή, χρησιμοποιείται ο χαρακτήρας ανάστροφης κάθετο: \.

Από προεπιλογή, η γλώσσα assembly δεν κάνει διάκριση μεταξύ κεφαλαίων και πεζών γραμμάτων κατά τη σύνταξη εντολών ή οδηγιών.

Παραδείγματα γραμμών κώδικα:

Μετρήστε db 1 ;Όνομα, οδηγία, ένας τελεστής
mov eax,0 Εντολή, δύο τελεστές
cbw ; Ομάδα

Ετικέτες

Επιγραφή στη γλώσσα assembly μπορεί να περιέχει τα ακόλουθα σύμβολα:

  • όλα τα γράμματα του λατινικού αλφαβήτου·
  • αριθμοί από το 0 έως το 9.
  • ειδικοί χαρακτήρες: _, @, $, ?.

Μια τελεία μπορεί να χρησιμοποιηθεί ως ο πρώτος χαρακτήρας μιας ετικέτας, αλλά ορισμένοι μεταγλωττιστές δεν συνιστούν τη χρήση αυτού του χαρακτήρα. Τα δεσμευμένα ονόματα Assembler (οδηγίες, τελεστές, ονόματα εντολών) δεν μπορούν να χρησιμοποιηθούν ως ετικέτες.

Ο πρώτος χαρακτήρας στην ετικέτα πρέπει να είναι γράμμα ή ειδικός χαρακτήρας (αλλά όχι αριθμός). Το μέγιστο μήκος ετικέτας είναι 31 χαρακτήρες. Όλες οι ετικέτες που είναι γραμμένες σε μια γραμμή που δεν περιέχει οδηγία assembler πρέπει να τελειώνουν με άνω και κάτω τελεία: .

Της ομάδας

Ομάδα λέει στον μεταφραστή ποια ενέργεια πρέπει να εκτελέσει ο μικροεπεξεργαστής. Σε ένα τμήμα δεδομένων, μια εντολή (ή οδηγία) ορίζει ένα πεδίο, χώρο εργασίας ή σταθερά. Σε ένα τμήμα κώδικα, μια εντολή καθορίζει μια ενέργεια, όπως μετακίνηση (mov) ή προσθήκη (προσθήκη).

Οδηγίες

Το assembler έχει έναν αριθμό χειριστών που σας επιτρέπουν να ελέγχετε τη διαδικασία συναρμολόγησης και καταχώρισης. Αυτοί οι τελεστές καλούνται οδηγίες . Ενεργούν μόνο κατά τη διαδικασία συναρμολόγησης του προγράμματος και, σε αντίθεση με τις εντολές, δεν δημιουργούν κώδικα μηχανής.

τελεστές

Ορος πράξης – ένα αντικείμενο στο οποίο εκτελείται μια εντολή μηχανής ή μια δήλωση γλώσσας προγραμματισμού.
Μια εντολή μπορεί να έχει έναν ή δύο τελεστές ή καθόλου τελεστές. Ο αριθμός των τελεστών καθορίζεται σιωπηρά από τον κώδικα εντολών.
Παραδείγματα:

  • Χωρίς επαναφορά τελεστών ;Επιστροφή
  • Ένας τελεστής inc ecx ;Αύξηση ecx
  • Δύο τελεστές προσθέτουν eax,12, Προσθέστε 12 στο eax

Η ετικέτα, η εντολή (οδηγία) και ο τελεστής δεν χρειάζεται να ξεκινούν από κάποια συγκεκριμένη θέση στη γραμμή. Ωστόσο, συνιστάται να τα γράψετε σε μια στήλη για να διευκολύνετε την ανάγνωση του προγράμματος.

Οι τελεστές μπορούν να είναι

  • αναγνωριστικά·
  • συμβολοσειρές χαρακτήρων που περικλείονται σε μονά ή διπλά εισαγωγικά.
  • ακέραιοι σε δυαδικά, οκταδικά, δεκαδικά ή δεκαεξαδικά συστήματα αριθμών.
Αναγνωριστικά

Αναγνωριστικά – ακολουθίες έγκυρων χαρακτήρων που χρησιμοποιούνται για τον προσδιορισμό αντικειμένων προγράμματος, όπως κωδικούς λειτουργίας, ονόματα μεταβλητών και ονόματα ετικετών.

Κανόνες καταγραφής αναγνωριστικών.

  • Το αναγνωριστικό μπορεί να αποτελείται από έναν ή περισσότερους χαρακτήρες.
  • Ως σύμβολα μπορείτε να χρησιμοποιήσετε γράμματα του λατινικού αλφαβήτου, αριθμούς και μερικούς ειδικούς χαρακτήρες: _, ?, $, @.
  • Ένα αναγνωριστικό δεν μπορεί να ξεκινά με έναν ψηφιακό χαρακτήρα.
  • Το μήκος του αναγνωριστικού μπορεί να είναι έως 255 χαρακτήρες.
  • Ο μεταφραστής δέχεται τους πρώτους 32 χαρακτήρες του αναγνωριστικού και αγνοεί τους υπόλοιπους.
Σχόλια

Τα σχόλια διαχωρίζονται από την εκτελέσιμη γραμμή με έναν χαρακτήρα. . Σε αυτήν την περίπτωση, όλα όσα γράφονται μετά το ερωτηματικό και μέχρι το τέλος της γραμμής είναι σχόλιο. Η χρήση σχολίων σε ένα πρόγραμμα βελτιώνει τη σαφήνειά του, ειδικά όταν ο σκοπός ενός συνόλου εντολών είναι ασαφής. Το σχόλιο μπορεί να περιέχει οποιουσδήποτε εκτυπώσιμους χαρακτήρες, συμπεριλαμβανομένων των διαστημάτων. Ένα σχόλιο μπορεί να καλύπτει ολόκληρη τη γραμμή ή να ακολουθεί μια εντολή στην ίδια γραμμή.

Δομή προγράμματος συναρμολόγησης

Ένα πρόγραμμα γραμμένο σε γλώσσα assembly μπορεί να αποτελείται από διάφορα μέρη που ονομάζονται ενότητες . Κάθε λειτουργική μονάδα μπορεί να έχει καθορισμένα ένα ή περισσότερα τμήματα δεδομένων, στοίβας και κώδικα. Οποιοδήποτε πλήρες πρόγραμμα assembler πρέπει να περιλαμβάνει μία κύρια ή κύρια μονάδα από την οποία ξεκινά η εκτέλεσή του. Μια λειτουργική μονάδα μπορεί να περιέχει τμήματα κώδικα, τμήματα δεδομένων και τμήματα στοίβας, που δηλώνονται χρησιμοποιώντας κατάλληλες οδηγίες. Πριν δηλώσετε τμήματα, πρέπει να καθορίσετε το μοντέλο μνήμης χρησιμοποιώντας την οδηγία .MODEL.

Ένα παράδειγμα προγράμματος "do τίποτα" στη γλώσσα assembly:

686P
.ΜΟΝΤΕΛΟ FLAT, STDCALL
.ΔΕΔΟΜΕΝΑ
.ΚΩΔΙΚΑΣ
ΑΡΧΗ:

ΜΟΥΣΚΕΥΩ
ΤΕΛΟΣ ΕΝΑΡΞΗ

Αυτό το πρόγραμμα περιέχει μόνο μία εντολή μικροεπεξεργαστή. Αυτή η εντολή είναι RET. Διασφαλίζει ότι το πρόγραμμα τερματίζεται σωστά. Γενικά, αυτή η εντολή χρησιμοποιείται για έξοδο από μια διαδικασία.
Το υπόλοιπο πρόγραμμα αφορά τη λειτουργία του μεταφραστή.
.686P - Επιτρέπονται εντολές προστατευμένης λειτουργίας Pentium 6 (Pentium II). Αυτή η οδηγία επιλέγει το υποστηριζόμενο σύνολο οδηγιών συναρμολόγησης, υποδεικνύοντας το μοντέλο του επεξεργαστή. Το γράμμα P που υποδεικνύεται στο τέλος της οδηγίας ενημερώνει τον μεταφραστή ότι ο επεξεργαστής λειτουργεί σε προστατευμένη λειτουργία.
.MODEL FLAT, stdcall - μοντέλο επίπεδης μνήμης. Αυτό το μοντέλο μνήμης χρησιμοποιείται σε λειτουργικό σύστημα Windows. stdcall
Το .DATA είναι ένα τμήμα προγράμματος που περιέχει δεδομένα.
.CODE είναι ένα μπλοκ προγράμματος που περιέχει κώδικα.
ΕΝΑΡΞΗ - ετικέτα. Στο assembler, οι ετικέτες παίζουν μεγάλο ρόλο, κάτι που δεν μπορεί να ειπωθεί για τις σύγχρονες γλώσσες υψηλού επιπέδου.
END START - το τέλος του προγράμματος και ένα μήνυμα στον μεταφραστή ότι η εκτέλεση του προγράμματος πρέπει να ξεκινά με την ετικέτα START.
Κάθε ενότητα πρέπει να περιέχει μια οδηγία ΤΕΛΟΣ, που σηματοδοτεί το τέλος του πηγαίου κώδικα του προγράμματος. Όλες οι γραμμές που ακολουθούν την οδηγία ΤΕΛΟΣ αγνοούνται. Εάν παραλείψετε την οδηγία ΤΕΛΟΣ, δημιουργείται ένα σφάλμα.
Η ετικέτα που καθορίζεται μετά την οδηγία ΤΕΛΟΣ λέει στον μεταφραστή το όνομα της κύριας μονάδας από την οποία ξεκινά η εκτέλεση του προγράμματος. Εάν το πρόγραμμα περιέχει μία ενότητα, η ετικέτα μετά την οδηγία ΤΕΛΟΣ μπορεί να παραλειφθεί.




Μπλουζα