Εντολές γλώσσας συναρμολόγησης. Η δομή της εντολής στον προγραμματισμό γλώσσας assembly σε επίπεδο Εν συντομία για τη δομή της γλώσσας

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

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

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

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

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

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

Μοντέλα μνήμης Πριν δηλώσετε τμήματα, πρέπει να καθορίσετε το μοντέλο μνήμης χρησιμοποιώντας μια οδηγία. MODEL modifier memory_model, calling_convention, OS_type, stack_parameter Βασικά μοντέλα μνήμης γλώσσας συναρμολόγησης: Μοντέλο μνήμης Διευθυνσιοδότηση κωδικού Διευθυνσιοδότηση δεδομένων Λειτουργικό σύστημα Κωδικός και παρεμβολή δεδομένων TINY NEAR NEAR MS-DOS Valid SMALL NEAR NEAR MS-DOS, Windows No MEDIUM FAR DOS NEARMS No COMPACT ΚΟΝΤΑ ΜΑΚΡΙΑ MS-DOS, Windows Όχι ΜΕΓΑΛΑ ΜΑΚΡΙΑ MS-DOS, Windows Όχι ΤΕΡΑΣΤΙΑ ΜΑΚΡΙΑ MS-DOS, Windows Όχι ΚΟΝΤΑ Windows 2000, Windows XP, Windows Valid 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_param έχει οριστεί σε: NEARSTACK (Ο καταχωρητής SS ισούται με DS, οι περιοχές δεδομένων και στοίβας βρίσκονται στο ίδιο φυσικό τμήμα) FARSTACK (ο καταχωρητής SS δεν είναι ίσος με DS, οι περιοχές δεδομένων και στοίβας βρίσκονται σε διαφορετικά φυσικά τμήματα). Η προεπιλογή είναι NEARSTACK.

Ένα παράδειγμα προγράμματος "δεν κάνουμε τίποτα". 686 P. MODEL FLAT, STDCALL. ΔΕΔΟΜΕΝΑ. CODE START: 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) - a Ο δωρεάν assembler για την αρχιτεκτονική Intel x 86 δημιουργήθηκε από τον Simon Tatham με τον Julian Hall και αυτή τη στιγμή αναπτύσσεται από μια μικρή ομάδα ανάπτυξης στο Source. Σιδηρουργείο. καθαρά.

Src="https://present5.com/presentation/-29367016_63610977/image-15.jpg" alt="(!LANG:Μετάφραση προγράμματος στο 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="(!LANG:Μετάφραση προγράμματος στο 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) Ορισμός επιλογών μεταγλωττιστή. Επιλέξτε στο δεξί κουμπί στο μενού αρχείου έργου Προσαρμοσμένοι κανόνες κατασκευής…

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

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

Src="https://present5.com/presentation/-29367016_63610977/image-22.jpg" alt="(!LANG:Μετάφραση προγράμματος στο 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: διάλογος (το κύριο παράθυρο είναι ένας διάλογος), δομή κονσόλας ή χωρίς παράθυρο, κλασική δομή (παράθυρο, πλαίσιο).

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

