Σύγχρονος συναρμολογητής. Βουτήξτε στο assembler. Ένα πλήρες μάθημα προγραμματισμού στο Asma από το ][. Τι είναι το assembler

Για να εκτελεί μια μηχανή ανθρώπινες εντολές επίπεδο υλικού, είναι απαραίτητο να ορίσετε μια συγκεκριμένη ακολουθία ενεργειών στη γλώσσα των "μηδενικών και μονάδων". Ο συναρμολογητής θα γίνει βοηθός σε αυτό το θέμα. Αυτό είναι ένα βοηθητικό πρόγραμμα που λειτουργεί με τη μετάφραση εντολών σε γλώσσα μηχανής. Ωστόσο, η σύνταξη ενός προγράμματος είναι μια πολύ κουραστική και πολύπλοκη διαδικασία. Αυτή η γλώσσα δεν προορίζεται να δημιουργήσει πνεύμονες και απλές ενέργειες. Επί αυτή τη στιγμήοποιαδήποτε γλώσσα προγραμματισμού χρησιμοποιείται (το Assembler λειτουργεί εξαιρετικά) σας επιτρέπει να γράφετε ειδικές, αποτελεσματικές εργασίες που επηρεάζουν σε μεγάλο βαθμό τη λειτουργία του υλικού. Ο κύριος σκοπός είναι η δημιουργία μικρο-εντολών και μικρών κωδικών. Αυτή η γλώσσα παρέχει περισσότερες δυνατότητες από, για παράδειγμα, Pascal ή C.

Σύντομη περιγραφή των γλωσσών συναρμολόγησης

Όλες οι γλώσσες προγραμματισμού χωρίζονται σε επίπεδα: χαμηλό και υψηλό. Οποιοδήποτε από συντακτικό σύστημαΗ «οικογένεια» του Assembler διακρίνεται από το γεγονός ότι συνδυάζει ταυτόχρονα μερικά από τα πλεονεκτήματα των πιο κοινών και μοντέρνες γλώσσες. Αυτό που έχουν κοινό με τους άλλους είναι αυτό στο έπακρομπορείτε να χρησιμοποιήσετε ένα σύστημα υπολογιστή.

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

Εν συντομία για τη δομή της γλώσσας

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

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

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

Η γλώσσα assembly έχει πολλές συντακτικές που θα συζητηθούν στο άρθρο.

Πλεονεκτήματα της γλώσσας

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

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

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

Μειονεκτήματα της γλώσσας

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

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

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

Γλωσσικές εντολές

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


Χρήση οδηγιών

Προγραμματισμός μικροελεγκτών στη γλώσσα (το Assembler το επιτρέπει και αντιμετωπίζει καλά τη λειτουργία) η ίδια χαμηλό επίπεδοστις περισσότερες περιπτώσεις τελειώνει με επιτυχία. Είναι καλύτερο να χρησιμοποιείτε επεξεργαστές με περιορισμένους πόρους. Για τεχνολογία 32 bit δεδομένη γλώσσαταιριάζει τέλεια. Μπορείτε συχνά να δείτε οδηγίες σε κώδικα. Τι είναι αυτό; Και σε τι χρησιμεύει;

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


προέλευση του ονόματος

Πώς πήρε το όνομά της η γλώσσα - "Assembler"; Μιλάμε για μεταφραστή και μεταγλωττιστή, που κρυπτογραφούν τα δεδομένα. Στα αγγλικά, Assembler δεν σημαίνει τίποτα περισσότερο από assembler. Το πρόγραμμα δεν συναρμολογήθηκε χειροκίνητα. Επιπλέον, αυτή τη στιγμή, οι χρήστες και οι ειδικοί έχουν ήδη χάσει τη διαφορά μεταξύ των όρων. Οι γλώσσες προγραμματισμού ονομάζονται συχνά assembler, αν και είναι απλώς ένα βοηθητικό πρόγραμμα.

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

Μακροεντολή σημαίνει

Οι γλώσσες συναρμολόγησης, οι οποίες είναι σχετικά νέες, έχουν χαρακτηριστικά macro. Διευκολύνουν τόσο τη σύνταξη όσο και την εκτέλεση ενός προγράμματος. Χάρη στην παρουσία τους, ο μεταφραστής εκτελεί τον γραπτό κώδικα πολλές φορές πιο γρήγορα. Όταν δημιουργείτε μια επιλογή υπό όρους, μπορείτε να γράψετε ένα τεράστιο μπλοκ εντολών, αλλά είναι πιο εύκολο να χρησιμοποιήσετε εργαλεία μακροεντολών. Θα σας επιτρέψουν να κάνετε γρήγορη εναλλαγή μεταξύ ενεργειών εάν πληρούται μια προϋπόθεση ή όχι.

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

Προγραμματισμός γλώσσας Assembly

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

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

1. Μητρώα

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

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

1.1. Μητρώα γενικής χρήσης

ΠΡΟΣ ΤΗΝ Οι καταχωρητές γενικής χρήσης είναι μια ομάδα 8 καταχωρητών που μπορούν να χρησιμοποιηθούν σε ένα πρόγραμμα γλώσσας assembly. Όλοι οι καταχωρητές έχουν μέγεθος 32 bit και μπορούν να χωριστούν σε 2 ή περισσότερα μέρη.

Όπως φαίνεται από το σχήμα, οι καταχωρητές ESI, EDI, ESP και EBP σας επιτρέπουν να έχετε πρόσβαση στα χαμηλότερα 16 bit με ονόματα SI, DI, SP και BP, αντίστοιχα, και οι καταχωρητές EAX, EBX, ECX και EDX σας επιτρέπουν να πρόσβαση τόσο στα χαμηλότερα 16 bit (με ονόματα AX , BX, CX και DX) όσο και στα δύο χαμηλά byte ξεχωριστά (με όνομα AH/AL, BH/BL, CH/CL και

Τα ονόματα των μητρώων προέρχονται από τον σκοπό τους:

EAX/AX/AH/AL (καταχωρητής συσσωρευτή) – μπαταρία.

EBX/BX/BH/BL (βασικός καταχωρητής) – βασικός καταχωρητής.

ECX/CX/CH/CL (μετρητής) – μετρητής.

EDX/DX/DH/DL (μητρώο δεδομένων) – μητρώο δεδομένων.

ESI/SI (πηγή μητρώο ευρετηρίου) – ευρετήριο πηγής.

EDI/DI (καταχωρητής ευρετηρίου προορισμού) – ευρετήριο του δέκτη (παραλήπτης).

ESP/SP (stack pointer register) – stack pointer register.

EBP/BP (βασικός καταχωρητής δείκτη) – καταχωρητής δείκτη βάσης πλαισίου στοίβας.

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

Μια άλλη απόχρωση είναι η χρήση καταχωρητών ως βάση, δηλ. Αποθήκευση διευθύνσεων RAM. Οποιοιδήποτε καταχωρητές μπορούν να χρησιμοποιηθούν ως καταχωρητές βάσης, αλλά συνιστάται η χρήση καταχωρητών EBX, ESI, EDI ή EBP. Σε αυτήν την περίπτωση, το μέγεθος της εντολής μηχανής είναι συνήθως μικρότερο.

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

1.2. Ευρετήριο εντολών

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

1.3. Μητρώο σημαίας

Μια σημαία είναι ένα bit που παίρνει την τιμή 1 ("σύνολο σημαίας") εάν πληρούται κάποια συνθήκη, και την τιμή 0 ("διαγράφεται η σημαία") διαφορετικά. Ο επεξεργαστής έχει έναν καταχωρητή σημαίας που περιέχει ένα σύνολο σημαιών που αντανακλούν Τωρινή κατάστασηεπεξεργαστή.

Ονομασία

Ονομα

Η σημαία μετακινήθηκε

Κατοχυρωμένα

Σημαία ισοτιμίας

Κατοχυρωμένα

Βοηθητική σημαία μεταφοράς

Βοηθητική

Κατοχυρωμένα

Σημαία μηδέν

Σημαία σημαίας

Ιχνηλάτης σημαίας

Σημαία Ενεργοποίηση διακοπής

Σημαία άδειας

Σημαία οδηγίες

Σημαία Repo

Επίπεδο προνομίου I/O

Επίπεδο σε

Σημαία ένθετη

Κατοχυρωμένα

Η σημαία συνεχίστηκε

Λειτουργία Virtual-8086

Εικονική λειτουργία

Σε ελέγχει

Σημαία εικονικής διακοπής

Εικονικός

Εικονική διακοπή σε εκκρεμότητα

Αναμονή

Ελεγξε για

Κατοχυρωμένα

Η τιμή των σημαιών CF, DF και IF μπορεί να αλλάξει απευθείας στον καταχωρητή σημαίας χρησιμοποιώντας Ειδικές Οδηγίες(π.χ. CLD για να διαγράψετε τη σημαία κατεύθυνσης), αλλά δεν υπάρχουν οδηγίες που να επιτρέπουν την πρόσβαση στον καταχωρητή σημαιών σαν να ήταν ένας κανονικός καταχωρητής. Ωστόσο, μπορείτε να αποθηκεύσετε

τον καταχωρητή σημαίας στη στοίβα ή τον καταχωρητή AH και επαναφέρετε τον καταχωρητή σημαίας από αυτούς χρησιμοποιώντας τις οδηγίες LAHF, SAHF, PUSHF, PUSHFD, POPF και POPFD.

1.3.1. Σημαίες κατάστασης

Οι σημαίες κατάστασης (bits 0, 2, 4, 6, 7 και 11) αντικατοπτρίζουν το αποτέλεσμα αριθμητικών οδηγιών όπως ADD, SUB, MUL, DIV.

Η σημαία μεταφοράς CF ορίζεται κατά τη μεταφορά από ηλικιωμένο σημαντικό κομμάτι/δανειστείτε στο πιο σημαντικό bit και υποδηλώνει την παρουσία υπερχείλισης σε αριθμητική χωρίς ακέραιο αριθμό. Χρησιμοποιείται επίσης στη μεγάλη αριθμητική.

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

Βοηθητική σημαία μεταφοράς Το AF ρυθμίζεται κατά τη μεταφορά από bitαποτέλεσμα/δάνειο σελίγο αποτέλεσμα. Αυτή η σημαία προορίζεται για χρήση σε BCD (δυαδική κωδικοποιημένη δεκαδική, BCD) αριθμητική.

Η μηδενική σημαία ZF ορίζεται εάν το αποτέλεσμα ίσο με μηδέν.

Η σημαία πρόσημο SF είναι ίση με την τιμή του πιο σημαντικού bit του αποτελέσματος, που είναι το bit πρόσημου στην αριθμητική υπογραφή.

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

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

Οι σημαίες κατάστασης επιτρέπουν την έκδοση της ίδιας αριθμητικής εντολής αποτέλεσμα τριών διάφοροι τύποι: Ανυπόγραφο, υπογεγραμμένο και δυαδικό κωδικοποιημένο δεκαδικό (BCD) ακέραιος. Εάν το αποτέλεσμα θεωρείται ανυπόγραφος αριθμός, τότε η σημαία CF δείχνει την κατάσταση υπερχείλισης (μεταφορά ή δανεισμό), για ένα υπογεγραμμένο αποτέλεσμα, μια μεταφορά ή δανεισμό δείχνει τη σημαία OF και για ένα αποτέλεσμα BCD, η σημαία μεταφορά/δανεισμός δείχνει την AF σημαία. Η σημαία SF αντικατοπτρίζει το πρόσημο ενός υπογεγραμμένου αποτελέσματος, η σημαία ZF αντικατοπτρίζει τόσο ένα ανυπόγραφο όσο και ένα υπογεγραμμένο μηδενικό αποτέλεσμα.

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

Οδηγίες

υποθετικός

μετάβαση Jcc (μετάβαση

κατάσταση cc ), SETcc (σετ

έννοια

byte αποτελέσματος

εξαρτήσεις

συνθήκες cc ),LOOPcc (οργάνωση

και CMOVcc (υπό όρους

αντιγραφή)

χρήση

ένα ή περισσότερα

σημαίες κατάστασης για να ελέγξετε την κατάσταση. Για παράδειγμα, η εντολή άλματος JLE (άλμα αν είναι μικρότερο ή ίσο) ελέγχει τη συνθήκη "ZF = 1 ή SF ≠ OF".

Η σημαία PF εισήχθη για συμβατότητα με άλλα αρχιτεκτονικές μικροεπεξεργαστώνκαι σπάνια χρησιμοποιείται για τον προορισμό του. Η πιο κοινή χρήση του είναι σε συνδυασμό με άλλες σημαίες κατάστασης στην αριθμητική κινητής υποδιαστολής: εντολές σύγκρισης (FCOM, FCOMP, κ.λπ.) στο σύνολο συνθηκών συνεπεξεργαστή μαθηματικών σημαιών C0, C1, C2 και C3 σε αυτό, και αυτές οι σημαίες μπορούν να αντιγραφούν για να επισημάνετε το μητρώο. Για να γίνει αυτό, συνιστάται η χρήση της εντολής FSTSW AX για την αποθήκευση της λέξης κατάστασης του συνεπεξεργαστή στον καταχωρητή AX και η εντολή SAHF για να αντιγράψετε στη συνέχεια τα περιεχόμενα του καταχωρητή AH στα χαμηλά 8 bit του καταχωρητή σημαίας, με το C0 να καταλήγει στη σημαία CF, C2 στη σημαία PF και C3 στη σημαία ZF. Η σημαία C2 ορίζεται, για παράδειγμα, στην περίπτωση μη συγκρίσιμων ορισμάτων (NaN ή μη υποστηριζόμενη μορφή) στην εντολή σύγκρισης FUCOM.

1.3.2. Σημαία ελέγχου

Σημαία κατεύθυνσηςΤο DF (bit 10 στον καταχωρητή σημαιών) ελέγχει τις εντολές συμβολοσειράς (MOVS, CMPS, SCAS, LODS και STOS) - η ρύθμιση της σημαίας προκαλεί μείωση των διευθύνσεων (γραμμές διεργασίας από τις υψηλές σε χαμηλές διευθύνσεις), ο μηδενισμός προκαλεί την αύξηση των διευθύνσεων. Οι οδηγίες STD και CLD ορίζουν και διαγράφουν τη σημαία DF αντίστοιχα.

1.3.3. Σημαίες συστήματος και πεδίο IOPL

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

Σημαία ενεργοποίησης διακοπής IF—Η διαγραφή αυτής της επισήμανσης απαγορεύει την απάντηση σε αιτήματα διακοπής με μάσκα.

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

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

Το πεδίο IOPL δείχνει το επίπεδο προτεραιότητας I/O εκτελέσιμο πρόγραμμαή εργασίες: Για να εκτελέσει ένα πρόγραμμα ή μια εργασία εντολές εισόδου/εξόδου ή να αλλάξει μια σημαία IF, το τρέχον επίπεδο προτεραιότητας (CPL) πρέπει να είναι ≤ IOPL.

Σημαία ένθεσης εργασιών NT - αυτή η σημαία ορίζεται όταν η τρέχουσα εργασία είναι "ενσωματωμένη" σε μια άλλη εργασία που έχει διακοπεί και το τμήμα κατάστασης TSS τρέχουσα εργασίαπαρέχει ανατροφοδότησημε το TSS της προηγούμενης εργασίας. Η σημαία NT ελέγχεται από την εντολή IRET για να καθοριστεί εάν η επιστροφή είναι intertask ή intratask.

Σημαία συνέχισηςΤο RF χρησιμοποιείται για την απόκρυψη σφαλμάτων εντοπισμού σφαλμάτων.

VM - Η ρύθμιση αυτής της σημαίας σε προστατευμένη λειτουργία προκαλεί μετάβαση σε εικονική λειτουργία 8086.

Σημαία ελέγχου ευθυγράμμισης AC – η ρύθμιση αυτής της σημαίας μαζί με το bit AM στον καταχωρητή CR0 επιτρέπει τον έλεγχο της στοίχισης τελεστών κατά την πρόσβαση στη μνήμη: η πρόσβαση σε έναν μη ευθυγραμμισμένο τελεστή προκαλεί εξαίρεση.

VIF εικονικό αντίγραφοΑΝ σημαία? χρησιμοποιείται σε συνδυασμό με τη σημαία VIP.

VIP – ορίζεται για να υποδεικνύει την παρουσία μιας εκκρεμούς διακοπής.

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

1.4. Μητρώα τμημάτων

Ο επεξεργαστής διαθέτει 6 λεγόμενους καταχωρητές τμημάτων: CS, DS, SS, ES, FS και GS. Η ύπαρξή τους οφείλεται στις ιδιαιτερότητες της οργάνωσης και χρήσης της μνήμης RAM.

Οι καταχωρητές 16-bit μπορούσαν να απευθύνονται μόνο σε 64 KB μνήμης RAM, κάτι που σαφώς δεν επαρκεί για ένα περισσότερο ή λιγότερο αξιοπρεπές πρόγραμμα. Επομένως, η μνήμη εκχωρήθηκε στο πρόγραμμα με τη μορφή πολλών τμημάτων, τα οποία είχαν μέγεθος 64 KB. Ταυτόχρονα, οι απόλυτες διευθύνσεις ήταν 20-bit, γεγονός που επέτρεψε τη διεύθυνση ήδη 1 MB μνήμης RAM. Τίθεται το ερώτημα: πώς μπορείτε να αποθηκεύσετε διευθύνσεις 20-bit με καταχωρητές 16-bit; Για να λυθεί αυτό το πρόβλημα, η διεύθυνση χωρίστηκε σε μετατόπιση. Η βάση είναι η διεύθυνση της αρχής του τμήματος και η μετατόπιση είναι ο αριθμός byte μέσα στο τμήμα. Επιβλήθηκε περιορισμός στη διεύθυνση της αρχής του τμήματος - έπρεπε να είναι πολλαπλάσιο του 16. Σε αυτήν την περίπτωση, τα τελευταία 4 bit ήταν ίσα με 0 και δεν αποθηκεύτηκαν, αλλά υπονοούνταν. Έτσι, ελήφθησαν δύο τμήματα 16-bit της διεύθυνσης. Για να πάρεις

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

Οι καταχωρητές τμημάτων χρησιμοποιήθηκαν για την αποθήκευση της διεύθυνσης της αρχής του τμήματος κώδικα (CS - τμήμα κώδικα), του τμήματος δεδομένων (DS - τμήμα δεδομένων) και του τμήματος στοίβας (SS - τμήμα στοίβας). Οι καταχωρητές ES, FS και GS προστέθηκαν αργότερα. Υπήρχαν πολλά μοντέλα μνήμης, καθένα από τα οποία περιλάμβανε την κατανομή ενός ή περισσότερων τμημάτων κώδικα και ενός ή περισσότερων τμημάτων δεδομένων σε ένα πρόγραμμα: μικροσκοπικό, μικρό, μεσαίο, συμπαγές, μεγάλο και τεράστιο. Υπήρχαν ορισμένες συμβάσεις για οδηγίες γλώσσας συναρμολόγησης: οι διευθύνσεις μετάβασης τμηματοποιήθηκαν από τον καταχωρητή CS, οι προσβάσεις δεδομένων τμηματοποιήθηκαν από τον καταχωρητή DS και οι προσβάσεις στοίβας τμηματοποιήθηκαν από τον καταχωρητή SS. Εάν σε ένα πρόγραμμα εκχωρήθηκαν πολλά τμήματα για κώδικα ή δεδομένα, τότε οι τιμές στους καταχωρητές CS και DS έπρεπε να αλλάξουν για πρόσβαση σε άλλο τμήμα. Υπήρχαν οι λεγόμενες «κοντές» και «μακρινές» μεταβάσεις. Εάν η εντολή στην οποία ήταν απαραίτητο να μεταβείτε ήταν στο ίδιο τμήμα, τότε για να μεταβείτε σε αυτήν αρκούσε να αλλάξετε μόνο την τιμή του καταχωρητή IP. Μια τέτοια μετάβαση ονομάστηκε κοντά. Εάν η εντολή στην οποία πρέπει να γίνει η μετάβαση βρισκόταν σε διαφορετικό τμήμα, τότε για να γίνει μετάβαση ήταν απαραίτητο να αλλάξετε τόσο την τιμή του καταχωρητή CS όσο και την τιμή του καταχωρητή IP. Μια τέτοια μετάβαση ονομαζόταν μεγάλη απόσταση και χρειάστηκε περισσότερο.

Οι καταχωρητές 32-bit σάς επιτρέπουν να διευθύνετε 4 GB μνήμης, που είναι ήδη αρκετό για οποιοδήποτε πρόγραμμα. Τα Windows εκτελούν κάθε πρόγραμμα Win32 σε ξεχωριστό εικονικό χώρο. Αυτό σημαίνει ότι κάθε πρόγραμμα Win32 θα έχει χώρο διευθύνσεων 4 GB, αλλά δεν σημαίνει ότι κάθε πρόγραμμα έχει 4 GB φυσική μνήμη, αλλά μόνο ότι το πρόγραμμα μπορεί να έχει πρόσβαση σε οποιαδήποτε διεύθυνση εντός αυτών των ορίων. Και τα Windows θα κάνουν ό,τι είναι απαραίτητο για να διασφαλίσουν ότι η μνήμη στην οποία έχει πρόσβαση το πρόγραμμα «υπάρχει». Φυσικά, το πρόγραμμα πρέπει να τηρεί τους κανόνες που έχουν θεσπιστεί

Windows, διαφορετικά παρουσιάζεται σφάλμα γενικής προστασίας.

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

χρησιμοποιούνται διαφορετικά1. Προηγουμένως, ήταν απαραίτητο να συσχετιστούν μεμονωμένα μέρη του προγράμματος με έναν ή άλλο καταχωρητή τμήματος και να αποθηκευτεί/αποκατασταθεί ο καταχωρητής DS κατά τη μετάβαση σε άλλο τμήμα δεδομένων ή να τμηματοποιηθεί ρητά τα δεδομένα σε άλλο καταχωρητή. Με μια αρχιτεκτονική 32 bit, αυτό δεν είναι πλέον απαραίτητο και στην απλούστερη περίπτωση μπορείτε να ξεχάσετε τους καταχωρητές τμημάτων.

1.5. Χρησιμοποιώντας μια στοίβα

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

Ας έχουμε μια συνάρτηση f1 που καλεί τη συνάρτηση f2 και η συνάρτηση f2, με τη σειρά της, καλεί τη συνάρτηση f3. Κατά την κλήση της συνάρτησης f1, εκχωρείται συγκεκριμένο μέροςστη στοίβα για τοπικά δεδομένα. Αυτός ο χώρος εκχωρείται αφαιρώντας από τον καταχωρητή ESP μια τιμή ίση με το μέγεθος της απαιτούμενης μνήμης. Το ελάχιστο μέγεθος της εκχωρημένης μνήμης είναι 4 byte, δηλ. ακόμα κι αν μια διαδικασία απαιτεί 1 byte, θα πρέπει να πάρει 4 byte.

Η συνάρτηση f1 εκτελεί κάποιες ενέργειες και μετά καλεί

Η συνάρτηση f2 καλεί τη συνάρτηση f3, η οποία εκχωρεί επίσης χώρο στη στοίβα. Η συνάρτηση f3 δεν καλεί άλλες συναρτήσεις και, μετά την ολοκλήρωση, πρέπει να ελευθερώσει χώρο στη στοίβα προσθέτοντας στον καταχωρητή ESP την τιμή που αφαιρέθηκε όταν κλήθηκε η συνάρτηση. Εάν η συνάρτηση f3 δεν επαναφέρει την τιμή του καταχωρητή ESP, τότε η συνάρτηση f2, συνεχίζοντας την εργασία της, δεν θα έχει πρόσβαση στα δικά της δεδομένα, επειδή Ψάχνει

που ήταν πριν από την κλήση της.

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

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

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

2. Βασικές έννοιες της γλώσσας assembly

2.1. Αναγνωριστικά

Η έννοια του αναγνωριστικού στη γλώσσα συναρμολόγησης δεν διαφέρει από την έννοια του αναγνωριστικού σε άλλες γλώσσες. Μπορεί να χρησιμοποιηθεί επιστολές, αριθμοί και σημάδια _. ? @ $ , και η τελεία μπορεί να είναι μόνο ο πρώτος χαρακτήρας του αναγνωριστικού. Τα κεφαλαία και τα μικρά γράμματα θεωρούνται ισοδύναμα.

2.2. Ολόκληροι αριθμοί

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

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

Τα μειονεκτήματα οφείλονται συχνά μόνο στην κλίση σύγχρονη αγοράνα προτιμούν την ποσότητα από την ποιότητα. Σύγχρονοι υπολογιστέςμπορούν να ανταπεξέλθουν εύκολα σε ένα σωρό εντολές λειτουργιών υψηλού επιπέδου και αν δεν είναι εύκολο, ενημερώστε το υλικό του μηχανήματος σας! Αυτός είναι ο νόμος του εμπορικού προγραμματισμού. Αν μιλάμε γιασχετικά με τον προγραμματισμό για την ψυχή, τότε ένα συμπαγές και ευέλικτο πρόγραμμα γραμμένο σε γλώσσα assembly θα αφήσει μια πολύ πιο ευχάριστη εντύπωση από ένα υψηλού επιπέδου hulk επιβαρυμένο με ένα σωρό περιττές λειτουργίες. Υπάρχει η άποψη ότι μόνο λίγοι εκλεκτοί μπορούν να προγραμματίσουν σε assembler. Δεν είναι αλήθεια. Φυσικά, οι ταλαντούχοι προγραμματιστές assembler μπορούν να μετρηθούν από το ένα χέρι, αλλά αυτό συμβαίνει σχεδόν σε κάθε τομέα της ανθρώπινης δραστηριότητας. Δεν υπάρχουν πολλοί οδηγοί άσων, αλλά ο καθένας μπορεί να μάθει να οδηγεί αυτοκίνητο αν έχει την επιθυμία. Αφού διαβάσετε αυτή τη σειρά άρθρων, δεν θα γίνετε κουλ χάκερ. Ωστόσο θα λάβεις γενικές πληροφορίεςκαι μάθε απλούς τρόπουςΠρογραμματισμός γλώσσας assembly για Windows, χρησιμοποιώντας τις ενσωματωμένες λειτουργίες και τις οδηγίες μακροεντολής μεταγλωττιστή. Φυσικά, για να κατακτήσετε τον προγραμματισμό των Windows, πρέπει να έχετε δεξιότητες και εμπειρία στα Windows. Στην αρχή δεν θα καταλάβετε πολλά, αλλά μην αναστατωθείτε από αυτό και διαβάστε παρακάτω: με τον καιρό, όλα θα μπουν στη θέση τους.

Έτσι, για να ξεκινήσουμε τον προγραμματισμό, χρειαζόμαστε τουλάχιστον έναν μεταγλωττιστή. Ο μεταγλωττιστής είναι ένα πρόγραμμα που μεταφράζει τον πηγαίο κώδικα που γράφτηκε από έναν προγραμματιστή σε κάτι εκτελέσιμο από τον επεξεργαστή. κωδικός μηχανής. Τα περισσότερα εγχειρίδια assembler επικεντρώνονται στη χρήση του πακέτου MASM32 (Microsoft Macro Assembler). Αλλά ως μορφή ποικιλίας και για πολλούς άλλους λόγους, θα σας παρουσιάσω τον νεαρό μεταγλωττιστή FASM (Flat Assembler), ο οποίος κερδίζει γρήγορα δημοτικότητα. Αυτός ο μεταγλωττιστής είναι αρκετά εύκολος στην εγκατάσταση και χρήση, είναι συμπαγής και γρήγορος, έχει μια πλούσια και ευρύχωρη σύνταξη μακροεντολών που σας επιτρέπει να αυτοματοποιήσετε πολλά εργασίες ρουτίνας. Του τελευταία έκδοσημπορείτε να κάνετε λήψη στη διεύθυνση: ιστότοπο επιλέγοντας flat assembler για Windows. Για να εγκαταστήσετε το FASM, δημιουργήστε έναν φάκελο, για παράδειγμα, "D:\FASM" και εξαγάγετε τα περιεχόμενα του αρχείου zip που έχετε λάβει σε αυτόν. Εκτελέστε το FASMW.EXE και κλείστε χωρίς να αλλάξετε τίποτα. Με την ευκαιρία, αν χρησιμοποιείτε τυπικός αγωγός, και η επέκταση αρχείου (για παράδειγμα, .EXE) δεν εμφανίζεται, προτείνω να εκτελέσετε Εργαλεία -> Επιλογές φακέλου -> Προβολή και καταργήστε την επιλογή Απόκρυψη επεκτάσεων για καταχωρημένους τύπους αρχείων. Μετά την πρώτη εκκίνηση του μεταγλωττιστή, θα πρέπει να εμφανιστεί ένα αρχείο ρυθμίσεων στον φάκελό μας - FASMW.INI. Ανοίξτε το με τυπικό σημειωματάριοκαι προσθέστε 3 γραμμές στο κάτω μέρος:

Fasminc=D:\FASM\INCLUDE
Include=D:\FASM\INCLUDE

Εάν αποσυσκευάσατε το FASM σε άλλη τοποθεσία, αντικαταστήστε το "D:\FASM\" με τη διαδρομή σας. Αποθηκεύστε και κλείστε το FASMW.INI. Κοιτάζοντας μπροστά, θα εξηγήσω εν συντομία πώς θα χρησιμοποιήσουμε τον μεταγλωττιστή:
1. Γράφουμε το κείμενο του προγράμματος ή ανοίγουμε προηγουμένως γραμμένο κείμενο που είναι αποθηκευμένο στο αρχείο .asm ή επικολλάμε το κείμενο του προγράμματος από το πρόχειρο χρησιμοποιώντας έναν συνδυασμό.
2. Πατήστε F9 για μεταγλώττιση και εκτέλεση του προγράμματος ή Ctrl+F9 για απλώς μεταγλώττιση. Εάν το κείμενο του προγράμματος δεν έχει ακόμη αποθηκευτεί, ο μεταγλωττιστής θα σας ζητήσει να το αποθηκεύσετε πριν από τη μεταγλώττιση.
3. Εάν το πρόγραμμα ξεκινήσει, το δοκιμάζουμε για σωστή λειτουργία, αν όχι, αναζητούμε σφάλματα, τα πιο σοβαρά από τα οποία θα μας υποδείξει ο μεταγλωττιστής ή θα υποδείξει διακριτικά.
Λοιπόν, τώρα μπορούμε να ξεκινήσουμε την πολυαναμενόμενη πρακτική. Εκκινούμε το FASMW.EXE μας και πληκτρολογούμε τον κωδικό του πρώτου μας προγράμματος:

Συμπεριλάβετε το "%fasminc%/win32ax.inc"

Δεδομένα
Λεζάντα db "Το πρώτο μου πρόγραμμα.",0
Κείμενο db "Γεια σε όλους!",0

Κώδικας
αρχή:

επίκληση ExitProcess,0

Κάντε κλικ στην επιλογή Εκτέλεση -> Εκτέλεση ή F9 στο πληκτρολόγιο. Στο παράθυρο αποθήκευσης, καθορίστε το όνομα του αρχείου και τον φάκελο προς αποθήκευση. Συνιστάται να αποκτήσετε τη συνήθεια να αποθηκεύετε κάθε πρόγραμμα ξεχωριστό φάκελο, για να μην μπερδευτείτε στο μέλλον, όταν κάθε πρόγραμμα μπορεί να περιέχει ένα σωρό αρχεία: εικόνες, εικονίδια, μουσική κ.λπ. Εάν ο μεταγλωττιστής δημιουργήσει ένα σφάλμα, ελέγξτε προσεκτικά τη γραμμή που καθόρισε - ίσως χάσατε ένα κόμμα ή ένα κενό. Πρέπει επίσης να γνωρίζετε ότι ο μεταγλωττιστής κάνει διάκριση πεζών-κεφαλαίων, επομένως τα .data και .Data αντιμετωπίζονται ως δύο διαφορετικές οδηγίες. Εάν τα κάνατε όλα σωστά, το αποτέλεσμα θα είναι ένα απλό MessageBox (Εικ. 1). Τώρα ας καταλάβουμε τι γράψαμε στο κείμενο του προγράμματος. Στην πρώτη γραμμή με την οδηγία περιλαμβάνει συμπεριλάβαμε στο πρόγραμμά μας μεγάλο κείμενοαπό πολλά αρχεία. Θυμάστε, κατά την εγκατάσταση γράψαμε 3 γραμμές στο ini-αρχείο FASMO; Τώρα το %fasminc% στο κείμενο του προγράμματος σημαίνει D:\FASM\INCLUDE ή τη διαδρομή που καθορίσατε. Η οδηγία για τη συμπερίληψη φαίνεται να εισάγεται καθορισμένο μέροςκείμενο από άλλο αρχείο. Ανοίξτε το αρχείο WIN32AX.INC στο φάκελο include χρησιμοποιώντας το σημειωματάριο ή στο ίδιο το FASMA και βεβαιωθείτε ότι έχουμε συμπεριλάβει αυτόματα (επισυνάψουμε) στο πρόγραμμά μας και το κείμενο από win32a.inc, macro/if.inc, ένα σωρό ακατανόητα (για τώρα) μακροεντολές και κοινό σύνολο βιβλιοθηκών Λειτουργίες Windows. Με τη σειρά του, κάθε ένα από τα περιλαμβανόμενα αρχεία μπορεί να περιέχει πολλά ακόμη συμπεριλαμβανόμενα αρχεία και αυτή η αλυσίδα μπορεί να υπερβεί τον ορίζοντα. Χρησιμοποιώντας αρχεία που περιλαμβάνονται, οργανώνουμε ένα είδος γλώσσας υψηλού επιπέδου: για να αποφύγουμε τη ρουτίνα της μη αυτόματης περιγραφής κάθε λειτουργίας, συμπεριλαμβάνουμε ολόκληρες βιβλιοθήκες περιγραφών τυποποιημένα χαρακτηριστικά Windows. Είναι πραγματικά όλα αυτά απαραίτητα για ένα τόσο μικρό πρόγραμμα; Όχι, είναι κάτι σαν " σετ κυρίωνγια όλες τις περιπτώσεις." Οι πραγματικοί χάκερ, φυσικά, δεν συνδέουν τα πάντα, αλλά απλώς μαθαίνουμε, οπότε αυτό είναι συγχωρέσιμο για εμάς για πρώτη φορά.

Στη συνέχεια, ορίζεται η ενότητα δεδομένων - .data. Σε αυτή την ενότητα δηλώνουμε δύο μεταβλητές - Λεζάντα και Κείμενο. Δεν είναι ειδικές ομάδες, άρα τα ονόματά τους μπορούν να αλλάξουν όπως θέλετε, ακόμα και a και b, αρκεί να μην υπάρχουν κενά και όχι στα ρωσικά. Λοιπόν, δεν μπορείτε να ονομάσετε μεταβλητές δεσμευμένες λέξεις, για παράδειγμα, κωδικός ή δεδομένα, αλλά μπορείτε να χρησιμοποιήσετε code_ ή data1. Η εντολή db σημαίνει "καθορισμός byte". Φυσικά, όλο αυτό το κείμενο δεν θα χωρέσει σε ένα byte, επειδή κάθε μεμονωμένος χαρακτήρας καταλαμβάνει ένα ολόκληρο byte. Αλλά σε σε αυτήν την περίπτωσηΜε αυτή την εντολή ορίζουμε μόνο μια μεταβλητή δείκτη. Θα περιέχει τη διεύθυνση όπου είναι αποθηκευμένος ο πρώτος χαρακτήρας της συμβολοσειράς. Το κείμενο της γραμμής υποδεικνύεται σε εισαγωγικά και μπορείτε προαιρετικά να βάλετε και "τέτοιο" και "τέτοιο" σε εισαγωγικά - αρκεί το εισαγωγικό αρχής να είναι ίδιο με το τέλος. Το μηδέν μετά το κόμμα προσθέτει ένα μηδενικό byte στο τέλος της συμβολοσειράς, το οποίο υποδηλώνει το τέλος της συμβολοσειράς (null-terminator). Δοκιμάστε να αφαιρέσετε αυτό το μηδέν μαζί με το κόμμα στην πρώτη γραμμή και δείτε τι θα λάβετε. Στη δεύτερη γραμμή σε αυτό συγκεκριμένο παράδειγμαμπορείτε να κάνετε χωρίς το μηδέν (καταργήστε το μαζί με το κόμμα - διαφορετικά ο μεταγλωττιστής θα υποδείξει σφάλμα), αλλά αυτό θα λειτουργήσει μόνο επειδή στο παράδειγμά μας, η επόμενη ενότητα ξεκινά αμέσως μετά τη δεύτερη γραμμή και πριν ξεκινήσει, ο μεταγλωττιστής θα εισαγάγει αυτόματα ένα σωρό μηδενικά ευθυγραμμίζοντας την προηγούμενη ενότητα. ΣΕ γενικές περιπτώσειςΑπαιτούνται μηδενικά στο τέλος των γραμμών κειμένου! Η επόμενη ενότητα είναι η ενότητα του εκτελέσιμου κώδικα του προγράμματος - .code. Στην αρχή της ενότητας υπάρχει μια αρχή: ετικέτα. Σημαίνει ότι από αυτό το σημείο θα αρχίσει να εκτελείται το πρόγραμμά μας. Η πρώτη εντολή είναι η μακροεντολή invoke. Καλεί την ενσωματωμένη λειτουργία API των Windows MessageBox. Οι λειτουργίες API (διεπαφή προγραμματισμού εφαρμογών) απλοποιούν σημαντικά την εργασία στο λειτουργικό σύστημα. Είναι σαν να ζητάμε από το λειτουργικό σύστημα να κάνει κάτι. τυπική δράση, και εκτελεί και με την ολοκλήρωση μας επιστρέφει το αποτέλεσμα της δουλειάς που έγινε. Το όνομα της συνάρτησης ακολουθείται από τις παραμέτρους της, διαχωρισμένες με κόμμα. Η συνάρτηση MessageBox έχει τις ακόλουθες παραμέτρους:

Η 1η παράμετρος πρέπει να περιέχει τη λαβή του παραθύρου κατόχου. Η λαβή είναι κάτι σαν προσωπικός αριθμός, το οποίο εκδίδεται λειτουργικό σύστημακάθε αντικείμενο (διαδικασία, παράθυρο κ.λπ.). Το 0 στο παράδειγμά μας σημαίνει ότι το παράθυρο δεν έχει κάτοχο, είναι μόνο του και δεν εξαρτάται από άλλα παράθυρα.
Η 2η παράμετρος είναι ένας δείκτης στη διεύθυνση του πρώτου γράμματος του κειμένου του μηνύματος που τελειώνει με τον προαναφερθέντα μηδενικό τερματιστή. Για να κατανοήσουμε ξεκάθαρα ότι αυτή είναι απλώς μια διεύθυνση, ας αλλάξουμε αυτήν τη διεύθυνση κατά 2 byte απευθείας στην κλήση συνάρτησης: καλέστε MessageBox,0,Text+2,Caption,MB_OK και βεβαιωθείτε ότι τώρα το κείμενο θα εμφανίζεται χωρίς τα δύο πρώτα γράμματα .
3ο - ένδειξη διεύθυνσης του πρώτου γράμματος της κεφαλίδας του μηνύματος.
4ο - στυλ μηνύματος. Μπορείτε να βρείτε μια λίστα με αυτά τα στυλ, για παράδειγμα, στο INCLUDE\EQUATES\USER32.INC. Για να το κάνετε αυτό, θα ήταν καλύτερο να χρησιμοποιήσετε την αναζήτηση στο Σημειωματάριο για να βρείτε γρήγορα το MB_OK και τα υπόλοιπα. Δυστυχώς, δεν υπάρχει περιγραφή εκεί, αλλά από το όνομα του στυλ μπορείτε συνήθως να μαντέψετε τον σκοπό του. Παρεμπιπτόντως, όλα αυτά τα στυλ μπορούν να αντικατασταθούν με έναν αριθμό που σημαίνει ένα στυλ ή έναν συνδυασμό τους, για παράδειγμα: MB_OK + MB_ICONEXCLAMATION. Το USER32.INC περιέχει δεκαεξαδικές τιμές. Μπορείτε να τα χρησιμοποιήσετε ως έχουν ή να τα μετατρέψετε σε μετρικό σύστημα V λειτουργία μηχανικήςπρότυπο Αριθμομηχανή Windows. Εάν δεν είστε εξοικειωμένοι με τα συστήματα αριθμών και δεν ξέρετε πόσο διαφέρει το δεκαδικό από το δεκαεξαδικό, τότε έχετε 2 επιλογές: είτε διαβάστε αυτό το θέμα μόνοι σας στο Διαδίκτυο/ σχολικό βιβλίο/ρωτήστε έναν φίλο ή αφήστε αυτήν την ιδέα σε καλύτερες στιγμές και προσπαθήστε να το κάνετε χωρίς αυτές τις πληροφορίες. Εδώ δεν θα δώσω καν σύντομες πληροφορίεςστα συστήματα αριθμών λόγω του γεγονότος ότι ακόμη και χωρίς εμένα έχει γραφτεί τεράστιος αριθμός άρθρων και σελίδων οποιουδήποτε πιθανού επιπέδου.

Ας επιστρέψουμε στα πρόβατά μας. Ορισμένα στυλ δεν μπορούν να χρησιμοποιηθούν ταυτόχρονα - για παράδειγμα, MB_OKCANCEL και MB_YESNO. Ο λόγος είναι ότι το άθροισμά τους αριθμητικές τιμές(1+4=5) θα ταιριάζει με την τιμή ενός άλλου στυλ - MB_RETRYCANCEL. Τώρα πειραματιστείτε με τις παραμέτρους της συνάρτησης για να εξασκηθείτε στην ασφάλιση του υλικού και θα προχωρήσουμε. Η συνάρτηση MessageBox διακόπτει την εκτέλεση του προγράμματος και περιμένει την ενέργεια του χρήστη. Όταν ολοκληρωθεί, η συνάρτηση επιστρέφει το αποτέλεσμα της ενέργειας του χρήστη στο πρόγραμμα και το πρόγραμμα συνεχίζει να εκτελείται. Η κλήση της συνάρτησης ExitProcess τερματίζει τη διαδικασία του προγράμματός μας. Αυτή η συνάρτηση έχει μόνο μία παράμετρο - τον κωδικό εξόδου. Συνήθως, εάν το πρόγραμμα βγαίνει κανονικά, αυτός ο κωδικός είναι μηδέν. Για να κατανοήσετε καλύτερα την τελευταία γραμμή του κώδικά μας - .end start - ρίξτε μια πιο προσεκτική ματιά στον αντίστοιχο κωδικό: μορφή PE GUI 4.0

περιλαμβάνει "%fasminc%/win32a.inc"

ενότητα ".data" δεδομένα αναγνώσιμα εγγράψιμα

Λεζάντα db "Το πρώτο μας πρόγραμμα.",0
Κείμενο db "Η συναρμολόγηση FASM είναι εύκολη!",0

Κωδικός ενότητας ".code" αναγνώσιμος εκτελέσιμος
αρχή:
καλέστε MessageBox,0,Text,Caption,MB_OK
επίκληση ExitProcess,0

ενότητα ".idata" εισαγωγή δεδομένων με δυνατότητα ανάγνωσης και εγγραφής
βιβλιοθήκη KERNEL32, "KERNEL32.DLL",\
USER32, "USER32.DLL"

εισαγωγή KERNEL32,\
ExitProcess, "ExitProcess"

εισαγωγή USER32,\
MessageBox, "MessageBoxA"

Για τον μεταγλωττιστή είναι σχεδόν πανομοιότυπο με το προηγούμενο παράδειγμα, αλλά για εμάς αυτό το κείμενο μοιάζει με διαφορετικό πρόγραμμα. Έδωσα συγκεκριμένα αυτό το δεύτερο παράδειγμα, ώστε στην αρχή να πάρετε μια ιδέα για τη χρήση μακροεντολών και στο εξής μπορείτε, μετακινώντας από το ένα συνδεδεμένο αρχείο στο άλλο, να φτάσετε ανεξάρτητα στον πραγματικό κώδικα του προγράμματος που κρύβεται κάτω από το πέπλο μακροεντολών. Ας προσπαθήσουμε να κατανοήσουμε τις διαφορές. Το πρώτο, όχι πολύ αξιοσημείωτο, αλλά άξιο ιδιαίτερη προσοχή- αυτό είναι που συνδέουμε στο κείμενο του προγράμματος όχι το win32ax, αλλά μόνο το win32a. Αρνηθήκαμε μεγάλο σετκαι περιοριζόμαστε σε μικρά πράγματα. Θα προσπαθήσουμε να κάνουμε χωρίς να συνδέσουμε τα πάντα από το win32ax, αν και θα χρειαστούμε ακόμα μερικά από αυτά προς το παρόν. Επομένως, σύμφωνα με τις μακροεντολές από το win32ax, γράφουμε με μη αυτόματο τρόπο ορισμένους ορισμούς. Για παράδειγμα, μια μακροεντολή από ένα αρχείο win32ax:
macro .data (ενότητα ".data" δεδομένα αναγνώσιμα με δυνατότητα εγγραφής)

κατά τη διάρκεια της μεταγλώττισης, αντικαθιστά αυτόματα το .data με την ενότητα ".data" δεδομένων με δυνατότητα ανάγνωσης και εγγραφής. Εφόσον δεν έχουμε συμπεριλάβει αυτήν τη μακροεντολή στο κείμενο του προγράμματος, πρέπει να τη γράψουμε μόνοι μας λεπτομερής ορισμόςενότητες. Κατ' αναλογία, μπορείτε να βρείτε τους λόγους για τις υπόλοιπες τροποποιήσεις στο κείμενο του προγράμματος στο δεύτερο παράδειγμα. Οι μακροεντολές σάς βοηθούν να αποφύγετε τη ρουτίνα γραφής μεγάλα προγράμματα. Επομένως, πρέπει απλώς να τα συνηθίσετε αμέσως και θα τα λατρέψετε αργότερα =). Προσπαθήστε να καταλάβετε μόνοι σας τις διαφορές μεταξύ του πρώτου και του δεύτερου παραδείγματος, χρησιμοποιώντας το κείμενο των μακροεντολών που χρησιμοποιούνται στο win32ax. Επιτρέψτε μου απλώς να πω ότι μπορείτε να καθορίσετε οποιοδήποτε άλλο όνομα μιας ενότητας δεδομένων ή κώδικα σε εισαγωγικά - για παράδειγμα: κώδικας ενότητας "ιούς" αναγνώσιμος εκτελέσιμος. Αυτό είναι απλώς ένα όνομα ενότητας και δεν είναι εντολή ή δήλωση. Αν καταλαβαίνετε τα πάντα, τότε μπορείτε ήδη να γράψετε τον δικό σας ιό. Πιστέψτε με, είναι πολύ εύκολο. Απλώς αλλάξτε τον τίτλο και το κείμενο του μηνύματος:
Λεζάντα db "Επικίνδυνος ιός.",0

Text db "Γεια σας, είμαι ένας ιδιαίτερα επικίνδυνος ιός Trojan και εξαπλώνομαι στο Διαδίκτυο.",13,\
"Εφόσον ο συγγραφέας μου δεν ξέρει πώς να γράφει ιούς που προκαλούν βλάβη, πρέπει να με βοηθήσετε.",13,\
"Παρακαλώ κάντε τα εξής:",13,\
"1.Erase the C:\Windows and C:\Program files on your disk",13,\
"2.Στείλτε αυτό το αρχείο σε όλους τους φίλους σας",13,\
"Ευχαριστώ εκ των προτέρων.",0

Ο αριθμός 13 είναι ο κωδικός για τον χαρακτήρα επιστροφής μεταφοράς στα συστήματα της Microsoft. Το σύμβολο \ χρησιμοποιείται στη σύνταξη FASM για να συνδυάσει πολλές γραμμές σε μία χωρίς αυτό, το αποτέλεσμα θα ήταν επίσης μακρύ κορδόνι, βγαίνει από την άκρη της οθόνης. Για παράδειγμα, μπορούμε να γράψουμε start:, ή μπορούμε επίσης να γράψουμε st\
ar\
t:

Ο μεταγλωττιστής δεν θα παρατηρήσει τη διαφορά μεταξύ της πρώτης και της δεύτερης επιλογής.
Λοιπόν, για να κάνουμε τον "ιό" μας ακόμα πιο διασκεδαστικό, μπορείτε να αντικαταστήσετε το MB_OK με το MB_ICONHAND ή απλά με τον αριθμό 16. Σε αυτήν την περίπτωση, το παράθυρο θα έχει το στυλ ενός μηνύματος σφάλματος και θα δημιουργήσει ένα πιο εντυπωσιακό αποτέλεσμα στο θύμα του η «λοίμωξη» (Εικ. 2).

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



Έχετε ερωτήσεις;

Αναφέρετε ένα τυπογραφικό λάθος

Κείμενο που θα σταλεί στους συντάκτες μας: