Προγραμματισμός γλώσσας Assembly για αρχάριους με παραδείγματα προγραμμάτων. Ομοσπονδιακή Υπηρεσία Εκπαίδευσης της Ρωσικής Ομοσπονδίας

Γειά σου!
Θέλω να δείξω πώς είναι γραμμένο ένα πρόγραμμα για τον έλεγχο του τεχνολογικού εξοπλισμού σε ένα PLC.
Τις περισσότερες φορές, ασχολήθηκα με PLC που κατασκευάζει η Schneider Electric. Το Quantum που επέλεξα για αυτήν την εργασία είναι το πιο ισχυρό και ακριβό PLC από αυτόν τον κατασκευαστή. Μπορεί να ελέγξει τον εξοπλισμό με χιλιάδες σήματα· στην πραγματική ζωή, κανείς, φυσικά, δεν θα τον χρησιμοποιήσει για φανάρι.

Ποτέ δεν ασχολήθηκα με την αυτοματοποίηση των φωτεινών σηματοδοτών, οπότε κατέληξα στον αλγόριθμο μόνος μου. Να τος:
1. Φανάρι για ρυθμιζόμενη διάβαση πεζών. Εκείνοι. ένα φανάρι για αυτοκίνητα, ένα φανάρι για τους πεζούς και ένα κουμπί για τους πεζούς, με το πάτημα του οποίου, ο πεζός ειδοποιεί την επιθυμία να διασχίσει το δρόμο.
2. Μετά την έναρξη του προγράμματος ανάβει πράσινο για τα αυτοκίνητα και κόκκινο για τους πεζούς.
3. Όταν πατηθεί το κουμπί από πεζό, το πράσινο για τα οχήματα αναβοσβήνει, μετά κίτρινο και μετά κόκκινο. Μετά από αυτό, ανάβει πράσινο για τους πεζούς, μετά από καθορισμένο χρόνο αρχίζει να αναβοσβήνει, κόκκινο ανάβει για πεζούς, μετά ανάβει κίτρινο και κόκκινο για αυτοκίνητα και μετά πράσινο.
4. Μέσα σε ένα καθορισμένο χρονικό διάστημα μετά το πράσινο φως σε φανάρι πεζών, το πάτημα του κουμπιού από έναν πεζό δεν ξεκινά τον αλγόριθμο μετάβασης. Ο αλγόριθμος μετάβασης ξεκινά σε αυτήν την περίπτωση μόνο αφού παρέλθει ο καθορισμένος χρόνος.
Ο προγραμματισμός PLC πραγματοποιείται στο περιβάλλον προγραμματισμού Unity στις γλώσσες του προτύπου IEC 61131-3. Αυτό το πρότυπο περιλαμβάνει 5 γλώσσες. Για παράδειγμα, επέλεξα τη γλώσσα των μπλοκ συναρτήσεων - FBD.
Εδώ είναι το πρόγραμμα περιήγησης του έργου στο Unity:

Διαμόρφωση του PLC:


Το PLC αποτελείται από έναν πίνακα τοποθέτησης, ένα τροφοδοτικό (1), έναν ελεγκτή (2), μια διακριτή μονάδα εισόδου για 32 σήματα 24V DC (4), μια διακριτή μονάδα εισόδου για 32 σήματα 24V DC (5). Σε ένα πραγματικό έργο, μπορεί να υπάρχουν δεκάδες πάνελ στερέωσης συνδεδεμένα σε έναν ελεγκτή μέσω διαφορετικών δικτύων και εκατοντάδες μονάδες I/O.
Δημιουργήστε μεταβλητές των απαιτούμενων τύπων στον επεξεργαστή μεταβλητών:


Οι μεταβλητές που συνδέονται στα κανάλια της μονάδας I/O έχουν μια διεύθυνση που υποδεικνύει σε ποιο κάδο, μονάδα και κανάλι είναι δεσμευμένο το σήμα.
Το πρόγραμμα αποτελείται από ενότητες που εκτελούνται σε κάθε κύκλο της σάρωσης του ελεγκτή με τη σειρά.
Απλοποιημένος, ο κύκλος σάρωσης ελεγκτή μοιάζει με αυτό:
1. Ανάγνωση σημάτων εισόδου από τη μονάδα εισόδου σε μεταβλητές με διευθύνσεις.
2. Εκτέλεση τμημάτων.
3. Εγγραφή τιμών από μεταβλητές με διευθύνσεις στα σήματα εξόδου των μονάδων εξόδου.
4. Πηγαίνετε στο βήμα 1.
Δημιουργήστε ένα τμήμα Ρολογιού με μια γεννήτρια παλμών με περίοδο 0,5 δευτερολέπτων. Το μπλοκ TP, όταν το σήμα εισόδου αλλάζει από 0 σε 1, εξάγει έναν παλμό δεδομένης διάρκειας στην έξοδο.


