Προγραμματισμός σε κωδικούς μηχανής και γλώσσα assembly

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

ονομάζονται ΟΔΗΓΙΕΣ ΣΥΝΑΡΜΟΛΟΓΗΣΗΣ και τώρα, μάλλον, οι περισσότερες βολική ώρανα δώσει μια ιδέα για το τι είναι.

Θα εξετάσουμε τις ακόλουθες οδηγίες: ORG, EQU, DEFB, DEFW, DEFM και END, αλλά προτού αρχίσουμε να τις εξετάζουμε, πρέπει να κατανοήσουμε σταθερά:

1. Οι οδηγίες ASSEMBLY δεν είναι εντολές του επεξεργαστή Z8 0 και υπό αυτή την έννοια δεν έχουν καμία σχέση με τον κωδικό μηχανής Z8 0.

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

3. Υπάρχουν πάρα πολλά προγράμματα ASSEMBLY και καθένα από αυτά μπορεί να έχει τις δικές του οδηγίες. Μπορεί να έχουν τις ίδιες οδηγίες, αλλά παρούσες διαφορετικές απαιτήσειςστη χρήση τους. Με μια λέξη, πρέπει να καθορίσετε συγκεκριμένες μεθόδους για τη χρήση των οδηγιών ASSEMBLY σύμφωνα με τις οδηγίες για το πρόγραμμα συναρμολόγησης που χρησιμοποιείτε (για παράδειγμα, EDITAS, GENS 3, GENS 4, ZEUS, κ.λπ.). Και παρόλο που δεν υπάρχουν πρότυπα, ωστόσο, ορισμένες θεμελιώδεις έννοιες μπορούν ακόμα να εντοπιστούν και θα επικεντρωθούμε σε αυτές.

3.1. Σχόλια.

Θα ξεκινήσουμε με το πιο απλό πράγμα - σχόλια. Γράφονται μετά το σύμβολο ";" (ερώτημα) .

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

Για παράδειγμα:

10 60001 LD E,A 2 0

Όπως μπορείτε να δείτε, η γραμμή μπορεί

; Φορτώθηκε στον καταχωρητή Ε που περιέχει -; πρέσα μπαταρίας. ; Το μείωσε κατά ένα.

μόνο από το σχόλιο.

Ετικέτες.

Οι ετικέτες απλοποιούν πολύ τα προγράμματα γραφής στα μνημονικά ASSEMBLY. Στις λειτουργίες μετάβασης JP, JR, DJNZ και στις υπορουτίνες κλήσης CALL, δεν μπορείτε να καθορίσετε τη διεύθυνση στην οποία θέλετε να μεταβείτε, αλλά να αντικαταστήσετε μια ετικέτα. Από την άλλη πλευρά, όταν γράφετε εντολές για αυτήν τη διεύθυνση, βάλτε και εκεί ένα σημάδι, για παράδειγμα:

10 60001 ΑΡΧΗ LD B,0 4

20 60003 AGAIN INC HL

40 60005 DJNZ ΞΑΝΑ

3.2.

250 260 270

60110 60111 60113

LD A,(HL) CP 80H JR NZ,BEGIN

Όπως μπορείτε να δείτε, είναι πολύ βολικό. Μπορείτε να δείτε αμέσως ότι από τη γραμμή 40 η επιστροφή είναι στην ετικέτα AGAIN εάν ο καταχωρητής Β δεν φτάσει στο μηδέν. Από τη γραμμή 270, η επιστροφή γίνεται στην ετικέτα BEGIN.

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

Κατά τη μεταγλώττιση, το ίδιο το πρόγραμμα συναρμολόγησης θα υπολογίσει τις τιμές των απαιτούμενων μετατοπίσεων στις οδηγίες του επεξεργαστή και θα τις αντικαταστήσει αντί για ετικέτες. Έτσι, για παράδειγμα, στη γραμμή 40 αντί για DJNZ AGAIN ο κωδικός αντικειμένου θα περιέχει DJNZ FCH, που είναι το ίδιο πράγμα.

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

Για παράδειγμα, στο πρόγραμμά σας πρέπει να καλέσετε επανειλημμένα διαδικασίες ROM, ας πούμε CLEAR (1EACH=7 8 52) και OUT-LINE (1856H=6230). Στη συνέχεια, στην αρχή του προγράμματός σας ορίζετε

για παράδειγμα αποκαλώντας τα CLEAR

διευθυντικός

τιμές στα σημάδια τους, n

και ΕΞΩ Λ.

ΣΑΦΗ

EQU 7 8 52

ΕΞΩ Λ

EQU 62 3 0

ΕΠΙΓΡΑΦΗ

EQU 60016

κλήση

τα ξέρεις αυτά

διαδικασίες ή

κατά σήμα.

60001

LD HL, (LABEL)

60004

LD BC, 0008

60007

LD DE, (04 52)

60010

ΚΑΘΑΡΙΣΜΟΣ ΚΛΗΣΗΣ

60013

ΚΑΛΕΣΤΕ Λ

60016

Αμέσως

σου χρωστάω

προειδοποιώ,

παραδείγματα

από άποψη

λογισμικό

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

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

Έτσι, τα κελιά 60016 και 60017 περιέχουν ορισμένα δεδομένα που μπορούν αργότερα να χρησιμοποιηθούν από το πρόγραμμα. Μπορείτε να στείλετε αυτά τα δεδομένα στα κελιά μόνοι σας πριν από τη μεταγλώττιση. Και δεν χρειάζεται να χρησιμοποιήσετε κώδικα μηχανής για αυτό. Αρχικές τιμέςστα κελιά μνήμης μπορείτε να ορίσετε χρησιμοποιώντας τις οδηγίες DEFB, DEFW και DEFM.

DEFB - DEFINE BYTE - ορίστε ένα byte.

DEFW - DEFINE WORD - ορίστε μια "λέξη" (μια "λέξη" είναι δύο διαδοχικά byte. Συνήθως αυτή είναι μια διεύθυνση.) DEFM - DEFINE MESSAGE - ορίστε ένα μήνυμα (αυτά είναι πολλά διαδοχικά byte). Συνήθως, τα προγράμματα συναρμολόγησης επιβάλλουν ένα όριο στο πόσα byte μπορούν να καθοριστούν από μία οδηγία DEFM, ας πούμε όχι περισσότερα από πέντε. Αλλά αυτό δεν πρέπει να σας ανησυχεί. Αν θέλετε ρωτήστε μακρύ μήνυμα, τότε μπορείτε να βάλετε όσες γραμμές DEFM θέλετε στη σειρά.

Έτσι, το DEFB καθορίζει ένα μεμονωμένο byte (0...255), το DEFW καθορίζει δύο διαδοχικά byte (0...65535) και το DEFM καθορίζει μια ομάδα διαδοχικών byte - γραπτό μήνυμα, πίνακας αριθμών κ.λπ.