Κλήση λειτουργιών API των Windows int Message. Πλαίσιο (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" προστίθεται συχνά στο όνομα των συναρτήσεων για μετάβαση σε νεότερες εκδόσεις συναρτήσεων.

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

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

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

Η οδηγία INVOKE Ο μεταφραστής γλώσσας MASM καθιστά επίσης δυνατή την απλοποίηση της κλήσης συνάρτησης χρησιμοποιώντας ένα εργαλείο μακροεντολής - την οδηγία INVOKE: συνάρτηση INVOKE, parameter1, parameter2, ... Δεν χρειάζεται να προσθέσετε @16 στην κλήση συνάρτησης. οι παράμετροι γράφονται ακριβώς με τη σειρά που δίνονται στην περιγραφή της συνάρτησης. Οι μακροεντολές μεταφραστή ωθούν τις παραμέτρους στη στοίβα. για να χρησιμοποιήσετε την οδηγία INVOKE, πρέπει να έχετε μια περιγραφή του πρωτοτύπου της λειτουργίας χρησιμοποιώντας την οδηγία PROTO με τη μορφή: Μήνυμα. κουτί. A PROTO: DWORD, : DWORD

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

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

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

Pentium.

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

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

εργασίες αποστολής,

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

λογικές πράξεις,

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

εργασίες σύγκρισης και δοκιμής,

λειτουργίες bit,

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

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

2. Mnemocodes εντολών επεξεργαστή Pentium

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

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

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

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

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

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

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

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

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

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

Οι εντολές αυτής της ομάδας εφαρμόζουν διαφορετικές επιλογές για την αλλαγή του δοκιμασμένου bit BT διατηρεί την τιμή αυτού του bit αμετάβλητη.Εντολή σι Τ μικρό μετά τη δοκιμή ορίζει την τιμή 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 , κατά την οποία τα απαραίτητα δεδομένα για τον επεξεργαστή εισάγονται στα μητρώα EAX,ebx,ECX,ΕΔΧκαι στη συνέχεια μπορεί να διαβαστεί από τον χρήστη ή το λειτουργικό σύστημα.

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

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

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

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

ΕΘΝΙΚΟ ΠΑΝΕΠΙΣΤΗΜΙΟ ΤΟΥ ΟΥΖΜΠΕΚΙΣΤΑΝ ΜΕ ΤΟ ΟΝΟΜΑ ΜΙΡΖΟ ΟΥΛΟΥΓΚΠΕΚ

ΣΧΟΛΗ ΤΕΧΝΟΛΟΓΙΩΝ Η/Υ

Με θέμα: Σημασιολογική ανάλυση αρχείου EXE.

Ολοκληρώθηκε το:

Τασκένδη 2003.

Πρόλογος.

Γλώσσα συναρμολόγησης και δομή διδασκαλίας.

Δομή αρχείου EXE (σημασιολογική ανάλυση).

Δομή ενός αρχείου COM.

Πώς λειτουργεί και εξαπλώνεται ο ιός.

αποσυναρμολογητής.

Προγράμματα.

Πρόλογος

Το επάγγελμα του προγραμματιστή είναι εκπληκτικό και μοναδικό. Στην εποχή μας, η επιστήμη και η ζωή δεν μπορούν να φανταστούν χωρίς την τελευταία λέξη της τεχνολογίας. Όλα όσα συνδέονται με την ανθρώπινη δραστηριότητα δεν είναι ολοκληρωμένα χωρίς την τεχνολογία των υπολογιστών. Και αυτό συμβάλλει στην υψηλή ανάπτυξη και τελειότητά του. Αφήστε την ανάπτυξη των προσωπικών υπολογιστών να ξεκινήσει όχι πολύ καιρό πριν, αλλά κατά τη διάρκεια αυτής της περιόδου έγιναν κολοσσιαία βήματα σε προϊόντα λογισμικού και για μεγάλο χρονικό διάστημα αυτά τα προϊόντα θα χρησιμοποιούνται ευρέως. Το πεδίο της γνώσης που σχετίζεται με τους υπολογιστές έχει εκραγεί, όπως και η σχετική τεχνολογία. Αν δεν λάβουμε υπόψη την εμπορική πλευρά, τότε μπορούμε να πούμε ότι δεν υπάρχουν ξένοι σε αυτόν τον τομέα της επαγγελματικής δραστηριότητας. Πολλοί ασχολούνται με την ανάπτυξη προγραμμάτων όχι για κέρδος ή κέρδη, αλλά με δική τους ελεύθερη βούληση, από πάθος. Φυσικά, αυτό δεν πρέπει να επηρεάζει την ποιότητα του προγράμματος και σε αυτήν την επιχείρηση, ας πούμε έτσι, υπάρχει ανταγωνισμός και ζήτηση για ποιοτική απόδοση, για σταθερή εργασία και ικανοποίηση όλων των απαιτήσεων της εποχής μας. Εδώ αξίζει επίσης να σημειωθεί η εμφάνιση μικροεπεξεργαστών στη δεκαετία του '60, οι οποίοι ήρθαν να αντικαταστήσουν ένα μεγάλο αριθμό σετ λαμπτήρων. Υπάρχουν ορισμένες ποικιλίες μικροεπεξεργαστών που διαφέρουν πολύ μεταξύ τους. Αυτοί οι μικροεπεξεργαστές διαφέρουν μεταξύ τους ως προς τη χωρητικότητα bit και τις ενσωματωμένες εντολές του συστήματος. Τα πιο συνηθισμένα είναι: Intel, IBM, Celeron, AMD κ.λπ. Όλοι αυτοί οι επεξεργαστές σχετίζονται με την προηγμένη αρχιτεκτονική των επεξεργαστών Intel. Η εξάπλωση των μικροϋπολογιστών έχει προκαλέσει μια επανεξέταση της στάσης απέναντι στη γλώσσα assembly για δύο βασικούς λόγους. Πρώτον, τα προγράμματα γραμμένα σε γλώσσα assembly απαιτούν σημαντικά λιγότερη μνήμη και χρόνο εκτέλεσης. Δεύτερον, η γνώση της γλώσσας συναρμολόγησης και του κώδικα μηχανής που προκύπτει παρέχει μια κατανόηση της αρχιτεκτονικής της μηχανής, η οποία σχεδόν δεν παρέχεται όταν εργάζεστε σε μια γλώσσα υψηλού επιπέδου. Ενώ οι περισσότεροι επαγγελματίες λογισμικού αναπτύσσονται σε γλώσσες υψηλού επιπέδου όπως οι Pascal, C ή Delphi, για τις οποίες είναι πιο εύκολο να γραφτούν προγράμματα, το πιο ισχυρό και αποτελεσματικό λογισμικό είναι γραμμένο εξ ολοκλήρου ή εν μέρει σε γλώσσα assembly. Οι γλώσσες υψηλού επιπέδου σχεδιάστηκαν για να αποφεύγουν τις ειδικές τεχνικές λεπτομέρειες συγκεκριμένων υπολογιστών. Και η γλώσσα assembly, με τη σειρά της, έχει σχεδιαστεί για τις συγκεκριμένες ιδιαιτερότητες του επεξεργαστή. Επομένως, για να γράψει κανείς ένα πρόγραμμα γλώσσας assembly για έναν συγκεκριμένο υπολογιστή, πρέπει να γνωρίζει την αρχιτεκτονική του. Σήμερα, ο τύπος του κύριου προϊόντος λογισμικού είναι ένα αρχείο EXE. Δεδομένων των θετικών πτυχών αυτού, ο συγγραφέας του προγράμματος μπορεί να είναι σίγουρος για το απαραβίαστο του. Αλλά πολλές φορές αυτό απέχει πολύ από την περίπτωση. Υπάρχει και αποσυναρμολογητής. Με τη βοήθεια ενός αποσυναρμολογητή, μπορείτε να μάθετε διακοπές και κωδικούς προγραμμάτων. Δεν θα είναι δύσκολο για ένα άτομο που γνωρίζει καλά το assembler να ξαναφτιάξει ολόκληρο το πρόγραμμα σύμφωνα με τα γούστα του. Ίσως από εδώ προέρχεται το πιο άλυτο πρόβλημα - ο ιός. Γιατί οι άνθρωποι γράφουν έναν ιό; Κάποιοι κάνουν αυτή την ερώτηση με έκπληξη, κάποιοι με θυμό, αλλά παρόλα αυτά υπάρχουν ακόμα άνθρωποι που ενδιαφέρονται για αυτό το έργο όχι από την άποψη της πρόκλησης κάποιου κακό, αλλά ως ενδιαφέρον για τον προγραμματισμό του συστήματος. Οι ιοί γράφονται για διάφορους λόγους. Σε κάποιους αρέσουν οι κλήσεις συστήματος, άλλοι βελτιώνουν τις γνώσεις τους στο assembler. Θα προσπαθήσω να τα εξηγήσω όλα αυτά στη διατριβή μου. Λέει επίσης όχι μόνο για τη δομή του αρχείου EXE, αλλά και για τη γλώσσα συναρμολόγησης.

^ Γλώσσα συναρμολόγησης.

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

Μια φορά κι έναν καιρό, η assembler ήταν μια γλώσσα χωρίς να γνωρίζουμε την οποία ήταν αδύνατο να κάνουμε έναν υπολογιστή να κάνει οτιδήποτε χρήσιμο. Σταδιακά η κατάσταση άλλαξε. Εμφανίστηκαν πιο βολικά μέσα επικοινωνίας με υπολογιστή. Αλλά, σε αντίθεση με άλλες γλώσσες, ο assembler δεν πέθανε, επιπλέον, δεν μπορούσε να το κάνει αυτό κατ 'αρχήν. Γιατί; Αναζητώντας μια απάντηση, θα προσπαθήσουμε να καταλάβουμε τι είναι γενικά η γλώσσα assembly.

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

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

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

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

Ένας τυπικός σύγχρονος υπολογιστής (με βάση το i486 ή Pentium) αποτελείται από τα ακόλουθα στοιχεία (Εικόνα 1).

Ρύζι. 1. Υπολογιστής και περιφερειακά

Ρύζι. 2. Μπλοκ διάγραμμα προσωπικού υπολογιστή

Από το σχήμα (Εικόνα 1) φαίνεται ότι ο υπολογιστής αποτελείται από πολλές φυσικές συσκευές, καθεμία από τις οποίες είναι συνδεδεμένη σε μία μονάδα, που ονομάζεται μονάδα συστήματος. Λογικά είναι ξεκάθαρο ότι παίζει το ρόλο κάποιας συντονιστικής συσκευής. Ας κοιτάξουμε μέσα στη μονάδα συστήματος (δεν χρειάζεται να προσπαθήσετε να μπείτε μέσα στην οθόνη - δεν υπάρχει τίποτα ενδιαφέρον εκεί, εκτός από αυτό είναι επικίνδυνο): ανοίξτε τη θήκη και δείτε μερικές σανίδες, μπλοκ, καλώδια σύνδεσης. Για να κατανοήσουμε τον λειτουργικό τους σκοπό, ας δούμε το μπλοκ διάγραμμα ενός τυπικού υπολογιστή (Εικ. 2). Δεν προσποιείται την απόλυτη ακρίβεια και στοχεύει μόνο στο να δείξει τον σκοπό, τη διασύνδεση και την τυπική σύνθεση των στοιχείων ενός σύγχρονου προσωπικού υπολογιστή.

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

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

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

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

Έτσι, όντας εξωτερικά πολύγλωσσος, ο υπολογιστής καταλαβαίνει μόνο μία γλώσσα - τη γλώσσα των οδηγιών της μηχανής. Φυσικά, για να επικοινωνήσετε και να εργαστείτε με έναν υπολογιστή, δεν είναι απαραίτητο να γνωρίζετε αυτή τη γλώσσα, αλλά σχεδόν κάθε επαγγελματίας προγραμματιστής αργά ή γρήγορα αντιμετωπίζει την ανάγκη να τη μάθει. Ευτυχώς, ο προγραμματιστής δεν χρειάζεται να προσπαθήσει να καταλάβει την έννοια των διαφόρων συνδυασμών δυαδικών αριθμών, καθώς ήδη από τη δεκαετία του '50, οι προγραμματιστές άρχισαν να χρησιμοποιούν το συμβολικό ανάλογο της γλώσσας μηχανής για προγραμματισμό, το οποίο ονομαζόταν γλώσσα συναρμολόγησης. Αυτή η γλώσσα αντικατοπτρίζει με ακρίβεια όλα τα χαρακτηριστικά της γλώσσας μηχανής. Γι' αυτό, σε αντίθεση με τις γλώσσες υψηλού επιπέδου, η γλώσσα assembly είναι διαφορετική για κάθε τύπο υπολογιστή.

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

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

Αυτά τα μητρώα μπορούν να χωριστούν σε δύο μεγάλες ομάδες:

^16 προσαρμοσμένα μητρώα.

16 μητρώα συστήματος.

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

Όπως υποδηλώνει το όνομα, οι καταχωρήσεις χρηστών ονομάζονται επειδή ο προγραμματιστής μπορεί να τις χρησιμοποιήσει όταν γράφει τα προγράμματά του. Αυτά τα μητρώα περιλαμβάνουν (Εικ. 3):

Οκτώ καταχωρητές 32-bit που μπορούν να χρησιμοποιηθούν από προγραμματιστές για την αποθήκευση δεδομένων και διευθύνσεων (ονομάζονται επίσης καταχωρητές γενικού σκοπού (RON)):

έξι καταχωρητές τμημάτων: cs, ds, ss, es, fs, gs;

μητρώα κατάστασης και ελέγχου:

Οι σημαίες καταχωρούν σημαίες/σημαίες.

Καταχωρητής δείκτη εντολών eip/ip.

Ρύζι. 3. Μητρώα χρηστών μικροεπεξεργαστών i486 και Pentium

Γιατί πολλοί από αυτούς τους καταχωρητές εμφανίζονται με κάθετο; Όχι, αυτοί δεν είναι διαφορετικοί καταχωρητές - είναι μέρη ενός μεγάλου καταχωρητή 32 bit. Μπορούν να χρησιμοποιηθούν στο πρόγραμμα ως ξεχωριστά αντικείμενα. Αυτό έγινε για να διασφαλιστεί η λειτουργικότητα των προγραμμάτων που γράφτηκαν για τα νεότερα μοντέλα μικροεπεξεργαστών 16-bit της Intel, ξεκινώντας από το i8086. Οι μικροεπεξεργαστές i486 και Pentium έχουν κυρίως καταχωρητές 32 bit. Ο αριθμός τους, με εξαίρεση τους καταχωρητές τμημάτων, είναι ίδιος με αυτόν του i8086, αλλά η διάσταση είναι μεγαλύτερη, κάτι που αντικατοπτρίζεται στους χαρακτηρισμούς τους - έχουν
πρόθεμα e (Εκτεταμένο).

^ Μητρώα γενικής χρήσης
Όλοι οι καταχωρητές αυτής της ομάδας επιτρέπουν την πρόσβαση στα «κατώτερα» μέρη τους (βλ. Εικ. 3). Καθώς βλέπετε αυτό το σχήμα, σημειώστε ότι μόνο τα κατώτερα τμήματα 16 και 8 bit αυτών των καταχωρητών μπορούν να χρησιμοποιηθούν για αυτοδιευθυνσιοδότηση. Τα ανώτερα 16 bit αυτών των καταχωρητών δεν είναι διαθέσιμα ως ανεξάρτητα αντικείμενα. Αυτό γίνεται, όπως σημειώσαμε παραπάνω, για συμβατότητα με τα νεότερα μοντέλα μικροεπεξεργαστή 16-bit της Intel.

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

eax/ax/ah/al (Accumulator register) - συσσωρευτής.
Χρησιμοποιείται για την αποθήκευση ενδιάμεσων δεδομένων. Σε ορισμένες εντολές, η χρήση αυτού του μητρώου είναι υποχρεωτική.

ebx/bx/bh/bl (Βασικός καταχωρητής) - καταχωρητής βάσης.
Χρησιμοποιείται για την αποθήκευση της βασικής διεύθυνσης κάποιου αντικειμένου στη μνήμη.

ecx/cx/ch/cl (Count register) - καταχωρητής μετρητή.
Χρησιμοποιείται σε εντολές που εκτελούν ορισμένες επαναλαμβανόμενες ενέργειες. Η χρήση του είναι συχνά σιωπηρή και κρυμμένη στον αλγόριθμο της αντίστοιχης εντολής.
Για παράδειγμα, η εντολή οργάνωσης βρόχου, εκτός από τη μεταφορά ελέγχου σε μια εντολή που βρίσκεται σε μια συγκεκριμένη διεύθυνση, αναλύει και μειώνει την τιμή του καταχωρητή ecx/cx κατά ένα.

edx/dx/dh/dl (Μητρώο δεδομένων) - μητρώο δεδομένων.
Ακριβώς όπως ο καταχωρητής eax/ax/ah/al, αποθηκεύει ενδιάμεσα δεδομένα. Ορισμένες εντολές απαιτούν τη χρήση του. για ορισμένες εντολές αυτό συμβαίνει σιωπηρά.

Οι ακόλουθοι δύο καταχωρητές χρησιμοποιούνται για την υποστήριξη των λεγόμενων λειτουργιών αλυσίδας, δηλαδή λειτουργιών που επεξεργάζονται διαδοχικά αλυσίδες στοιχείων, καθένα από τα οποία μπορεί να έχει μήκος 32, 16 ή 8 bit:

esi/si (Register Index Source) - ευρετήριο πηγής.
Αυτός ο καταχωρητής σε λειτουργίες αλυσίδας περιέχει την τρέχουσα διεύθυνση του στοιχείου στην αλυσίδα πηγής.

edi/di (Destination Index Register) - ευρετήριο του δέκτη (παραλήπτης).
Αυτός ο καταχωρητής στις λειτουργίες αλυσίδας περιέχει την τρέχουσα διεύθυνση στην αλυσίδα προορισμού.

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

esp/sp (Stack Pointer Register) - καταχωρητής δείκτη στοίβας.
Περιέχει έναν δείκτη στην κορυφή της στοίβας στο τρέχον τμήμα της στοίβας.

ebp/bp (Βασικός καταχωρητής δείκτη) - καταχωρητής δείκτη βάσης πλαισίου στοίβας.
Σχεδιασμένο για να οργανώνει την τυχαία πρόσβαση σε δεδομένα μέσα στη στοίβα.

Μια στοίβα είναι μια περιοχή προγράμματος για την προσωρινή αποθήκευση αυθαίρετων δεδομένων. Φυσικά, τα δεδομένα μπορούν επίσης να αποθηκευτούν στο τμήμα δεδομένων, αλλά σε αυτήν την περίπτωση, για κάθε προσωρινά αποθηκευμένο δεδομένα, πρέπει να δημιουργηθεί ένα ξεχωριστό κελί με όνομα, το οποίο αυξάνει το μέγεθος του προγράμματος και τον αριθμό των ονομάτων που χρησιμοποιούνται. Η ευκολία της στοίβας είναι ότι η περιοχή της επαναχρησιμοποιείται και η αποθήκευση δεδομένων στη στοίβα και η ανάκτησή τους από εκεί γίνεται χρησιμοποιώντας αποτελεσματικές εντολές push και pop χωρίς να προσδιορίζονται ονόματα.
Η στοίβα χρησιμοποιείται παραδοσιακά, για παράδειγμα, για την αποθήκευση των περιεχομένων των καταχωρητών που χρησιμοποιούνται από το πρόγραμμα πριν από την κλήση μιας υπορουτίνας, η οποία, με τη σειρά της, θα χρησιμοποιήσει τους καταχωρητές του επεξεργαστή "για τους δικούς της σκοπούς". Τα αρχικά περιεχόμενα των καταχωρητών διαρρέουν από τη στοίβα κατά την επιστροφή από την υπορουτίνα. Μια άλλη κοινή τεχνική είναι να μεταβιβάζονται οι παράμετροι που απαιτεί σε μια υπορουτίνα μέσω της στοίβας. Η υπορουτίνα, γνωρίζοντας με ποια σειρά τοποθετούνται οι παράμετροι στη στοίβα, μπορεί να τις πάρει από εκεί και να τις χρησιμοποιήσει στην εκτέλεσή της. Ένα χαρακτηριστικό γνώρισμα της στοίβας είναι η περίεργη σειρά δειγματοληψίας των δεδομένων που περιέχονται σε αυτήν: ανά πάσα στιγμή, μόνο το επάνω στοιχείο είναι διαθέσιμο στη στοίβα, δηλ. το τελευταίο στοιχείο που φορτώθηκε στη στοίβα. Αν σκάσετε το επάνω στοιχείο από τη στοίβα, το επόμενο στοιχείο είναι διαθέσιμο. Τα στοιχεία της στοίβας βρίσκονται στην περιοχή της μνήμης που εκχωρείται για τη στοίβα, ξεκινώντας από το κάτω μέρος της στοίβας (δηλαδή, από τη μέγιστη διεύθυνσή της) έως τις διαδοχικά μειούμενες διευθύνσεις. Η διεύθυνση του επάνω προσβάσιμου στοιχείου αποθηκεύεται στον καταχωρητή δείκτη στοίβας SP. Όπως κάθε άλλη περιοχή της μνήμης του προγράμματος, η στοίβα πρέπει να περιλαμβάνεται σε κάποιο τμήμα ή να σχηματίζει ένα ξεχωριστό τμήμα. Και στις δύο περιπτώσεις, η διεύθυνση τμήματος αυτού του τμήματος τοποθετείται στον καταχωρητή στοίβας τμήματος SS. Έτσι, ένα ζεύγος καταχωρητών SS:SP περιγράφει τη διεύθυνση ενός διαθέσιμου κελιού στοίβας: το SS αποθηκεύει τη διεύθυνση τμήματος της στοίβας και το SP αποθηκεύει τη μετατόπιση των τελευταίων δεδομένων που είναι αποθηκευμένα στη στοίβα (Εικ. 4, α). Ας δώσουμε προσοχή στο γεγονός ότι στην αρχική κατάσταση, ο δείκτης στοίβας SP δείχνει ένα κελί που βρίσκεται κάτω από το κάτω μέρος της στοίβας και δεν περιλαμβάνεται σε αυτό.

Εικ. 4. Οργάνωση στοίβας: α - αρχική κατάσταση, β - μετά τη φόρτωση ενός στοιχείου (σε αυτό το παράδειγμα, τα περιεχόμενα του καταχωρητή AX), γ - μετά τη φόρτωση του δεύτερου στοιχείου (περιεχόμενα του καταχωρητή DS), δ - μετά την εκφόρτωση ενός στοιχείο, e - μετά την εκφόρτωση δύο στοιχείων και επιστροφή στην αρχική κατάσταση.

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

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

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

pop DS
pop AX

Πόσο μεγάλη πρέπει να είναι η στοίβα; Εξαρτάται από το πόσο εντατικά χρησιμοποιείται στο πρόγραμμα. Εάν, για παράδειγμα, σκοπεύετε να αποθηκεύσετε έναν πίνακα 10.000 byte στη στοίβα, τότε η στοίβα πρέπει να έχει τουλάχιστον αυτό το μέγεθος. Θα πρέπει να ληφθεί υπόψη ότι σε ορισμένες περιπτώσεις η στοίβα χρησιμοποιείται αυτόματα από το σύστημα, ιδιαίτερα κατά την εκτέλεση της εντολής διακοπής int 21h. Με αυτήν την εντολή, ο επεξεργαστής ωθεί πρώτα τη διεύθυνση επιστροφής στη στοίβα και, στη συνέχεια, το DOS ωθεί εκεί τα περιεχόμενα των καταχωρητών και άλλες πληροφορίες που σχετίζονται με το πρόγραμμα που έχει διακοπεί. Επομένως, ακόμα κι αν το πρόγραμμα δεν χρησιμοποιεί καθόλου τη στοίβα, πρέπει να υπάρχει στο πρόγραμμα και να έχει μέγεθος τουλάχιστον αρκετών δεκάδων λέξεων. Στο πρώτο μας παράδειγμα, βάλαμε 128 λέξεις στη στοίβα, που είναι σίγουρα αρκετές.

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

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

Οι δηλώσεις συναρμολόγησης είναι τεσσάρων τύπων:

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

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

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

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

^ Σύνταξη γλώσσας συναρμολόγησης

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

Ρύζι. 5. Μορφή πρότασης Assembler

Ρύζι. 6. Μορφοποίηση οδηγιών

Ρύζι. 7. Μορφή εντολών και μακροεντολών

Σε αυτά τα σχέδια:

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

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

Ο κωδικός λειτουργίας (COP) και η οδηγία είναι μνημονικοί προσδιορισμοί της αντίστοιχης οδηγίας μηχανής, μακροεντολής ή οδηγίας μεταφραστή.

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

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

Οι επιτρεπόμενοι χαρακτήρες κατά τη σύνταξη του κειμένου των προγραμμάτων είναι:

Όλα τα λατινικά γράμματα: A-Z, a-z. Στην περίπτωση αυτή, τα κεφαλαία και τα πεζά γράμματα θεωρούνται ισοδύναμα.

Αριθμοί από 0 έως 9.

Σημάδια;, @, $, _, &;

Διαχωριστές, . ()< > { } + / * % ! " " ? \ = # ^.

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

Οι μάρκες είναι:

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

^ Εντολές γλώσσας συναρμολόγησης.

Οι εντολές Assembler αποκαλύπτουν τη δυνατότητα μεταφοράς των απαιτήσεών τους στον υπολογιστή, τον μηχανισμό μεταφοράς ελέγχου στο πρόγραμμα (βρόχους και άλματα) για λογικές συγκρίσεις και οργάνωση προγράμματος. Ωστόσο, οι εργασίες προγραμματισμού σπάνια είναι τόσο απλές. Τα περισσότερα προγράμματα περιέχουν μια σειρά από βρόχους στους οποίους επαναλαμβάνονται πολλές εντολές έως ότου επιτευχθεί μια συγκεκριμένη απαίτηση και διάφορους ελέγχους για να προσδιοριστεί ποια από τις διάφορες ενέργειες πρέπει να εκτελεστούν. Ορισμένες εντολές μπορούν να μεταφέρουν τον έλεγχο αλλάζοντας την κανονική ακολουθία βημάτων τροποποιώντας απευθείας την τιμή μετατόπισης στον δείκτη εντολών. Όπως αναφέρθηκε προηγουμένως, υπάρχουν διαφορετικές εντολές για διαφορετικούς επεξεργαστές, αλλά θα εξετάσουμε ορισμένες εντολές για τους επεξεργαστές 80186, 80286 και 80386.

Για να περιγράψουμε την κατάσταση των σημαιών μετά την εκτέλεση μιας συγκεκριμένης εντολής, θα χρησιμοποιήσουμε μια επιλογή από τον πίνακα που αντικατοπτρίζει τη δομή του καταχωρητή σημαίας eflag:

Η κάτω σειρά αυτού του πίνακα παραθέτει τις τιμές των σημαιών μετά την εκτέλεση της εντολής. Σε αυτήν την περίπτωση, χρησιμοποιούνται οι ακόλουθες σημειώσεις:

1 - μετά την εκτέλεση της εντολής, η σημαία ορίζεται (ίση με 1).

0 - μετά την εκτέλεση της εντολής, η σημαία επαναφέρεται (ίση με 0).

r - η τιμή της σημαίας εξαρτάται από το αποτέλεσμα της εντολής.

Μετά την εκτέλεση της εντολής, η σημαία δεν ορίζεται.

space - μετά την εκτέλεση της εντολής, η σημαία δεν αλλάζει.

Ο ακόλουθος συμβολισμός χρησιμοποιείται για την αναπαράσταση τελεστών σε συντακτικά διαγράμματα:

r8, r16, r32 - τελεστής σε έναν από τους καταχωρητές μεγέθους byte, λέξης ή διπλής λέξης.

m8, m16, m32, m48 - τελεστής σε μέγεθος μνήμης byte, λέξη, διπλή λέξη ή 48 bit.

i8, i16, i32 - άμεσος τελεστής μεγέθους byte, λέξης ή διπλής λέξης.

a8, a16, a32 - σχετική διεύθυνση (offset) στο τμήμα κώδικα.

Εντολές (με αλφαβητική σειρά):

*Οι εντολές αυτές περιγράφονται αναλυτικά.

ΠΡΟΣΘΗΚΗ
(Πρόσθεση)

Πρόσθεση

^ Περίγραμμα εντολών:

προσθήκη προορισμού, πηγής

Σκοπός: προσθήκη δύο τελεστών πηγής και προορισμού διαστάσεων byte, λέξης ή διπλής λέξης.

Αλγόριθμος εργασίας:

προσθέστε τους τελεστές προέλευσης και προορισμού.

γράψτε το αποτέλεσμα της προσθήκης στον δέκτη.

ορίστε σημαίες.

Κατάσταση σημαιών μετά την εκτέλεση της εντολής:

Εφαρμογή:
Η εντολή add χρησιμοποιείται για την προσθήκη δύο ακέραιων τελεστών. Το αποτέλεσμα της προσθήκης τοποθετείται στη διεύθυνση του πρώτου τελεστή. Εάν το αποτέλεσμα της προσθήκης υπερβαίνει τα όρια του τελεστή προορισμού (συμβαίνει υπερχείλιση), τότε αυτή η κατάσταση θα πρέπει να ληφθεί υπόψη αναλύοντας τη σημαία cf και στη συνέχεια χρησιμοποιώντας την εντολή adc. Για παράδειγμα, ας προσθέσουμε τις τιμές στον άξονα καταχωρητή και στην περιοχή μνήμης ch. Κατά την προσθήκη, θα πρέπει να λάβετε υπόψη την πιθανότητα υπερχείλισης.

Εγγραφή συν εγγραφή ή μνήμη:

|000000dw|modregr/rm|

Καταχώρηση AX (AL) συν άμεση αξία:

|0000010w|--data--|δεδομένα εάν w=1|

Εγγραφή ή μνήμη συν άμεση τιμή:

|100000sw|mod000r/m|--data--|δεδομένα εάν BW=01|

ΚΛΗΣΗ
(ΚΛΗΣΗ)

Κλήση διαδικασίας ή εργασίας

^ Περίγραμμα εντολών:

Σκοπός:

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

εναλλαγή εργασιών.

Αλγόριθμος εργασίας:
καθορίζεται από τον τύπο τελεστών:

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

Far label - τα περιεχόμενα του δείκτη εντολής eip/ip και cs ωθούνται στη στοίβα. Στη συνέχεια, οι νέες τιμές διευθύνσεων που αντιστοιχούν στο μακρινό σήμα φορτώνονται στους ίδιους καταχωρητές.

R16, 32 ή m16, 32 - ορίστε έναν καταχωρητή ή ένα κελί μνήμης που περιέχει μετατοπίσεις στο τρέχον τμήμα εντολών, όπου μεταφέρεται ο έλεγχος. Όταν μεταφέρεται ο έλεγχος, τα περιεχόμενα του δείκτη εντολής eip/ip ωθούνται στη στοίβα.

Δείκτης μνήμης - ορίζει μια θέση μνήμης που περιέχει έναν δείκτη 4 ή 6 byte για τη διαδικασία που καλείται. Η δομή ενός τέτοιου δείκτη είναι 2+2 ή 2+4 byte. Η ερμηνεία ενός τέτοιου δείκτη εξαρτάται από τον τρόπο λειτουργίας του μικροεπεξεργαστή:

^ Κατάσταση σημαιών μετά την εκτέλεση εντολών (εκτός από τον διακόπτη εργασιών):

η εκτέλεση εντολών δεν επηρεάζει τις σημαίες

Όταν γίνεται εναλλαγή μιας εργασίας, οι τιμές των σημαιών αλλάζουν σύμφωνα με τις πληροφορίες σχετικά με τον καταχωρητή eflag στο τμήμα κατάστασης TSS της εργασίας στο οποίο γίνεται εναλλαγή.
Εφαρμογή:
Η εντολή κλήσης σάς επιτρέπει να οργανώσετε μια ευέλικτη και πολυμεταβλητή μεταφορά ελέγχου σε μια υπορουτίνα διατηρώντας παράλληλα τη διεύθυνση του σημείου επιστροφής.

Κωδικός αντικειμένου (τέσσερις μορφές):

Απευθείας διευθυνσιοδότηση σε ένα τμήμα:

|11101000|dip-low|diep-high|

Έμμεση διευθυνσιοδότηση σε ένα τμήμα:

|11111111|mod010r/m|

Έμμεση διευθυνσιοδότηση μεταξύ τμημάτων:

|11111111|mod011r/m|

Απευθείας διευθυνσιοδότηση μεταξύ τμημάτων:

|10011010|offset-low|offset-high|seg-low|seg-high|

ΔΕΑ
(συγκρίνετε τελεστές)

Σύγκριση τελεστών

^ Περίγραμμα εντολών:

cmp τελεστής 1, τελεστής 2

Σκοπός: σύγκριση δύο τελεστών.

Αλγόριθμος εργασίας:

εκτελεί αφαίρεση (τελεστής1-τελεστής2).

ανάλογα με το αποτέλεσμα, ορίστε σημαίες, μην αλλάζετε τελεστές1 και τελεστές2 (δηλαδή μην αποθηκεύετε το αποτέλεσμα).

Εφαρμογή:
Αυτή η εντολή χρησιμοποιείται για τη σύγκριση δύο τελεστών με αφαίρεση, ενώ οι τελεστές δεν αλλάζουν. Οι σημαίες ορίζονται ως αποτέλεσμα της εκτέλεσης εντολών. Η εντολή cmp χρησιμοποιείται με τις εντολές άλματος υπό όρους και την εντολή set byte by value setcc.

Κωδικός αντικειμένου (τρεις μορφές):

Εγγραφή ή καταχωρημένη μνήμη:

|001110dw|modreg/m|

Άμεση τιμή με καταχωρητή AX (AL):

|0011110w|--data--|δεδομένα εάν w=1|

Άμεση τιμή με καταχωρητή ή μνήμη:

|100000sw|mod111r/m|--data--|δεδομένα εάν sw=0|

ΔΕΚ
(Μείωση τελεστή κατά 1)

Μείωση τελεστή κατά ένα

^ Περίγραμμα εντολών:

τελεστής δεκ

Σκοπός: μείωση της τιμής του τελεστή στη μνήμη ή του καταχωρητή κατά 1.

Αλγόριθμος εργασίας:
η εντολή αφαιρεί 1 από τον τελεστή. Κατάσταση σημαιών μετά την εκτέλεση της εντολής:

Εφαρμογή:
Η εντολή dec χρησιμοποιείται για τη μείωση της τιμής ενός byte, λέξης, διπλής λέξης στη μνήμη ή εγγραφή κατά ένα. Σημειώστε ότι η εντολή δεν επηρεάζει τη σημαία cf.

Εγγραφή: |01001reg|

^ Εγγραφή ή μνήμη: |1111111w|mod001r/m|

DIV
(Διαίρεση ανυπόγραφο)

Μεραρχία ανυπόγραφο

Σχέδιο εντολών:

div divider

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

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

εάν ο διαιρέτης είναι σε byte, τότε το μέρισμα πρέπει να βρίσκεται στον άξονα καταχωρητή. Μετά την επέμβαση, το πηλίκο τοποθετείται σε al και το υπόλοιπο σε ah.

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

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

^ Κατάσταση σημαιών μετά την εκτέλεση της εντολής:

Εφαρμογή:
Η εντολή εκτελεί μια ακέραια διαίρεση των τελεστών, επιστρέφοντας το αποτέλεσμα της διαίρεσης ως πηλίκο και το υπόλοιπο της διαίρεσης. Κατά την εκτέλεση μιας λειτουργίας διαίρεσης, μπορεί να προκύψει μια εξαίρεση: 0 - σφάλμα διαίρεσης. Αυτή η κατάσταση συμβαίνει σε μία από τις δύο περιπτώσεις: ο διαιρέτης είναι 0 ή το πηλίκο είναι πολύ μεγάλο για να χωρέσει στον καταχωρητή eax/ax/al.

Κωδικός αντικειμένου:

|1111011w|mod110r/m|

INT
(Διακοπή)

Κλήση ρουτίνας υπηρεσίας διακοπής

^ Περίγραμμα εντολών:

int interrupt_number

Σκοπός: καλέστε τη ρουτίνα υπηρεσίας διακοπής με τον αριθμό διακοπής που καθορίζεται από τον τελεστή εντολής.

^ Αλγόριθμος εργασίας:

σπρώξτε τον καταχωρητή eflags/flags και τη διεύθυνση επιστροφής στη στοίβα. Κατά τη σύνταξη της διεύθυνσης επιστροφής, πρώτα γράφονται τα περιεχόμενα του καταχωρητή τμημάτων cs και μετά τα περιεχόμενα του δείκτη εντολής eip/ip.

μηδενίστε τις σημαίες if και tf στο μηδέν.

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

^ Κατάσταση σημαιών μετά την εκτέλεση της εντολής:

Εφαρμογή:
Όπως μπορείτε να δείτε από τη σύνταξη, υπάρχουν δύο μορφές αυτής της εντολής:

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

Η δεύτερη μορφή της εντολής έχει μήκος δύο byte, έχει έναν κωδικό λειτουργίας 0cdh και σας επιτρέπει να ξεκινήσετε μια κλήση σε μια ρουτίνα υπηρεσίας διακοπής με έναν διανυσματικό αριθμό στην περιοχή 0-255. Τα χαρακτηριστικά της μεταφοράς ελέγχου, όπως σημειώθηκε, εξαρτώνται από τον τρόπο λειτουργίας του μικροεπεξεργαστή.

Κωδικός αντικειμένου (δύο μορφές):

Εγγραφή: |01000reg|

^ Εγγραφή ή μνήμη: |1111111w|mod000r/m|

JCC
JCXZ/JECXZ
(Άλμα εάν συνθήκη)

(Άλμα αν CX=Μηδέν/ Άλμα αν ECX=Μηδέν)

Πήδα εάν πληρούται η προϋπόθεση

Πήδα εάν το CX/ECX είναι μηδέν

^ Περίγραμμα εντολών:

ετικέτα jcc
ετικέτα jcxz
ετικέτα jecxz

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

^ Αλγόριθμος εντολών (εκτός από jcxz/jecxz):
Έλεγχος της κατάστασης των σημαιών ανάλογα με τον κωδικό λειτουργίας (αντανακλά την κατάσταση που ελέγχεται):

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

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

Αλγόριθμος εντολών jcxz/jecxz:
Έλεγχος της συνθήκης ότι τα περιεχόμενα του καταχωρητή ecx/cx είναι ίσα με μηδέν:

εάν η ελεγμένη συνθήκη

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

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 - αδράνεια κ.λπ.).