Εδώ και παρακάτω, τα στιγμιότυπα οθόνης των ενοτήτων εμφανίζονται σε λειτουργία κίνησης και όχι σε λειτουργία επεξεργασίας. Εμφανίζουν τις τιμές των μεταβλητών την τρέχουσα στιγμή όταν συνδέονται σε PLC με φορτωμένο πρόγραμμα (αριθμοί για αριθμητικές μεταβλητές, χρώμα πράσινο (1)-κόκκινο (0) για boolean).
Η κύρια ενότητα χειρίζεται την κύρια λογική.
Το μπλοκ SR ορίζει την έξοδο σε 1 όταν S1=1 και επαναφέρει την έξοδο στο 0 όταν R=1.
Το μπλοκ R_TRIG ορίζει την έξοδο για 1 κύκλο σάρωσης σε 1 όταν η είσοδος μεταβαίνει από το 0 στο 1 (ανιχνευτής ανερχόμενης ακμής).
Το μπλοκ F_TRIG ορίζει την έξοδο για 1 κύκλο σάρωσης σε 1 όταν η είσοδος μεταβαίνει από το 1 στο 0 (ανιχνευτής τελικής ακμής).
Η μεταβλητή inButton που είναι δεσμευμένη στο κανάλι κουμπιών έχει αντικατασταθεί στην ενότητα με το inButtonForTest προκειμένου να είναι δυνατή η αλλαγή της τιμής της σε έναν προσομοιωτή ελεγκτή χωρίς πραγματικό υλικό.


Η ενότητα Έξοδοι παράγει σήματα εξόδου για τον έλεγχο των φωτεινών σηματοδοτών.


Φόρτωση του έργου στον προσομοιωτή ελεγκτή:


Η τιμή οποιωνδήποτε μεταβλητών μπορεί να προβληθεί στον πίνακα κινούμενων εικόνων:


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

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

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

UPD. Διορθώθηκε ένα σφάλμα στο όνομα του προτύπου.

(Σχήματα), (Πάνελ).

Πριν δημιουργήσετε μια εφαρμογή, θα πρέπει να ελέγξετε την περιγραφή των νέων στοιχείων.

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

Πρόοδος του έργου

1. Δημιουργήστε ένα νέο έργο. Αποθηκεύστε το σε ξεχωριστό φάκελο, ονομάστε το "Φανάρι".

2. Τοποθετήστε στη φόρμα ένα πλαίσιο (TPanel) με τρία σχήματα (TShape), δύο κουμπιά (TButton), ένα πεδίο κειμένου (TEdit), μια επιγραφή (TLabel), ένα χρονόμετρο (TTimer) σύμφωνα με το δείγμα:

Θα πρέπει να μοιάζει με αυτό:

2. Κάνοντας το σχέδιο:

Ορίστε τις δεδομένες τιμές ιδιοτήτων στον επιθεωρητή αντικειμένων:

Συστατικό Ιδιοκτησία Εννοια
Έντυπο 1 Λεζάντα Φανάρια
Πίνακας 1 Λεζάντα *Αδειάζω*
Σχήμα 1 σχήμα stCircle
Σχήμα 2 σχήμα stCircle
Σχήμα 3 σχήμα stCircle
Ετικέτα 1 Λεζάντα Ταχύτητα
Επεξεργασία 1 Κείμενο *κενό*
Κουμπί 1 Λεζάντα Αρχή
Κουμπί 2 Λεζάντα Να σταματήσει

3. Δημιουργούμε ένα συμβάν για το Form1 στην ενότητα OnCreate - Πατήστε την έλλειψη

Δημιουργήστε ένα συμβάν για το Timer1 στην ενότητα OnTimer - Πατήστε την έλλειψη

4. Ορίστε χρώματα για σχήματα:

Τελική εργασία:

5. Κατά τη φόρτωση της φόρμας, το χρονόμετρο είναι απενεργοποιημένο, τα σχήματα στον πίνακα γίνονται αόρατα.

Δημιουργήστε ένα πρόγραμμα χειρισμού συμβάντων για το συμβάν FormCreate (κάντε διπλό κλικ στο στοιχείο Form1) και επικολλήστε αυτόν τον κώδικα:

vark:integer; διαδικασία TForm1.FormCreate(Αποστολέας: TObject); start Timer1.Enabled:=false; Shape1.Visible:=false; Shape2.Visible:=false; Shape3.Visible:=false; τέλος;

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

Κάντε διπλό κλικ στο στοιχείο Timer1 και επικολλήστε αυτόν τον κωδικό:

6. Γράψτε τον κωδικό για το κουμπί έναρξης. Κάνοντας κλικ στο κουμπί, το διάστημα για το χρονόμετρο διαβάζεται από το πεδίο Ταχύτητα, οι ενδείξεις του χρονοδιακόπτη ρυθμίζονται στο μηδέν και ο χρονοδιακόπτης είναι ενεργοποιημένος.

Κάντε διπλό κλικ στο στοιχείο Button1 και επικολλήστε τον κώδικα:

διαδικασία TForm1.Button1Click(Sender: TObject); start Timer1.Interval:=StrToInt(Edit1.text); k:=0; Timer1.Enabled:=true; τέλος;

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

Κάντε διπλό κλικ στο στοιχείο Button2 και επικολλήστε τον κωδικό:

διαδικασία TForm1.Button2Click(Αποστολέας: TObject); start Timer1.Enabled:=false; Shape1.Visible:=false; Shape2.Visible:=false; Shape3.Visible:=false; τέλος;

