- Η γλώσσα assembly οργανώνει τις εντολές της με βάση τον σκοπό: μεταφορά, υπολογισμό, έλεγχο ροής και άλλα.
- Κάθε εντολή αποτελείται από έναν κώδικα λειτουργίας και τελεστές, με διαφορετικές μορφές ανάλογα με την αρχιτεκτονική.
- Υπάρχουν διάφοροι τρόποι διευθυνσιοδότησης για την πρόσβαση σε δεδομένα, όπως άμεση, άμεση και έμμεση.
Η γλώσσα assembly αποτελεί έναν από τους θεμελιώδεις πυλώνες της ανάπτυξης λογισμικού από την αρχή της πληροφορικής. Παρόλο που οι γλώσσες υψηλού επιπέδου κυριαρχούν σήμερα, η assembler παραμένει ευρέως χρησιμοποιούμενη και σχετική σε περιβάλλοντα όπου ο έλεγχος υλικού, η βελτιστοποίηση ή οι περιορισμοί πόρων αποτελούν προτεραιότητα.
Σε αυτό το άρθρο, θα εμβαθύνουμε στους τύπους εντολών σε γλώσσα assembly, αναλύοντας τη δομή, τον σκοπό, τις λειτουργίες διευθυνσιοδότησης και τον τρόπο οργάνωσής τους σε διαφορετικές αρχιτεκτονικές. Θα βρείτε επίσης παραδείγματα, μορφές και μια ολοκληρωμένη επισκόπηση που θα σας επιτρέψει να κατανοήσετε πλήρως τη λογική πίσω από αυτές τις εντολές, οι οποίες λειτουργούν πολύ στενά με το υλικό.
Τι είναι μια εντολή σε γλώσσα assembly;
Μια εντολή assembly είναι μια εντολή που η CPU μπορεί να κατανοήσει άμεσα (αφού μεταφραστεί σε κώδικα μηχανής από ένα πρόγραμμα assembler). Κάθε εντολή έχει έναν συγκεκριμένο σκοπό και συνήθως αποτελείται από ένα μνημονικό που αναπαριστά την πράξη και έναν ή περισσότερους τελεστές που υποδεικνύουν πού λαμβάνονται τα δεδομένα ή/και πού αποθηκεύονται τα αποτελέσματα.
Αυτές οι εντολές εξαρτώνται σε μεγάλο βαθμό από την αρχιτεκτονική του επεξεργαστή, επομένως κάθε τύπος CPU (είτε x86, ARM, MIPS, μεταξύ άλλων) έχει το δικό του σύνολο εντολών με συγκεκριμένη σύνταξη και δυνατότητες.
Δομή μιας εντολής
Οι οδηγίες συνήθως αποτελούνται από δύο μέρη:
- Κωδικός λειτουργίας (opcode): Υποδεικνύει την ενέργεια που πρόκειται να εκτελεστεί, όπως προσθήκη, μετακίνηση δεδομένων, σύγκριση κ.λπ.
Οι τελεστές παρέχουν τις απαραίτητες πληροφορίες για την εκτέλεση της πράξης και μπορούν να αποθηκευτούν σε καταχωρητές, στη μνήμη ή να είναι σταθερές. Δεν απαιτούν όλες οι εντολές τελεστές και, σε ορισμένες περιπτώσεις, αυτοί μπορεί να είναι έμμεσοι στην εντολή ή να αποθηκεύονται σε προκαθορισμένους καταχωρητές.
Τύποι εντολών σε γλώσσα assembly
Ανάλογα με τη λειτουργικότητα που εκτελούν μέσα σε ένα πρόγραμμα, οι εντολές σε γλώσσα assembly μπορούν να ταξινομηθούν σε διάφορες ομάδες. Οι πιο σχετικές παρουσιάζονται αναλυτικά παρακάτω:
1. Οδηγίες μεταφοράς δεδομένων
Αυτές οι εντολές επιτρέπουν την αντιγραφή δεδομένων από τη μία τοποθεσία στην άλλη χωρίς να τροποποιηθεί το περιεχόμενό τους στην πηγή. Είναι απαραίτητες για τη μετακίνηση πληροφοριών μεταξύ καταχωρητών, μνήμης και περιφερειακών συσκευών.
Μερικές από τις πιο συνηθισμένες οδηγίες σε αυτήν την ομάδα είναι:
- MOV: Αντιγράφει τα περιεχόμενα ενός τελεστή σε έναν άλλο. Για παράδειγμα,
MOV AX, BXΑντιγράψτε τα περιεχόμενα του BX στο AX. - MOVS / MOVSB / MOVSW: Μετακινεί συμβολοσειρές από μια διεύθυνση πηγής (SI) σε μια διεύθυνση προορισμού (DI), αυτοματοποιώντας τη διαδικασία μεταφοράς.
- LODS / LODSB / LODSW: Φορτώνει μια τιμή από τη διεύθυνση που υποδεικνύεται από τον καταχωρητή SI στον συσσωρευτή (AL ή AX).
- ΑΝΑΓΝΩΣΗ: Φορτώνει μια ενεργή διεύθυνση αντί για την τιμή. Χρήσιμο για τη λήψη της διεύθυνσης μιας μεταβλητής ή μιας δομής.
2. Οδηγίες για την μπαταρία
Η στοίβα είναι μια δομή LIFO (last in, first out - τελευταίος εισερχόμενος, πρώτος εξερχόμενος) που χρησιμοποιείται για την προσωρινή αποθήκευση δεδομένων, τη διαβίβαση παραμέτρων ή την αποθήκευση του περιβάλλοντος εκτέλεσης.
- ΣΠΡΩΞΤΕ: Αποθηκεύει μια τιμή στη στοίβα, μειώνοντας τον δείκτη SP.
- POP: Ανακτά την πιο πρόσφατη τιμή που είναι αποθηκευμένη στη στοίβα, αυξάνοντας το SP.
- PUSHF / POPF: Αποθηκεύουν και ανακτούν την κατάσταση των σημαιών της CPU στη στοίβα.
3. Αριθμητικές και λογικές οδηγίες
Επιτρέπουν την εκτέλεση υπολογισμών και λειτουργιών σε bit. Αυτές οι οδηγίες είναι απαραίτητες για τον χειρισμό αριθμητικών δεδομένων και τη λήψη αποφάσεων στη ροή του προγράμματος.
Μεταξύ των πιο χρησιμοποιούμενων βρίσκουμε:
- ΠΡΟΣΘΗΚΗ / ΥΠΟΔΟΧΗ: Πρόσθεση και αφαίρεση.
- ΠΟΛΛΑΠΛΩΝ ΧΡΗΣΕΩΝ / IMUL: Δυαδικοί πολλαπλασιασμοί.
- DIV / IDIV: Διαίρεση (ακέραιος ή με πρόσημο).
- ΚΑΙ / Ή / XOR / ΟΧΙ: Λογικές πράξεις ανά bit.
- SHL / SHR / ROL / ROR: Μετατοπίσεις και περιστροφές bit.
4. Οδηγίες ελέγχου ροής
Σας επιτρέπουν να τροποποιήσετε την ακολουθία εκτέλεσης του προγράμματος , εισάγοντας άλματα ή υπό όρους και χωρίς όρους κλήσεις σε άλλες εντολές.
- JMP: Μεταβαίνει άνευ όρων σε μια άλλη διεύθυνση στο πρόγραμμα.
- ΚΑΛΕΣΤΕ / ΕΠΑΝΑΠΡΟΣΔΟΣΗ: Κλήση σε μια υπορουτίνα και επιστροφή.
- JE/JNE/JG/JL/JZ/JNZ: Υπό όρους άλματα, εκτελούνται εάν πληρούνται ορισμένες συνθήκες (μετά από σύγκριση).
5. Εντολές εισόδου/εξόδου (I/O)
Επιτρέπουν την επικοινωνία μεταξύ του επεξεργαστή και των εξωτερικών συσκευών. Αυτές οι οδηγίες επιτρέπουν την ανάγνωση και την εγγραφή δεδομένων από/προς θύρες (υλικό).
- Σε: Διαβάζει δεδομένα από μια θύρα εισόδου.
- ΕΞΩ: Στέλνει δεδομένα σε μια θύρα εξόδου.
6. Εντολές κινητής υποδιαστολής
Πολλές CPU διαθέτουν μαθηματικούς συνεπεξεργαστές (ή ειδικές εντολές) αφιερωμένους στην εργασία με δεκαδικούς αριθμούς (κινητής υποδιαστολής). Αυτές οι εντολές επιτρέπουν λειτουργίες όπως:
- Πρόσθεση, αφαίρεση, πολλαπλασιασμός και διαίρεση πραγματικών αριθμών.
- Τριγωνομετρικές πράξεις (ημίτονο, συνημίτονο, εφαπτομένη).
- Λογαριθμικές, εκθετικές και πράξεις ρίζας.
Αυτές οι οδηγίες συνήθως συμμορφώνονται με το πρότυπο IEEE 754 για αριθμητική ακρίβεια.
Λειτουργίες διευθυνσιοδότησης
Ένα θεμελιώδες μέρος του σχεδιασμού εντολών είναι ο τρόπος με τον οποίο προσδιορίζεται η θέση των τελεστέων. Οι τρόποι διευθυνσιοδότησης καθορίζουν τον τρόπο με τον οποίο η CPU έχει πρόσβαση στα δεδομένα.
1. Άμεση αντιμετώπιση
Τα δεδομένα περιλαμβάνονται απευθείας στην εντολή. Είναι γρήγορο, αλλά δεν επιτρέπει την τροποποίηση τιμών χωρίς να αλλάξει η εντολή.
MOV AX, 5
2. Άμεση διευθυνσιοδότηση
Η διεύθυνση μνήμης που περιέχει τα δεδομένα καθορίζεται ρητά.
MOV AX,
3. Έμμεση διευθυνσιοδότηση
Η ενεργός διεύθυνση λαμβάνεται από τα περιεχόμενα μιας εγγραφής. Πολύ ευέλικτο και χρησιμοποιείται για δομές και συνδεδεμένες λίστες.
MOV AX,
4. Διευθυνσιοδότηση με ευρετήριο
Η διεύθυνση υπολογίζεται προσθέτοντας μια βάση και έναν δείκτη (για παράδειγμα, για τη διέλευση πινάκων). Χρησιμοποιεί ειδικούς καταχωρητές όπως SI, DI ή καταχωρητές βάσης + μετατόπισης.
MOV AX,
Μορφές εντολών: διαφορετικοί τύποι ανάλογα με την αρχιτεκτονική
Η δομή μιας εντολής μπορεί να διαφέρει ανάλογα με την αρχιτεκτονική. Οι συνήθεις μορφές περιλαμβάνουν:
Μορφή 4 κατευθύνσεων
Περιλαμβάνει δύο τελεστές, μια θέση αποτελέσματος και τη διεύθυνση της επόμενης εντολής. Είναι πλέον ξεπερασμένο λόγω της πολυπλοκότητάς του.
Μορφή 3 κατευθύνσεων
Καθορίζει δύο τελεστές και μια διεύθυνση προορισμού. Είναι συνηθισμένο στις σύγχρονες αρχιτεκτονικές RISC.
Μορφή 2 κατευθύνσεων
Χρησιμοποιήστε έναν τελεστή πηγής και έναν τελεστή προορισμού (ο προορισμός μπορεί επίσης να συνεισφέρει αξία). Δημοφιλές σε αρχιτεκτονικές x86 και άλλες αρχιτεκτονικές CISC.
Μονόδρομη μορφή
Καθορίζεται μόνο ένας τελεστής. Ο άλλος θεωρείται ότι είναι ο συσσωρευτής. Συνήθης πρακτική σε παλαιότερους επεξεργαστές και απλά συστήματα.
Μορφή 0-διεύθυνσης (βασισμένη σε στοίβα)
Οι λειτουργίες χρησιμοποιούν τη στοίβα για την ανάκτηση και αποθήκευση τελεστέων και αποτελεσμάτων. Πολύ αποτελεσματικό για μηχανήματα που βασίζονται σε στοίβα, όπως ορισμένες προγραμματιζόμενες αριθμομηχανές.
Μακροεντολές και ψευδοκώδικες λειτουργίας
Για τη βελτίωση της παραγωγικότητας, πολλοί assemblers προσφέρουν μακροεντολές , οι οποίες επεκτείνουν μια μεμονωμένη γραμμή σε πολλές πραγματικές οδηγίες. Αυτές είναι χρήσιμες για την αποφυγή επανάληψης πολύπλοκων μοτίβων ή για τη δημιουργία δομών υψηλού επιπέδου, όπως βρόχοι ή εντολές υπό όρους.
Ο ψευδοκώδικες λειτουργίας Είναι εντολές που ο assembler μεταφράζει εσωτερικά σε μια πραγματική ακολουθία εντολών. Για παράδειγμα, NOP (καμία λειτουργία) μπορεί να μεταφραστεί ως XCHG AX, AX σε CPU x86.
Οδηγίες συναρμολόγησης
Οι οδηγίες ( που ονομάζονται επίσης ψευδο-λειτουργίες ) δεν είναι εντολές με την αυστηρή έννοια. Χρησιμεύουν για τον έλεγχο της διαδικασίας συναρμολόγησης, τον ορισμό δεδομένων, ενοτήτων κώδικα, μακροεντολών, συνθηκών μεταγλώττισης κ.λπ.
Τα κοινά παραδείγματα περιλαμβάνουν:
- .δεδομένα / .κώδικας: Υποδεικνύουν την ενότητα δεδομένων ή κώδικα.
- .org: Ορίζει τη διεύθυνση από την οποία θα ξεκινήσει η συναρμολόγηση.
- .equ: Ορίζει συμβολικές σταθερές.
Περιπτώσεις χρήσης γλώσσας assembly
Παρά την άνοδο των γλωσσών υψηλού επιπέδου, η γλώσσα assembly παραμένει καθοριστική σε διάφορους τομείς:
- Ανάπτυξη ενσωματωμένων συστημάτων και μικροελεγκτών.
- Προγραμματισμός προγραμμάτων οδήγησης, bootloaders και BIOS.
- Ακραία βελτιστοποίηση σε εφαρμογές όπως βιντεοπαιχνίδια ή κρυπτογραφία.
- Αντίστροφη μηχανική, εντοπισμός σφαλμάτων και hacking χαμηλού επιπέδου.
Επιπλέον, η εκπαίδευση στη γλώσσα assembly εξακολουθεί να κατέχει σημαντική θέση στα πτυχία της επιστήμης των υπολογιστών και της ηλεκτρονικής, καθώς παρέχει μια εις βάθος κατανόηση του πώς λειτουργεί ένας επεξεργαστής, του πώς αποθηκεύονται και χειρίζονται τα δεδομένα και του πώς εκτελούνται οι εντολές σε δυαδικό επίπεδο.
Η κατανόηση όλων των τύπων εντολών συναρμολόγησης, της δομής, της λειτουργικότητας και των τρόπων διευθυνσιοδότησης, παρέχει μια σταθερή βάση για κάθε προγραμματιστή που θέλει να εμβαθύνει στον προγραμματισμό χαμηλού επιπέδου ή να κατανοήσει πώς οι γλώσσες υψηλού επιπέδου μεταφράζονται τελικά σε κώδικα μηχανής. Αν και η χρήση του έχει γίνει πιο συγκεκριμένη, παραμένει ένα απαραίτητο εργαλείο σε πολλούς κρίσιμους τομείς της ανάπτυξης λογισμικού και συστημάτων.