Μια πλήρης λίστα εντολών assembler μπορεί να βρεθεί στα έργα.

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

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

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

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

Το Src μπορεί να είναι τύπου: r (register) - register, m (memory) - memory, i (impeance) - άμεση τιμή. Το 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 (συμπεριλαμβανομένου του τμήματος) ή δύο θέσεις μνήμης. Οι σημαίες δεν αλλάζουν.

Εισαγωγή.

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

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

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

). Η παραγόμενη ακολουθία συμβόλων χρησιμοποιείται για την εκτέλεση των λειτουργιών που έχουν εκχωρηθεί στο αρχικό πρόγραμμα.

Η γλώσσα συναρμολόγησης που συζητείται παρακάτω υλοποιείται με τη χρήση μεταγλώττισης.

Χαρακτηριστικά της γλώσσας.

Τα κύρια χαρακτηριστικά του assembler:

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

) χρησιμοποιείται μνημονικό

Αφαιρέσεις (

πολλαπλασιασμός (

Τμήματα (

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

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

● η γλώσσα παρέχει πρόσβαση σε όλα τα αντικείμενακαι ομάδες. Οι γλώσσες υψηλού επιπέδου δεν έχουν αυτήν την ικανότητα. Για παράδειγμα, η γλώσσα assembly σάς επιτρέπει να ελέγξετε ένα bit καταχώρισης σημαίας και μια γλώσσα υψηλού επιπέδου (για παράδειγμα,

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

● γλώσσα συναρμολόγησης δεν είναι μια καθολική γλώσσα.Κάθε συγκεκριμένη ομάδα μικροεπεξεργαστών έχει το δικό της assembler. Οι γλώσσες υψηλού επιπέδου δεν έχουν αυτό το μειονέκτημα.

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

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

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

Στα περισσότερα προγράμματα, μόνο ένα μικρό ποσοστό του συνολικού κώδικα είναι υπεύθυνο για ένα μεγάλο ποσοστό του χρόνου εκτέλεσης του προγράμματος. Συνήθως, το 1% του προγράμματος είναι υπεύθυνο για το 50% του χρόνου εκτέλεσης και το 10% του προγράμματος είναι υπεύθυνο για το 90% του χρόνου εκτέλεσης. Επομένως, για τη σύνταξη ενός συγκεκριμένου προγράμματος σε πραγματικές συνθήκες, χρησιμοποιείται τόσο ο assembler όσο και μία από τις γλώσσες υψηλού επιπέδου.

Μορφή χειριστή στη γλώσσα assembly.

Ένα πρόγραμμα γλώσσας assembly είναι μια λίστα εντολών (δηλώσεις, προτάσεις), καθεμία από τις οποίες καταλαμβάνει μια ξεχωριστή γραμμή και περιέχει τέσσερα πεδία: ένα πεδίο ετικέτας, ένα πεδίο λειτουργίας, ένα πεδίο τελεστών και ένα πεδίο σχολίων. Κάθε πεδίο έχει ξεχωριστή στήλη.

Πεδίο ετικέτας.

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

● κάντε μια υπό όρους ή άνευ όρων μετάβαση στην εντολή.

● αποκτήστε πρόσβαση στο μέρος όπου αποθηκεύονται τα δεδομένα.

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

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

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

Πεδίο κωδικού συναλλαγής.

Αυτό το πεδίο περιέχει την εντολή μνημονική ή ψευδοεντολή (δείτε παρακάτω). Ο μνημονικός κώδικας εντολής επιλέγεται από τους προγραμματιστές γλωσσών. Στη γλώσσα assembly

μνημονικό επιλεγμένο για φόρτωση καταχωρητή από τη μνήμη

), και για να αποθηκεύσετε τα περιεχόμενα του καταχωρητή στη μνήμη - το μνημονικό

). Σε γλώσσες assembly

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

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

Τα μνημονικά καταχωρήσεων εξαρτώνται επίσης από την έκδοση του assembler (Πίνακας 5.2.1).

Πεδίο τελεστών.

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

● αριθμητικά δεδομένα,

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

Αντίστοιχα, δυαδικά, οκταδικά, δεκαδικά συστήματα αριθμών (

μπορεί να μην καταγραφεί). Εάν το πρώτο ψηφίο του δεκαεξαδικού αριθμού είναι A, B, C,

Στη συνέχεια προστίθεται ένα ασήμαντο 0 (μηδέν) μπροστά.

● κωδικοί εσωτερικών καταχωρητών μικροεπεξεργαστή και κυψελών μνήμης

M (πηγές ή δέκτες πληροφοριών) με τη μορφή γραμμάτων A, B, C,

M ή τις διευθύνσεις τους σε οποιοδήποτε σύστημα αριθμών (για παράδειγμα, 10V - διεύθυνση μητρώου

σε δυαδικό σύστημα).

● αναγνωριστικά,

για εγγεγραμμένα ζεύγη αεροσκαφών,

Τα πρώτα γράμματα Β

H; για ένα ζεύγος συσσωρευτή και καταχωρητή χαρακτηριστικών -

; για τον μετρητή προγράμματος -

; για δείκτη στοίβας -

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

(όταν πληρούται η προϋπόθεση) και άνευ όρων μεταβάσεις.Για παράδειγμα, ο τελεστής M1 στην εντολή

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

● εκφράσεις,

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

Ορίστε τη λέξη), και αργότερα εισήγαγε μια εναλλακτική.

που από την αρχή ήταν στη γλώσσα των επεξεργαστών

Σε γλωσσική έκδοση

μεταχειρισμένος

ορίστε μια σταθερά).