Στο προηγούμενο παράδειγμά μας, αν θέλαμε να αποθηκεύσουμε κάποιο αριθμό δύο byte στις διευθύνσεις 60016 και 60017, η γραμμή 80 θα έπρεπε να γραφτεί ως εξής:

80 60016 DEFW 5C92H

90 60018

Ας υποθέσουμε ότι θέλετε να αποθηκεύσετε τη λέξη "Spectrum" ξεκινώντας από τη διεύθυνση 60135.

Κωδικός για το γράμμα "S" Κωδικός για το γράμμα "p" "e" "c" "t" "r"

"υ" "μ"

60135

60136

60137

60138

60139

60140

60141

60142

53H 7 0H 65H 63H 7 4H 72H 75H 6DH

DEFB DEFB DEFB DEFB DEFB DEFB DEFB DEFB DEFB

μπορείτε να το καθορίσετε σε ζεύγη byte:

Αλλά είναι πιο εύκολο και σωστό να το ορίσετε ως μήνυμα:

60135 DEFM 5370656374 ; "Φάντασμα"

60140 DEFM 72756D ; "ρούμι"

Υπάρχει μια ειδική περίπτωση κατά τον προγραμματισμό σε ASSEMBLY όταν το κείμενο του προγράμματος πρέπει επίσης να εισαχθεί μέσω DEFB ή DEFM. Αυτό συμβαίνει όταν γράφετε ένα πρόγραμμα για μια ενσωματωμένη αριθμομηχανή. Εξάλλου, ένα πρόγραμμα συναρμολόγησης μπορεί να μεταφράσει τα μνημονικά ASSEMBLY σε κώδικα μηχανής, αλλά δεν γνωρίζει τίποτα για τους κωδικούς της αριθμομηχανής και δεν γνωρίζει τα μνημονικά του. Ο κωδικός της αριθμομηχανής είναι ένα εσωτερικό θέμα "Sinclair", η ερμηνεία του

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

Στο πρώτο μέρος του βιβλίου χρησιμοποιήσαμε μνημονικές σημειώσεις για εντολές αριθμομηχανής, όπως add, stk_data s_lt κ.λπ., και τις γράψαμε με ένα μικρό γράμμα, σε αντίθεση με τις εντολές του επεξεργαστή. Αλλά το έχουμε κάνει στο παρελθόν και θα συνεχίσουμε να το κάνουμε μόνο για λόγους κατανόησης και ευκολίας ηχογράφησης. Το πρόγραμμα ASSEMBLY δεν γνωρίζει τέτοια μνημονικά δεν υπάρχουν στο λεξικό του.

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

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

3.5. Οδηγίες ORG, END.

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

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

10 ORG 63000

και στη συνέχεια το ίδιο το πρόγραμμα συναρμολόγησης θα υπολογίσει σε ποιο κελί μνήμης θα βρίσκεται αυτή ή εκείνη η εντολή. Αυτό απλοποιεί σημαντικά τη διαδικασία προγραμματισμού. Και αν κάνετε αλλαγές σε έτοιμο κείμενο, Ο ίδιος ο ΣΥΝΑΡΜΟΛΟΓΗΣ θα διορθώσει όλες τις διευθύνσεις.

Η οδηγία ΤΕΛΟΣ σηματοδοτεί το τέλος ενός προγράμματος. Εάν υπάρχει κάτι άλλο μετά από αυτό, η ΣΥΝΑΡΜΟΛΟΓΗΣΗ θα το αγνοήσει κατά τη μεταγλώττιση.

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

Προσδιορίστε τη συσκευή για την οποία έχει μεταγλωττιστεί

Οι παράμετροι που μεταβιβάζονται στην οδηγία είναι μια ακολουθία εκφράσεων που χωρίζονται με κόμματα. Κάθε έκφραση πρέπει να είναι είτε αριθμός στο εύρος (-128..255) είτε

το αποτέλεσμα του υπολογισμού πρέπει να δίνει ένα αποτέλεσμα στο ίδιο εύρος, διαφορετικά ο αριθμός περικόπτεται σε ένα byte και ΧΩΡΙΣ την έκδοση προειδοποιήσεων.

Εάν μια οδηγία λάβει περισσότερες από μία παραμέτρους και το τρέχον τμήμα προγράμματος είναι τότε οι παράμετροι συσκευάζονται σε λέξεις (η πρώτη παράμετρος είναι το χαμηλό byte) και αν

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

Οδηγία ΣΠ.

Σύνταξη:
ΕΤΙΚΕΤΑ: .DB express_list

Παράδειγμα:
.CSEG
consts: .DB 0, 255, 0b01010101, -128, 0xaa

Οι παράμετροι που μεταβιβάζονται στην οδηγία είναι μια ακολουθία εκφράσεων που χωρίζονται με κόμμα. Κάθε έκφραση πρέπει να είναι είτε αριθμός στο εύρος (-32768..65535) είτε

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

Σύνταξη:
ΕΤΙΚΕΤΑ: Λίστα εκφράσεων .DW

Παράδειγμα:
.CSEG
varlist: .DW 0, 0xffff, 0b1001110001010101, -32768, 65535

Σύνταξη:
.ENDMACRO

Παράδειγμα:
.MACRO SUBI16 ; Ξεκινώντας έναν ορισμό μακροεντολών
subi r16,low(@0) ; Αφαιρέστε το χαμηλό byte της πρώτης παραμέτρου
sbci r17,high(@0) ; Αφαιρέστε το υψηλό byte της πρώτης παραμέτρου
.ENDMACRO

EQU – Ορισμός σταθερής έκφρασης

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

εκχωρείται εκ νέου και η τιμή του δεν μπορεί να αλλάξει.

Σύνταξη:
.Ετικέτα EQU = έκφραση

Παράδειγμα:
.EQU io_offset = 0x23
.EQU porta = io_offset + 2

CSEG ; Έναρξη τμήματος δεδομένων
clr r2 ; Εκκαθάριση καταχωρητή r2
out porta,r2 ; Γράψτε στη θύρα Α

Τμήμα ESEG – EEPROM

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

Ένα τμήμα EEPROM συνήθως αποτελείται μόνο από οδηγίες,

href="#DW - Ορίστε σταθερές λέξεις στη μνήμη προγράμματος και στο EEPROM">DW

και σημάδια. Τα τμήματα EEPROM έχουν τα δικά τους

μετρητές θέσης byte. Η οδηγία μπορεί να χρησιμοποιηθεί για την τοποθέτηση

μεταβλητές στην απαιτούμενη θέση στο EEPROM. Η οδηγία δεν έχει παραμέτρους.

Σύνταξη:
.ΕΣΕΓ

Παράδειγμα:
var1: .BYTE 1 ; κρατήστε 1 byte για var1
πίνακας: .BYTE tab_size ; δέσμευση tab_size byte.

