Assembler directives
Ενώ οι εντολές λένε τι η CPU θα κάνει οι directives (αλλιώς ψευδοεντολές) δίνουν κατευθύνσεις στον assembler. Για παράδειγμα οι εντολές LDI και ADD είναι εντολές στην CPU ενώ οι .EQU , .DEVICE και .ORG είναι directives στον assembler. Στις επόμενες ενότητες παρουσιάζουμε τις πιο συνηθισμένες directives του AVR μικροελεγκτή και πως χρησιμοποιούνται. Οι directives μας βοηθούν να αναπτύξουμε τον κώδικα ευκολότερα και να τον κάνουμε ευανάγνωστο.
.EQU
Αυτή χρησιμοποιείται για να δηλώσουμε μια σταθερή τιμή ή σταθερή διεύθυνση. Η χρήση της .EQU δεν δεσμεύει χώρο στη μνήμη για αποθήκευση δεδομένων, απλά διασυνδέει ένα σταθερό αριθμό με μια ετικέτα δεδομένων ή διευθύνσεων, έτσι ώστε όταν η ετικέτα εμφανίζεται στον κώδικα η σταθερά που αντιπροσωπεύει αντικαθιστά την ετικέτα. Στο ακόλουθο παράδειγμα χρησιμοποιείται η .EQU για την σταθερά COUNT και στη συνέχεια χρησιμοποιείται για τη φόρτωση του καταχωρητή R21
.EQU COUNT = 0x25
…
LDI R21, COUNT ; R21 = 0x25
Όταν εκτελείται η παραπάνω εντολή “LDI R21, COUNT” ο καταχωρητής R21 θα φορτωθεί με την τιμή 0x25. Με την .EQU directive μπορούμε να τροποποιήσουμε μαζικά αριθμητικές τιμές που αντιπροσωπεύονται από κοινή ετικέτα.
Όπως αναφέραμε σε προηγούμενη ενότητα, μπορούμε να χρησιμοποιούμε τα ονόματα των Ι/Ο καταχωρητών αντί τις διευθύνσεις τους (π.χ. μπορούμε να γράψουμε “OUT PORTB, R20” αντί “OUT 0x05, R20). Αυτό γίνεται με την βοήθεια της .EQU directive. Με την συμπερίληψη του κατάλληλου αρχείου τα Ι/Ο ονόματα καταχωρητών ορίζονται με τις διευθύνσεις τους χρησιμοποιώντας την .EQU directive.
.SET
Αυτή η directive χρησιμοποιείται για να ορίσουμε σταθερές τιμές ή σταθερές διευθύνσεις. Οι directives .SET και .EQU είναι πανομοιότυπες που διαφέρουν στο γεγονός ότι η τιμή που εκχωρείται στην .SET directive μπορεί να εκχωρηθεί ξανά αργότερα.
Χρησιμοποιώντας την .EQU για εκχώρηση σταθερών τιμών
Για την εξάσκηση της .EQU μελέτησε το ακόλουθο παράδειγμα:
; in hexadecimal
.EQU DATA1 = 0X39 ; one way to define hex value
.EQU DATA2 = $39 ; another way to define hex value
; in binary
.EQU DATA3 = 0b00110101 ; binary (35 in hex)
; in decimal
.EQU DATA4 = 39 ; decimal numbers (27 in hex)
; in ASCII
.EQU DATA5 = ‘2’ ; ASCII characters
Χρησιμοποιώντας την .EQU για εκχώρηση SFR διευθύνσεων
Η .EQU directive χρησιμοποιείται ευρέως για εκχώρηση SFR διευθύνσεων. Μελέτησε τον ακόλουθο κώδικα:
.EQU COUNTER = 0x00 ; counter value 00
.EQU PORTB = 0x05 ; SFR Port B address
LDI R16, COUNTER ; R16 = 0x00
OUT PORTB, R16 ; Port B (loc 0x05) now has 00 too
Χρησιμοποιώντας την . EQU για την εκχώρηση RAM διευθύνσεων
Μια άλλη συνηθισμένη χρήση της .EQU είναι η εκχώρηση διευθύνσεων της εσωτερικής μνήμης SRAM. Μελέτησε ένα άλλο παράδειγμα κώδικα, για να καταλάβεις περισσότερα:
.EQU SUM = 0x120 ; assign RAM loc to SUM
LDI R20, 5 ; load R20 with 5
LDI R21, 2 ; load R21 with 2
ADD R20, R21 ; R20 = R20 + R21
ADD R20, R21 ; R20 = R20 + R21
STS SUM, R20 ; store the result in loc 0x120
Η χρήση της .EQU directive είναι ιδιαίτερα βολική, όταν μια διεύθυνση χρειάζεται να αλλάξει στην περίπτωση που θέλουμε να χρησιμοποιήσουμε ένα άλλο AVR τσιπ στην εργασία μας.
Με την .EQU directive είναι ευκολότερο να αναφερόμαστε σε ένα όνομα παρά σε ένα αριθμό όταν προσπελαύνουμε θέσεις διευθύνσεων της RAM.
.ORG
Η .ORG directive χρησιμοποιείται για να ορίσουμε την αρχή των διευθύνσεων. Μπορεί να χρησιμοποιηθεί και για τα δυο κώδικα και δεδομένα.
.INCLUDE
H .INCLUDE directive προκαλεί τον AVR assembler να προσθέσει τα περιεχόμενα ενός αρχείου στον κώδικα που γράφουμε. Για παράδειγμα η επόμενη γραμμή κώδικα θα συμπεριλάβει ένα αρχείο με όνομα “myfile.inc”
.INCLUDE myfile.inc
Στο Atmel Studio 7 όταν επιλέγεις ένα τσιπ το IDE αυτόματα προσθέτει τους ορισμούς στον κώδικα που γράφεις και δεν χρειάζεται να συμπεριλάβεις κάποιο αρχείο.
Κανόνες για τα ονόματα ετικετών στη γλώσσα Assembly
Επιλέγοντας ευανάγνωστες και ξεκάθαρες ετικέτες μπορείς να κάνεις τον κώδικα που γράφεις ξεκάθαρο και εύκολο να συντηρηθεί. Υπάρχουν αρκετοί κανόνες που πρέπει να ακολουθήσεις. Πρώτον το όνομα της ετικέτας να είναι μοναδικό. Τα ονόματα που χρησιμοποιούνται για ετικέτες θα πρέπει να αποτελούνται από αλφαβητικούς χαρακτήρες μικρά ή κεφαλαία, τα ψηφία 0 έως 9 και τους χαρακτήρες (?), (.), (@), (_), ($). Ο πρώτος χαρακτήρας του ονόματος ετικέτας πρέπει να είναι αλφαβητικός και δεν πρέπει να είναι αριθμός. Το όνομα μιας ετικέτας δεν πρέπει να είναι δεσμευμένο όνομα που χρησιμοποιεί ο assembler όπως τα μνημονικά ονόματα εντολών όπως π.χ. το “LDI” ή “ADD”.