8. Εκτελέστε το έργο. Στο πεδίο Ταχύτητα, πληκτρολογήστε τον αριθμό 1000 (1000ms=1s). Τα φανάρια θα αρχίσουν να αλλάζουν ανά διαστήματα ενός δευτερολέπτου.

Artem Poznyak, μαθητής της τάξης 10 "A", γυμνάσιο Νο. 23, Ekibasbuz

Όταν ο γιος μου κολλούσε ένα μοντέλο φαναριού από χαρτί για το σχολείο, ήρθε η σκέψη: «Γιατί να μην του συναρμολογήσω ένα λειτουργικό μοντέλο φαναριού σε έναν μικροελεγκτή». Στο Διαδίκτυο, υπάρχουν πολλά σχέδια και προγράμματα για αυτούς που εφαρμόζουν την αρχή ενός απλού φαναριού. Αλλά είτε είναι πολύ περίπλοκα για ένα παιχνίδι (μετατροπέας DC-DC, καταχωρητές αλλαγής ταχυτήτων κ.λπ.) είτε παρουσιάζονται μόνο ως παράδειγμα ενός απλού προγράμματος συναρμολόγησης. Θα ήθελα να σας δείξω το διάγραμμα κυκλώματος και τον κωδικό συναρμολόγησης ενός πλήρους φαναριού παιχνιδιού με ορισμένες πρόσθετες δυνατότητες. Επιπλέον, συναρμολογείται σε έναν μικροελεγκτή "penny" σύμφωνα με το απλούστερο σχήμα, το οποίο είναι σημαντικό για αρχάριους. Ελπίζω ότι αυτό το απλό κύκλωμα θα είναι για πολλούς που αρχίζουν να μαθαίνουν τον προγραμματισμό μικροελεγκτών PIC, το πρώτο σχέδιο που συναρμολογήθηκε πραγματικά σε ένα PIC. Απλό, αλλά ταυτόχρονα περιέχει τις βασικές τεχνικές και χαρακτηριστικά του προγραμματισμού, το πρόγραμμα θα διευκολύνει την κατανόηση και τον πειραματισμό μαζί του.

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

Συνοπτικά χαρακτηριστικά της συσκευής:

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

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

Το κύκλωμα συναρμολογείται σε έναν φθηνό μικροελεγκτή PIC12F629. Οι έξοδοι GP0-GP2, GP4, GP5 (πόδια 7, b, 5, 3, 2) που έχουν προγραμματιστεί ως έξοδοι χρησιμοποιούνται απευθείας για τον έλεγχο των LED. Τα LED σε κάθε κατεύθυνση ομαδοποιούνται σε σειρά για να ελαχιστοποιηθεί η κατανάλωση ρεύματος. Οι αντιστάσεις R3-R8 περιορίζουν τα ρεύματα LED. Σε περίπτωση έντονης διαφοράς στην έξοδο των LED διαφορετικών χρωμάτων, θα πρέπει να επιλέξετε τις κατάλληλες αντιστάσεις. Για παράδειγμα, έχω δύο κίτρινες ομάδες συνδεδεμένες παράλληλα και συνδεδεμένες με την ίδια αντίσταση, και την ίδια τιμή με τις υπόλοιπες και λάμπουν ακόμη και λίγο πιο φωτεινά από τις άλλες (η επιστροφή είναι μεγαλύτερη).