ΕΣΕΓ
eevar1: .DW 0xffff ; αρχικοποιήστε 1 λέξη στο EEPROM

EXIT – Έξοδος από το αρχείο

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

href="#INCLUDE - Συμπεριλάβετε άλλο αρχείο">INCLUDE

), στη συνέχεια η μεταγλώττιση συνεχίζεται από τη γραμμή που ακολουθεί την οδηγία ΠΕΡΙΛΗΨΗ.

Εάν το αρχείο δεν είναι ένθετο, τότε η μεταγλώττιση σταματά.

Σύνταξη:
.ΕΞΟΔΟΣ

Παράδειγμα:
.ΕΞΟΔΟΣ ; Έξοδος από αυτό το αρχείο

ΠΕΡΙΛΑΜΒΑΝΕΙ – Επισυνάψτε άλλο αρχείο

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

href="#EXIT - Έξοδος από αυτό το αρχείο">EXIT

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

ΠΕΡΙΛΑΜΒΑΝΩ. Το συνημμένο αρχείο μπορεί επίσης να περιέχει οδηγίες ΠΕΡΙΛΑΜΒΑΝΕΙ.

Σύνταξη:
.ΣΥΜΠΕΡΙΛΑΒΕΤΕ "όνομα αρχείου"

Παράδειγμα:
; Αρχείο iodefs.asm:
.EQU sreg = 0x3f ; Μητρώο κατάστασης
.EQU sphigh = 0x3e ; Υψηλό byte δείκτη στοίβας
.Ροή EQU = 0x3d ; Χαμηλό byte του δείκτη στοίβας

; αρχείο incdemo.asm
.ΠΕΡΙΛΑΜΒΑΝΕΙ iodefs.asm ; Ορισμοί θύρας Nest
σε r0,sreg ; Ανάγνωση μητρώου κατάστασης

LIST – Ενεργοποίηση δημιουργίας καταχώρισης

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

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

Σύνταξη:
.ΛΙΣΤΑ

Παράδειγμα:

LISTMAC – Ενεργοποιήστε την επέκταση μακροεντολών στη λίστα

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

επιλογές.

Σύνταξη:
.LISTMAC

Παράδειγμα:
.MACRO MACX ; Μακροεντολή Ορισμός
προσθέστε r0,@0 ; Μακρο σώμα
eor r1,@1

LISTMAC; Ενεργοποίηση επέκτασης μακροεντολών
MACX r2,r1; Κλήση μακροεντολής (το σώμα της μακροεντολής θα εμφανίζεται στην καταχώριση)

MACRO – Έναρξη μακροεντολής

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

ο μεταγλωττιστής αντικαθιστά αυτό το όνομα με το σώμα της μακροεντολής. Μια μακροεντολή μπορεί να έχει έως και 10 παραμέτρους, στις οποίες έχετε πρόσβαση μέσω @0-@9 στο σώμα της. Όταν καλείται, παρατίθενται οι παράμετροι

χωρίζονται με κόμματα. Ο μακροορισμός τελειώνει με μια οδηγία.

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

Σύνταξη:
Όνομα μακροεντολής .MACRO

Παράδειγμα:
.MACRO SUBI16 ; Έναρξη μακροορισμού
subi @1,low(@0) ; Αφαιρέστε το χαμηλό byte της παραμέτρου 0 από την παράμετρο 1
sbci @2,high(@0) ; Αφαιρέστε το υψηλό byte της παραμέτρου 0 από την παράμετρο 2
.ENDMACRO ; Τέλος ορισμού μακροεντολής

CSEG; Έναρξη τμήματος προγράμματος
SUBI16 0x1234,r16,r17 ; Αφαιρέστε 0x1234 από r17:r16

NOLIST – Απενεργοποιήστε τη δημιουργία καταχώρισης

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

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

μαζί με μια οδηγία για τη λήψη καταλόγων μεμονωμένων εξαρτημάτων

αρχεία πηγής

Σύνταξη:
.ΝΟΛΙΣΤ

Παράδειγμα:
.NOLIST ; Απενεργοποιήστε τη δημιουργία καταχώρισης
.ΠΕΡΙΛΑΜΒΑΝΕΙ το "macro.inc" ; Τα συνημμένα αρχεία δεν θα είναι
.ΠΕΡΙΛΑΜΒΑΝΕΙ "const.def" ; εμφανίζεται στην καταχώριση
.LIST ; Ενεργοποίηση δημιουργίας καταχώρισης

ORG – Ορισμός θέσης στο τμήμα

Η οδηγία ORG ορίζει τον μετρητή θέσης σε μια δεδομένη τιμή, η οποία μεταβιβάζεται ως παράμετρος. Για το τμήμα δεδομένων, ορίζει τον μετρητή θέσης σε

SRAM (RAM), για ένα τμήμα προγράμματος αυτός είναι ο μετρητής προγράμματος και για ένα τμήμα EEPROM αυτή είναι η θέση στο EEPROM. Αν της οδηγίας προηγείται ετικέτα (στην ίδια γραμμή) τότε

Η ετικέτα τοποθετείται στη διεύθυνση που καθορίζεται στην παράμετρο της οδηγίας. Πριν ξεκινήσει η μεταγλώττιση, ο μετρητής προγράμματος και ο μετρητής EEPROM είναι ίσοι με μηδέν και ο μετρητής RAM είναι ίσος με 32

(αφού οι διευθύνσεις 0-31 καταλαμβάνονται από μητρώα). Λάβετε υπόψη ότι οι μετρητές byte χρησιμοποιούνται για τη μνήμη RAM και το EEPROM και οι μετρητές λέξεων χρησιμοποιούνται για το τμήμα προγράμματος.

Σύνταξη:
Έκφραση .ORG

Παράδειγμα:
.DSEG ; Έναρξη τμήματος δεδομένων

ORG 0x37 ; Ορίστε τη διεύθυνση SRAM σε 0x37
μεταβλητή: .BYTE 1 ; Κρατήστε ένα byte στη διεύθυνση 0x37H

CSEG
.ORG 0x10 ; Ορίστε τον μετρητή προγράμματος σε 0x10
mov r0,r1 ; Αυτή η εντολήθα βρίσκεται στη διεύθυνση 0x10

SET – Ορίστε το συμβολικό ισοδύναμο της μεταβλητής μιας έκφρασης

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

href="#EQU - Ορίστε ένα σύμβολο ίσο με μια έκφραση">EQU

η τιμή του ονόματος μπορεί να αλλάξει με άλλη οδηγία SET.

Σύνταξη:
.Όνομα SET = έκφραση

Παράδειγμα:
.SET io_offset = 0x23
.SET porta = io_offset + 2

CSEG; Έναρξη τμήματος κώδικα
clr r2 ; Εκκαθάριση μητρώου 2