Οι επεξεργαστές επεξεργάζονται τελεστές διαφορετικού μήκους. Για να το ορίσουμε, οι προγραμματιστές assembler έχουν λάβει διαφορετικές αποφάσεις, για παράδειγμα:

Οι καταχωρητές II διαφορετικών μηκών έχουν διαφορετικά ονόματα: EAX - για τοποθέτηση τελεστών 32 bit (τύπος

) AX - για 16-bit (τύπος

και AN - για 8-bit (τύπος

● για επεξεργαστές

προστίθενται επιθήματα σε κάθε opcode: επίθημα

Για τον τύπο

; επίθημα ".Β" για τον τύπο

για τελεστές διαφορετικού μήκους, χρησιμοποιούνται διαφορετικοί κωδικοί λειτουργίας, για παράδειγμα, για τη φόρτωση ενός byte, μιας μισής λέξης (

) και οι λέξεις σε καταχωρητή 64-bit χρησιμοποιούν κωδικούς λειτουργίας

αντίστοιχα.

Πεδίο σχολίων.

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

● ερωτηματικό (;) σε γλώσσες για τους επεξεργαστές της εταιρείας

● θαυμαστικό (!) σε γλώσσες για

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

Ψευδοεντολές (οδηγίες).

Στη γλώσσα assembly, μπορούν να διακριθούν δύο κύριοι τύποι εντολών:

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

ψευδοεντολέςή οδηγίες,έχει σχεδιαστεί για να εξυπηρετεί τη διαδικασία μετάφρασης του προγράμματος στη γλώσσα των συνδυασμών κώδικα. Για παράδειγμα, στον Πίνακα. Το 5.2.2 δείχνει μερικές ψευδοεντολές από το as-assembler

για οικογένεια

.

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

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

● τακτοποιήστε αυτήν την ακολουθία σε μια διαδικασία (υπορουτίνα) και καλέστε την εάν είναι απαραίτητο. Μια τέτοια έξοδος έχει τα μειονεκτήματά της: κάθε φορά που πρέπει να εκτελείτε μια ειδική εντολή κλήσης διαδικασίας και μια εντολή επιστροφής, η οποία, με μια σύντομη και συχνά χρησιμοποιούμενη ακολουθία, μπορεί να μειώσει σημαντικά την ταχύτητα του προγράμματος.

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

Μια μακροεντολή, ή μακροεντολή, χαρακτηρίζεται από τρεις πτυχές: ορισμό μακροεντολών, αντιστροφή μακροεντολών και επέκταση μακροεντολών.

μακροεντολή

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

Μια μακροεντολή έχει την ακόλουθη δομή:

Κατάλογος εκφράσεων. μακροεντολή

Υπάρχουν τρία μέρη στην παραπάνω δομή ορισμού μακροεντολών:

● κεφαλίδα

μακροεντολή που περιέχει το όνομα

Ψευτοεντολή

και ένα σύνολο παραμέτρων.

● διάστικτη σώμαμακροεντολή?

● ομάδα

αποφοίτηση

μακροοικονομικούς ορισμούς.

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

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

λίστα μακροεντολών και παραμέτρων με άλλες τιμές.

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

) μιας μακροεντολής, ο συναρμολογητής την αντικαθιστά με το σώμα της μακροεντολής.

Η χρήση ενός ονόματος μακροεντολής ως opcode ονομάζεται μακρο-αντιστροφή(κλήση μακροεντολής) και η αντικατάστασή της από το σώμα της μακροεντολής - μακροοικονομική επέκταση.

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

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

Η διαδικασία συναρμολόγησης πραγματοποιείται σε δύο περάσματα:

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

● Το δεύτερο πέρασμα επεξεργάζεται το ληφθέν πρόγραμμα χωρίς μακροεντολές.

Μακροεντολές με παραμέτρους.

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

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

● με επίσημοςΠαράμετροι. Κατά την επέκταση της μακροεντολής, κάθε επίσημη παράμετρος που εμφανίζεται στο σώμα της μακροεντολής αντικαθίσταται από την αντίστοιχη πραγματική παράμετρο.

χρησιμοποιώντας μακροεντολές με παραμέτρους.

Το Πρόγραμμα 1 εμφανίζει δύο παρόμοιες ακολουθίες εντολών, που διαφέρουν στο ότι η πρώτη από αυτές ανταλλάσσει το P και

Και το δεύτερο

Το πρόγραμμα 2 περιλαμβάνει μια μακροεντολή με δύο επίσημες παραμέτρους P1 και P2. Κατά την επέκταση της μακροεντολής, κάθε χαρακτήρας P1 μέσα στο σώμα της μακροεντολής αντικαθίσταται από την πρώτη πραγματική παράμετρο (P,

), και το σύμβολο P2 αντικαθίσταται από τη δεύτερη πραγματική παράμετρο (

) από το πρόγραμμα Νο. 1. Σε κλήση μακροεντολής

Το πρόγραμμα 2 επισημαίνεται: P,

Η πρώτη πραγματική παράμετρος,

Η δεύτερη πραγματική παράμετρος.

Πρόγραμμα 1

Πρόγραμμα 2

MOV EBX,Q MOV EAX,Pl

MOV Q,EAX MOV EBX,P2

MOV P,EBX MOV P2,EAX

Εκτεταμένες δυνατότητες.

Εξετάστε ορισμένα προηγμένα χαρακτηριστικά της γλώσσας

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

η ετικέτα δηλώνεται τοπική (

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

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

IF WORDSIZE GT 16 M2 MACRO

Η μακροεντολή M2 μπορεί να οριστεί και στα δύο μέρη της δήλωσης

Ωστόσο, ο ορισμός εξαρτάται από το εάν το πρόγραμμα συναρμολογείται σε επεξεργαστή 16-bit ή 32-bit. Εάν δεν κληθεί το M1, τότε η μακροεντολή M2 δεν θα οριστεί καθόλου.

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

Σχετικά με τη χρήση μακροεντολών σε assembler.

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

Αποθήκευση ορισμών μακροεντολών.

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

Όταν αντιμετωπίζετε μια μακροεντολή κατά τη συναρμολόγηση δημιουργήθηκε:

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

● λίστα επίσημοςΠαράμετροι.

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

Εσωτερική αναπαράσταση μιας μακροεντολής

από το παραπάνω παράδειγμα για το πρόγραμμα 2 (σελ. 244) είναι:

MOV EAX, MOV EBX, MOV MOV &

όπου το ερωτηματικό χρησιμοποιείται ως χαρακτήρας επιστροφής μεταφοράς και το σύμβολο & χρησιμοποιείται ως ο τυπικός χαρακτήρας παραμέτρου.

Επέκταση κλήσης μακροεντολής.

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

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

Συναρμολόγηση δύο περασμάτων.

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

● μεταφράστε το σε γλώσσα μηχανής.

● μεταφέρετε τον λαμβανόμενο κωδικό μηχανής σε ένα αρχείο και το αντίστοιχο μέρος της καταχώρισης - σε άλλο αρχείο.

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

Ωστόσο, αυτή η προσέγγιση δεν είναι αποτελεσματική. Ένα παράδειγμα είναι το λεγόμενο πρόβλημα κορυφαίος σύνδεσμος.Εάν η πρώτη πρόταση είναι ένα άλμα στην πρόταση P στο τέλος του προγράμματος, τότε ο assembler δεν μπορεί να τη μεταφράσει. Πρέπει πρώτα να καθορίσει τη διεύθυνση του χειριστή P και για αυτό είναι απαραίτητο να διαβάσει ολόκληρο το πρόγραμμα. Κάθε πλήρης ανάγνωση του αρχικού προγράμματος καλείται πέρασμα.Ας δείξουμε πώς μπορούμε να λύσουμε το πρόβλημα μπροστινής αναφοράς χρησιμοποιώντας δύο περάσματα:

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

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

Πρώτο πέρασμα.

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

;Τιμή - μέγεθος buffer

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

) ως ειδική μεταβλητή. Στην αρχή του πρώτου περάσματος, η τιμή της ειδικής μεταβλητής ορίζεται στο 0 και αυξάνεται μετά από κάθε εντολή που υποβάλλεται σε επεξεργασία κατά το μήκος αυτής της εντολής. Για παράδειγμα, στον Πίνακα. Το 5.2.3 δείχνει ένα τμήμα του προγράμματος που υποδεικνύει το μήκος των εντολών και τις τιμές του μετρητή. Οι πίνακες δημιουργούνται κατά το πρώτο πέρασμα ονόματα συμβόλων, οδηγίεςΚαι κωδικούς λειτουργίας,και αν χρειαστεί κατά γράμματραπέζι. Το literal είναι μια σταθερά για την οποία ο assembler δεσμεύει αυτόματα τη μνήμη. Σημειώνουμε αμέσως ότι οι σύγχρονοι επεξεργαστές περιέχουν οδηγίες με άμεσες διευθύνσεις, επομένως οι συναρμολογητές τους δεν υποστηρίζουν literals.

Πίνακας συμβόλων

περιέχει ένα στοιχείο για κάθε όνομα (Πίνακας 5.2.4). Κάθε καταχώρηση στον πίνακα συμβόλων περιέχει το ίδιο το όνομα (ή έναν δείκτη σε αυτό), την αριθμητική του αξία και μερικές φορές κάποιες πρόσθετες πληροφορίες, οι οποίες μπορεί να περιλαμβάνουν:

● το μήκος του πεδίου δεδομένων που σχετίζεται με το σύμβολο.

● bit επαναχαρτογράφησης μνήμης (τα οποία υποδεικνύουν εάν η τιμή ενός χαρακτήρα αλλάζει εάν το πρόγραμμα φορτωθεί σε διαφορετική διεύθυνση από αυτήν που προοριζόταν ο assembler).

● πληροφορίες σχετικά με το εάν το σύμβολο είναι προσβάσιμο εκτός της διαδικασίας.

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

Πίνακας οδηγιών.

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

Πίνακας κωδικών λειτουργίας.

Για κάθε opcode, ο πίνακας έχει ξεχωριστές στήλες: προσδιορισμός opcode, τελεστής 1, τελεστής 2, δεκαεξαδική τιμή του opcode, μήκος εντολής και τύπος εντολής (Πίνακας 5.2.5). Οι κώδικες λειτουργίας χωρίζονται σε ομάδες ανάλογα με τον αριθμό και τον τύπο των τελεστών. Ο τύπος εντολής καθορίζει τον αριθμό της ομάδας και καθορίζει τη διαδικασία που καλείται να επεξεργαστεί όλες τις εντολές σε αυτήν την ομάδα.

Δεύτερο πέρασμα.

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

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

Το αρχικό πρόγραμμα μπορεί να περιέχει σφάλματα, για παράδειγμα:

το δεδομένο σύμβολο δεν ορίζεται ή ορίζεται περισσότερες από μία φορές.

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

● χωρίς χειριστή

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

Άρθρα αφιερωμένα στη γλώσσα assembly.

Συνεχίζοντας το θέμα:
Μόντεμ

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

Νέα άρθρα
/
Δημοφιλής