Σε αυτό το κύκλωμα, τα LED τροφοδοτούνται με 1,5 V περισσότερο από τον μικροελεγκτή από ένα πρόσθετο στοιχείο (σε αυτή την περίπτωση, όταν η έξοδος είναι απενεργοποιημένη, το ρεύμα δεν περνά στην έξοδο του μικροκυκλώματος, καθώς απαιτείται πολύ περισσότερη τάση για ανοίξτε τις μεταβάσεις δύο LED από 1,5 V (τουλάχιστον 2,5 C) Και ακόμη και με σπασμένα και τα δύο LED (κάτι που είναι απίθανο), το ρεύμα μέσω της εσωτερικής προστατευτικής διόδου στο συν της τροφοδοσίας θα είναι περίπου 7,5 mA, που είναι πολύ μικρότερη από την επιτρεπόμενη. Η κατανάλωση ρεύματος των LED είναι πολύ μεγαλύτερη από την κατανάλωση του MK, επομένως, η διαφορά στην εκφόρτιση των στοιχείων (μέσω ενός δεν ρέει η κατανάλωση ρεύματος του MC) μπορεί να αγνοηθεί. έχει αποδειχθεί πειραματικά ότι, παρά τη μείωση του ρεύματος μέσω των LED κατά την αποφόρτιση της μπαταρίας, η φωτεινότητα της λάμψης τους παραμένει σε αποδεκτό επίπεδο σε όλο το εύρος της τάσης της μπαταρίας. Το κύκλωμα είναι εξαιρετικά απλοποιημένο και δεν υπάρχει σταθεροποιητής τάσης που καταναλώνει ένα πρόσθετο ρεύμα, το οποίο κατέστησε δυνατή την εγκατάλειψη του διακόπτη λειτουργίας (κατανάλωση ρεύματος σε κατάσταση αναστολής λειτουργίας - 1-3 m kA).

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

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

Η φόρτιση των κυψελών AA σε κατάσταση αναστολής λειτουργίας θα διαρκέσει για τουλάχιστον ένα χρόνο, γι' αυτό η συσκευή δεν διαθέτει διακόπτη λειτουργίας. Η συσκευή μπαίνει σε κατάσταση αναστολής λειτουργίας επίσης μετά από 0,5 - 1 ώρα (ανάλογα με την ταχύτητα εναλλαγής χρωμάτων) εργασίας χωρίς να πατήσετε το κουμπί. Η λειτουργία SLEEP εξέρχεται με οποιοδήποτε πάτημα κουμπιού. Η ισχύς παρέχεται στον μικροελεγκτή μέσω των ακροδεκτών 1 και 8. Για εξοικονόμηση ακίδων και απλούστευση του σχεδιασμού, διαθέτει λειτουργία εσωτερικής γεννήτριας χωρίς εξωτερικά στοιχεία.

Μικρές εξηγήσεις για το πρόγραμμα, που δίνονται στο συνημμένο.

Η επεξεργασία των πιέσεων κουμπιών πραγματοποιείται σε υπορουτίνες: wait_butt__ - αναμονή για πάτημα και εγγραφή 6 δευτερόλεπτα. χωρίς πάτημα, push_butt__ - καταγραφή της διάρκειας του πατήματος, wait_nobutt__ - αναμονή για ένα κουμπί που δεν έχει πατηθεί. Τη στιγμή της αλλαγής της κατάστασης του φαναριού (κίτρινο και πράσινο που αναβοσβήνει), οι τιμές στη θύρα εξόδου διαβάζονται από τον πίνακα στην υπορουτίνα tact__ (χαμηλά ή ψηλά τσιμπήματα). Ομοίως, η ένδειξη κατάστασης όταν πατηθεί ένα κουμπί είναι από την υπορουτίνα ind__. Για να εισέλθετε σε κατάσταση αναστολής λειτουργίας μετά την πάροδο του χρόνου εκτέλεσης, πραγματοποιείται μια αναγκαστική μετάβαση στη ρουτίνα χειρισμού διακοπών με προγραμματισμό της σημαία διακοπής. Αλλάζοντας τις σταθερές CONST_MIN, CONST_REG, CONST_SL, μπορείτε να αλλάξετε, αντίστοιχα, την περίοδο που αναβοσβήνει με πράσινο χρώμα, την αρχική λειτουργία κατά τη σύνδεση της μπαταρίας, τον χρόνο λειτουργίας χωρίς επιρροή πριν από τη μετάβαση στη λειτουργία SLEEP.

Η πλακέτα τυπωμένου κυκλώματος είναι κατασκευασμένη από αλουμινόχαρτο μονής όψης και έχει διαστάσεις 22x87 mm. Τα LED άκρων εγκαθίστανται παράλληλα με την πλακέτα σε διαφορετικές κατευθύνσεις. Τα μεσαία τοποθετούνται το ένα από την πλευρά της εγκατάστασης των εξαρτημάτων και το άλλο - από την πλευρά των τροχιών με το σπείρωμα των καλωδίων στις οπές της σανίδας και τη στερέωσή τους από την πλευρά των εξαρτημάτων με μια σταγόνα συγκόλλησης, και από το πλάι των τροχιών με συγκόλληση στις αντίστοιχες ράγες.

Όλες οι αντιστάσεις είναι 0,125W. Μπορείτε να πάρετε οποιαδήποτε εγχώρια ή εισαγόμενα LED, κατά προτίμηση του ίδιου τύπου με άμεση πτώση τάσης σε ρεύμα 10 mA, περίπου 2 Volt. Κουμπί - οποιοδήποτε μη μανδάλωμα. Ο μικροελεγκτής είναι εγκατεστημένος στο μπλοκ.

Η λέξη διαμόρφωσης εισάγεται αυτόματα στη μνήμη κατά τη φόρτωση του υλικολογισμικού (το "bird" ορίζεται μόνο στο στοιχείο "PWRT", τα υπόλοιπα στοιχεία έχουν ρυθμιστεί "reset", η στήλη "oscillator" ορίζεται σε "intOSC GP4" ). Πρώτα, πρέπει να διαβάσετε το υλικολογισμικό από ένα κενό μικροκύκλωμα και να γράψετε την τιμή της λέξης στο τέλος της μνήμης του προγράμματος στη διεύθυνση 03FF, η οποία απαιτείται για τη ρύθμιση της συχνότητας του εσωτερικού ταλαντωτή μιας συγκεκριμένης περίπτωσης μικροκυκλώματος. Αφού φορτώσετε το αρχείο HEX στο πρόγραμμα, πρέπει να εισαγάγετε χειροκίνητα αυτήν την τιμή στη διεύθυνση 03FF. Σε αυτήν τη συσκευή, η απόκλιση συχνότητας δεν είναι κρίσιμη, αλλά θα πρέπει να γνωρίζετε ότι μια τέτοια διαδικασία απαιτείται για αυτό το μικροκύκλωμα. Σε ακραίες περιπτώσεις, εάν χαθεί η εργοστασιακή τιμή, δεν μπορείτε να κάνετε τίποτα - το πρόγραμμα έχει λάβει μέτρα για να λειτουργεί σωστά και σε αυτήν την περίπτωση.

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

Η εφαρμογή περιέχει: ένα μοντέλο, μια πλακέτα τυπωμένου κυκλώματος σε μορφή LAY, ένα πρόγραμμα συναρμολόγησης MPASM, ένα αρχείο υλικολογισμικού HEX.

Λίστα ραδιοφωνικών στοιχείων

Ονομασία Τύπος Ονομασία Ποσότητα ΣημείωσηΚατάστημαΤο σημειωματάριό μου
IC1 MK PIC 8-bit

PIC12F629

1 ΒΟΥΤΙΑ Στο σημειωματάριο
R1 Αντίσταση

3 kOhm

1 0,125 W Στο σημειωματάριο
R2 Αντίσταση

100 ωμ

1 0,125 W Στο σημειωματάριο
R3-R8 Αντίσταση

200 ωμ

6 0,125 W Στο σημειωματάριο
HL1,HL2,HL9,HL10 Δίοδος εκπομπής φωτός

AL307A

4 ΤΟ ΚΟΚΚΙΝΟ Στο σημειωματάριο
HL3,HL4,HL11,HL12 Δίοδος εκπομπής φωτός

Όταν ο γιος μου κολλούσε ένα μοντέλο φαναριού από χαρτί για το σχολείο, ήρθε η σκέψη: «Γιατί να μην του συναρμολογήσω ένα λειτουργικό μοντέλο φαναριού σε έναν μικροελεγκτή». Στο Διαδίκτυο, υπάρχουν πολλά σχέδια και προγράμματα για αυτούς που εφαρμόζουν την αρχή ενός απλού φαναριού. Αλλά είτε είναι πολύ περίπλοκα για ένα παιχνίδι (μετατροπέας DC-DC, καταχωρητές αλλαγής ταχυτήτων κ.λπ.) είτε παρουσιάζονται μόνο ως παράδειγμα ενός απλού προγράμματος συναρμολόγησης. Θα ήθελα να σας δείξω το διάγραμμα κυκλώματος και τον κωδικό συναρμολόγησης ενός πλήρους φαναριού παιχνιδιού με ορισμένες πρόσθετες δυνατότητες. Επιπλέον, συναρμολογείται σε έναν μικροελεγκτή "penny" σύμφωνα με το απλούστερο σχήμα, το οποίο είναι σημαντικό για αρχάριους. Ελπίζω ότι αυτό το απλό κύκλωμα θα είναι για πολλούς που αρχίζουν να μαθαίνουν τον προγραμματισμό μικροελεγκτών PIC, το πρώτο σχέδιο που συναρμολογήθηκε πραγματικά σε ένα PIC. Απλό, αλλά ταυτόχρονα περιέχει τις βασικές τεχνικές και χαρακτηριστικά του προγραμματισμού, το πρόγραμμα θα διευκολύνει την κατανόηση και τον πειραματισμό μαζί του.

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

Συνοπτικά χαρακτηριστικά της συσκευής:

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

Λοιπόν, ας προχωρήσουμε στην περιγραφή και την εξέταση του σχήματος:

Το κύκλωμα συναρμολογείται σε έναν φθηνό μικροελεγκτή. Οι έξοδοι GP0-GP2, GP4, GP5 (πόδια 7, b, 5, 3, 2) που έχουν προγραμματιστεί ως έξοδοι χρησιμοποιούνται απευθείας για τον έλεγχο των LED. Τα LED σε κάθε κατεύθυνση ομαδοποιούνται σε σειρά για να ελαχιστοποιηθεί η κατανάλωση ρεύματος. Οι αντιστάσεις R3-R8 περιορίζουν τα ρεύματα LED. Σε περίπτωση έντονης διαφοράς στην έξοδο των LED διαφορετικών χρωμάτων, θα πρέπει να επιλέξετε τις κατάλληλες αντιστάσεις. Για παράδειγμα, έχω δύο κίτρινες ομάδες συνδεδεμένες παράλληλα και συνδεδεμένες στην ίδια αντίσταση, και την ίδια τιμή με τις υπόλοιπες και λάμπουν ακόμη και λίγο πιο φωτεινά από τις άλλες (η επιστροφή είναι μεγαλύτερη).

Σε αυτό το κύκλωμα, τα LED τροφοδοτούνται με 1,5 V περισσότερο από τον μικροελεγκτή από ένα πρόσθετο στοιχείο (σε αυτή την περίπτωση, όταν η έξοδος είναι απενεργοποιημένη, το ρεύμα δεν περνά στην έξοδο του μικροκυκλώματος, καθώς απαιτείται πολύ περισσότερη τάση για ανοίξτε τις μεταβάσεις δύο LED από 1,5 V (τουλάχιστον 2,5 C) Και ακόμη και με σπασμένα και τα δύο LED (κάτι που είναι απίθανο), το ρεύμα μέσω της εσωτερικής προστατευτικής διόδου στο συν της τροφοδοσίας θα είναι περίπου 7,5 mA, που είναι πολύ μικρότερη από την επιτρεπόμενη. Η κατανάλωση ρεύματος των LED είναι πολύ μεγαλύτερη από την κατανάλωση του MK, επομένως, η διαφορά στην εκφόρτιση των στοιχείων (μέσω ενός δεν ρέει η κατανάλωση ρεύματος του MC) μπορεί να αγνοηθεί. έχει αποδειχθεί πειραματικά ότι, παρά τη μείωση του ρεύματος μέσω των LED κατά την αποφόρτιση της μπαταρίας, η φωτεινότητα της λάμψης τους παραμένει σε αποδεκτό επίπεδο σε όλο το εύρος της τάσης της μπαταρίας. Το κύκλωμα είναι εξαιρετικά απλοποιημένο και δεν υπάρχει σταθεροποιητής τάσης που καταναλώνει ένα πρόσθετο ρεύμα, το οποίο κατέστησε δυνατή την εγκατάλειψη του διακόπτη λειτουργίας (κατανάλωση ρεύματος σε κατάσταση αναστολής λειτουργίας - 1-3 m kA).

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

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

Η φόρτιση των κυψελών AA σε κατάσταση αναστολής λειτουργίας θα διαρκέσει για τουλάχιστον ένα χρόνο, γι' αυτό η συσκευή δεν διαθέτει διακόπτη λειτουργίας. Η συσκευή μπαίνει σε κατάσταση αναστολής λειτουργίας επίσης μετά από 0,5 - 1 ώρα (ανάλογα με την ταχύτητα εναλλαγής χρώματος) λειτουργίας χωρίς να πατήσετε το κουμπί. Η λειτουργία SLEEP εξέρχεται με οποιοδήποτε πάτημα κουμπιού. Η ισχύς παρέχεται στον μικροελεγκτή μέσω των ακροδεκτών 1 και 8. Για εξοικονόμηση ακίδων και απλούστευση του σχεδιασμού, διαθέτει λειτουργία εσωτερικής γεννήτριας χωρίς εξωτερικά στοιχεία.

Μια μικρή εξήγηση για το πρόγραμμα, η οποία δίνεται στο συνημμένο:

Η επεξεργασία των πιέσεων κουμπιών πραγματοποιείται σε υπορουτίνες: wait_butt__ - αναμονή για πάτημα και εγγραφή 6 δευτερόλεπτα. χωρίς πάτημα, push_butt__ - καταγραφή της διάρκειας του πατήματος, wait_nobutt__ - αναμονή για ένα κουμπί που δεν έχει πατηθεί. Τη στιγμή της αλλαγής της κατάστασης του φαναριού (κίτρινο και πράσινο που αναβοσβήνει), οι τιμές στη θύρα εξόδου διαβάζονται από τον πίνακα στην υπορουτίνα tact__ (χαμηλά ή ψηλά τσιμπήματα). Ομοίως, η ένδειξη κατάστασης όταν πατηθεί ένα κουμπί είναι από την υπορουτίνα ind__. Για να εισέλθετε σε κατάσταση αναστολής λειτουργίας μετά την πάροδο του χρόνου εκτέλεσης, πραγματοποιείται μια αναγκαστική μετάβαση στη ρουτίνα χειρισμού διακοπών με προγραμματισμό της σημαία διακοπής. Αλλάζοντας τις σταθερές CONST_MIN, CONST_REG, CONST_SL, μπορείτε να αλλάξετε, αντίστοιχα, την περίοδο που αναβοσβήνει με πράσινο χρώμα, την αρχική λειτουργία κατά τη σύνδεση της μπαταρίας, τον χρόνο λειτουργίας χωρίς επιρροή πριν από τη μετάβαση στη λειτουργία SLEEP.

Η πλακέτα τυπωμένου κυκλώματος είναι κατασκευασμένη από αλουμινόχαρτο μονής όψης και έχει διαστάσεις 22x87 mm. Τα LED άκρων εγκαθίστανται παράλληλα με την πλακέτα σε διαφορετικές κατευθύνσεις. Τα μεσαία τοποθετούνται το ένα από την πλευρά της τοποθέτησης των εξαρτημάτων και το άλλο από την πλευρά των τροχιών, περνώντας τα καλώδια στις οπές της σανίδας και στερεώνοντάς τα από την πλευρά των εξαρτημάτων με μια σταγόνα συγκόλλησης και από την πλευρά των τροχιών με συγκόλληση στις αντίστοιχες ράγες.

Όλες οι αντιστάσεις είναι 0,125W. Μπορείτε να πάρετε οποιαδήποτε εγχώρια ή εισαγόμενα LED, κατά προτίμηση του ίδιου τύπου με άμεση πτώση τάσης σε ρεύμα 10 mA, περίπου 2 Volt. Κουμπί - οποιοδήποτε χωρίς στερέωση. Ο μικροελεγκτής είναι εγκατεστημένος στο μπλοκ.

Η λέξη διαμόρφωσης εισάγεται αυτόματα στη μνήμη κατά τη φόρτωση του υλικολογισμικού (στο IC-Prog, το "bird" έχει οριστεί μόνο στο στοιχείο "PWRT", τα υπόλοιπα στοιχεία είναι "reset", το "intOSC GP4" ορίζεται σε η στήλη «ταλαντωτής»). Πρώτα, πρέπει να διαβάσετε το υλικολογισμικό από ένα κενό μικροκύκλωμα και να γράψετε την τιμή της λέξης στο τέλος της μνήμης του προγράμματος στη διεύθυνση 03FF, η οποία απαιτείται για τη ρύθμιση της συχνότητας του εσωτερικού ταλαντωτή μιας συγκεκριμένης περίπτωσης μικροκυκλώματος. Αφού φορτώσετε το αρχείο HEX στο πρόγραμμα, πρέπει να εισαγάγετε χειροκίνητα αυτήν την τιμή στη διεύθυνση 03FF. Σε αυτήν τη συσκευή, η απόκλιση συχνότητας δεν είναι κρίσιμη, αλλά θα πρέπει να γνωρίζετε ότι μια τέτοια διαδικασία απαιτείται για αυτό το μικροκύκλωμα. Σε ακραίες περιπτώσεις, εάν χαθεί η εργοστασιακή τιμή, δεν μπορείτε να κάνετε τίποτα - το πρόγραμμα έχει λάβει μέτρα για να λειτουργεί σωστά και σε αυτήν την περίπτωση.

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

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

IDE για Assembler

Η πρώτη ερώτηση είναι: σε ποιο περιβάλλον ανάπτυξης προγραμματίζετε στο assembler; Η απάντηση είναι ξεκάθαρη - MASM32. Αυτό είναι το τυπικό πρόγραμμα που χρησιμοποιείται για αυτό το PL. Μπορείτε να το κατεβάσετε στον επίσημο ιστότοπο masm32.com ως αρχείο, το οποίο θα πρέπει να αποσυσκευάσετε και στη συνέχεια να εκτελέσετε το πρόγραμμα εγκατάστασης install.exe. Εναλλακτικά, μπορείτε να χρησιμοποιήσετε το FASM, αλλά ο κωδικός για αυτό θα είναι σημαντικά διαφορετικός.

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

C:\masm32\bin

Το πρόγραμμα "Hello world" σε assembler

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

386 .model flat, επιλογή stdcall casemap: none lib/kernel32.lib .data msg_title db "Title", 0 msg_message db "Hello world", 0 .code start: invoke MessageBox, 0, addr msg_message invomessage, MB_message addr, , 0 τέλος έναρξη

Αρχικά, εκκινούμε το πρόγραμμα επεξεργασίας qeditor.exe στον φάκελο με το εγκατεστημένο MASM32 και γράφουμε τον κώδικα του προγράμματος σε αυτόν. Αφού το αποθηκεύσουμε ως αρχείο με την επέκταση ".asm", και δημιουργήσουμε το πρόγραμμα χρησιμοποιώντας το στοιχείο μενού "Project" → "Build all". Εάν δεν υπάρχουν σφάλματα στον κώδικα, το πρόγραμμα θα μεταγλωττιστεί με επιτυχία και στην έξοδο θα λάβουμε ένα έτοιμο αρχείο exe που θα εμφανίζει ένα παράθυρο των Windows με την επιγραφή "Hello world".

Προσθήκη δύο αριθμών στον assembler

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

486 .model flat, stdcall επιλογή casemap: none lib/kernel32.lib περιλαμβάνει /masm32/macros/macros.asm uselib masm32, comctl32, ws2_32 .data .code start: mov eax, 123 mov eax, -90 add test eax, eax jz zero invoke MessageBox, 0, chr$("In eax is not 0!"), chr$("Info"), 0 jmp lexit zero: invoke MessageBox, 0, chr$("In eax 0!" ), chr$("Info"), 0 lexit: invoke ExitProcess, 0 end start

Εδώ χρησιμοποιούμε τις λεγόμενες ετικέτες και ειδικές εντολές με τη χρήση τους (jz, jmp, test). Ας ρίξουμε μια πιο προσεκτική ματιά:

  • δοκιμή - χρησιμοποιείται για τη λογική σύγκριση μεταβλητών (τελεστών) με τη μορφή byte, λέξεων ή διπλών λέξεων. Για σύγκριση, η εντολή χρησιμοποιεί λογικό πολλαπλασιασμό και εξετάζει τα bit: αν είναι ίσα με 1, τότε το bit του αποτελέσματος θα είναι ίσο με 1, διαφορετικά - 0. Εάν λάβαμε 0, οι σημαίες ορίζονται μαζί με το ZF ( zero flag), το οποίο θα είναι ίσο με 1 Τα αποτελέσματα αναλύονται περαιτέρω με βάση το ZF.
  • jnz - εάν η σημαία ZF δεν έχει οριστεί πουθενά, το άλμα γίνεται σε αυτήν την ετικέτα. Συχνά αυτή η εντολή χρησιμοποιείται εάν το πρόγραμμα έχει λειτουργίες σύγκρισης που επηρεάζουν κατά κάποιο τρόπο το αποτέλεσμα του ZF. Αυτά περιλαμβάνουν απλώς τη δοκιμή και το cmp.
  • jz - εάν η σημαία ZF ήταν ακόμα καθορισμένη, η ετικέτα μεταπηδά.
  • jmp - ανεξάρτητα από το αν υπάρχει ZF ή όχι, γίνεται ένα άλμα στην ετικέτα.

Πρόγραμμα αθροίσματος συναρμολογητή

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

486 .model flat, stdcall επιλογή casemap: none lib/kernel32.lib περιλαμβάνει /masm32/macros/macros.asm uselib masm32, comctl32, ws2_32 .data msg_title db "Title", 0 A DB 1h bufferdBd ?) μορφή db "%d",0 .code start: MOV AL, A ADD AL, B invoke wsprintf, addr buffer, addr format, eax invoke MessageBox, 0, addr buffer, addr msg_title, MB_OK invoke ExitProcess, 0 end start

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

Λήψη τιμής από τη γραμμή εντολών στο assembler

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

486 .model flat, stdcall επιλογή casemap: none lib/kernel32.lib περιλαμβάνει /masm32/macros/macros.asm uselib masm32, comctl32, ws2_32 .data .code start: καλέστε GetCommandLine ; Το αποτέλεσμα θα τοποθετηθεί στο eax push 0 push chr$("Command Line") push eax ; παίρνουμε το κείμενο για έξοδο από eax push 0 call MessageBox push 0 call ExitProcess end start

Μπορείτε επίσης να χρησιμοποιήσετε μια εναλλακτική μέθοδο:

486 .model flat, stdcall επιλογή casemap: none lib/kernel32.lib περιλαμβάνει /masm32/macros/macros.asm uselib masm32, comctl32, ws2_32 .data .code start: καλέστε GetCommandLine ; το αποτέλεσμα θα τοποθετηθεί στο eax invoke GetCommandLine invoke MessageBox, 0, eax, chr$("Command Line"), 0 invoke ExitProcess, 0 push 0 call ExitProcess end start

Εδώ χρησιμοποιείται το Invoke - μια ειδική μακροεντολή που απλοποιεί τον κώδικα του προγράμματος. Κατά το χρόνο μεταγλώττισης, οι εντολές macro μετατρέπονται σε οδηγίες συναρμολόγησης. Με τον ένα ή τον άλλο τρόπο, χρησιμοποιούμε τη στοίβα - έναν πρωτόγονο τρόπο αποθήκευσης δεδομένων, αλλά ταυτόχρονα πολύ βολικό. Κατά σύμβαση, stdcall, σε όλες τις συναρτήσεις WinAPI, οι μεταβλητές περνούν μέσα από τη στοίβα, μόνο με αντίστροφη σειρά, και τοποθετούνται στον αντίστοιχο καταχωρητή eax.

Βρόχοι στο assembler

Περίπτωση χρήσης:

Δεδομένα msg_title db "Title", 0 A DB 1h buffer db 128 dup(?) format db "%d",0 .code start: mov AL, A .REPEAT inc AL .ΜΕΩΣ AL==7 κλήση wsprintf, addr buffer, μορφή addr, AL Invoke MessageBox, 0, addr buffer, addr msg_title, MB_OK invoke ExitProcess, 0 end start .data msg_title db "Title", 0 buffer db 128 dup(?) format db "%d",0 .code start: mov eax, 1 mov edx, 1 .WHILE edx==1 inc eax .IF eax==7 .BREAK .ENDIF .ENDW invoke wsprintf, addr buffer, adr format, eax invoke MessageBox, 0, addr buffer, addr msg_title, MB_ επίκληση ExitProcess, 0

Η εντολή επανάληψη χρησιμοποιείται για τη δημιουργία βρόχου. Επιπλέον, χρησιμοποιώντας το inc, η τιμή της μεταβλητής αυξάνεται κατά 1, ανεξάρτητα από το αν βρίσκεται στη μνήμη RAM ή στον ίδιο τον επεξεργαστή. Για να διακοπεί ο βρόχος, χρησιμοποιείται η οδηγία ".BREAK". Μπορεί και να σταματήσει τον κύκλο και να συνεχίσει τη δράση του μετά την «παύση». Μπορείτε επίσης να διακόψετε την εκτέλεση του κώδικα προγράμματος και να ελέγξετε τη συνθήκη επανάληψης και ενώ χρησιμοποιώντας την οδηγία ".ΣΥΝΕΧΕΙΑ".

Άθροισμα στοιχείων πίνακα στο assembler

Εδώ αθροίζουμε τις τιμές των μεταβλητών στον πίνακα χρησιμοποιώντας έναν βρόχο "for":

486 .model flat, stdcall επιλογή casemap: none lib/kernel32.lib περιλαμβάνει /masm32/macros/macros.asm uselib masm32, comctl32, ws2_32 .data msg_title db "Title", 0 A DB 1h, 2 xd 3,4,5,6,7, 8,9,10,11 n dd 12 buffer db 128 dup(?) μορφή db "%d",0 .code start: mov eax, 0 mov ecx, n mov ebx, 0 L: προσθήκη eax, x προσθήκη ebx, πληκτρολόγηση x dec ecx cmp ecx, 0 jne L invoke wsprintf, addr buffer, μορφή addr, MessageBox invoke eax, 0, addr buffer, addr msg_title, MB_OK invoke ExitProcess, 0 end start

Η εντολή dec, όπως και η inc, αλλάζει την τιμή του τελεστή κατά ένα, μόνο προς την αντίθετη κατεύθυνση, σε -1. Αλλά το cmp συγκρίνει μεταβλητές χρησιμοποιώντας τη μέθοδο αφαίρεσης: αφαιρεί μια τιμή από τη δεύτερη και, ανάλογα με το αποτέλεσμα, ορίζει τις κατάλληλες σημαίες.

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

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

Προβολές ανάρτησης: 767