Οι συναρμολογητές MASM, TASM και WASM διαφέρουν μεταξύ τους. Ωστόσο, η δημιουργία απλών προγραμμάτων για αυτά δεν έχει ουσιαστικά διαφορές, με εξαίρεση τη συναρμολόγηση και τη σύνδεση.

Έτσι το πρώτο μας πρόγραμμα για MASM, TASM και WASM που βγάζει Αγγλική επιστολή"A" στην τρέχουσα θέση του δρομέα, δηλαδή στην επάνω αριστερή γωνία της οθόνης:

Model tiny .code ORG 100h start: MOV AH,2 MOV DL,41h INT 21h INT 20h END start Αυτό το κείμενο μπορεί να πληκτρολογηθεί σε οποιαδήποτε απλή γλώσσα επεξεργαστής κειμένου- για παράδειγμα, στο NotePad από τα WINDOWS (αλλά όχι στο Word ή σε άλλα "σοφιστικέ"). Ωστόσο, προτείνω ένα "προηγμένο" πρόγραμμα επεξεργασίας κειμένου με επισήμανση σύνταξης, όπως το PSPad (βλ. ενότητα). Στη συνέχεια αποθηκεύουμε αυτό το αρχείο με την επέκταση .asm, για παράδειγμα, στο φάκελο MYPROG. Ας ονομάσουμε το αρχείο atest. Έτσι, πήραμε: C:\MYPROG\test.asm.

ΣΗΜΕΙΩΣΗ
Σημειώστε ότι στην πρώτη εντολή γράψαμε 2 αντί για 02h. Τα MASM, TASM και WASM, όπως το Emu8086, επιτρέπουν τέτοιες «ελευθερίες». Αν και μπορείτε να γράψετε 02h - δεν θα υπάρξει σφάλμα.

Επεξηγήσεις για το πρόγραμμα:

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

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

ORG 100h– 3η γραμμή. Αυτή η εντολή ορίζει τον μετρητή προγράμματος σε 100 ώρες επειδή κατά τη φόρτωση ενός αρχείου COM στη μνήμη, το DOS εκχωρεί τα πρώτα 256 byte στο μπλοκ δεδομένων PSP ( δεκαδικός αριθμός 256 ισούται με δεκαεξαδικό 100h). Ο κωδικός προγράμματος βρίσκεται μόνο μετά από αυτό το μπλοκ. Όλα τα προγράμματα που μεταγλωττίζονται σε αρχεία τύπου COM πρέπει να ξεκινούν με αυτήν την οδηγία.

έναρξη: MOV AH, 02h– 4η γραμμή. Η ετικέτα έναρξης τοποθετείται πριν από την πρώτη εντολή στο πρόγραμμα και θα χρησιμοποιηθεί στην οδηγία ΤΕΛΟΣ για να υποδείξει με ποια εντολή ξεκινά το πρόγραμμα. Η εντολή MOV τοποθετεί την τιμή του δεύτερου τελεστή στον πρώτο τελεστή. Δηλαδή, η τιμή 02h τοποθετείται στον καταχωρητή AN. Γιατί γίνεται αυτό; Το 02h είναι μια συνάρτηση DOS που εμφανίζει έναν χαρακτήρα στην οθόνη. Γράφουμε ένα πρόγραμμα για DOS, οπότε χρησιμοποιούμε τις εντολές αυτού λειτουργικό σύστημα(OS). Και γράφουμε αυτή τη συνάρτηση (ή μάλλον τον αριθμό της) στον καταχωρητή AH, επειδή η διακοπή 21h χρησιμοποιεί αυτόν τον καταχωρητή.

MOV DL, 41h– 5η γραμμή. Ο κωδικός χαρακτήρα "A" εισάγεται στον καταχωρητή DL. Ο κωδικός ASCII για τον χαρακτήρα "A" είναι 41 ώρες.

INT 21h– 6η γραμμή. Αυτή είναι η ίδια διακοπή 21h - η εντολή που προκαλεί λειτουργία συστήματοςΤο DOS καθορίζεται στον καταχωρητή AN (στο παράδειγμά μας αυτή είναι η συνάρτηση 02h). Η εντολή INT 21h είναι το κύριο μέσο αλληλεπίδρασης μεταξύ των προγραμμάτων και του λειτουργικού συστήματος.

INT 20h– 7η γραμμή. Αυτή είναι μια διακοπή που λέει στο λειτουργικό σύστημα να βγει από το πρόγραμμα και να μεταφέρει τον έλεγχο στην εφαρμογή της κονσόλας. Εάν το πρόγραμμα έχει ήδη μεταγλωττιστεί και εκκινηθεί από το λειτουργικό σύστημα, η εντολή INT 20h θα μας επιστρέψει στο λειτουργικό σύστημα (για παράδειγμα, στο DOS).

ΤΕΛΟΣ εκκίνησης– 8η γραμμή. Η οδηγία ΤΕΛΟΣ τερματίζει το πρόγραμμα ενώ υποδεικνύει σε ποιο σημείο θα πρέπει να ξεκινήσει η εκτέλεσή του.

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

Οδηγίες για τον ορισμό του αναγνωριστικού

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

όνομα κειμένου EQU

όνομα = αριθμητική τιμή (έκφραση)

Διαφορά μεταξύ ψευδο-τελεστών EQU και =:

l EQU - εκχωρεί μια τιμή μόνιμα (δεν μπορεί να αλλάξει), το κείμενο μπορεί να είναι μια συμβολική, αριθμητική ή μικτή έκφραση που ορίζει μια σταθερά, μια διεύθυνση, ένα άλλο συμβολικό όνομα, μια ετικέτα κ.λπ.

l = - εκτελεί την τρέχουσα εκχώρηση (η τιμή μπορεί να εκχωρηθεί εκ νέου, αλλά μόνο κατά τη μετάφραση, φυσικά). εκχωρεί μόνο αριθμητική παράσταση, που περιέχει απλούς μαθηματικούς μετασχηματισμούς που θα εκτελεστούν κατά τη μετάφραση (για παράδειγμα: const + 1, 15H*4, 3*12/4, κ.λπ.).

Οδηγίες για τον ορισμό δεδομένων

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

[όνομα] Δ* έκφραση [,έκφραση] [,...].

Οι λέξεις-κλειδιά D* θα μπορούσαν να είναι:

l DB - ορισμός byte (1 byte).

l DW - ορίστε μια λέξη (2 byte).

l DD - ορίστε μια διπλή λέξη (4 byte).

l DQ - ορίστε 8 byte.

l DT - ορίστε 10 byte.

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

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

l σταθερά:
const DB 56; const DW 1936; const DD 3FFH.
Φροντίστε να λάβετε υπόψη το εύρος και τη χωρητικότητα ενός byte, μιας λέξης κ.λπ. έτσι, για DB η σταθερά δεν μπορεί να είναι μεγαλύτερη από 255, για DW - 65.535, για DD -



l 65 535 2 – 1 = 4 294 967 295;

l διάνυσμα ή πίνακας:
πίνακας1 DB 30, 4, –15, 0, 0, 0, 56; πίνακας 2 DW 1936, 3004, 56, 15.
Σε έναν ψευδοτελεστή μπορείτε να τοποθετήσετε μια συμβολοσειρά έως και 132 θέσεων και αντί να επαναλάβετε την ίδια τιμή πολλές φορές (0 στον πίνακα 1), μπορείτε να χρησιμοποιήσετε τον ψευδοτελεστή DUP (διπλότυπο):
table1 DB 30, 4, –15, 3 dup(0), 56);

l μια σειρά χαρακτήρων:
str1 DB "Εισήγατε πάρα πολύ μεγάλος αριθμός";
str2 DB "Κακή εντολή";
στον ψευδο-τελεστή DB η γραμμή μπορεί να περιέχει 255 χαρακτήρες, σε όλους τους άλλους (DW, DD, DQ, DT) - μόνο 2 χαρακτήρες.

μεγάλο κενό πεδίο:
pole1 DB ?; pole2 DW 12 dup(?),
Ταυτόχρονα, δεν γράφεται τίποτα στα στοιχεία δεσμευμένης μνήμης κατά τη φόρτωση του προγράμματος (δεν γράφεται το 0, όπως, για παράδειγμα, στην οδηγία pole3 DW 5 dup(0), αλλά τα κελιά μνήμης απλώς δεσμεύονται).

l συμβολικό όνομα μεταβλητής:
var1 DW disp; var2 διάνυσμα DD
(μια μεταβλητή ορίζεται από τη διεύθυνση μιας άλλης· δεν χρειάζεται να προσδιορίζεται η μετατόπιση στις οδηγίες, αφού το όνομα της μεταβλητής γίνεται αντιληπτό ως η διεύθυνσή της). Αυτή η επιλογή είναι κατάλληλη, για παράδειγμα, για την αποθήκευση διευθύνσεων κελιών μνήμης, ετικετών που μπορούν να αναφέρονται σε ένα πρόγραμμα (var1 DW disp) και εάν η μεταβλητή βρίσκεται στο ίδιο τμήμα με την εντολή αναφοράς, τότε αρκεί να καθορίσετε μόνο η μετατόπιση ως διεύθυνση ( 2 byte), δηλαδή, μπορείτε να τα βγάλετε πέρα ​​με το DW. εάν η μεταβλητή βρίσκεται σε άλλο τμήμα, τότε πρέπει να καθορίσετε και το τμήμα και τη μετατόπιση (4 byte συνολικά), δηλαδή, θα πρέπει να χρησιμοποιήσετε DD (var2 DD διάνυσμα).

l με μια απλή έκφραση:
fn1 DB 80*3; fn2 DW (disp) + 256, υπολογίζεται φυσικά μόνο όταν μεταφραστεί το πρόγραμμα.

Οδηγίες για τον καθορισμό τμημάτων και διαδικασιών

Ένα τμήμα ορίζεται από ψευδο-τελεστές:

τμήμα_όνομα τμήματος

το segname τελειώνει

Σε ένα πρόγραμμα, μπορείτε να χρησιμοποιήσετε 4 τμήματα (ανάλογα με τον αριθμό των καταχωρητών τμημάτων) και για καθένα, να καθορίσετε τον αντίστοιχο καταχωρητή τμημάτων χρησιμοποιώντας τον ψευδο-τελεστή ASSUME (υποθέτω - εκχώρηση), για παράδειγμα:

υποθέστε CS:codeseg, DS:dataseg, SS:stackseg

Η οδηγία ASSUME register_seg:seg_name [,..], συγκεκριμένα, ASSUME cs:codeseg, προσδιορίζει ότι ο καταχωρητής που επιλέχθηκε για το τμήμα seg_name (codeseg) είναι CS.

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

Η διαδικασία ορίζεται από ψευδο-τελεστές:

procedure_name proc...

procedure_name endp

Κατά τον καθορισμό μιας διαδικασίας μετά λέξη-κλειδίΤο proc πρέπει να προσδιορίζει το χαρακτηριστικό απόστασης κοντά ή μακριά. Εάν αυτό το χαρακτηριστικό δεν υπάρχει, τότε η προεπιλογή είναι κοντά. Συνήθως η διαδικασία πρέπει να τελειώνει με μια εντολή ret (return). Εάν μια διαδικασία δηλωθεί ως πλησιέστερη, τότε η κλήση πρέπει να γίνει από το ίδιο τμήμα. αν procfar, τότε από οποιοδήποτε τμήμα (σε αυτήν την περίπτωση, η εντολή ret θα εμφανίσει δύο λέξεις από τη στοίβα κατά την επιστροφή: για IP και για CS).

Οδηγίες για τον έλεγχο της εκπομπής

Υπάρχουν αρκετά από αυτά, το πιο συχνά χρησιμοποιούμενο είναι το ΤΕΛΟΣ. Η οδηγία ΤΕΛΟΣ σηματοδοτεί το τέλος του προγράμματος και λέει στον συναρμολογητή πού να τερματίσει τη μετάφραση. Μορφή: ΤΕΛΟΣ [όνομα_προγράμματος].

Διαδικασίες προγραμματισμού για εργασία με συσκευές εισόδου/εξόδου

Οι διαδικασίες εισόδου/εξόδου σε έναν υπολογιστή εκτελούνται συνήθως χρησιμοποιώντας διακοπές. Η σύνθεση και η χρήση των κύριων τύπων διακοπών και οι λειτουργίες εξυπηρέτησης της διακοπής DOS 21H συζητούνται στις εργασίες. Παρακάτω θα συζητήσουμε εν συντομία τα ζητήματα προγραμματισμού των διακοπών I/O μόνο για την εμφάνιση πληροφοριών στην οθόνη και στην είσοδο του πληκτρολογίου. Ζητήματα εξόδου πληροφοριών σε έναν εκτυπωτή και εργασίας με αρχεία συζητούνται στις εργασίες.

Προγραμματισμός οθόνης

Η ρύθμιση των τρόπων λειτουργίας και η ανταλλαγή δεδομένων με την οθόνη μπορούν να πραγματοποιηθούν χρησιμοποιώντας διακοπές BIOS τύπου 10H και δεδομένα μπορούν να εξάγονται στην οθόνη χρησιμοποιώντας διακοπές DOS τύπου 21H.

Λειτουργίες βίντεο με διακοπή DOS 21 ωρών

μεγάλο Έξοδος συμβόλουγια εμφάνιση οθόνης: AH = 2 ή AH = 6 και DL<>0FFh. Ο καταχωρητής DL πρέπει να περιέχει τον κωδικό ASCII του χαρακτήρα. Παράδειγμα τμήματος προγράμματος (έξοδος του συμβόλου "C"):

mov DL, 43H; Το 43H είναι ο κωδικός ASCII για τον χαρακτήρα C

μεγάλο Έξοδος μιας σειράς χαρακτήρων: AH = 9 (συνάρτηση που χρησιμοποιείται πιο συχνά). Οι καταχωρητές DS:DX πρέπει να περιέχουν την αρχική διεύθυνση της συμβολοσειράς χαρακτήρων, η οποία πρέπει να τελειώνει με τον χαρακτήρα $. Ένα παράδειγμα τμήματος προγράμματος (εμφανίζει το κείμενο "outputting a string of characters $"):

Κείμενο db "συμβολοσειρά χαρακτήρων εξόδου $"

mov DX, offset text ; αυτή είναι η διεύθυνση της γραμμής εξόδου

μεγάλο I/O από αρχείομέσω λογικού αριθμού. Οι τυπικοί λογικοί αριθμοί αρχείων προσδιορίζουν τον τύπο και τη συσκευή του I/O:

l 0 - είσοδος πληκτρολογίου.

l 1 - έξοδος στην οθόνη προβολής.

l 2- εμφάνιση μηνύματος σφάλματος.

l 3- I/O ενεργοποιημένη εξωτερική συσκευή;

l 4- εκτύπωση.

Η συνάρτηση AH = 3Fh της διακοπής 21H χρησιμοποιείται για είσοδο, η συνάρτηση AH = 40h της διακοπής 21H χρησιμοποιείται για την έξοδο. Ο καταχωρητής CX είναι προρυθμισμένος με τον αριθμό των byte εισόδου/εξόδου και ο καταχωρητής DX είναι προρυθμισμένος με τη διεύθυνση έναρξης του πεδίου μνήμης για την είσοδο/έξοδο. Εάν η διαδικασία I/O ολοκληρωθεί με επιτυχία, η σημαία μεταφοράς CF διαγράφεται και ο αριθμός των byte που πραγματικά μεταφέρθηκαν επιστρέφεται στον καταχωρητή AX. Εάν η λειτουργία αποτύχει, η σημαία CF ορίζεται σε 1 και ένας κωδικός σφάλματος γράφεται στον καταχωρητή AX.

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

κείμενο db 50 dup(" ")

mov BX, 1 ; προσδιορίζοντας τη συσκευή εξόδου

mov CX, 50 ;που υποδεικνύει τον αριθμό των byte που θα εξάγονται

mov DX, offset text ; προσδιορίζοντας τη διεύθυνση έναρξης

; πεδίο μνήμης που περιέχει κείμενο

Οδηγίες Συνέλευσης

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

Ο κατάλογος των οδηγιών δίνεται στον παρακάτω πίνακα.

Διευθυντικός Περιγραφή
ΨΗΦΙΟΛΕΞΗ Κρατήστε byte στη μνήμη RAM
CSEG Τμήμα προγράμματος
D.B. Ορίστε byte σε flash ή EEPROM
DEF Εκχωρήστε ένα συμβολικό όνομα σε ένα μητρώο
ΣΥΣΚΕΥΗ Προσδιορίστε τη συσκευή για την οποία έχει μεταγλωττιστεί το πρόγραμμα
DSEG Τμήμα δεδομένων
DW Ορίστε λέξεις σε flash ή EEPROM
ENDM, ENDMACRO Τέλος μακροεντολής
EQU Ορίστε σταθερή έκφραση
ΕΣΕΓ Τμήμα EEPROM
ΕΞΟΔΟΣ Έξοδος από το αρχείο
ΠΕΡΙΛΑΜΒΑΝΩ Επισυνάψτε ένα άλλο αρχείο
ΛΙΣΤΑ Ενεργοποίηση δημιουργίας καταχώρισης
LISTMAC Ενεργοποιήστε την επέκταση μακροεντολών στην καταχώριση
ΜΑΚΡΟ Έναρξη μακροεντολής
ΝΟΛΙΣΤ Απενεργοποιήστε τη δημιουργία καταχώρισης
ΟΡΓ Ορισμός θέσης στο τμήμα
ΣΕΙΡΑ Ορισμός μεταβλητής ισοδύναμου συμβολικής έκφρασης

BYTE - κρατήστε byte στη μνήμη RAM.Η οδηγία BYTE κρατά byte στη μνήμη RAM. Εάν θέλετε να μπορείτε να ανατρέχετε σε μια εκχωρημένη περιοχή μνήμης, πριν από την οδηγία BYTE πρέπει να υπάρχει μια ετικέτα. Η οδηγία λαμβάνει μία απαιτούμενη παράμετρο, η οποία καθορίζει τον αριθμό των byte που θα εκχωρηθούν. Αυτή η οδηγία μπορεί να χρησιμοποιηθεί μόνο στο τμήμα δεδομένων (δείτε οδηγίες CSEG και DSEG). Τα εκχωρημένα byte δεν αρχικοποιούνται.

Σύνταξη:

ΕΤΙΚΕΤΑ: Έκφραση .BYTE

DSEG var1: .BYTE 1 ; κρατά 1 byte για var1

πίνακας: .BYTE tab_size ; κρατά byte tab_size

Ldi r30,low(var1) ; Φορτώνει το χαμηλό byte του καταχωρητή Z

Ldi r31,high(var1) ; Φορτώνει το υψηλό byte του καταχωρητή Z

Ld r1,Z ; Φορτώνει το var1 στον καταχωρητή 1

DB - ορίστε byte σε flash ή EEPROM.Η οδηγία DB διατηρεί έναν εξαιρετικά σημαντικό αριθμό byte στη μνήμη προγράμματος ή στο EEPROM. Εάν θέλετε να μπορείτε να αναφέρεστε σε μια εκχωρημένη περιοχή μνήμης, πριν από την οδηγία DB πρέπει να υπάρχει μια ετικέτα. Η οδηγία ΣΠ πρέπει να έχει τουλάχιστον μία παράμετρο.
Δημοσιεύτηκε στο ref.rf

Οι παράμετροι που μεταβιβάζονται στην οδηγία είναι μια ακολουθία εκφράσεων που χωρίζονται με κόμμα. Κάθε έκφραση πρέπει είτε να είναι ένας αριθμός στο εύρος (-128..255) είτε ο υπολογισμός πρέπει να παράγει ένα αποτέλεσμα στο ίδιο εύρος, διαφορετικά ο αριθμός περικόπτεται σε ένα byte και ΧΩΡΙΣ την έκδοση προειδοποιήσεων.

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

Σύνταξη:

ΕΤΙΚΕΤΑ: .DB express_list

CSEG συνίσταται: .DB 0, 255, 0b01010101, -128, 0xaa

const2: .DB 1,2,3

DW - ορίστε λέξεις σε flash ή EEPROM.Η οδηγία DW διατηρεί έναν εξαιρετικά σημαντικό αριθμό λέξεων στη μνήμη προγράμματος ή EEPROM. Εάν θέλετε να μπορείτε να αναφέρεστε σε μια εκχωρημένη περιοχή μνήμης, πριν από την οδηγία DW πρέπει να υπάρχει μια ετικέτα. Η οδηγία DW πρέπει να έχει τουλάχιστον μία παράμετρο.
Δημοσιεύτηκε στο ref.rf
Αυτή η οδηγία πρέπει να τοποθετείται μόνο στο τμήμα προγράμματος (CSEG) ή στο τμήμα EEPROM (ESEG).

Οι παράμετροι που μεταβιβάζονται στην οδηγία είναι μια ακολουθία εκφράσεων που χωρίζονται με κόμμα. Κάθε έκφραση πρέπει είτε να είναι ένας αριθμός στο εύρος (-32768..65535) είτε ο υπολογισμός πρέπει να παράγει αποτέλεσμα στο ίδιο εύρος, διαφορετικά ο αριθμός περικόπτεται σε λέξη και ΧΩΡΙΣ να εκδίδει προειδοποιήσεις.

Σύνταξη:

ΕΤΙΚΕΤΑ: Λίστα εκφράσεων .DW

varlist:═ .DW 0, 0xffff, 0b1001110001010101, -32768, 65535

eevarlst: .DW 0.0xffff,10

· Τμήματα

DSEG - τμήμα δεδομένων.Η οδηγία DSEG καθορίζει την έναρξη του τμήματος δεδομένων. Το αρχείο προέλευσης μπορεί να αποτελείται από πολλά τμήματα δεδομένων, τα οποία συνδυάζονται σε ένα τμήμα κατά τη μεταγλώττιση. Το τμήμα δεδομένων συνήθως αποτελείται μόνο από οδηγίες και ετικέτες BYTE. Τα τμήματα δεδομένων έχουν τους δικούς τους μετρητές θέσης byte. Η οδηγία ORG πρέπει να χρησιμοποιηθεί για την τοποθέτηση μεταβλητών σε μια κρίσιμη θέση στη μνήμη RAM. Η οδηγία δεν έχει παραμέτρους.

Σύνταξη:

ldi r30,low(var1) ; Φόρτωση χαμηλού byte του καταχωρητή Z

ldi r31,high(var1) ; Φόρτωση υψηλού byte του καταχωρητή Z

ld r1,Z ; Φορτώστε το var1 στον καταχωρητή r1

CSEG - τμήμα προγράμματος.Η οδηγία CSEG ορίζει την έναρξη ενός τμήματος προγράμματος. Ένα αρχείο προέλευσης μπορεί να αποτελείται από πολλά τμήματα προγράμματος, τα οποία συνδυάζονται σε ένα τμήμα προγράμματος κατά τη μεταγλώττιση. Το τμήμα προγράμματος είναι το προεπιλεγμένο τμήμα. Τα τμήματα προγράμματος έχουν τους δικούς τους μετρητές θέσης, οι οποίοι μετρούν σαν να μην είναι byte-byte. Η οδηγία ORG θα πρέπει να χρησιμοποιείται για την τοποθέτηση κώδικα και σταθερών σε μια κρίσιμη θέση στο τμήμα. Η οδηγία CSEG δεν έχει παραμέτρους.

Σύνταξη:

DSEG ; Έναρξη τμήματος δεδομένων

vartab: .BYTE 4 ; Διατηρεί 4 byte σε RAM

CSEG ; Έναρξη τμήματος κώδικα

const: .DW 2 ; Τοποθετήστε τη σταθερά 0x0002 στη μνήμη του προγράμματος

mov r1,r0 ; Εκτελέστε ενέργειες

Τμήμα ESEG - EEPROM.Η οδηγία ESEG ορίζει την αρχή του τμήματος EEPROM. Το αρχείο προέλευσης μπορεί να αποτελείται από πολλά τμήματα EEPROM, τα οποία συνδυάζονται σε ένα τμήμα κατά τη μεταγλώττιση. Ένα τμήμα EEPROM συνήθως αποτελείται μόνο από οδηγίες DB, DW και label. Τα τμήματα EEPROM έχουν τους δικούς τους μετρητές θέσης byte. Η οδηγία ORG πρέπει να χρησιμοποιηθεί για την τοποθέτηση μεταβλητών σε κρίσιμη θέση στο EEPROM. Η οδηγία δεν έχει παραμέτρους.

Σύνταξη:

DSEG ; Έναρξη τμήματος δεδομένων

var1: .BYTE 1 ; κρατήστε 1 byte για var1

πίνακας: .BYTE tab_size ; δέσμευση tab_size byte.

eevar1: .DW 0xffff ; αρχικοποιήστε 1 λέξη στο EEPROM

ORG - Ορίστε τη θέση στο τμήμα.Η οδηγία ORG ορίζει τον μετρητή θέσης ίσο με μια δεδομένη τιμή, η οποία μεταβιβάζεται ως παράμετρος.
Δημοσιεύτηκε στο ref.rf
Είναι σημαντικό να σημειωθεί ότι για το τμήμα δεδομένων ορίζει τον μετρητή θέσης στο SRAM, για το τμήμα προγράμματος είναι ο μετρητής προγράμματος και για το τμήμα EEPROM είναι η θέση στο EEPROM. Εάν της οδηγίας προηγείται μια ετικέτα (στην ίδια γραμμή), τότε η ετικέτα τοποθετείται στη διεύθυνση που καθορίζεται στην παράμετρο της οδηγίας. Πριν ξεκινήσει η μεταγλώττιση, ο μετρητής προγράμματος και ο μετρητής EEPROM είναι ίσοι με μηδέν και ο μετρητής RAM είναι ίσος με 32 (αφού οι διευθύνσεις 0-31 καταλαμβάνονται από καταχωρητές). Λάβετε υπόψη ότι οι μετρητές byte χρησιμοποιούνται για τη μνήμη RAM και το EEPROM και μετρητές λέξη προς λέξη χρησιμοποιούνται για το τμήμα του προγράμματος.

Σύνταξη:

Έκφραση ORG

DSEG ; Έναρξη τμήματος δεδομένων

ORG 0x37 ; Ορίστε τη διεύθυνση SRAM σε 0x37

μεταβλητή: .BYTE 1 ; Κρατήστε ένα byte στη διεύθυνση 0x37H

CSEG.ORG 0x10; Ορίστε τον μετρητή προγράμματος σε 0x10

mov r0,r1 ; Αυτή η εντολή θα βρίσκεται στη διεύθυνση 0x10

Σύνταξη:

· Μακροεντολές

MACRO - έναρξη μιας μακροεντολής.Ο ορισμός της μακροεντολής ξεκινά με την οδηγία MACRO. Το όνομα της μακροεντολής μεταβιβάζεται στην οδηγία ως παράμετρος. Όταν ένα όνομα μακροεντολής συναντάται αργότερα στο κείμενο του προγράμματος, ο μεταγλωττιστής αντικαθιστά αυτό το όνομα με το σώμα της μακροεντολής. Μια μακροεντολή μπορεί να έχει έως και 10 παραμέτρους, οι οποίες είναι προσβάσιμες στο σώμα της μέσω @0-@9. Όταν καλούνται, οι παράμετροι παρατίθενται διαχωρισμένες με κόμμα. Ο ορισμός της μακροεντολής τελειώνει με την οδηγία ENDMACRO.

Από προεπιλογή, μόνο η κλήση μακροεντολής περιλαμβάνεται στην καταχώριση για την επέκταση της μακροεντολής, είναι εξαιρετικά σημαντικό να χρησιμοποιήσετε την οδηγία LISTMAC. Η μακροεντολή στην καταχώριση εμφανίζεται με σύμβολο +.

Σύνταξη:

Όνομα μακροεντολής MACRO

MACRO SUBI16; Έναρξη μακροορισμού

subi @1,low(@0) ; Αφαιρέστε το χαμηλό byte της παραμέτρου 0 από την παράμετρο 1

sbci @2,high(@0) ; Αφαιρέστε το υψηλό byte της παραμέτρου 0 από την παράμετρο 2

CSEG ; Έναρξη τμήματος προγράμματος

SUBI16 0x1234,r16,r17 ; Αφαιρέστε 0x1234 από το ζεύγος r17:r16

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

Σύνταξη:

MACRO SUBI16 ; Έναρξη ορισμού μακροεντολών

subi r16,low(@0) ; Αφαιρέστε το χαμηλό byte της πρώτης παραμέτρου

sbci r17,high(@0) ; Αφαιρέστε το υψηλό byte της πρώτης παραμέτρου

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

Σύνταξη:

MACRO MACX; Μακροεντολή Ορισμός

προσθέστε r0,@0 ; Μακρο σώμα

ENDMACRO; Τέλος ορισμού μακροεντολής

LISTMAC; Ενεργοποίηση επέκτασης μακροεντολών

MACX r2,r1; Κλήση μακροεντολής (το σώμα της μακροεντολής θα εμφανίζεται στην καταχώριση)

· Εκφράσεις

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

Σύνταξη:

Ετικέτα EQU = έκφραση

EQU io_offset = 0x23

EQU porta = io_offset + 2

CSEG ; Έναρξη τμήματος δεδομένων

clr r2 ; Εκκαθάριση καταχωρητή r2

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

Σύνταξη:

Όνομα SET = έκφραση

SET io_offset = 0x23

SET porta = io_offset + 2

ΧΑΚ ; Έναρξη τμήματος κώδικα

clr r2 ; Εκκαθάριση μητρώου 2

out porta,r2 ; Γράψτε στη θύρα Α

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

Σύνταξη:

DEF Symbolic_name = Εγγραφή

θερμοκρασία ldi,0xf0 ; Φόρτωση 0xf0 στον προσωρινό καταχωρητή (R16)

eor temp, ior ; Οι καταχωρητές temp και ior προστίθενται με αποκλειστικό ή

ΣΥΣΚΕΥΗ - ορίστε τη συσκευή.Η οδηγία DEVICE σάς επιτρέπει να καθορίσετε για ποια συσκευή θα μεταγλωττιστεί το πρόγραμμα. Όταν χρησιμοποιείτε αυτήν την οδηγία, ο μεταγλωττιστής θα εκδώσει μια προειδοποίηση εάν βρεθεί μια οδηγία που δεν υποστηρίζεται από αυτόν τον μικροελεγκτή.
Δημοσιεύτηκε στο ref.rf
Θα εκδοθεί επίσης προειδοποίηση εάν το τμήμα λογισμικού ή το τμήμα EEPROM υπερβαίνει το μέγεθος που επιτρέπεται από τη συσκευή. Εάν δεν χρησιμοποιηθεί η οδηγία, τότε όλες οι οδηγίες θεωρούνται έγκυρες και δεν υπάρχουν περιορισμοί στο μέγεθος των τμημάτων.

Σύνταξη:

ΣΥΣΚΕΥΗ AT90S1200 | AT90S2313 | AT90S2323 | AT90S2333 | AT90S2343 | AT90S4414 | AT90S4433 | AT90S4434 | AT90S8515 | AT90S8534 | AT90S8535 | ATtiny11 | ATtiny12 | ATtiny22 | ATmega603 | ATmega103

ΣΥΣΚΕΥΗ AT90S1200 ; Μεταχειρισμένο AT90S1200

ώθηση r30 ; η οδηγία θα προκαλέσει μια προειδοποίηση, το AT90S1200 δεν έχει

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

Σύνταξη:

ΕΞΟΔΟΣ ; Έξοδος από αυτό το αρχείο

ΠΕΡΙΛΑΜΒΑΝΕΙ - επισυνάψτε άλλο αρχείο.Έχοντας συναντήσει μια οδηγία INCLUDE, ο μεταγλωττιστής ανοίγει το αρχείο που καθορίζεται σε αυτό, το μεταγλωττίζει μέχρι να τελειώσει το αρχείο ή να συναντηθεί η οδηγία EXIT, μετά την οποία συνεχίζει να μεταγλωττίζει το αρχικό αρχείο από τη γραμμή που ακολουθεί την οδηγία INCLUDE. Το συνημμένο αρχείο μπορεί επίσης να περιέχει οδηγίες ΠΕΡΙΛΑΜΒΑΝΕΙ.

Σύνταξη:

ΠΕΡΙΛΑΜΒΑΝΕΙ "όνομα αρχείου"

; Αρχείο iodefs.asm:

EQU sreg = 0x3f ; Μητρώο κατάστασης

EQU sphigh = 0x3e ; Υψηλό byte δείκτη στοίβας

Ροή EQU = 0x3d ; Χαμηλό byte του δείκτη στοίβας

; αρχείο incdemo.asm

ΠΕΡΙΛΑΜΒΑΝΕΤΕ iodefs.asm ; Επισυνάψτε ορισμούς θυρών

· Καταχωρήσεις

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

Σύνταξη: .LIST

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

Σύνταξη:.ΝΟΛΙΣΤ

Παράδειγμα: .NOLIST ; Απενεργοποιήστε τη δημιουργία καταχώρισης

ΠΕΡΙΛΑΜΒΑΝΕΙ το "macro.inc" ; Τα συνημμένα αρχεία δεν θα είναι

ΠΕΡΙΛΑΜΒΑΝΕΙ το "const.def" ; εμφανίζεται στην καταχώριση

ΛΙΣΤΑ ; Ενεργοποίηση δημιουργίας καταχώρισης

Οδηγίες συναρμολόγησης - έννοια και τύποι. Ταξινόμηση και χαρακτηριστικά της κατηγορίας "Οδηγίες συναρμολογητών" 2017, 2018.