Εγχειρίδιο Χρήσης ΑΤ91 · 2013-03-30 · Εγχειρίδιο χρήσης at91...

131
ΠΑΝΕΠΙΣΤΗΜΙΟ ΠΑΤΡΩΝ ΠΟΛΥΤΕΧΝΙΚΗ ΣΧΟΛΗ ΤΜΗΜΑ ΜΗΧΑΝΙΚΩΝ Η/Υ & ΠΛΗΡΟΦΟΡΙΚΗΣ ΕΡΓΑΣΤΗΡΙΟ ΤΕΧΝΟΛΟΓΙΑΣ & ΑΡΧΙΤΕΚΤΟΝΙΚΗΣ Ver. 1, Rev. 5 Εγχειρίδιο Χρήσης ΑΤ91 ΧΑΡΙ∆ΗΜΟΣ ΒΕΡΓΟΣ ΝΙΚΟΛΑΟΣ ΚΩΣΤΑΡΑΣ Μάρτιος 2009

Transcript of Εγχειρίδιο Χρήσης ΑΤ91 · 2013-03-30 · Εγχειρίδιο χρήσης at91...

Page 1: Εγχειρίδιο Χρήσης ΑΤ91 · 2013-03-30 · Εγχειρίδιο χρήσης at91 1. Πρόλογος ουσία επιλέξαµε τον πιο ισχυρό µικροελεγκτή

ΠΑΝΕΠΙΣΤΗΜΙΟ ΠΑΤΡΩΝ

ΠΟΛΥΤΕΧΝΙΚΗ ΣΧΟΛΗ

ΤΜΗΜΑ ΜΗΧΑΝΙΚΩΝ Η/Υ & ΠΛΗΡΟΦΟΡΙΚΗΣ

ΕΡΓΑΣΤΗΡΙΟ ΤΕΧΝΟΛΟΓΙΑΣ & ΑΡΧΙΤΕΚΤΟΝΙΚΗΣ

Ver. 1, Rev. 5

Εγχειρίδιο Χρήσης ΑΤ91

ΧΑΡΙ∆ΗΜΟΣ ΒΕΡΓΟΣ

ΝΙΚΟΛΑΟΣ ΚΩΣΤΑΡΑΣ

Μάρτιος 2009

Page 2: Εγχειρίδιο Χρήσης ΑΤ91 · 2013-03-30 · Εγχειρίδιο χρήσης at91 1. Πρόλογος ουσία επιλέξαµε τον πιο ισχυρό µικροελεγκτή

Εγχειρίδιο χρήσης AT91

ii

Page 3: Εγχειρίδιο Χρήσης ΑΤ91 · 2013-03-30 · Εγχειρίδιο χρήσης at91 1. Πρόλογος ουσία επιλέξαµε τον πιο ισχυρό µικροελεγκτή

Περιεχόµενα

Πρόλογος 1

Αρχιτεκτονική του επεξεργαστή 5

2.1 Γενικά . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5

2.2 Καταχωρητές . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8

2.3 Εντολές . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14

2.3.1 Εκτέλεση υπό συνθήκη . . . . . . . . . . . . . . . . . . . . . . . . . 14

2.3.2 Ολισθήσεις . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16

2.3.3 Εντολές µεταφοράς δεδοµένων . . . . . . . . . . . . . . . . . . . . . 20

2.3.4 Αριθµητικές/Λογικές πράξεις . . . . . . . . . . . . . . . . . . . . . . 28

2.3.5 Εντολές διακλάδωσης . . . . . . . . . . . . . . . . . . . . . . . . . . 31

Εισαγωγή στην Assembly του ΑΤ91 35

3.1 Γενικά . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35

3.2 GNU Assembler . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38

3.2.1 Ετικέτες . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39

3.2.2 Ντιρεκτίβες . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40

3.3 Παραδείγµατα . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46

3.3.1 Μεταφορά δεδοµένων εύρους 32­bit . . . . . . . . . . . . . . . . . . 46

3.3.2 ΄Αθροιση αριθµών εύρους 32­bit . . . . . . . . . . . . . . . . . . . . 47

3.3.3 Σωρός . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 48

3.3.4 Σύγκριση αριθµών εύρους 8 bit . . . . . . . . . . . . . . . . . . . . 52

3.3.5 Πρόσθεση αριθµών εύρους 64 bit . . . . . . . . . . . . . . . . . . . 56

3.3.6 ∆ιαίρεση αριθµού εύρους 32 bit µε 16 bit διαιρέτη . . . . . . . . . . 57

Περιβάλλον εργασίας 61

4.1 Υλικό . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61

4.2 Λειτουργικό σύστηµα . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61

4.3 GNU tools . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 65

iii

Page 4: Εγχειρίδιο Χρήσης ΑΤ91 · 2013-03-30 · Εγχειρίδιο χρήσης at91 1. Πρόλογος ουσία επιλέξαµε τον πιο ισχυρό µικροελεγκτή

Εγχειρίδιο χρήσης AT91 ΠΕΡΙΕΧΟΜΕΝΑ

4.4 Ευκολίες . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 70

Εξοµοιωτής 71

5.1 Γενικά . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 71

5.2 Ρυθµίσεις . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 71

5.3 Χρήση . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 74

Instruction Set 79

6.1 Αριθµητικές Εντολές . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 80

6.1.1 ADC . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 80

6.1.2 ADD . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 81

6.1.3 AND . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 82

6.1.4 BIC . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 83

6.1.5 CLZ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 84

6.1.6 CMN . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 85

6.1.7 CMP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 86

6.1.8 EOR . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 87

6.1.9 MLA . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 88

6.1.10MUL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 89

6.1.11ORR . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 90

6.1.12RSB . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 91

6.1.13RSC . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 92

6.1.14SBC . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 94

6.1.15SMLAL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 96

6.1.16SMULL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 97

6.1.17SUB . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 98

6.1.18TEQ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 100

6.1.19TST . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 101

6.1.20UMLAL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 102

6.1.21UMULL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 103

6.2 Εντολές Μετακίνησης . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 104

6.2.1 LDM . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 104

6.2.2 LDR . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 105

6.2.3 LDRB . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 107

6.2.4 LDRH . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 108

6.2.5 LDRSB . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 109

6.2.6 LDRSH . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 110

6.2.7 MCR . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 111

6.2.8 MOV . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 112

iv

Page 5: Εγχειρίδιο Χρήσης ΑΤ91 · 2013-03-30 · Εγχειρίδιο χρήσης at91 1. Πρόλογος ουσία επιλέξαµε τον πιο ισχυρό µικροελεγκτή

ΠΕΡΙΕΧΟΜΕΝΑ Εγχειρίδιο χρήσης AT91

6.2.9 MRC . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 113

6.2.10MRS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 114

6.2.11MSR . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 115

6.2.12MVN . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 117

6.2.13STM . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 118

6.2.14STR . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 119

6.2.15STRB . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 120

6.2.16STRH . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 121

6.2.17SWP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 122

6.2.18SWPB . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 123

6.3 Εντολές ∆ιακλάδωσης . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 124

6.3.1 B,BL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 124

6.3.2 BX . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 125

v

Page 6: Εγχειρίδιο Χρήσης ΑΤ91 · 2013-03-30 · Εγχειρίδιο χρήσης at91 1. Πρόλογος ουσία επιλέξαµε τον πιο ισχυρό µικροελεγκτή

Εγχειρίδιο χρήσης AT91 ΠΕΡΙΕΧΟΜΕΝΑ

vi

Page 7: Εγχειρίδιο Χρήσης ΑΤ91 · 2013-03-30 · Εγχειρίδιο χρήσης at91 1. Πρόλογος ουσία επιλέξαµε τον πιο ισχυρό µικροελεγκτή

Πρόλογος

Η πλατφόρµα AT91 σπάει µια µακρά παράδοση του Τοµέα Υλικού & Αρχιτεκτονικής

του Τµήµατος Μηχανικών Ηλεκτρονικών Υπολογιστών και Πληροφορικής : τη παρά-

δοση να σχεδιάζουµε εκ του µηδενός τις πλατφόρµες των εργαστηριακών µαθηµάτων µας.

Παρότι οι συγγραφείς ϐρέθηκαν στο δίληµµα «να χτίσουµε κάτι εκ του µηδενός» ή «να

στηριχθούµε σε κάτι έτοιµο και να αναπτύξουµε πάνω του», υπήρξαν αρκετοί λόγοι που

µας ώθησαν στη δεύτερη λύση :

• Η υποστήριξη οποιουδήποτε custom­made συστήµατος είναι εξαιρετικά δύσκολη

στο ακαδηµαϊκό περιβάλλον που τα πρόσωπα εναλλάσσονται διαρκώς.

• Η ανάπτυξη εργαλείων υποστήριξης (εξοµοιωτών, αποσφαλµατωτών, ...) είναι εξ-

αιρετικά επίπονη.

• Η ανάπτυξη εκ του µηδενός απαιτεί πολύ µεγάλη επένδυση σε χρόνο, µε αµφίβολα

αποτελέσµατα.

Το υλικό της πλατφόρµας AT91 είναι στην ουσία µια εµπορικά διαθέσιµη αναπτυξι-

ακή πλακέτα (AT91SAM9261EK της εταιρείας ATMEL). Στη πλακέτα αυτή µπορούµε να

αναπτύξουµε εφαρµογές υλικού και λογισµικού για τον µικροελεγκτή AT91SAM9261,

ο οποίος είναι µια εµπλουτισµένη υλοποίηση από την εταιρεία ATMEL του επεξεργαστή

ARM926EJ­S της εταιρείας Advanced Risc Machines (ARM). Η επιλογή του συγκεκριµέ-

νου επεξεργαστικού στοιχείου δεν έγινε τυχαία. Σήµερα (τέλη 2007) όλα τα µικροϋπολο-

γιστικά συστήµατα που αναπτύσσονται (κυρίως µε τη µορφή των ενσωµατωµένων συστη-

µάτων) ϐασίζονται είτε στην αρχιτεκτονική της ARM είτε στην αρχιτεκτονική των PowerPC.

Η πρώτη όντας πιο ανοικτή, υλοποιήσιµη από πολύ µεγάλη γκάµα εταιρειών µε λογικά

κόστη κατέχει πάνω από το 70% της παγκόσµιας αγοράς. Ο συγκεκριµένος µικροελεγκτής

χρονίζεται µε ένα ϱολόι των 200 MHz, διαθέτει στο ίδιο ολοκληρωµένο διαφορετική κρυφή

µνήµη για δεδοµένα και διαφορετική για εντολές (Harvard architecture ­ split caches)

κάθε µία των 16K, ενσωµατώνει τη µονάδα διαχείρισης µνήµης (MMU), προσφέρει δύο

εναλλακτικά σετ εντολών (ARM / THUMB) µε ειδικές εντολές για τη γρήγορη επεξεργασία

ψηφιακού σήµατος (DSP) και για την υλοποίηση της Jazelle αρχιτεκτονικής για Java. Στην

1

Page 8: Εγχειρίδιο Χρήσης ΑΤ91 · 2013-03-30 · Εγχειρίδιο χρήσης at91 1. Πρόλογος ουσία επιλέξαµε τον πιο ισχυρό µικροελεγκτή

Εγχειρίδιο χρήσης AT91 1. Πρόλογος

ουσία επιλέξαµε τον πιο ισχυρό µικροελεγκτή (210 MIPS) προερχόµενο από την αρχιτεκ-

τονική που όσοι απόφοιτοί µας ασχοληθούν µε την ανάπτυξη ενσωµατωµένων συστηµάτων

και εφαρµογών είναι εξαιρετικά πιθανόν να χρησιµοποιήσουν.

Αντίθετα, όλο το λογισµικό της πλακέτας είναι προσαρµογή λογισµικού ανοικτού κώδι-

κα (GNU licensed) για τη συγκεκριµένη αρχιτεκτονική, που έγινε από τον κ. Κωσταρά στα

πλαίσια της Μεταπτυχιακής διπλωµατικής του εργασίας. Παρότι κι εδώ ϑα µπορούσαµε να

χρησιµοποιήσουµε έτοιµες λύσεις (τα Windows CE είναι σήµερα ο κύριος αντίπαλος για

εφαρµογές ενσωµατωµένων συστηµάτων εφόσον δεν υφίστανται απαιτήσεις πραγµατικού

χρόνου), το ελάχιστο κόστος, η δυνατότητα µεταφοράς κώδικα σε διαφορετικές πλατφόρµες

µα κυρίως η ϑέλησή µας να παρέχουµε ένα σύστηµα στο οποίο οι µελλοντικοί ϕοιτητές ϑα

µπορούν να αναπτύσσουν και δικές τους εφαρµογές υποστήριξης (ϱουτίνες λειτουργικού,

οδηγούς συσκευών) καθοδήγησαν την επιλογή µας. Επίσης η αναβάθµιση σε επόµενες

εκδόσεις λειτουργικού είναι µια σαφώς ανοιχτή διαδικασία. Στο AT91 τη διαχείριση του

υλικού αναλαµβάνει προσαρµοσµένο λειτουργικό σύστηµα Linux µε πυρήνα της έκδοσης

2.6.20. Προσαρµόσθηκαν επίσης όλα τα GNU εργαλεία : συµβολοµεταφραστές, assem­

blers, αποσφαλµατωτές. ΄Εχοντας προσαρµόσει τα GNU εργαλεία στο υλικό µας, περάσαµε

σε σχεδόν αυτοµατοποιηµένη προσαρµογή όλων των αναγκαίων πακέτων λογισµικού (π.χ.

editors), προγραµµάτων οδήγησης (π.χ. USB driver) και άλλων, καταλήγοντας σε ένα

πλήρως λειτουργικό σύστηµα.

Η εµπειρία δέκα και πλέον χρόνων διδασκαλίας και επίβλεψης των εργαστηριακών

ασκήσεων της συµβολικής γλώσσας στο προηγούµενο του AT91 σύστηµα, έδειξε ότι το

µεγαλύτερο µειονέκτηµα ήταν η απουσία ενός εξοµοιωτή. Οι λίγες εργαστηριακές ώρες δεν

έφταναν στους ϕοιτητές για τη πλήρη κατανόηση της συµβολικής γλώσσας. Τα αποτελέσ-

µατα τραγικά : αντιγραφή των εργαστηριακών ασκήσεων και αποτυχία στις εξετάσεις.

Πολλοί συµφοιτητές σας προσπάθησαν στο παρελθόν να αναπτύξουν εξοµοιωτές της προ-

ηγούµενης πλατφόρµας, άλλοτε µε καλά και άλλοτε µε άθλια αποτελέσµατα. Η υιοθέτηση

λογισµικού ανοικτού κώδικα, προφανώς µας δίνει τη δυνατότητα να χρησιµοποιήσουµε

κάποιον από τους διαθέσιµους εξοµοιωτές. ΄Ετσι µαζί µε το AT91, σας παρέχονται το δ-

ωρεάν µέρος των αναπτυξιακών εργαλείων της εταιρείας Keil µε τα οποία µπορείτε να αναπ-

τύξετε εφαρµογές για οποιονδήποτε επεξεργαστή / µικροελεγκτή των αρχιτεκτονικών ARM

και τα GNU εργαλεία για λειτουργικά συστήµατα της Microsoft. ∆ίνεται λοιπόν η ευκαιρία

στο ϕοιτητή να έχει ένα εξοµοιούµενο AT91 σπίτι του. Εκεί να δίνει τις πρώτες λύσεις

στις εργαστηριακές ασκήσεις, τις οποίες µπορεί να δοκιµάζει, να τις εκτελεί ϐηµατικά,

να διαπιστώνει λάθη και να κάνει αλλαγές µέχρι να ϕτάσει στο επιθυµητό αποτέλεσµα.

Τον κώδικά του µπορεί ακολούθως απλά να τον µεταφέρει (και ηλεκτρονικά ϕυσικά, µέσω

οποιασδήποτε USB συσκευής) στο πραγµατικό AT91 ώστε να επιδείξει τη σωστή λειτουργία

του.

2

Page 9: Εγχειρίδιο Χρήσης ΑΤ91 · 2013-03-30 · Εγχειρίδιο χρήσης at91 1. Πρόλογος ουσία επιλέξαµε τον πιο ισχυρό µικροελεγκτή

1. Πρόλογος Εγχειρίδιο χρήσης AT91

Ενα τόσο δυνατό εργαλείο σα το AT91 ϕυσικά δε ϕτιάχτηκε µόνο για το εργαστήρι-

ο συµβολικής γλώσσας. Πέρα από το εγχειρίδιο χρήσης που κρατάτε αυτή τη στιγµή,

αναπτύσσεται και άλλο εκπαιδευτικό υλικό γύρω από το AT91. Οι ασκήσεις συµβολικής

γλώσσας είναι ένα µικρό πρώτο µέρος από αυτό. Σκοπεύουµε στη νέα πλατφόρµα να

µεταφέρουµε επίσης µέρος των εργαστηρίων Αρχιτεκτονικής και µεγάλο µέρος των ερ-

γαστηρίων Μικροϋπολογιστών. Η τεράστια αυτή προσπάθεια δε ϑα ήταν δυνατή χωρίς

την οικονοµική συνδροµή που µας προσφέρθηκε µέσω της δράσης για αναµόρφωση και

ανάπτυξη εκπαιδευτικού υλικού του προγράµµατος ΕΠΕΑΚ ΙΙ.

Ελπίζουµε ότι το AT91 ϑα αποτελέσει ένα καλό εκπαιδευτικό εργαλείο.

Χ. Βέργος

Μηχανικός Η/Υ & Πληροφορικής, Ph.D., Αναπληρωτής Καθηγητής.

Ν. Κωσταράς

Μηχανικός Η/Υ & Πληροφορικής, MSc

3

Page 10: Εγχειρίδιο Χρήσης ΑΤ91 · 2013-03-30 · Εγχειρίδιο χρήσης at91 1. Πρόλογος ουσία επιλέξαµε τον πιο ισχυρό µικροελεγκτή

Εγχειρίδιο χρήσης AT91 1. Πρόλογος

4

Page 11: Εγχειρίδιο Χρήσης ΑΤ91 · 2013-03-30 · Εγχειρίδιο χρήσης at91 1. Πρόλογος ουσία επιλέξαµε τον πιο ισχυρό µικροελεγκτή

Αρχιτεκτονική του επεξεργαστή

2.1 Γενικά

Ο µικροελεγκτής AT91SAM9261 της εταιρίας ATMEL ο οποίος υπάρχει στο AT91 είναι

ένα ολοκληρωµένο κύκλωµα χαµηλής κατανάλωσης ενέργειας, ϐασισµένο στον επεξερ-

γαστή ARM926EJ­S, µε συχνότητα λειτουργίας τα 200 MHz. Ο ARM926EJ­S έχει σχεδι-

αστεί από την εταιρεία ARM και ο σχεδιασµός του είναι προσανατολισµένος για χρήση σε

ενσωµατωµένες εφαρµογές (embedded applications). Τα χαρακτηριστικά που τον διακρί-

νουν είναι η απλότητα σχεδιασµού (ανήκει σε οικογένεια 32bit RISC επεξεργαστών) και η

ευέλικτη αρχιτεκτονική του, που δίνει τη δυνατότητα ανάπτυξης µιας ευρύτατης γκάµας

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

επεξεργασία ήχου και video, παιχνιδιών κ.α). Το διάγραµµα αρχιτεκτονικής του επεξερ-

γαστή ϕαίνεται στην εικόνα ∆ιάγραµµα Αρχιτεκτονικής (κεφ. 2.1, σελ. 6).

Επεξήγηση

RISC (Reduced Instruction Set Computer) ονοµάζουµε κάθε αρχιτεκτονική επεξεργαστή

µε εξαιρετικά λίγες και απλές εντολές, κάτι που κάνει την υλοποίηση του επεξεργαστή

απλούστερη και ταυτόχρονα του επιτρέπει να εκτελεί 1 εντολή ανά περίοδο ϱολογιού.

Εναλλακτικά, υπάρχει και η CISC (Complex Instruction Set Computer) αρχιτεκτονική,

όπου οι εντολές είναι πολλές, πολύπλοκες και εκτελούν σύνθετες εργασίες.

Τα ϐασικά τµήµατα του επεξεργαστή είναι οι καταχωρητές (registers - παρακάτω

συµβολίζονται µε R ή r) και η Αριθµητική/Λογική Μονάδα1. Οι καταχωρητές είναι

µικρές µνήµες εύρους 32 δυαδικών ψηφίων (bits) η κάθε µία, οι οποίες µπορούν να

προσπελαστούν µε ϱυθµό αντίστοιχο του κύκλου ϱολογιού2. Οι καταχωρητές αναλαµβά-

νουν να αποθηκεύουν δεδοµένα προερχόµενα από την εξωτερική µνήµη του συστήµατος

και να τροφοδοτούν τον επεξεργαστή µε αυτά. Η ΑΛΜ δεν επεξεργάζεται άµεσα τα δεδοµένα

1Arithmetic Logic Unit - ΑΛΜ - ALU2Στις RISC αρχιτεκτονικές ο κύκλος ϱολογιού ισούται και µπορεί να αναφέρεται εναλλακτικά και ως κύκλος

µηχανής

5

Page 12: Εγχειρίδιο Χρήσης ΑΤ91 · 2013-03-30 · Εγχειρίδιο χρήσης at91 1. Πρόλογος ουσία επιλέξαµε τον πιο ισχυρό µικροελεγκτή

Εγχειρίδιο χρήσης AT91 Κεφάλαιο 2.1 - Γενικά

Σχήµα 2.1: ∆ιάγραµµα Αρχιτεκτονικής

6

Page 13: Εγχειρίδιο Χρήσης ΑΤ91 · 2013-03-30 · Εγχειρίδιο χρήσης at91 1. Πρόλογος ουσία επιλέξαµε τον πιο ισχυρό µικροελεγκτή

2. Αρχιτεκτονική του επεξεργαστή Εγχειρίδιο χρήσης AT91

από την εξωτερική µνήµη, αλλά πρέπει πρώτα να αποθηκευτούν σε κάποιον καταχωρητή.

Τα αποτελέσµατα της ΑΛΜ πριν σταλούν στην εξωτερική µνήµη, πάλι ενδιάµεσα πρέπει να

αποθηκεύονται σε κάποιο καταχωρητή.

Ο επεξεργαστής για να Ϲητήσει µια εντολή ή ένα δεδοµένο το οποίο ϐρίσκεται κάπου

στο σύστηµα µνήµης ακολουθεί µια σειρά από ϐήµατα, ένα από τα οποία είναι η εµφάνιση

της διεύθυνσης της Ϲητούµενης πληροφορίας στην αρτηρία διευθύνσεων (address bus) του

συστήµατος. ΄Ολα τα κυκλώµατα που απαρτίζουν το σύστηµα µνήµης «ακούν» την αρτηρία

διευθύνσεων και αναλαµβάνουν να ελέγξουν αν η διεύθυνση που εµφανίστηκε αναφέρεται

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

διεύθυνση εµφανίζει την αποθηκευµένη πληροφορία στην αρτηρία δεδοµένων (data bus),

ώστε αυτή να µεταφερθεί στον επεξεργαστή. Το εύρος της αρτηρίας διευθύνσεων είναι 32

δυαδικών ψηφίων, και συνεπώς στο ΑΤ91 έχουµε 232 διαφορετικές διευθυνσιοδοτούµενες

ϑέσεις µνήµης.

Επεξήγηση . . .

Με τον όρο εξωτερική µνήµη αναφερόµαστε σε κάθε µνήµη που υλοποιείται σε ολοκληρωµένα

κυκλώµατα εκτός αυτού του επεξεργαστή. Τα δεδοµένα µιας τέτοιας µνήµης µπορούµε να τα

προσπελάσουµε µέσω των αρτηριών του συστήµατος, χρησιµοποιώντας τη διεύθυνση του επιθυµη-

τού δεδοµένου ως κλειδί αναζήτησης. Κάθε ολοκληρωµένο µνήµης ή περιφερειακή συσκευή που

είναι συνδεδεµένη στην αρτηρία διευθύνσεων καταλαµβάνει ένα συγκεκριµένο αριθµό από ϑέσεις

µνήµης (χώρος διευθύνσεων - address space). Στο χώρο διευθύνσεων ανάµεσα στις ϑέσεις που

καταλαµβάνουν τα ολοκληρωµένα µνήµης και τα περιφερειακά µπορεί να µην έχει αντιστοιχιστεί

τίποτα, οπότε αν προσπελάσουµε µια τέτοια ϑέση ϑα µας επιστραφεί το 0 ή ϑα µας ειδοποιήσει ο

επεξεργαστής ότι έχει συµβεί σφάλµα.

Ο επεξεργαστής υποστηρίζει επτά διαφορετικές καταστάσεις λειτουργίας, όπου η δι-

αφοροποίησή τους σχετίζεται µε τα δικαιώµατα πρόσβασης σε περιοχές εξωτερικής µνήµης.

∆ηλαδή, για να µπορέσουµε να προσπελάσουµε µερικές περιοχές µνήµης που έχουν

δεσµευτεί για ειδική χρήση (πχ. χρήση από το λειτουργικό σύστηµα) πρέπει να µεταβούµε

σε κατάσταση µε αυξηµένα δικαιώµατα. Ο λόγος ύπαρξης των διαφορετικών καταστάσεων

λειτουργίας σχετίζεται µε την απαίτηση του λειτουργικού συστήµατος να µπορεί να δι-

αχειρίζεται τους διαθέσιµους πόρους (resources) αποδοτικά και χωρίς να επηρρεάζεται

από τις εφαρµογές των χρηστών. Οι διαφορετικές καταστάσεις του επεξεργαστή ϕαίνονται

στον πίνακα Processor Modes (κεφ. 2.1 σελ. 8). Η κατάσταση του επεξεργαστή στην οποία

ϐρισκόµαστε όταν εκτελούµε τα προγράµµατά µας είναι η User.

7

Page 14: Εγχειρίδιο Χρήσης ΑΤ91 · 2013-03-30 · Εγχειρίδιο χρήσης at91 1. Πρόλογος ουσία επιλέξαµε τον πιο ισχυρό µικροελεγκτή

Εγχειρίδιο χρήσης AT91 Κεφάλαιο 2.2 - Καταχωρητές

Mode Περιγραφή

User Η κατάσταση εκτέλεσης προγραµµάτων

FIQ Κατάσταση αµέσως µετά από Fast Interrupt

IRQ Κατάσταση αµέσως µετά από Interrupt

Supervisor Κατάσταση µε αυξηµένα δικαιώµατα

Abort Κατάσταση µετά από λάθος προσπέλαση στη µνήµη

Undefined Κατάσταση µετά από εκτέλεση εντολής που δεν ανήκει

στο σύνολο εντολών

System Κατάσταση µε αυξηµένα δικαιώµατα

Πίνακας 2.1: Processor Modes

2.2 Καταχωρητές

Ο επεξεργαστής µας διαθέτει 37 καταχωρητές, εκ των οποίων 31 είναι γενικού και 6

ειδικού σκοπού. Από αυτούς, µόνο οι 17 είναι ταυτόχρονα διαθέσιµοι και προσπελάσι-

µοι ανά πάσα στιγµή. Οι πρώτοι 8 (r0 έως r7) είναι κοινοί για όλες τις καταστάσεις του

επεξεργαστή, ενώ οι υπόλοιποι 7 γίνονται διαθέσιµοι ανάλογα µε την κατάσταση στην

οποία ϐρίσκεται ο επεξεργαστής (αυτό σηµαίνει για παράδειγµα, πως δεν µπορούµε να

προσπελάσουµε τον καταχωρητή r8 της κατάστασης Fiq όταν είµαστε σε κατάσταση Us­

er, διότι ένας άλλος καταχωρητής είναι διαθέσιµος ως r8 στην κατάσταση User). Στον

πίνακα Καταχωρητές (κεφ. 2.2 σελ. 8) καταγράφονται οι καταχωρητές που είναι διαθέσ-

ιµοι στις διάφορες καταστάσεις λειτουργίας του επεξεργαστή µας (εικόνα 2.2, σελίδα 9).

Η σηµειολογία όσων αναγράφονται σε αυτό το πίνακα ϑα γίνει πλήρως κατανοητή στις

επόµενες παραγράφους.

Mode User Mode Regs Additional Regs

User r0­r14, r15, CPSR

FIQ r0­r7, r15, CPSR r8_fiq­r14_fiq,SPSR_fiq

IRQ r0­r12, r15, CPSR r13_irq­r14_irq,SPSR_irq

Supervisor r0­r12, r15, CPSR r13_svc­r14_svc,SPSR_svc

Abort r0­r12, r15, CPSR r13_abt­r14_abt,SPSR_abt

Undefined r0­r12, r15, CPSR r13_und­r14_und,SPSR_und

System r0­r12, r15, CPSR r13_sys­r14_sys,SPSR_sys

Πίνακας 2.2: Καταχωρητές

8

Page 15: Εγχειρίδιο Χρήσης ΑΤ91 · 2013-03-30 · Εγχειρίδιο χρήσης at91 1. Πρόλογος ουσία επιλέξαµε τον πιο ισχυρό µικροελεγκτή

2. Αρχιτεκτονική του επεξεργαστή Εγχειρίδιο χρήσης AT91

Σχήµα 2.2: ∆ιαθέσιµοι καταχωρητές σε κάθε κατάσταση λειτουργίας

9

Page 16: Εγχειρίδιο Χρήσης ΑΤ91 · 2013-03-30 · Εγχειρίδιο χρήσης at91 1. Πρόλογος ουσία επιλέξαµε τον πιο ισχυρό µικροελεγκτή

Εγχειρίδιο χρήσης AT91 Κεφάλαιο 2.2 - Καταχωρητές

Το εύρος των καταχωρητών είναι 32 ψηφία, κάτι που ισοδυναµεί µε µια λέξη (word)

του συστήµατός µας. Μπορούµε όµως στους υπολογισµούς µας να χρησιµοποιούµε έ-

να τµήµα της πληροφορίας κάποιου καταχωρητή, όπως τα 16 λιγότερο σηµαντικά ψηφία

(µισή λέξη - halfword) ή τα 8 λιγότερο σηµαντικά ψηφία (byte).

Για τα προγράµµατά µας µπορούµε να χρησιµοποιούµε τους καταχωρητές r0 εως r12,

αλλάζοντας το περιεχόµενό τους. Οι επόµενοι 3 καταχωρητές, r13 έως r15, έχουν συγ-

κεκριµένη λειτουργία που σχετίζεται µε τον τρόπο εκτέλεσης του προγράµµατος και όχι µε

το περιεχόµενο του προγράµµατος. Πιο συγκεκριµένα, ο r15 είναι ο µετρητής προγράµ-

µατος (Program Counter ­ PC), ο r14 είναι ο καταχωρητής διασύνδεσης κώδικα (Branch

& Link) και ο r13 είναι ο δείκτης σωρού (Stack Pointer). Ο τελευταίος καταχωρητής ει-

δικού σκοπού (καταχωρητής κατάστασης - Current Processor Status Register ­ CPSR) έχει

ιδιαίτερη σηµασία για τη ϱοή εκτέλεσης του προγράµµατος. Πολλές ϕορές στα προγράµ-

µατά µας ϑέλουµε να εκτελέσουµε κώδικα υπό συνθήκη, κώδικα δηλαδή που σχετίζεται

µε το αποτέλεσµα κάποιας προηγούµενης αριθµητικής ή λογικής εντολής. Κάθε ϕορά

που εκτελείται µια αριθµητική ή λογική εντολή, µπορεί να αποθηκεύουµε σε αυτόν το

καταχωρητή δυαδικές σηµαίες κατάστασης (status bits) που µας δείχνουν το είδος3 του

αποτελέσµατος που πήραµε (εικόνα Status Register κεφ. 2.3, σελ. 12, πίνακας Status

Register κεφ. 2.3, σελ. 11. Σε όλο το εγχειρίδιο χρησιµοποιούµε το συµβολισµό 0xWXYZ

για τη δεκαεξαδική ποσότητα WXYZ και #WXYZ για τη δεκαδική ποσότητα WXYZ). Κάθε

εντολή που έχει ενεργοποιηµένη την επιλογή αλλαγής του CPSR προκαλεί την ενηµερ-

ωµέρωση των δυαδικών σηµαιών κατάστασης ϐάσει του είδους του αποτελέσµατος που ϑα

προκύψει από την εκτέλεσή της. Οι περισσότερες εντολές υποστηρίζουν την επιλογή αλ-

λαγής του CPSR µε την προσθήκη του χαρακτήρα ‘S’ στο τέλος του ονόµατος της εντολής.

Ο r15 ονοµάζεται µετρητής προγράµµατος (PC) µιας και ο ϱόλος του είναι να περιέ-

χει τη διεύθυνση στην οποία υπάρχει η επόµενη προς εκτέλεση εντολή. Κάθε ϕορά που

εκτελείται µια εντολή, ο PC µεταβάλεται αυτόµατα από τον επεξεργαστή, ώστε πάντα να

περιέχει τη διεύθυνση της επόµενης προς εκτέλεση εντολής. Κατά το πρώτο στάδιο εκτέ-

λεσης µιας εντολής, ο επεξεργαστής διαβάζει το περιεχόµενο του PC και το τοποθετεί στην

αρτηρία διευθύνσεων. Το σύστηµα µνήµης µέσω της αρτηρίας δεδοµένων του διαβιβάζει το

κωδικό της εντολής προς εκτέλεση4. Ο PC αυξάνεται αµέσως µετά αυτόµατα κατά 4, διότι

κάθε εντολή στο σύστηµά µας έχει µέγεθος 4 bytes. Το περιεχόµενο του PC µπορούµε

να το µεταβάλουµε και εµείς γράφοντας µια τιµή σε αυτόν, αρκεί να είµαστε σίγουροι ότι

η τιµή που γράψαµε αντιστοιχεί σε µια διεύθυνση στην οποία υπάρχει σωστός κώδικας

3Πιθανά είδη : µηδενικό ή αρνητικό αποτέλεσµα ή υπερχείλιση ή ...4Αν η διεύθυνση δεν περιέχει σωστό κωδικό λειτουργίας, ο επεξεργαστής ϑα µεταβεί σε κατάσταση Prefetch

Abort

10

Page 17: Εγχειρίδιο Χρήσης ΑΤ91 · 2013-03-30 · Εγχειρίδιο χρήσης at91 1. Πρόλογος ουσία επιλέξαµε τον πιο ισχυρό µικροελεγκτή

2. Αρχιτεκτονική του επεξεργαστή Εγχειρίδιο χρήσης AT91

Bit Περιγραφή

N 1 αν το αποτέλεσµα της πράξης ήταν αρνητικό

Z 1 αν το αποτέλεσµα της πράξης ήταν µηδενικό

C 1 σε πρόσθεση που δηµιούργησε κρατούµενο ή σε αφαίρεση που δε

δηµιούργησε δανεικό ή σε πράξη ολίσθησης που το τελευταίο ψηφίο που

ολίσθησε εκτός του καταχωρητή ήταν 1

V 1 αν το αποτέλεσµα της πράξης δηµιούργησε υπερχείλιση (overflow)

Q Το ψηφίο αυτό επηρεάζεται από ένα σύνολο πράξεων, όπως QADD κ.α, και

παραµένει ενεργό µέχρι να µηδενιστεί µε εγγραφή στον CPSR. ∆εν αποτελεί

συνθήκη για την εκτέλεση εντολών, αλλά είναι ϐοηθητικό για την εκτέλεση

ειδικών εντολών που απαιτούν αλγοριθµικό υπολογισµό.

J 1 αν ο επεξεργαστής έχει εισέλθει σε Jazelle mode και εκτελεί εντολές Java.

I 1 αν ο επεξεργαστής έχει απενεργοποιήσει τις διακοπές (interrupts) IRQ.

Μόλις µηδενίσουµε το συγκεκριµένο ψηφίο τα σήµατα διακοπών ϑα

σηµατοδοτήσουν άµεσα τον επεξεργαστή.

F 1 αν ο επεξεργαστής έχει απενεργοποιήσει τις γρήγορες διακοπές FIQ. Τα

ψηφία I & F του CPSR δεν ενεργοποιούνται αυτόµατα, αλλά τη κατάστασή

τους µπορεί να τη µεταβάλλει ο χρήστης.

T 1 αν ο επεξεργαστής έχει εισέλθει σε Thumb mode και εκτελεί εντολές Thum­

b.

Mode Τα 5 αυτά δυαδικά ψηφία δείχνουν σε ποια κατάσταση του επεξεργαστή

ϐρισκόµαστε.

0x10 User

0x11 FIQ

0x12 FIQ

0x13 Supervisor

0x17 Abort

0x1B Undefined

0x1F System

Πίνακας 2.3: Status Register

11

Page 18: Εγχειρίδιο Χρήσης ΑΤ91 · 2013-03-30 · Εγχειρίδιο χρήσης at91 1. Πρόλογος ουσία επιλέξαµε τον πιο ισχυρό µικροελεγκτή

Εγχειρίδιο χρήσης AT91 Κεφάλαιο 2.2 - Καταχωρητές

Σχήµα 2.3: Status Register

προς εκτέλεση5. Για παράδειγµα, αν έχουµε τοποθετήσει κώδικα στην περιοχή µνήµης

0x50000000 και ο PC δείχνει στη διεύθυνση 0xC0005100, τότε µπορούµε (όταν ϑέλουµε

να εκτελέσουµε τον κώδικά µας) να µεταβάλουµε το περιεχόµενο του PC και να του γράψ-

ουµε την τιµή 0x50000000. Ο επεξεργαστής, µετά από την µεταβολή του PC, ϑα είναι

έτοιµος να Ϲητήσει τα περιεχόµενα από τη ϑέση µνήµης 0x50000000 και να τα εκτελέσει.

΄Οµως, όταν τελειώσει η εκτέλεση του κώδικα από τη ϑέση 0x50000000, είναι εξ-

αιρετικά πιθανό ότι ϑα ϑέλουµε να ξαναβάλουµε στον PC τη τιµή που είχε πριν από τη

µεταβολή του, δηλαδή την 0xC0005100. (Το ανάλογο παράδειγµα στη γλώσσα C είναι

η κλήση µιας συνάρτησης. Μόλις τελειώσει η εκτέλεση της συνάρτησης, επιστρέφουµε

στο σηµείο που έγινε η κλήση της και συνεχίζουµε µε την επόµενη εντολή). Κατά τη

συγγραφή του κώδικα, είναι αδύνατο να γνωρίζουµε σε ποια ϑέση ϑα τοποθετηθεί αυτός

καθώς αυτό είναι ευθύνη του λειτουργικού συτήµατος. Πολύ περισσότερο είναι αδύνατο

να γνωρίζουµε τη διεύθυνση που ϑα πρέπει να ϕορτώσουµε στον PC µετά το τέλος της

εκτέλεσης του προγράµµατός µας. Γι΄ αυτό το λόγο χρησιµοποιούµε τον καταχωρητή r14,

για να αποθηκεύουµε σε αυτόν το περιεχόµενο του PC πριν εκτελέσουµε τη µετάβαση σε

άλλη ϑέση µνήµης6. ΄Ετσι, πριν γράψουµε την τιµή 0x50000000 στον PC, αντιγράφουµε

το περιεχόµενό του στον r14, ο οποίος έχει το όνοµα Branch & Link. Μόλις τελειώσει η

εκτέλεση του κώδικα στη ϑέση 0x50000000, αντιγράφουµε το περιεχόµενο του Branch

& Link στον PC, αρκεί ϕυσικά να µην έχουµε αλλάξει το περιεχόµενό του κατά την εκτέ-

λεση του κώδικά µας. Για να µην χρειάζεται από τους προγραµµατιστές να εκτελούν τη

διαδικασία αντιγραφής και αποκατάστασης, όταν χρησιµοποιούµε συγκεκριµένες εντολές

5Στην περίπτωση που στην διεύθυνση που προσπαθήσει να προσπελάσει ο πεξεργαστής δεν αντιστοιχεί

εξωτερική µνήµη, ο επεξεργαστής ϑα µεταβεί σε κατάσταση λειτουργίας Undefined6∆ιακλάδωση

12

Page 19: Εγχειρίδιο Χρήσης ΑΤ91 · 2013-03-30 · Εγχειρίδιο χρήσης at91 1. Πρόλογος ουσία επιλέξαµε τον πιο ισχυρό µικροελεγκτή

2. Αρχιτεκτονική του επεξεργαστή Εγχειρίδιο χρήσης AT91

διακλάδωσης, όι διαδικασίες αυτές εκτελούνται αυτόµατα από τον επεξεργαστή.

Πολλές ϕορές είναι απαραίτητο να περάσουµε δεδοµένα στη συνάρτησή µας σαν παϱα-

µέτρους, ώστε να γίνει η επεξεργασία τους και να πάρουµε πίσω τα αποτελέσµατα. Επίσης,

κατά την εκτέλεση µιας συνάρτησης είναι πολύ πιθανό να χρειαστεί να χρησιµοποιήσουµε

περισσότερες µεταβλητές από τους 12 διαθέσιµους καταχωρητές γενικού σκοπού, ή να

δεσµεύσουµε µνήµη µέσω του λειτουργικού συστήµατος, και όταν τελειώσουµε να την

επιστρέψουµε σε αυτό για να µπορεί να την χρησιµοποιήσει άλλη διεργασία. Για όλους

αυτούς τους λόγους, το λειτουργικό σύστηµα παρέχει µια περιοχή µνήµης σε κάθε πρό-

γραµµα η οποία ονοµάζεται σωρός (stack) και χρησιµοποιείται σαν πρόχειρο. Ο σωρός

λειτουργεί σα µια LIFO (Last In First Out) δοµή, σα µια δοµή δηλαδή που το τελευταίο

εισαχθέν στοιχείο είναι το πρώτο που µπορεί να εξαχθεί. Για παράδειγµα αν εισάγουµε στο

σωρό τα δεδοµένα Α, Γ, Ε & Ι µε τη σειρά που καταγράφονται (δηλαδή µε το Α πρώτο και το

Ι τελευταίο) και εκτελέσουµε διαδικασία επαναφόρτωσης στους καταχωρητές, ϑα πάρουµε

τα δεδοµένα µε την αντίστροφη σειρά, δηλαδή Ι, Ε, Γ & Α.

0x8000

0x7FFC

0x7FF8

0x7FF4

0x7FF0

0x7FEC

0x7FE8

0x7FE4

0x8000

r13

Άδειος Σωρός

0x8000

0x7FFC

0x7FF8

0x7FF4

0x7FF0

0x7FEC

0x7FE8

0x7FE4

0x7FF4

r13

Εισαγωγή 3 λέξεων

0xF0320000

0xCEFFBABA

0x0BADB00B

0x8000

0x7FFC

0x7FF8

0x7FF4

0x7FF0

0x7FEC

0x7FE8

0x7FE4

0x7FFC

r13

Αφαίρεση 2 λέξεων

0xF0320000

Σχήµα 2.4: Παράδειγµα σωρού.

Για τη διαχείριση του σωρού, υπάρχει ένας καταχωρητής που έχει σαν περιεχόµενο

τη διεύθυνση της µνήµης µε την πρώτη ελεύθερη ϑέση του σωρού, ώστε όταν εκτελούµε

εγγραφή στο σωρό να εµφανίζεται η συγκεκριµένη διεύθυνση στην αρτηρία δεδοµένων. Ο

καταχωρητής αυτός είναι ο r13 (δείκτης σωρού - Stack pointer). Κάθε ϑέση στο σωρό έχει

µέγεθος 32 ψηφίων ή 4 bytes, οπότε η αύξηση ή η µείωση του δείκτη σωρού γίνεται πάντα

πάντα κατά 4. Λόγω της LIFO λειτουργίας του, ο σωρός έχει το χαρακτηριστικό να ξεκινά

από µια διεύθυνση7 και όσο γεµίζει µε δεδοµένα αυτή η διεύθυνση να µειώνεται. Αυτό

7Στα προγράµµατά µας τη διεύθυνση αυτή την αναθέτει το λειτουργικό σύστηµα

13

Page 20: Εγχειρίδιο Χρήσης ΑΤ91 · 2013-03-30 · Εγχειρίδιο χρήσης at91 1. Πρόλογος ουσία επιλέξαµε τον πιο ισχυρό µικροελεγκτή

Εγχειρίδιο χρήσης AT91 Κεφάλαιο 2.3 - Εντολές

ϕαίνεται και στην εικόνα Stack (κεφ. 2.4, σελ. 13).

2.3 Εντολές

Οι εντολές αποτελούν τη ϐάση του προγράµµατός µας, αφού µε αυτές οδηγούµε τον

επεξεργαστή στην εκτέλεση των ϐηµάτων που χρειάζονται για τη λύση του προβλήµατός

µας. Οι εντολές χωρίζονται σε κατηγορίες, ανάλογα µε την ενέργεια που εκτελούν και οι

κατηγορίες αυτές περιγράφονται στον πίνακα Κατηγορίες εντολών (παρ. 2.3, σελ. 14).

Κατηγορία Περιγραφή

Μεταφορά δεδοµένωνΜεταφορά δεδοµένων από και προς την κύρια µ-

νήµη & τους καταχωρητές

Αριθµητικές πράξεις Πρόσθεση, πολλαπλασιασµός. . .

Λογικές πράξεις AND, OR, XOR. . .

∆ιακλαδώσεις Αλλαγή της ϱοής εκτέλεσης του κώδικα

ΣυστήµατοςΠροσπέλαση συνεπεξεργαστή, προγραµµατισµός

εξαιρέσεων

Πίνακας 2.4: Κατηγορίες εντολών

2.3.1 Εκτέλεση υπό συνθήκη

Η αρχιτεκτονική µας έχει σχεδιαστεί για να εκτελεί απλές πράξεις µε µεγάλη ταχύτητα.

Για το σκοπό αυτό χρησιµοποιεί ϐαθµωτή επεξεργασία (pipelining8). Είναι γνωστό ότι δι-

ακλαδώσεις και άλµατα προκαλούν «σπασίµατα» της ϐαθµωτής επεξεργασίας και συνεπώς

υποβάθµιση της απόδοσης. Η λύση της εισαγωγής υλικού για πρόβλεψη διακλαδώσεων

(branch prediction) δεν είναι και η καλύτερη λύση για τη δική µας αρχιτεκτονική κα-

ϑώς αυξάνει τη πολυπλοκότητα υλοποίησης και επηρρεάζει την ταχύτητα. Η λύση η

οποία ακολουθήθηκε από τους σχεδιαστές της ARM είναι να δώσουν σε κάθε εντολή τη

δυνατότητα εκτέλεσης υπό συνθήκη. Αυτό σηµαίνει πως κάθε εντολή ϑα εκτελεστεί µόνο

αν πληρούνται όλες οι συνθήκες που ορίζουµε. Οι συνθήκες έχουν σχέση µε τις σηµαίες

κατάστασης του CPSR (Carry, Negative κλπ) και αναγράφονται στον πίνακα Συνθήκες εκ-

τέλεσης (παρ. 2.3.1, σελ. 15). Η ενεργοποίηση των συνθηκών σε κάθε εντολή γίνεται µε

την αναγραφή του µνηµονικού ονόµατος της συνθήκης ακριβώς µετά από το µνηµονικό

8Η τεχνική του pipelining χωρίζει την εκτέλεση µιας εντολής σε ανεξάρτητα στάδια. Μόλις ολοκληρώσει

κάποια εντολή ένα στάδιό της, προωθείται στο επόµενο, ενώ η επόµενη εντολή µπορεί να απασχολεί παράλληλα

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

επόµενη εντολή αντί να περιµένει 5 κύκλους µέχρι να αρχίσει να εκτελείται, µε το pipelining περιµένει µόνο

1.

14

Page 21: Εγχειρίδιο Χρήσης ΑΤ91 · 2013-03-30 · Εγχειρίδιο χρήσης at91 1. Πρόλογος ουσία επιλέξαµε τον πιο ισχυρό µικροελεγκτή

2. Αρχιτεκτονική του επεξεργαστή Εγχειρίδιο χρήσης AT91

όνοµα της εντολής (πχ. στην εντολή ADDCS R0, R1, R2, ϑα εκτελεστεί η πρόσθεση µόνο

αν το Carry CPSR bit είναι ίσο µε 1).

Συνθήκη Περιγραφή

CS/HS C = 1 (Unsigned Higher or Same)

CC/LO C = 0 (Unsigned Lower)

EQ Z = 1 (Equal)

NE Z = 0 (Not Equal)

VS V = 1

VC V = 0

MI N = 1 (Minus)

PL N = 0 (Plus)

GE N = V (Signed Greater Than or Equal)

GT Z = 0 και N = V (Signed Greater Than)

HI C = 1 και Z = 0 (Unsigned Higher)

LE Z = 1 ή N != V (Signed Less Than or Equal)

LT N != V (Signed Less Than)

LS C = 0 ή Z = 1 (Unsigned Lower or Same)

Πίνακας 2.5: Συνθήκες εκτέλεσης

Στον πίνακα ϐλέπουµε πως η συνθήκη CS (η σηµαία κρατουµένου του CPSR είναι 1)

έχει το ίδιο νόηµα µε την συνθήκη HS. Αυτό συµβαίνει εξαιτίας του τρόπου αντιµετώπισης

των συνθηκών εκτέλεσης. Κατά τη συγγραφή του προγράµµατός µας είναι συνηθισµένο

να χρησιµοποιείται η πράξη CMP, η οποία εκτελεί µια εικονική9 αφαίρεση ανάµεσα σε

δυο τιµές. Το αποτέλεσµα µιας αφαίρεσης, αν είναι ϑετικός αριθµός, ϑα οδηγήσει στην

ενεργοποίηση της σηµαίας κρατουµένου και την απενεργοποίηση της σηµαίας µηδενικού

αποτελέσµατος, άρα αν στη συνέχεια ελέγξουµε την τιµή των σηµαιών κρατουµένου και

µηδενικού και τις ϐρούµε 1 & 0 αντίστοιχα ϑα ξέρουµε πως ο αφαιρετέος ήταν µεγαλύτερος

από τον αφαιρέτη (γι’αυτό και η συνθήκη που ϑέλει το C = 1 & Z = 0 είναι η Unsigned High­

er). Κατ΄ αναλογία, ακολουθούµε την ίδια αντιµετώπιση και µε τις υπόλοιπες συνθήκες,

δηλαδή χρησιµοποιούµε µια εντολή σύγκρισης η οποία ϑα ενηµερώνει συγκεκριµένα ψ-

ηφία του CPSR και στη συνέχεια τα ελέγχουµε για να δούµε αν έχουν ενεργοποιηθεί τα

ψηφία που καθορίζουν αν το άλµα ή η διακλάδωσή µας πρέπει να γίνει ή όχι.

9Το αποτέλεσµα της δεν αποθηκεύεται σε κάποιον καταχωρητή, αλλά χρησιµοποιείται µόνο για την ενηµέρ-

ωση των σηµαιών κατάστασης του CPSR

15

Page 22: Εγχειρίδιο Χρήσης ΑΤ91 · 2013-03-30 · Εγχειρίδιο χρήσης at91 1. Πρόλογος ουσία επιλέξαµε τον πιο ισχυρό µικροελεγκτή

Εγχειρίδιο χρήσης AT91 Κεφάλαιο 2.3 - Εντολές

2.3.2 Ολισθήσεις

Οι εντολές ολίσθησης έχουν τη γενική µορφή:

<opcode> <var1>, [<var2>]

Το <opcode> είναι το µνηµονικό όνοµα της εντολής, το <var1> αποτελεί το πρώτο έν-

τελο και το <var2> το δεύτερο έντελο, το οποίο δεν είναι πάντα απαιτούµενο και γι’αυτό

αναγράφεται µέσα σε [ ]. Το <var1> είναι συνήθως ο καταχωρητής στον οποίο ϑα απο-

ϑηκευτούν τα αποτελέσµατα της εντολής. Το <var2> µπορεί να είναι καταχωρητής ή

σταθερά τιµή10.

Η αρχιτεκτονική του επεξεργαστή (δες ∆ιάγραµµα Αρχιτεκτονικής (κεφ. 2.1, σελ.

6)) µεταφέρει το <var2> στη µονάδα που το χρειάζεται µέσω ενός προγραµµατιζόµε-

νου ολισθητή (barrel shifter), δίνοντάς µας έτσι τη δυνατότητα να εκτελέσουµε ολίσθηση

στην τιµή του <var2> στον ίδιο κύκλο µε την εκτέλεση της εντολής. Ο ολισθητής µας

δέχεται έντελα µέγεθους 32 ψηφίων (δηλαδή όσο και το µέγεθος κάθε καταχωρητή) και η

µέγιστη ολίσθηση που µπορεί να εκτελέσει είναι κατά 31 ψηφία. Οι πράξεις ολίσθησης

που παρέχει η αρχιτεκτονική του επεξεργαστή µας περιγράφονται στον πίνακα Ολισθήσεις

(κεφ. 2.3.2, σελ. 16).

Τύπος ολίσθησης Περιγραφή

LSL Λογική ολίσθηση προς τα αριστερά

LSR Λογική ολίσθηση προς τα δεξιά

ASR Αριθµητική ολίσθηση προς τα δεξιά

ROR Κυκλική ολίσθηση προς τα δεξιά

RRX Επαυξηµένη κυκλική ολίσθηση προς τα δεξιά

Πίνακας 2.6: Ολισθήσεις

Λογική ολίσθηση

Η λογική ολίσθηση προς τα αριστερά µεταφέρει τα ψηφία του καταχωρητή µας αριστερά

και στις ϑέσεις των λιγότερο σηµαντικών ψηφίων εισάγονται 0 (αν εκτελέσουµε ολίσθηση

κατά n ϑέσεις ϑα εισαχθούν n µηδενικά). Τα n περισσότερο σηµαντικά ψηφία που

ολίσθησαν πέρα από την αριστερότερη ϑέση χάνονται, αλλά το λιγότερο σηµαντικό από

10Οι σταθερές τιµές είναι αριθµοί που τους εισάγουµε µε την εντολή χωρίς να τους έχουµε αποθηκεύσει

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

# πριν τον αριθµό χωρίς κενό ανάµεσα, πχ. #0x4 ή #25

16

Page 23: Εγχειρίδιο Χρήσης ΑΤ91 · 2013-03-30 · Εγχειρίδιο χρήσης at91 1. Πρόλογος ουσία επιλέξαµε τον πιο ισχυρό µικροελεγκτή

2. Αρχιτεκτονική του επεξεργαστή Εγχειρίδιο χρήσης AT91

αυτά αποθηκεύεται στη σηµαία κατάστασης (Carry bit) του CPSR, όταν η ολίσθηση γίνε-

ται για αριθµητική/λογική πράξη (όχι για διευθυνσιοδότηση). Για παράδειγµα, ο αρι-

ϑµός 0x1035004A = 00010000 00110101 00000000 01001010 αν υποστεί ολίσθηση

προς τα αριστερά κατά 4 ϑέσεις ϑα γίνει 00000011 01010000 00000100 10100000 =

0x035004A0. Στο bit κρατουµένου του καταχωρητή κατάστασης ϑα αποθηκευτεί το 1

(εικόνα Ολίσθηση προς τα αριστερά κεφ. 2.5, σελ. 17).

32-Ν bits

Καταχωρητής

32-Ν bits 0 . . . . . . . 0

N µηδενικά

Ολίσθηση κατά Ν θέσεις αριστερά

N bitsΣηµαία

κρατούµενου

του

καταχωρητή

κατάστασης

1 bit

Σχήµα 2.5: Ολίσθηση προς τα αριστερά

Αν ϑεωρήσουµε τον δυαδικό αριθµό 0x49 = 0100_1001 = (4*16 + 9=7310) µε ανα-

παράσταση πολυωνύµου (δηλαδή x7 ∗ 27 + x6 ∗ 26+. . . +x0, µε x7 = 0, x6 = 1, x5 =

0, x4 = 0, x3 = 1, x2 = 0, x1 = 0, x0 = 1) ϑα διαπιστώσουµε πως η ολίσθηση κατά µια

ϑέση προς τα αριστερά ισοδυναµεί µε τη µετακίνηση της τιµής του κάθε xi στο xi+1 (η

τιµή του x0 συµπληρώνεται µε 0). Το αποτέλεσµα είναι 1001_0010 = 0x92 = (9*16 + 2 =

14610), το οποίο είναι το διπλάσιο της αρχικής τιµής. Αυτό συµβαίνει διότι οι συντελεστές xi

πολλαπλασιάζονται µε µια δύναµη του 2 και οι διαδοχικοί συντελεστές πολλαπλασιάζονται

µε διαδοχικές δυνάµεις του 2. ΄Αρα, αν ο xi συντελούσε κατά 2i στην τιµή του αρχικού

αριθµού, µετά την ολίσθηση ϑα συντελεί κατά 2i+1, δηλαδή κατά το διπλάσιο. ΄Οπως

ϐλέπετε, διπλασιάζεται η συνεισφορά του κάθε συντελεστή στην τιµή του αριθµού και µετά

την ολίσθηση έχουµε σαν αποτέλεσµα το διπλάσιο αριθµό του αρχικού. Αν εκτελέσουµε

ολίσθηση κατά 2 ϑέσεις ϑα πάρουµε σαν αποτέλεσµα τον τετραπλάσιο αριθµό του αρχικού

και στη γενική περίπτωση αν εκτελέσουµε αριστερή ολίσθηση κατά n ϑέσεις ϑα πάρουµε

σαν αποτέλεσµα το 2n×(#αρχικός αριθµός) (αριστερή ολίσθηση κατά 510 ϑέσεις στον αρι-

ϑµό 310 ϑα δώσει σαν αποτέλεσµα το 3*25 = 3*32=9610). Επειδή οι καταχωρητές του επεξ-

εργαστή µας έχουν εύρος 32 ψηφίων, κατά τη διαδικασία της ολίσθησης ϑα αποκοπούν

τα περισσότερο σηµαντικά ψηφία και η τιµή που ϑα πάρουµε, λόγω του περιορισµού του

εύρους, ϑα είναι mod(2n×(#αρχικός αριθµός), 232), όπου το mod συµβολίζει το υπόλοιπο

της διαίρεσης του 2n×(#αρχικός αριθµός) µε το 232. Η πράξη της αριστερής ολίσθησης

17

Page 24: Εγχειρίδιο Χρήσης ΑΤ91 · 2013-03-30 · Εγχειρίδιο χρήσης at91 1. Πρόλογος ουσία επιλέξαµε τον πιο ισχυρό µικροελεγκτή

Εγχειρίδιο χρήσης AT91 Κεφάλαιο 2.3 - Εντολές

είναι πολύ χρήσιµη όταν ϑέλουµε να εκτελέσουµε πολλαπλασιασµό ανάµεσα σε κάποιον

αριθµό µε δύναµη του 2, γιατί εκτελείται σε ένα κύκλο ϱολογιού, ενώ ο πολλαπλασιασµός

που χρησιµοποιεί το κύκλωµα του πολλαπλασιαστή είναι αρκετά πιο χρονοβόρος και α-

παιτεί σηµαντικά περισσότερους κύκλους.

Η δεξιά λογική ολίσθηση αντίστοιχα ισοδυναµεί µε τη τη µετακίνηση της τιµής του

κάθε xi στο xi−1 (η τιµή του x31 συµπληρώνεται µε 0). Τώρα, αν ο xi συντελούσε κατά 2i

στην τιµή του αρχικού αριθµού, µετά την ολίσθηση ϑα συντελεί κατά 2i−1, δηλαδή κατά

το µισό. Επιπλέον, αποκόπτονται τα λιγότερα σηµαντικά ψηφία και το αποτέλεσµα που

παίρνουµε µετά την εκτέλεση της δεξιάς ολίσθησης είναι στρογγυλοποιηµένο στον αµέσως

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

κατά n ϑέσεις ϑα παράγει το ⌊(#(αρχικός αριθµός)/2n)⌋ (δεξιά ολίσθηση κατά 3 ϑέσεις

στον αριθµό 15 ϑα δώσει σαν αποτέλεσµα ⌊(15)/23)⌋ = 1). Η δεξιά ολίσθηση είναι πολύ

χρήσιµη στην υλοποίηση διαίρεσης κάποιου αριθµού µε δύναµη του 2, διότι ο επεξερ-

γαστής µας δεν υποστηρίζει µε υλικό την πράξη της διαίρεσης. Η υλοποίηση αυτής της

πράξης µε λογισµικό αυξάνει πολύ τον απαιτούµενο χρόνο ολοκλήρωσης της διαίρεσης.

Γι΄ αυτό είναι πολύ προτιµότερο να γίνεται χρήση της παραπάνω ιδιότητας όπου είναι αυτό

δυνατό (εικόνα Ολίσθηση προς τα δεξιά κεφ. 2.6, σελ. 18).

32-Ν bits

Καταχωρητής

32-Ν bits0 . . . . . . . 0

N µηδενικά

N bits

καταχωρητή

κατάστασης

1 bit

Σχήµα 2.6: Ολίσθηση προς τα δεξιά

Αριθµητική ολίσθηση

΄Οταν χρησιµοποιούµε αριθµητικές πράξεις µε προσηµασµένους αριθµούς, η δεξιά

ολίσθηση δηµιουργεί το πρόβληµα αλλαγής του προσήµου. Ενας αρνητικός αριθµός σε

αριθµητική συµπληρώµατος ως προς 2 έχει πάντα στο περισσότερο σηµαντικό δυαδικό

ψηφίο την τιµή 1 (πχ. ο −1510 σε αναπαράσταση 8 δυαδικών ψηφίων είναι 1111_0001).

18

Page 25: Εγχειρίδιο Χρήσης ΑΤ91 · 2013-03-30 · Εγχειρίδιο χρήσης at91 1. Πρόλογος ουσία επιλέξαµε τον πιο ισχυρό µικροελεγκτή

2. Αρχιτεκτονική του επεξεργαστή Εγχειρίδιο χρήσης AT91

Αν ϑέλουµε να εκτελέσουµε διαίρεση του −1510 µε το 410 περιµένουµε σαν αποτέλεσµα

τον αριθµό −410 (σε Ευκλείδια αναπαράσταση ισχύει ότι −1510 = −4 ∗ 4 + 1, επειδή το

υπόλοιπο είναι πάντα ϑετικός αριθµός), αλλά µε την εφαρµογή δεξιάς ολίσθησης κατά

2 ψηφία (4 = 22) ϑα έχουµε σαν αποτέλεσµα τον αριθµό 0011_1100 = 6010, το οποίο

είναι λανθασµένο. Το λάθος αποτέλεσµα οφείλεται στο ότι δεν εισάγαµε 1 στα περισ-

σότερο σηµαντικά ψηφία. Αν το είχαµε προβλέψει, ϑα είχαµε σαν αποτέλεσµα τον αριθµό

1111_1100 = −410. Για να πάρουµε συνεπώς το επιθυµητό αποτέλεσµα χρησιµοποιούµε

την αριθµητική δεξιά ολίσθηση, η οποία στη ϑέση των περισσότερο σηµαντικών ψηφίων

εισάγουν την τιµή του περισσότερο σηµαντικού ψηφίου του αρχικού αριθµού. Ετσι, σε

µια αριθµητική ολίσθηση N ψηφίων, αν το περισσότερο σηµαντικό είναι 0 ϑα εισαχθούν

N µηδενικά, ενώ αν είναι 1 ϑα εισαχθούν N άσσοι (εικόνα Αριθµητική ολίσθηση προς τα

δεξιά κεφ. 2.7, σελ. 19).

32-Ν-

32-

MSB

Σχήµα 2.7: Αριθµητική ολίσθηση προς τα δεξιά

Κυκλική ολίσθηση

Στις παραπάνω πράξεις, τα ψηφία που ολισθαίνουν πέρα από τα άκρα του καταχωρητή

χάνονται, µε εξαίρεση το τελευταίο που µπορεί να αποθηκευτεί σα σηµαία κρατουµένου

του CPSR, κάτω από συγκεκριµένες συνθήκες. Μερικές ϕορές είναι επιθυµητή η επανεισ-

αγωγή των ψηφίων που ολισθαίνουν πέρα από τον καταχωρητή στις ϑέσεις που µένουν

κενές. Για παράδειγµα, αν έχουµε τον αριθµό 0x97 = 1001_0111 και σα σηµαία κρα-

τουµένου του CPSR µια άγνωστη τιµή x, η κυκλική δεξιά ολίσθηση κατά 3 ϑέσεις ϑα έχει

σαν αποτέλεσµα την τιµή 11x1_0010, ενώ σα νέα σηµαία κρατουµένου ϑα αποθηκευτεί

το 1. Τα έντονα ψηφία είναι αυτά που επανεισήχθηκαν στον αριθµό, στις ϑέσεις όπου ϑα

εισάγονταν 0 αν χρησιµοποιούσαµε λογική δεξιά ολίσθηση. Η αριστερή κυκλική ολίσθηση

δεν υπάρχει σαν ξεχωριστή εντολή, διότι µπορεί να υλοποιηθεί µέσω της δεξιάς. Για αρισ-

τερή κυκλική ολίσθηση n ϑέσεων (µε n > 1) εκτελούµε δεξιά κυκλική ολίσθηση κατά

19

Page 26: Εγχειρίδιο Χρήσης ΑΤ91 · 2013-03-30 · Εγχειρίδιο χρήσης at91 1. Πρόλογος ουσία επιλέξαµε τον πιο ισχυρό µικροελεγκτή

Εγχειρίδιο χρήσης AT91 Κεφάλαιο 2.3 - Εντολές

33−n. Αν η ολίσθηση γίνεται για 1 ϑέση, τότε εκτελούµε την εντολή ADCS χρησιµοποιών-

τας ως έντελα δύο ϕορές τον καταχωρητή. Αν προσθέσουµε ένα αριθµό µε τον εαυτό του

στην ουσία τον διπλασιάζουµε ή τον ολισθαίνουµε λογικά κατά µια ϑέση αριστερά. Το

κρατούµενο που δηµιουργείται είναι το ίδιο µε το περισσότερο σηµαντικό bit του αρχικού

αριθµού. Στο λιγότερο σηµαντικό ψηφίο ϑα εµφανιστεί το 0, οπότε προσθέτοντας και το

περιεχόµενο της σηµαίας κρατουµένου στο άθροισµα, ϑα εµφανίσουµε εκεί το κρατού-

µενο που υπήρχε στον CPSR (Για παράδειγµα, αν η σηµαία κρατουµένου είναι 1 και στον

καταχωρητή υπάρχει η τιµή 0x49 = 0100_1001, το άθροισµα του 0x49 + 0x49 = 0x92 =

1001_0010, το κρατούµενο εξόδου είναι 0 και η πρόσθεση του 1 που υπήρχε ως σηµαία

κρατουµένου ϑα δώσει αποτέλεσµα 1001_0011) (εικόνα Κυκλική Ολίσθηση προς τα δεξιά

κεφ. 2.8, σελ. 20).

32-Ν bits

Καταχωρητής

32-Ν bits

bit

- bits

Σχήµα 2.8: Κυκλική Ολίσθηση προς τα δεξιά

Η τελευταία µορφή ολίσθησης, η επαυξηµένη δεξιά κυκλική ολίσθηση, δεν είναι τίποτα

άλλο παρά µια κυκλική δεξιά ολίσθηση κατά µια ϑέση.

2.3.3 Εντολές µεταφοράς δεδοµένων

Ο επεξεργαστής µας έχει τη δυνατότητα εκτέλεσης των εντολών µεταφοράς που αναφέρονται

στον πίνακα Εντολές Μεταφοράς (κεφ. 2.3.3, σελ. 21).

Μεταφορά απλού καταχωρητή

Οι εντολές µεταφοράς δεδοµένων αναλαµβάνουν να ϕέρουν δεδοµένα από την κύρι-

α µνήµη στους καταχωρητές, να µετακινήσουν δεδοµένα ανάµεσα σε καταχωρητές και να

στείλουν στην κύρια µνήµη το περιεχόµενο καταχωρητών. Κατά την εκτέλεση αυτών των εν-

τολών δεν χρησιµοποιείται η ΑΛΜ, αλλά η Μονάδα ∆ιασύνδεσης µε την εξωτερική µνήµη.

20

Page 27: Εγχειρίδιο Χρήσης ΑΤ91 · 2013-03-30 · Εγχειρίδιο χρήσης at91 1. Πρόλογος ουσία επιλέξαµε τον πιο ισχυρό µικροελεγκτή

2. Αρχιτεκτονική του επεξεργαστή Εγχειρίδιο χρήσης AT91

Εντολή Περιγραφή Εντολή Περιγραφή

LDM Μεταφορά block από µνήµη

σε καταχωρητές

STM Μεταφορά block από

καταχωρητές σε µνήµη

LDR Μεταφορά από µνήµη σε

καταχωρητή

STR Μεταφορά από καταχωρητή

σε µνήµη

MOV Μεταφορά από καταχωρητή

σε καταχωρητή

MVN Μεταφορά µε αντιστροφή

MRS Μεταφορά από CPSR σε

καταχωρητή

MSR Μεταφορά από καταχωρητή

σε CPSR

MRC Μεταφορά από συνεπεξερ-

γαστή σε καταχωρητή

MCR Μεταφορά από καταχωρητή

σε συνεπεξεργαστή

SWP Ανταλλαγή τιµής ανάµεσα σε

µνήµη και καταχωρητή

Πίνακας 2.7: Εντολές Μεταφοράς

Η κάθε µεταφορά µπορεί να γίνει για δεδοµένα εύρους 32 ψηφίων (word), 16 ψηφίων

(halfword) ή 8 ψηφίων (byte). Για µεταφορές δεδοµένων 16 ψηφίων χρησιµοποιείται το

επίθεµα H, ενώ για µεταφορά byte το επίθεµα B. Για παράδειγµα οι εντολές LDR, LDRH

και LDRB µεταφέρουν word, halfword και byte αντίστοιχα από κάποια εξωτερική µνήµη

προς τους καταχωρητές.

Στις εντολές µεταφοράς δεδοµένων είναι απαραίτητο να ορίσουµε την πηγή των δε-

δοµένων και τον προορισµό τους. Αν πρόκειται για µεταφορά από τη µνήµη προς κατα-

χωϱητή, τότε η µορφή είναι :

<Εντολή> Rd, [Rb, <offset>]

Ο καταχωρητής Rd (Register destination) είναι ένας από τους r0. . . r12, όπως και ο Rb

(Register base). Στον Rd ϑα αποθηκευτεί το δεδοµένο από την κύρια µνήµη. Ο Rb περιέ-

χει τη διεύθυνση της κύριας µνήµης στην οποία ϐρίσκεται το δεδοµένο. Για µεγαλύτερη

ευελιξία, µπορούµε να χρησιµοποιήσουµε και το πεδίο <offset> (µετατόπιση) αν είναι

επιθυµητό. Το offset ορίζει µια µετατόπιση η οποία προστίθεται στο περιεχόµενο του Rb.

Η µορφή του <offset> είναι :

Καταχωρητής: Μπορούµε να χρησιµοποιήσουµε οποιονδήποτε καταχωρητή από τους

r0. . . r12 ([Rb, Rx])

Τιµή: Χρησιµοποιούµε απευθείας τιµή ([Rb, #val]). Η τιµή µπορεί να είναι

οποιοσδήποτε αριθµός από [0. . . 255] που να έχει δεχτεί ολίσθηση από

[0. . . 31] ψηφίων (πχ. 0x35 ή 0x35 left­shifted(4) = 0x350)

21

Page 28: Εγχειρίδιο Χρήσης ΑΤ91 · 2013-03-30 · Εγχειρίδιο χρήσης at91 1. Πρόλογος ουσία επιλέξαµε τον πιο ισχυρό µικροελεγκτή

Εγχειρίδιο χρήσης AT91 Κεφάλαιο 2.3 - Εντολές

Η χρήση της µετατόπισης µπορεί να µας ϐοηθήσει στην περίπτωση που προσπελαύ-

νουµε στοιχεία ενός πίνακα. ΄Ενας πίνακας ορίζεται σαν µια σειρά από διαδοχικά bytes.

Αν γνωρίζουµε την διεύθυνση του πρώτου στοιχείου του πίνακα, τότε αποθηκεύουµε αυτή

τη διεύθυνση στον καταχωρητή που χρησιµοποιούµε σαν Rb και στον Rx αποθηκεύουµε τη

ϑέση του στοιχείου. Για παράδειγµα, αν ο πίνακάς µας ξεκινά από τη ϑέση 0xC0000380,

το πρώτο στοιχείο του ϐρίσκεται στη ϑέση 0xC0000380 + 0, το πέµπτο στοιχείο στη ϑέση

0xC0000380 + 4 και το n στοιχείο στη ϑέση 0xC0000380 + (n− 1). Παρατηρήστε πως η

αρίθµηση ξεκινά από το 0 και όχι από το 1! Ας υποθέσουµε τώρα πως κάθε στοιχείο του

πίνακα δεν έχει µέγεθος ένα byte, αλλά 4 (δηλαδή πρόκειται για ένα word). Αυτό σηµαίνει

πως το επόµενο στοιχείο ϑα ξεκινά από τη ϑέση 0xC0000380 + 4 και το µεθεπόµενο από

τη ϑέση 0xC0000380 + 8. Για παράδειγµα, αν στη ϑέση 0xC0000380 υπάρχει ο αριθµός

0xCAFEBABA και στην 0xC0000384 υπάρχει ο 0x12345678, εκτελώντας µεταφορά 4

bytes µε Rb = 0xC0000380 και <offset> = 1 ϑα έχουµε σαν υποθετικό αποτέλεσµα τον

αριθµό 0x78CAFEBA. Το υποθετικό σχετίζεται µε το γεγονός πως ο επεξεργαστής δεν ϑα

µας επιτρέψει να εκτελέσουµε προσπέλαση word στην κύρια µνήµη, αν η διεύθυνση δεν

είναι ακέραιο πολλαπλάσιο του 4! Το ίδιο ισχύει και για halfword προσπελάσεις, µόνο

που εκεί η διεύθυνση πρέπει να είναι ακέραιο πολλαπλάσιο του 2. ∆ηλαδή ο επεξεργαστής

µας χρησιµοποιεί στοίχιση (alignment) των δεδοµένων στη µνήµη.

Συµπληρωµατικά . . .

Ο τρόπος αποθήκευσης δεδοµένων µεγαλύτερων του ενός byte στη µνήµη µπορεί να ακολουθεί 2

τρόπους, οι οποίοι έχουν να κάνουν µε τη σειρά των bytes. Εστω για παράδειγµα, ότι µια λέξη

αποτελείται από 4 bytes και ότι τα bytes αυτά τοποθετούνται στη µνήµη διαδοχικά. Ποιο όµως ϑα

τοποθετηθεί πρώτο και ποιο τελευταίο; Αν ακολουθούµε αρχιτεκτονική Little Endian στην αρχική

διεύθυνση ϑα τοποθετηθεί το λιγότερο σηµαντικό byte, στην αµέσως επόµενη το επόµενο byte και

στην τέταρτη και τελευταία ϑα τοποθετηθεί το περισσότερο σηµαντικό byte. Ας υποθέσουµε πως

ϑέλουµε να αποθηκεύσουµε τον αριθµό 0xDEADBEEF στη ϑέση µνήµης 0xC000450. Στην 0x­

C000450 ϑα τοποθετηθεί το 0xEF, στην 0xC000451 το 0xBE, στην 0xC000452 το 0xAD και στην

0xC000453 το 0xDE. Ο εναλλακτικός τρόπος αποθήκευσης ορίζει πως το πιο σηµαντικό byte ϑα

αποθηκευτεί στην πρώτη διεύθυνση και το λιγότερο σηµαντικό στην τελευταία διεύθυνση. ∆ηλαδή,

στην 0xC000450 ϑα τοποθετηθεί το 0xDE, στην 0xC000451 το 0xAD, στην 0xC000452 το 0xBE

και στην 0xC000453 το 0xEF. Η αρχιτεκτονική αυτή ονοµάζεται Big Endian. Η σειρά των bytes

ισχύει και για την περίπτωση των halfwords, µόνο που εκεί έχουµε 2 bytes (σε αυτή την περίπτωση

ο αριθµός 0xDEAD ϑα αποθηκευτεί µε το 0xAD στην 0xC000450 και το 0xDE στην 0xC000451

µε Little Endian αρχιτεκτονική). Ο επεξεργαστής ARM υποστηρίζει και τους δυο τρόπους απο-

ϑήκευσης, αλλά το λειτουργικό σύστηµα Linux υιοθετεί την Little Endian αρχιτεκτονική, οπότε

όλα τα προγράµµατά µας ϑα πρέπει να ακολουθούν κανόνες Little Endian.

22

Page 29: Εγχειρίδιο Χρήσης ΑΤ91 · 2013-03-30 · Εγχειρίδιο χρήσης at91 1. Πρόλογος ουσία επιλέξαµε τον πιο ισχυρό µικροελεγκτή

2. Αρχιτεκτονική του επεξεργαστή Εγχειρίδιο χρήσης AT91

΄Ετσι λοιπόν, αν στο πρόγραµµά µας έχουµε χρησιµοποιήσει έναν καταχωρητή για να

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

να κρατά τη ϑέση του στοιχείου που ϑέλουµε να προσπελάσουµε και το µέγεθος κάθε

στοιχείου είναι ίσο µε µια δύναµη του 2 (πχ. 2, 4, 8, 16. . . ), τότε ή ϑα αυξάνουµε τον

καταχωρητή της ϑέσης κατά το µέγεθος του κάθε στοιχείου (δηλαδή αν πρόκειται για το

3ο στοιχείο και κάθε στοιχείο έχει µέγεθος 8, στον καταχωρητή ϑέσης ϑα έχουµε (3-1)*8

= 16), ή ϑα χρησιµοποιήσουµε τη δυνατότητα του επεξεργαστή να εκτελεί ολίσθηση στα

δεδοµένα του καταχωρητή ϑέσης, πριν αυτά προστεθούν στον καταχωρητή ϐάσης και στον

καταχωρητή ϑέσης ϑα έχουµε τη σειρά του στοιχείου (0 για το πρώτο, 1 για το δεύτερο. . . ).

Η διαδικασία αποστολής δεδοµένων προς την κύρια µνήµη είναι ακριβώς ίδια µε

την διαδικασία αποθήκευσης δεδοµένων στους καταχωρητές, εκτός από τη σηµασία του

καταχωρητή Rd, όπου τώρα περιέχει την τιµή η οποία ϑα αποσταλεί προς την κύρια µνήµη.

Μετά από την προσπέλαση της κύριας µνήµης (είτε για αποθήκευση, είτε για ανάκτηση

δεδοµένων), πολλές ϕορές είναι επιθυµητή η τροποποίηση του Rb, ώστε να περιέχει την

διεύθυνση όπου έγινε η τελευταία προσπέλαση (αν τον χρησιµοποιήσουµε για επόµενη

προσπέλαση µνήµης, αυτή ϑα γίνει µε ϐάση τη ϑέση που έγινε η τελευταία προσπέ-

λαση). Αυτό µπορεί να γίνει αν χρησιµοποιήσουµε µια πράξη πρόσθεσης (µετά από την

προσπέλαση µνήµης) ανάµεσα στον Rb και τη µετατόπιση. Μιας και αυτή η αντιµετώπιση

απαιτεί επιπλέον κύκλους ϱολογιού για τη πράξης της πρόσθεσης, η αρχιτεκτονική του

επεξεργαστή µας είναι ϕτιαγµένη έτσι ώστε να µας επιτρέπεται η αλλαγή της τιµής του

Rb κατά το κύκλο προσπέλασης στην κύρια µνήµη. Επιπλέον, µας δίνει τη δυνατότη-

τα να επιλέξουµε αν ϑέλουµε να γίνει η τροποποίηση πριν ή µετά την προσπέλαση. Για

να γίνει η τροποποίηση πριν την προσπέλαση τοποθετούµε το σύµβολο ! στο τέλος της

εντολής (πχ. LDR R5, [R0, R2, LSL #2]! όπου ϑα γίνει η αύξηση του R0 κατά R2*4,

το αποτέλεσµα ϑα αποθηκευτεί στον R0 και µετά ϑα διευθυνσιοδοτηθεί η κύρια µνήµη).

Για να γίνει η τροποποίηση µετά από την προσπέλαση στην κύρια µνήµη αλλάζουµε λίγο

την σηµειογραφία της εντολής και περικλείουµε στα σύµβολα [ ] µόνο τον Rb, ενώ την

µετατόπιση την προσθέτουµε µετά (πχ. η εντολή LDR R5, [R0], R2, LSL #2 ϑα διευθυν-

σιοδοτήσει την κύρια µνήµη µε την τιµή που περιέχει ο R0 και στη συνέχεια ϑα αυξήσει

τον R0 κατά R2*4. Παρατηρείστε πως εδώ δεν χρειάζεται το !). Παραδείγµατα µεταφοράς

δεδοµένων από την µνήµη στους καταχωρητές υπάρχουν στον πίνακα Data Transfer (κεφ.

2.3.3, σελ. 24).

23

Page 30: Εγχειρίδιο Χρήσης ΑΤ91 · 2013-03-30 · Εγχειρίδιο χρήσης at91 1. Πρόλογος ουσία επιλέξαµε τον πιο ισχυρό µικροελεγκτή

Εγχειρίδιο χρήσης AT91 Κεφάλαιο 2.3 - Εντολές

Υποθέστε ότι το περιεχόµενο του R1 είναι 0x8000 και του R5 είναι 0x6.

Εντολή Περιγραφή

LDR R0, [R1] Μεταφέρει το περιεχόµενο της ϑέσης µνήµης µε διεύ-

ϑυνση 0x8000 στον καταχωρητή R0.

LDR R0, [R1, R5] Μεταφέρει το περιεχόµενο της ϑέσης µνήµης µε διεύ-

ϑυνση 0x8000 + 6 = 0x8006 στον καταχωρητή R0.

LDR R0, [R1, #10] Μεταφέρει το περιεχόµενο της ϑέσης µνήµης µε διεύ-

ϑυνση 0x8000 + 0xA = 0x800A στον καταχωρητή R0.

LDR R0, [R1, R5, LSL #2] Μεταφέρει το περιεχόµενο της ϑέσης µνήµης µε διεύ-

ϑυνση 0x8000 + 6*4 = 0x8018 στον καταχωρητή R0.

LDR R0, [R1, R5, LSL #4]! Μεταφέρει το περιεχόµενο της ϑέσης µνήµης µε διεύ-

ϑυνση 0x8000 + 6*16 = 0x8060 στον καταχωρητή R0

και αποθηκεύει την τιµή 0x8060 στον R1.

LDR R0, [R1], #12 Μεταφέρει το περιεχόµενο της ϑέσης µνήµης µε διεύ-

ϑυνση 0x8000 στον καταχωρητή R0 και αποθηκεύει

την τιµή 0x8000 + 12 = 0x800C στον R1.

STR R0, [R1] Μεταφέρει στη ϑέση µνήµης µε διεύθυνση 0x8000 το

περιεχόµενο του καταχωρητή R0.

STR R0, [R1, #20] Μεταφέρει στη ϑέση µνήµης µε διεύθυνση 0x8000 +

20 = 0x8014 το περιεχόµενο του καταχωρητή R0.

Πίνακας 2.8: Data Transfer

24

Page 31: Εγχειρίδιο Χρήσης ΑΤ91 · 2013-03-30 · Εγχειρίδιο χρήσης at91 1. Πρόλογος ουσία επιλέξαµε τον πιο ισχυρό µικροελεγκτή

2. Αρχιτεκτονική του επεξεργαστή Εγχειρίδιο χρήσης AT91

Μεταφορά block καταχωρητών

Μέχρι τώρα η µεταφορά δεδοµένων από τους καταχωρητές προς τη µνήµη και αν-

τίστροφα αφορούσε δεδοµένα ενός καταχωρητή. Στο AT91, υπάρχει επίσης η δυνατότητα

να µεταφέρουµε προς την κύρια µνήµη όσους καταχωρητές ϑέλουµε µε τη χρήση της εν-

τολής STM (όπως και από τη µνήµη προς τους καταχωρητές µε την LDM). Οι εντολές αυτές

µπορούν να χρησιµοποιηθούν σε περιπτώσεις µεταφοράς οµάδας block δεδοµένων και εί-

ναι ταχύτερες από την µεταφορά των δεδοµένων ένα-προς-ένα µε τη χρήση των εντολών

LDR, STR, διότι εκµεταλλεύονται την αρχιτεκτονική του επεξεργαστή και χρησιµοποιούν

την αρτηρία δεδοµένων κατά ϱιπάς (burst mode11). Πρέπει να σηµειώσουµε πως σε αυτό

το τρόπο µεταφοράς υποστηρίζονται µόνο µεταφορές words. Μια επιπλέον χρήσιµη εφαρ-

µογή των εντολών µεταφοράς block εµφανίζεται κατά την κλήση συναρτήσεων. Με το που

ξεκινά η εκτέλεση της συνάρτησής µας, για να έχουµε τη δυνατότητα να χρησιµοποιή-

σουµε οποιονδήποτε καταχωρητή επιθυµούµε χωρίς να χαθεί το περιεχόµενό του, πρέπει

να τον αποθηκεύσουµε στην κύρια µνήµη. Μόλις ολοκληρωθεί η εκτέλεση του κώδικα

της συνάρτησής µας και αµέσως πριν εκτελέσουµε την εντολή επιστροφής στο σηµείο κ-

λήσης της συνάρτησης, καλούµε την εντολή επαναφοράς των καταχωρητών από την κύρια

µνήµη, οπότε µε αυτό τον τρόπο τα δεδοµένα των καταχωρητών έχουν παραµείνει άθικτα.

Η γενική µορφή της εντολής είναι :

<Εντολή><Mode> Rb, <registers>

Ο καταχωρητής που περιέχει την αρχική διεύθυνση της κύριας µνήµης είναι ο Rb. Οι

καταχωρητές αναγράφονται µέσα σε και χωρίζονται µεταξύ τους µε κόµµα (r0, r5­r8,

r15). Αν υπάρχει µια σειρά από διαδοχικούς καταχωρητές που ϑα συµµετάσχουν στην

µεταφορά, τότε αντί να αναγράψουµε τον καθένα, µπορούµε να σηµειώσουµε τον πρώτο,

µετά µια παύλα και µετά τον τελευταίο (όπως r5­r8). Σε κάθε κύκλο εκτέλεσής της η

εντολή αλλάζει την διεύθυνση της κύριας µνήµης, ανάλογα µε την επιλογή προσπέλασης.

Ο επεξεργαστής µας δίνει 4 διαφορετικές επιλογές (Modes) στον τρόπο προσπέλασης της

κύριας µνήµης :

- Increment Before (IB) Πριν γίνει η προσπέλαση στη µνήµη, η διεύθυνση προσπέ-

λασης αυξάνεται κατά 4.

- Increment After (IA) Η διεύθυνση προσπέλασης αυξάνεται κατά 4 αφού γίνει η

προσπέλαση στη µνήµη.

11Burst mode έχουµε όταν ο επεξεργαστής προωθεί τα δεδοµένα στην αρτηρία δεδοµένων σε διαδοχικούς

κύκλους ϱολογιού έχοντας αποκλείσει διακοπή από άλλο περιφερειακό που ϑα ήθελε τη χρήση της αρτηρίας

για να εκτελέσει δική του µεταφορά.

25

Page 32: Εγχειρίδιο Χρήσης ΑΤ91 · 2013-03-30 · Εγχειρίδιο χρήσης at91 1. Πρόλογος ουσία επιλέξαµε τον πιο ισχυρό µικροελεγκτή

Εγχειρίδιο χρήσης AT91 Κεφάλαιο 2.3 - Εντολές

- Decrement Before (DB) Πριν γίνει η προσπέλαση στη µνήµη, η διεύθυνση προσπέ-

λασης µειώνεται κατά 4.

- Decrement After (DA) Η διεύθυνση προσπέλασης µειώνεται κατά 4 αφού γίνει η

προσπέλαση στη µνήµη.

Οπως και µε τις εντολές απλής προσπέλασης της κύριας µνήµης, έτσι και µε τις εντολές

µεταφοράς block, η αρχιτεκτονική του επεξεργαστή δίνει τη δυνατότητα να τροποποιηθεί

το περιεχόµενο του καταχωρητή ϐάσης (Rb) µε την τελευταία διεύθυνση που υπολογίζει

η εντολή µας (αν πρόκειται για προσπελάσεις Increment η τιµή του Rb ϑα γίνει Rb + 4

* (#αριθµός καταχωρητών), αν πρόκειται για Decrement η τιµή του Rb ϑα γίνει Rb - 4 *

(#αριθµός καταχωρητών). Η τροποποίηση ενεργοποιείται µε την αναγραφή του συµβόλου !

δίπλα στον καταχωρητή ϐάσης. Ιδιαίτερη προσοχή απαιτείται από τον προγραµµατιστή στην

περίπτωση που ο Rb συµπεριλαµβάνεται και στη λίστα καταχωρητών που µεταφέρονται, διότι

αν χρησιµοποιήσουµε ανανέωση του Rb το τελικό περιεχόµενο ϑα είναι άγνωστο (εξαρτάται

από το αν ϑα επιδράσει τελευταία η αλλαγή λόγω µεταφοράς ή η αλλαγή λόγω ανανέωσης).

Παραδείγµατα υπάρχουν στον πίνακα Multiple Data Transfer (κεφ. 2.3.3, σελ. 26).

Το περιεχόµενο του R1 είναι 0x8000.

Εντολή Περιγραφή

LDMIB R1, R0, R2­R5 Θα ξεκινήσει από την ϑέση 0x8004 και ϑα τοποθετή-

σει το περιεχόµενο της στον R0, το περιεχόµενο της

0x8008 στον R2 κλπ.

LDMDA R1, R0, R2­R5 Θα ξεκινήσει από την ϑέση 0x8000 και ϑα τοποθετή-

σει το περιεχόµενο της στον R5, το περιεχόµενο της

0x7FFC στον R4 και τέλος το περιεχόµενο της 0x7FF0

στον R0.

LDMDA R1!, R0, R2­R5 Θα εκτελέσει την ίδια διαδικασία µε την προηγού-

µενη εντολή, αλλά τώρα η τελευταία υπολογισθείσα

διεύθυνση ϑα αποθηκευτεί στον R1 (0x8000 ­ 4*5 =

0x7FEC).

STMIA R1, R0, R2­R5 Θα τοποθετήσει στο 0x8000 το περιεχόµενο του R0,

στο 0x8004 το περιεχόµενο του R2 κλπ.

STMDB R1, R0, R2­R5 Θα τοποθετήσει το περιεχόµενο του R5 στο 0x7FFC,

το περιεχόµενο του R4 στο 0x7FF8 κλπ.

Πίνακας 2.9: Multiple Data Transfer

26

Page 33: Εγχειρίδιο Χρήσης ΑΤ91 · 2013-03-30 · Εγχειρίδιο χρήσης at91 1. Πρόλογος ουσία επιλέξαµε τον πιο ισχυρό µικροελεγκτή

2. Αρχιτεκτονική του επεξεργαστή Εγχειρίδιο χρήσης AT91

Παρατηρείστε πως η ανάκτηση των δεδοµένων ακολουθεί την ακριβώς αντίθετη επιλογή

προσπέλασης από την αποστολή προς την κύρια µνήµη. ∆ηλαδή, µετά από µια εντολή

STMDA, για να γίνει σωστά η ανάκτηση των δεδοµένων πρέπει να χρησιµοποιήσουµε την

LDMIB, όπως και µετά από µια STMIA πρέπει να χρησιµοποιήσουµε την LDMDB.

Μεταφορά καταχωρητή σε καταχωρητή

Οταν ϑέλουµε να µεταφέρουµε την τιµή ενός καταχωρητή σε άλλον ή να ϑέσουµε άµεσα

την τιµή ενός καταχωρητή, χρησιµοποιούµε την εντολή MOV, της οποίας η γενική µορ-

ϕή είναι MOV Rd, <operand>. Ο καταχωρητής Rd είναι αυτός που ϑα δεχθεί την τιµή

του <operand>, το οποίο µπορεί να είναι οποιοσδήποτε καταχωρητής, ή καταχωρητής µε

εντολή ολίσθησης ή άµεση τιµή. Χρειάζεται προσοχή σε ότι αφορά τις άµεσες τιµές που

µπορούµε να εισάγουµε, αφού λόγω της αρχιτεκτονικής του επεξεργαστή µας τα δεδοµένα

της τιµής µπορούν να καταλάβουν µόνο 8 ψηφία µέσα στην εντολή (δηλαδή η µέγιστη

επιτρεπτή τιµή είναι το 255 ή 0xFF). Επειδή η τιµή περνά µέσω του ολισθητή µπορούµε

να εισάγουµε όποιον αριθµό ϑέλουµε (µέχρι το 255) ο οποίος να έχει δεχθεί ολίσθηση

µέχρι 31 ϑέσεις. Για παράδειγµα, οι τιµές 0xFF, 0xDA0000, 0xF0000000 είναι αποδεκ-

τές γιατί έχουν προέλθει από τις 0xFF χωρίς ολίσθηση, 0xDA ολισθηµένο αριστερά κατά

16 ϑέσεις και 0xF0 ολισθηµένο αριστερά κατά 24 ϑέσεις αντίστοιχα. Οι τιµές 0xDA0010,

0xF0003200, 0x254 δεν µπορούν να εισαχθούν άµεσα, γιατί δεν αποτελούν γινόµενο

(8ψήφιου δυαδικού αριθµού) * (δύναµη του 2). Με την εντολή MVN εκτελούµε ότι και µε

την εντολή MOV, αλλά στον καταχωρητή Rd αποθηκεύεται η αντίθετη τιµή (δηλαδή όλα τα

bits που είναι 1 γίνονται 0 και το αντίθετο). Παραδείγµατα υπάρχουν στον πίνακα Register

to Register Transfer (κεφ. 2.3.3, σελ. 27).

Εντολή Περιγραφή

MOV R1, R2 Μεταφέρει στον R1 το περιεχόµενο του R2.

MOV R1, R2, LSL #5 Μεταφέρει στον R1 το περιεχόµενο του R2, ολισθηµένο

αριστερά κατά 5 ϑέσεις.

MOVS R1, R2, LSL #5 Εκτελεί την ίδια διαδικασία µε την προηγούµενη εν-

τολή, αλλά τώρα αποθηκεύεται στο Carry bit του CPSR

το τελευταίο bit που ολίσθησε εκτός του καταχωρητή.

MOV R1, #0x35 Μεταφέρει στον R1 την τιµή #0x35.

MVN R1, #0x35 Μεταφέρει στον R1 την τιµή #0xFFFF_FFCA.

Πίνακας 2.10: Register to Register Transfer

27

Page 34: Εγχειρίδιο Χρήσης ΑΤ91 · 2013-03-30 · Εγχειρίδιο χρήσης at91 1. Πρόλογος ουσία επιλέξαµε τον πιο ισχυρό µικροελεγκτή

Εγχειρίδιο χρήσης AT91 Κεφάλαιο 2.3 - Εντολές

Μεταφορές ειδικού τύπου

Στις εντολές µεταφοράς εντάσσονται και µερικές εντολές που έχουν σχέση µε µεταφορά

δεδοµένων ανάµεσα στους καταχωρητές και ειδικές µονάδες του επεξεργαστή, όπως ο CP­

SR και ο συνεπεξεργαστής (CoProcessor). ΄Οσον αφορά στον CPSR χρειάζεται λίγη προσο-

χή, διότι ενώ µπορούµε να αντιγράψουµε το περιεχόµενό του σε έναν καταχωρητή, δεν

µπορούµε να αλλάξουµε το περιεχόµενο των bits [23-0] όταν ϐρισκόµαστε σε User mode.

Επιπλέον, όταν ϑέλουµε να αποθηκεύσουµε στον CPSR διαφορετικές τιµές στις σηµαίες

κατάστασης πρέπει να χρησιµοποιούµε την γενική µορφή MSR CPSR_f, Rm, όπου το

σύµβολο _f υποδηλώνει πως ϑέλουµε να αλλάξουµε µόνο τις σηµαίες. Ο καταχωρητής Rm

περιέχει την τιµή που ϑα σταλεί στον CPSR. Για παράδειγµα, αν το περιεχόµενο του R0

είναι 0x80000000 και εκτελέσουµε την εντολή :

MSR CPSR_f, R0

ϑα γίνει 1 η σηµαία αρνητικού αποτελέσµατος (Negative bit) και 0 οι υπόλοιπες (bits Z,

C, V, Q).

Επεξήγηση

Ο συνεπεξεργαστής (CoProcessor) αποτελεί έναν υποσχεδιασµό του ολοκληρωµένου του

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

αχείρισης µνήµης (Memory Management Unit ­ MMU), η µονάδα προστασίας της µνήµης

διαφορετικών διεργασιών (Protection Unit) και έχει το δικό του σύνολο από καταχωρητές.

Τέλος, η εντολή SWP αναλαµβάνει να αντιµεταθέσει το περιεχόµενο µιας ϑέσης µνήµης

µε ένα καταχωρητή. Η γενική της µορφή είναι SWP Rd, Rm, [Rb], όπου ο Rd είναι ο

καταχωρητής στον οποίο ϑα αποθηκευτεί το περιεχόµενο της ϑέσης µνήµης, ο Rm περιέχει

την τιµή που ϑα σταλεί στη µνήµη και ο Rb περιέχει τη διεύθυνση της κύριας µνήµης, µε

την οποία ϑα γίνει η ανταλλαγή δεδοµένων.

2.3.4 Αριθµητικές/Λογικές πράξεις

Ο επεξεργαστής µας έχει τη δυνατότητα εκτέλεσης των αριθµητικών/λογικών πράξεων

που αναφέρονται στον πίνακα Πράξεις (κεφ. 2.3.4, σελ. 29). Εδώ πρέπει να τονίσουµε

πως ο επεξεργαστής µας υλοποιεί µε υλικό (hardware) µόνο πρόσθεση και πολλαπλασι-

ασµό ακεραίων. Οι υπόλοιπες πράξεις ακεραίων καθώς και πράξεις κινητής υποδιαστολής

µπορούν αν είναι αναγκαίες σε µια εφαρµογή να υλοποιηθούν µε λογισµικό (software).

Η γενική µορφή των αριθµητικών/λογικών πράξεων είναι <Εντολή> Rd, Rn, <par1>,

όπου Rd είναι ο καταχωρητής που ϑα δεχτεί το αποτέλεσµα της πράξης, Rn είναι ο

28

Page 35: Εγχειρίδιο Χρήσης ΑΤ91 · 2013-03-30 · Εγχειρίδιο χρήσης at91 1. Πρόλογος ουσία επιλέξαµε τον πιο ισχυρό µικροελεγκτή

2. Αρχιτεκτονική του επεξεργαστή Εγχειρίδιο χρήσης AT91

Εντολή Περιγραφή Εντολή Περιγραφή

ADC Πρόσθεση µε κρατούµενο ADD Πρόσθεση

AND Λογικό AND BIC Λογικό AND µε το λογικό

συµπλήρωµα (NOT) του 2ou

εντέλου

CLZ Μέτρηση των 0 στις περισ-

σότερο σηµαντικές ϑέσεις

CMN Σύγκριση µε το −(2o έντελο)

CMP Σύγκριση EOR Λογικό XOR

ORR Λογικό OR RSB Αφαίρεση (αφαιρέτης - µει-

ωτέος)

RSC Αφαίρεση (αφαιρέτης - µει-

ωτέος) µε δανεικό

SBC Αφαίρεση µε δανεικό

SUB Αφαίρεση TEQ ΄Ελεγχος ισότητας

TST ΄Ελεγχος MLA Πολλαπλασιασµός και

συσσώρευση

MUL Πολλαπλασιασµός SMLAL Προσηµασµένος πολ-

λαπλασιασµός και

συσσώρευση 32bits

SMULL Προσηµασµένος πολ-

λαπλασιασµός 32bits

UMLAL Μη-προσηµασµένος

πολλαπλασιασµός και

συσσώρευση 32bits

UMULL Μη-προσηµασµένος πολ-

λαπλασιασµός 32bits

Πίνακας 2.11: Πράξεις

καταχωρητής που περιέχει το πρώτο έντελο της πράξης και <par1> µπορεί να είναι

καταχωρητής, καταχωρητής που έχει δεχτεί ολίσθηση ή άµεση τιµή. Οι πράξεις αυτές,

αν έχουν ενεργοποιηµένη την επιλογή ανανέωσης του CPSR, αλλάζουν τις σηµαίες κατάσ-

τασης ανάλογα µε το αποτέλεσµα που προκύπτει. Εξαίρεση αποτελεί η εντολή CLZ που

µετρά τα 0 που υπάρχουν στα περισσότερο σηµαντικά ψηφία του Rn, µέχρι να συναντήσει

ένα ψηφίο ίσο µε 1 και αποθηκεύει τον αριθµό τους στον Rd (δεν χρησιµοποιεί το πεδίο

<par1>). Παραδείγµατα παρατίθενται στον πίνακα Αριθµητικές/Λογικές πράξεις (κεφ.

2.3.4, σελ. 30).

Οι εντολές σύγκρισης CMP, CMN, TEQ & TST εκτελούν τις αριθµητικές πράξεις SUB,

ADD, EOR, AND αντίστοιχα χωρίς να αποθηκεύεται το αποτέλεσµά τους. Η εντολή CM­

29

Page 36: Εγχειρίδιο Χρήσης ΑΤ91 · 2013-03-30 · Εγχειρίδιο χρήσης at91 1. Πρόλογος ουσία επιλέξαµε τον πιο ισχυρό µικροελεγκτή

Εγχειρίδιο χρήσης AT91 Κεφάλαιο 2.3 - Εντολές

Εντολή Περιγραφή

ADD R1, R1, #0x10 Προσθέτει στον καταχωρητή R1 την τιµή 0x10.

SUB R5, R1, R2, LSL #2 Αφαιρεί από τον R1 το R2*4 και αποθηκεύει το αποτέ-

λεσµα στον R5

RSB R5, R1, R2, LSL #2 Αφαιρεί από το R2*4 τον R1 και αποθηκεύει το αποτέ-

λεσµα στον R5

ADC R5, R1, R2 Προσθέτει τον R1 µε τον R2 συνυπολογίζοντας και τη

σηµαία κρατουµένου του CPSR και αποθηκεύει το

αποτέλεσµα στον R5.

AND R1, R1, #0x10 Εκτελεί λογική πράξη AND ανάµεσα στον R1 και την

άµεση τιµή 0x10 και αποθηκεύει το αποτέλεσµα στον

R1.

Πίνακας 2.12: Αριθµητικές/Λογικές πράξεις

P ανανεώνει πάντα τις σηµαίες κατάστασης του CPSR ενώ οι υπόλοιπες τρεις εντολές

σύγκρισης µόνο αν υπάρχει η επιλογή S στο τέλος της εντολής. Η γενική µορφή τους

είναι <Εντολή> Rn, <par1>, όπου Rn είναι ο καταχωρητής που περιέχει την πρώτη

τιµή προς σύγκριση και το <par1> µπορεί να είναι καταχωρητής, καταχωρητής που έχει

δεχτεί ολίσθηση ή άµεση τιµή. Για παράδειγµα, αν ϑέλουµε να εξακριβώσουµε αν ένας

αριθµός είναι µεγαλύτερος από τον άλλο, εκτελούµε αφαίρεση µεταξύ τους και µε ϐάση τις

σηµαίες κατάστασης που προκύπτουν ελέγχουµε αν το αποτέλεσµα ήταν αρνητικό, µηδέν

ή ϑετικό. Παραδείγµατα συγκρίσεων υπάρχουν στον πίνακα Συγκρίσεις (κεφ. 2.3.4, σελ.

31).

Οι εντολές πολλαπλασιασµού υποστηρίζονται από τον πολλαπλασιαστή της αρχιτεκ-

τονικής µας, ο οποίος είναι υλοποιηµένος σε υλικό. Παρότι δέχεται δεδοµένα εισόδου

εύρους 32 ψηφίων, µπορεί να να παράγουµε αποτελέσµατα 32 ή 64 ψηφίων. Ο πλήρης

πολλαπλασιασµός δύο δυαδικών αριθµών των 32 ψηφίων ϑα παράγει γινόµενο εύρους 64

ψηφίων, το οποίο µιας και δεν χωρά στο εύρος των καταχωρητών µας, αποθηκεύεται σε 2

καταχωρητές. Ωστόσο είναι πιθανό να µας ενδιαφέρουν µόνο τα 32 λιγότερα σηµαντικά

ψηφία του αποτελέσµατος. Για παράδειγµα, αν ϑέλουµε να υπολογίσουµε το γινόµενο 5

x 6, δεν χρειαζόµαστε και τα 64 ψηφία, διότι το γινόµενο χωρά σε 32 ψηφία µόνο. Ο

πολλαπλασιαστής µας είναι ικανός να µας δώσει τα 32 λιγότερο σηµαντικά ψηφία ενός

πολλαπλασιασµού εντέλων των 32 ψηφίων σε λιγότερους κύκλους απ΄ ότι απαιτεί ένας

πλήρης πολλαπλασιασµός.

30

Page 37: Εγχειρίδιο Χρήσης ΑΤ91 · 2013-03-30 · Εγχειρίδιο χρήσης at91 1. Πρόλογος ουσία επιλέξαµε τον πιο ισχυρό µικροελεγκτή

2. Αρχιτεκτονική του επεξεργαστή Εγχειρίδιο χρήσης AT91

Εντολή Περιγραφή

CMP R2, R4 Συγκρίνει το περιεχόµενο του R2 µε το περιεχόµενο του

R4. Ανάλογα µε το είδος του αποτελέσµατος ανανεώνονται οι

σηµαίες κατάστασης.

CMP R3, 0x8000 Συγκρίνει το περιεχόµενο του R3 µε το δεδοµένο 0x8000.

Ανάλογα µε το είδος του αποτελέσµατος ανανεώνονται οι

σηµαίες κατάστασης.

CMN R1, R2 Συγκρίνει το περιεχόµενο του R1 µε το ­R2 (προσθέτει το

συµπλήρωµα ως προς 2 του R2) και δεν επηρεάζει τις σηµαίες

κατάστασης.

TEQS R1, R4 Συγκρίνει ως προς την ισότητα το περιεχόµενο του R1 µε το

περιεχόµενο του R4. Αν τα περιεχόµενα των καταχωρητών είναι

ίδια, η σηµαία µηδενικού αποτελέσµατος του CPSR γίνεται 1.

Πίνακας 2.13: Συγκρίσεις

Στο σύνολο εντολών µας υποστηρίζονται όλοι αυτοί οι εναλλακτικοί τρόποι χρήσης του

πολλαπλασιαστή. Η εντολή MUL πολλαπλασιάζει 2 καταχωρητές και αποθηκεύει τα 32

λιγότερα σηµαντικά ψηφία. Η εντολή MLA πολλαπλασιάζει 2 καταχωρητές και προσθέτει

το γινόµενό τους µε το περιεχόµενο ενός τρίτου πριν αποθηκεύσει τα 32 λιγότερα σηµαν-

τικά ψηφία. Οι δύο αυτές εντολές πολλαπλασιάζουν προσηµασµένα και µη προσηµασ-

µένα δεδοµένα. Οι υπόλοιπες εντολές πολλαπλασιασµού παράγουν γινόµενα εύρους 64

ψηφίων και διαχωρίζονται σε εντολές πολλαπλασιασµού προσηµασµένων και µη προση-

µασµένων δεδοµένων. Οι εντολές SMULL & SMLAL εκτελούν τις παραπάνω διαδικασίες

(πολλαπλασιασµό και πολλαπλασιασµό µε κατοπινή άθροιση - συσσώρευση αντίστοιχα),

για προσηµασµένα δεδοµένα. Οι εντολές UMULL & UMLAL εκτελούν τις παραπάνω δι-

αδικασίες αντίστοιχα για µη-προσηµασµένα δεδοµένα. Σε όλες τις περιπτώσεις το αποτέ-

λεσµα είναι 64 ψηφίων. Παραδείγµατα πολλαπλασιασµών υπάρχουν στον πίνακα Πολ-

λαπλασιασµοί (κεφ. 2.3.4, σελ. 32)

2.3.5 Εντολές διακλάδωσης

Ο επεξεργαστής µας έχει τη δυνατότητα εκτέλεσης των εντολών διακλάδωσης που

αναφέρονται στον πίνακα Branches (κεφ. 2.3.5, σελ. 32).

Ο επεξεργαστής µας υποστηρίζει µια σειρά από εντολές διακλάδωσης, που µπορούν να

εκτελέσουν αλλαγή της ϱοής του κώδικα υπό συνθήκη κατά ±32MBytes. Η αλλαγή της

ϱοής εκτέλεσης σε διαφορετικό σηµείο του κώδικα σχετίζεται µε την αλλαγή του περιεχοµέ-

31

Page 38: Εγχειρίδιο Χρήσης ΑΤ91 · 2013-03-30 · Εγχειρίδιο χρήσης at91 1. Πρόλογος ουσία επιλέξαµε τον πιο ισχυρό µικροελεγκτή

Εγχειρίδιο χρήσης AT91 Κεφάλαιο 2.3 - Εντολές

Εντολή Περιγραφή

MUL R1, R2, R5 Πολλαπλασιάζει το περιεχόµενο του R2 µε αυτό του

R5 και αποθηκεύει τα 32 λιγότερο σηµαντικά bits στον

καταχωρητή R1.

MLA R1, R1, R4, R6 Πολλαπλασιάζει το περιεχόµενο του R1 µε αυτό του

R4, προσθέτει στο γινόµενο το περιεχόµενο του R6

και αποθηκεύει τα 32 λιγότερο σηµαντικά bits στον

καταχωρητή R1.

SMULL R0, R1, R4, R6 Πολλαπλασιάζει το περιεχόµενο του R4 µε αυτό του

R6 µε προσηµασµένη αριθµητική και αποθηκεύει τα

32 λιγότερο σηµαντικά bits στον καταχωρητή R0 και

τα 32 περισσότερα σηµαντικά bits στον R1.

UMLAL R1, R2, R4, R6 Πολλαπλασιάζει το περιεχόµενο του R4 µε αυτό του

R6 µε µη-προσηµασµένη αριθµητική, προσθέτει στο

γινόµενο την τιµή R1 + R2 * 232 και αποθηκεύει τα 32

λιγότερο σηµαντικά bits στον καταχωρητή R1 και τα

32 περισσότερα σηµαντικά bits στον R2.

Πίνακας 2.14: Πολλαπλασιασµοί

Εντολή Περιγραφή Εντολή Περιγραφή

B ∆ιακλάδωση BL ∆ιακλάδωση µε αποθήκευση

του R15 στον R14

BX ∆ιακλάδωση µε αλλαγή

συνόλου εντολών

BLX ∆ιακλάδωση µε αποθήκευση

του R15 στον R14 και αλλαγή

συνόλου εντολών

Πίνακας 2.15: Branches

32

Page 39: Εγχειρίδιο Χρήσης ΑΤ91 · 2013-03-30 · Εγχειρίδιο χρήσης at91 1. Πρόλογος ουσία επιλέξαµε τον πιο ισχυρό µικροελεγκτή

2. Αρχιτεκτονική του επεξεργαστή Εγχειρίδιο χρήσης AT91

νου του καταχωρητή R15 (PC). Οι εντολές διακλάδωσης έχουν τη γενική µορφή <Εντολή>

<label>, όπου <label> είναι µια ετικέτα που σηµατοδοτεί τη διεύθυνση της εντολής του

άλµατος (περισσότερες πληροφορίες κεφ. 3.2.1, σελ. 39).

33

Page 40: Εγχειρίδιο Χρήσης ΑΤ91 · 2013-03-30 · Εγχειρίδιο χρήσης at91 1. Πρόλογος ουσία επιλέξαµε τον πιο ισχυρό µικροελεγκτή

Εγχειρίδιο χρήσης AT91 Κεφάλαιο 2.3 - Εντολές

34

Page 41: Εγχειρίδιο Χρήσης ΑΤ91 · 2013-03-30 · Εγχειρίδιο χρήσης at91 1. Πρόλογος ουσία επιλέξαµε τον πιο ισχυρό µικροελεγκτή

Εισαγωγή στην Assembly του ΑΤ91

3.1 Γενικά

΄Ενα πρόγραµµα ορίζεται σαν µια σειρά από εντολές που εκτελούνται διαδοχικά και

καθοδηγούν τον επεξεργαστή στην υλοποίηση µιας διεργασίας. Κάθε εντολή περιγράφει

και ένα µικρό ϐήµα, απαραίτητο για την ολοκλήρωση της διεργασίας. Για παράδειγµα,

για να υλοποιηθεί µια πρόσθεση είναι απαραίτητο να µεταφερθούν τα δεδοµένα από την

εξωτερική µνήµη στους καταχωρητές, να εκτελεστεί η πράξη και το αποτέλεσµα να σταλεί

στην εξωτερική µνήµη για αποθήκευση. Χρειαζόµαστε δηλαδή:

1. 2 εντολές για τη µεταφορά των δεδοµένων

2. 1 εντολή για την πρόσθεση

3. 1 εντολή για την αποθήκευση του αποτελέσµατος

Συνολικά 4 εντολές

Η υλοποίηση οποιασδήποτε διεργασίας πρέπει να διασπαστεί σε πολύ απλά ϐήµατα,

τα οποία ϑα εκτελούν µια από τις παρακάτω λειτουργίες :

1. Μεταφορά δεδοµένων από και προς τη µνήµη

2. Επεξεργασία των δεδοµένων που υπάρχουν στους καταχωρητές

3. Αλλαγή της ϱοής του προγράµµατος µε διακλαδώσεις

Οι εντολές αυτές γίνονται αντιληπτές από τον επεξεργαστή σαν µια αλληλουχία από 0 και

1 (πχ. η εντολή πρόσθεσης µπορεί να µοιάζει µε 0111100111101111). Αυτό το επίπεδο

συγγραφής προγραµµάτων ονοµάζεται γλώσσα µηχανής και είναι το χαµηλότερο δυνατό12.

Ο προγραµµατισµός σε τέτοιο επίπεδο είναι εξαιρετικά δύσκολος, διότι η κάθε εντολή δεν

µπορεί να γίνει άµεσα κατανοητή από κάποιον που διαβάζει το πρόγραµµα (δε συνδέεται

12 ΄Οσο πιο περιγραφική και αφαιρετική είναι η γλώσσα προγραµµατισµού, τόσο υψηλότερο γίνεται το

επίπεδο προγραµµατισµού.

35

Page 42: Εγχειρίδιο Χρήσης ΑΤ91 · 2013-03-30 · Εγχειρίδιο χρήσης at91 1. Πρόλογος ουσία επιλέξαµε τον πιο ισχυρό µικροελεγκτή

Εγχειρίδιο χρήσης AT91 Κεφάλαιο 3.1 - Γενικά

µε κάποια περιγραφή σε λεξικολογικό επίπεδο). Επιπλέον, η συγγραφή ενός µεγάλου

αριθµού από 0 και 1 είναι εξαιρετικά κουραστική και µπορεί εύκολα να οδηγήσει σε σ-

ϕάλµατα (παράλειψη κάποιων ψηφίων ή προσθήκη επιπλέον) τα οποία για να διορθωθούν

πρέπει να γίνει επαλήθευση κάθε ψηφίου εξ αρχής. Η λύση σε αυτά τα προβλήµατα ήρθε

µε την αντιστοίχιση των εντολών σε µικρά ονόµατα (τα οποία ονοµάζονται µνηµονικά) και

είναι επεξηγηµατικά ως προς τη λειτουργία τους. ∆ηλαδή, στην εντολή πρόσθεσης έγινε

η αντιστοίχιση του µνηµονικού ADD, το οποίο µόλις αναγνωστεί από κάποιον υποδηλώνει

άµεσα πως πρόκειται για πρόσθεση. Φυσικά, για να γίνει η µετάβαση από το λεκτικό

επίπεδο στο δυαδικό επίπεδο είναι απαραίτητη η χρήση ειδικού προγράµµατος που ϑα

µεταφράζει τα µνηµονικά ονόµατα στην αλληλουχία των 0 και 1 (Assembler).

Η χρήση των µνηµονικών ονοµάτων οδηγεί αµέσως σε γλώσσα προγραµµατισµού που

ϐρίσκεται ένα επίπεδο υψηλότερο από τη γλώσσα µηχανής και το όνοµα που της έχουµε

δώσει είναι συµβολική γλώσσα (Assembly). Οι σχεδιαστές κάθε επεξεργαστή αναλαµβά-

νουν να αντιστοιχίσουν ένα µνηµονικό όνοµα σε κάθε εντολή που µπορεί να εκτελέσει ο

επεξεργαστής και γι’αυτό το λόγο κάθε συµβολική γλώσσα συνδέεται µε ένα συγκεκριµένο

επεξεργαστή ή µια συγκεκριµένη οµάδα επεξεργαστών (οικογένεια). Αυτό σηµαίνει πως οι

εντολές της συµβολικής γλώσσας του επεξεργαστή ARM946EJ­S είναι διαφορετικές από

τις εντολές του Intel Pentium 4 ή του 80C196KB, διότι κάθε επεξεργαστής υποστηρίζει δι-

αφορετικό σύνολο εντολών. Η συµβολική γλώσσα αν και διαφέρει από τη γλώσσα µηχανής

στο γεγονός ότι εισάγει χρήση λεκτικών ονοµάτων, συνεχίζει να έχει το µειονέκτηµα πως

απαιτεί την περιγραφή κάθε µικρού ϐήµατος, έτσι ώστε να περιγραφεί πλήρως η διεργασία

του χρήστη. Για κάθε διαδικασία επεξεργασίας δεδοµένων, ο προγραµµατιστής πρέπει να

ϕροντίσει και για την µεταφορά και αποθήκευση των δεδοµένων προς επεξεργασία. ΄Αρα ο

προγραµµατιστής σε συµβολική γλώσσα δε χρειάζεται να εστιάζει µόνο στη περιγραφή της

λύσης του προβλήµατος, αλλά και στο πως ϑα διαχειριστεί τους πόρους του συστήµατος.

Αυτό το µειονέκτηµα το παρακάµπτουν γλώσσες προγραµµατισµού σε υψηλότερα επίπε-

δα, όπως C, FORTRAN, BASIC κ.α.

Η συµβολική γλώσσα παρουσιάζει προβλήµατα, όπως η εξειδίκευση του προγράµµατος

σε ένα τύπο επεξεργαστών, η µεγάλη έκταση προγραµµάτων προκειµένου να υλοποιηθεί

µια διεργασία και η δυσκολία στην συντήρηση και κατανόηση ενός κώδικα13. Επιπλέον, οι

γλώσσες υψηλότερου επιπέδου µπορούν να υλοποιήσουν τις ίδιες διεργασίες µε µικρότερο

χρονικό κόστος (για να αναπτύξουµε µια εφαρµογή σε συµβολική γλώσσα χρειάζεται να δα-

πανήσουµε πολύ χρόνο, σε σχέση µε το χρόνο που ϑα χρειαζόµασταν αν χρησιµοποιούσαµε

τη γλώσσα C πχ. µια πρόσθεση καταγράφεται στη C σαν a = b + c;). Το πρόβληµα που

13Με τον όρο συντήρηση εννοούµε το ϐαθµό ευκολίας που ϑα έχει η προσπάθεια επέκτασης ή κατανόησης

ενός κώδικα αρκετό καιρό µετά την ανάπτυξή του και από διαφορετικά άτοµα.

36

Page 43: Εγχειρίδιο Χρήσης ΑΤ91 · 2013-03-30 · Εγχειρίδιο χρήσης at91 1. Πρόλογος ουσία επιλέξαµε τον πιο ισχυρό µικροελεγκτή

3. Εισαγωγή στην Assembly του ΑΤ91 Εγχειρίδιο χρήσης AT91

εµφανίζεται µε τις γλώσσες υψηλού επιπέδου εντοπίζεται στο γεγονός πως ο εκτελέσιµος

κώδικας που παράγεται περιέχει πλεονάζουσες εντολές, διότι η διαδικασία της µετάφρασης

που ακολουθείται για κώδικα των υψηλού επιπέδου γλωσσών χρησιµοποιεί τεχνικές που

παράγουν γενικευµένο14 και όχι στοχευµένο στη πραγµατική αρχιτεκτονική κώδικα. Για

παράδειγµα, στον παρακάτω κώδικα a = b + c; d = b + c; ο συµβολοµεταφραστής compiler

της C ϑα παράγει τα παρακάτω ϐήµατα ικανά να εκτελεστούν από κάθε αρχιτεκτονική :

1. Προσκόµµιση του b

2. Προσκόµµιση του c

3. Πρόσθεση.

4. Αποθήκευση στο a.

5. Προσκόµµιση του b.

6. Προσκόµµιση του c.

7. Πρόσθεση.

8. Αποθήκευση στο d.

Οι παραπάνω εντολές προφανώς µπορούν να υπολογιστούν πολύ πιο αποδοτικά µε :

1. Προσκόµµιση του b.

2. Προσκόµµιση του c.

3. Πρόσθεση.

4. Αποθήκευση στο a.

5. Αποθήκευση στο d.

Με τον δεύτερο τρόπο επιταχύνουµε την εκτέλεση της έκφρασης, διότι αφαιρούµε άχρηστες

εντολές. Ο µεταφραστής της C δεν µπορεί να ϕτάσει σε τέτοιο ϐαθµό ϐελτιστοποίησης, διότι

πρόκειται για λογική ϐελτιστοποίηση και όχι αλγεβρική15. Αρα, ο ϐασικός λόγος εκµά-

ϑησης της συµβολικής γλώσσας είναι η δυνατότητα που προσφέρει για ανάπτυξη τµηµάτων

του προγράµµατός µας που απαιτούν ταχύτητα ή µικρό µέγεθος κώδικα. Επιπλέον, οι

µεταφραστές των γλωσσών υψηλού επιπέδου δεν υποστηρίζουν µε την ίδια ευκολία όλες

τις εντολές γλώσσας µηχανής του επεξεργαστή, οπότε αν χρειαστούµε κάποια από αυτές ϑα

πρέπει να την καλέσουµε µέσω συµβολικής γλώσσας. Τέλος, η αποσφαλµάτωση ενός κώδι-

κα (το οποίο µπορεί να έχει ϕτιαχτεί µε οποιαδήποτε γλώσσα προγραµµατισµού) γίνεται

σε επίπεδο συµβολικής γλώσσας, διότι η διαδικασία περιλαµβάνει τη ϐηµατική εκτέλεση

των εντολών της γλώσσας µηχανής. Από τη στιγµή που γίνεται η µετάφραση ενός προ-

γράµµατος δεν είναι δυνατή η ανάκτηση του πηγαίου κώδικα σε µορφή υψηλής γλώσσας

προγραµµατισµού. ΄Ετσι, για να ελέγξουµε περιπτώσεις σφαλµάτων κατά την εκτέλεση

14Γνωστός και ως ενδιάµεσος κώδικας15Η λογική ϐελτιστοποίηση έχει σχέση µε τον αλγόριθµο που επιλέγουµε για την επίλυση ενός προβλήµατος.

37

Page 44: Εγχειρίδιο Χρήσης ΑΤ91 · 2013-03-30 · Εγχειρίδιο χρήσης at91 1. Πρόλογος ουσία επιλέξαµε τον πιο ισχυρό µικροελεγκτή

Εγχειρίδιο χρήσης AT91 Κεφάλαιο 3.2 - GNU Assembler

του προγράµµατος, πρέπει να χρησιµοποιήσουµε ειδικά εργαλεία (αποσφαλµατωτές - de­

buggers) τα οποία διερµηνεύσουν τον κώδικα µηχανής µέχρι το επίπεδο της συµβολικής

γλώσσας. Προφανώς η εκµάθηση της συµβολικής γλώσσας συνδέεται άµεσα µε την εκµά-

ϑηση της αρχιτεκτονικής του κάθε επεξεργαστή και των ιδιαίτερων χαρακτηριστικών που

έχει. Αυτή η γνώση ϐοηθά την αποτελεσµατικότερη συγγραφή προγραµµάτων, διότι έ-

χοντας κατανοήσει καλύτερα τον τρόπο µε τον οποίο αντιδρά ο επεξεργαστής στην κάθε

εντολή, µπορούµε να συνδυάσουµε τις εντολές µεταξύ τους πολύ πιο αποδοτικά.

Πληροφοριακά . . .

Οι επεξεργαστές της σειράς i386 ή i686 (πχ. Pentium 4 ή Athlon) κατασκευάζονται από διαφορε-

τικές εταιρίες, αλλά έχουν σε ένα µεγάλο ποσοστό κοινό σύνολο εντολών. Επιπλέον, διατηρούν στο

σύνολο εντολών τους και εντολές οι οποίες υπήρχαν σε παλιότερα µοντέλα, όπως πχ. στον 486. Με

αυτό τον τρόπο εξασφαλίζεται η αρµονική εκτέλεση των εφαρµογών σε κάθε επεξεργαστή, όπως και

η εκτέλεση παλιών εφαρµογών. Φυσικά, η κάθε εταιρία προσφέρει και επιπλέον εντολές, οι οποίες

δεν υπάρχουν στους επεξεργαστές των ανταγωνιστών, οι οποίες έχουν σχέση µε την αύξηση της

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

προγράµµατα οδηγοί (drivers) από το λειτουργικό σύστηµα (προγράµµατα τα οποία εκτελούνται

µε αυξηµένα δικαιώµατα σε επίπεδο πυρήνα και έχουν στόχο την αντιστοίχιση µιας γενικής δι-

αδικασίας στις εντολές αυτές). Ενα σηµαντικό τµήµα των προγραµµάτων αυτών έχει αναπτυχθεί

στη συµβολική γλώσσα του αντίστοιχου επεξεργαστή.

3.2 GNU Assembler

Το πρόγραµµα που ϑα χρησιµοποιήσουµε για τη µετάφραση από τη συµβολική γλώσ-

σα σε γλώσσα µηχανής είναι ο GNU Assembler (gas). Στο AT91 χρησιµοποιούµε το όνοµα

as για τον GNU Assembler. Ο as δέχεται σαν είσοδο το πηγαίο αρχείο µας16 και παράγει

το εκτελέσιµο αρχείο. Οι εντολές της συµβολικής γλώσσας έχουν συγκεκριµένη και οµοιό-

µορφη δοµή η οποία είναι :

[ετικέτα:]<ΚΕΝΟ>εντολή<ΚΕΝΟ>δεδοµένα [<ΚΕΝΟ> @ σχόλια]

Το πρώτο πεδίο είναι η ετικέτα και επειδή δεν είναι υποχρεωτικό να αναγράφεται σε

κάθε γραµµή, γι’αυτό και είναι ανάµεσα στα [ ]. Το <ΚΕΝΟ> µπορεί να αποτελείται από

οποιονδήποτε συνδψασµό από spaces ή tabs και δεν λαµβάνεται υπ΄ όψιν το µέγεθός του

16Πηγαίο ονοµάζεται το αρχείο που περιέχει τον κώδικά µας

38

Page 45: Εγχειρίδιο Χρήσης ΑΤ91 · 2013-03-30 · Εγχειρίδιο χρήσης at91 1. Πρόλογος ουσία επιλέξαµε τον πιο ισχυρό µικροελεγκτή

3. Εισαγωγή στην Assembly του ΑΤ91 Εγχειρίδιο χρήσης AT91

(πάντα ϑεωρείται σαν ένα space). Το πεδίο της εντολής περιέχει το µνηµονικό όνοµα της

εντολής (πχ. ADD, MUL, ORR κ.α.) ή κάποια εντολή προς τον ίδιο τον as για να τον

ενηµερώσει πως σε εκείνο το σηµείο πρέπει να συνεχίσει τη µετάφραση µε συγκεκριµένο

τρόπο. Οι εξειδικευµένες εντολές προς τον as ονοµάζονται ντιρεκτίβες. Το πεδίο των

δεδοµένων µπορεί να περιέχει ένα συνδυασµό από καταχωρητές, αριθµούς ή διευθύνσεις

και το περιεχόµενο του πεδίου έχει σχέση µε την εντολή που εκτελείται. ∆ηλαδή, η µορφή

και τα περιεχόµενα αυτού του πεδίου καθορίζονται από την εντολή. Τέλος, το σύµβολο

@ χρησιµοποιείται όταν ϑέλουµε να προσθέσουµε ένα σχόλιο µετά το τέλος της εντολής.

Το κείµενο που ακολουθεί το @ δεν λαµβάνεται υπ΄ όψιν από τον as και χρησιµοποιείται

από τους προγραµµατιστές για να προσθέτουν σχόλια σε κρίσιµα σηµεία. Η κάθε εντολή

καταλαµβάνει µόνο µια γραµµή, δηλαδή δεν µπορεί να διαχωριστεί το περιεχόµενό της σε

δυο ή περισσότερες γραµµές.

Επεξήγηση

΄Ενα ακόµη σύµβολο για σχόλια είναι το ‘/*. . . */’, όπου το κείµενο ανάµεσα στα ‘/*’ &

’*/’ δεν λαµβάνεται υπ΄ όψιν από το µεταφραστή και µπορεί να εκταθεί σε όσες γραµµές

είναι επιθυµητό. Για παράδειγµα:/∗

All this is a big comment

MOV R2, R2, LSL #4

ADC R2, R1, #15...

∗/

3.2.1 Ετικέτες

Πολλές ϕορές, κατά την εκτέλεση του προγράµµατος είναι επιθυµητή η αλλαγή της

ϱοής εκτέλεσης και η διακλάδωση σε διαφορετικό σηµείο, έτσι ώστε να εκτελεστεί συγ-

κεκριµένο τµήµα του κώδικά µας. Για να γίνει εφικτή η διακλάδωση είναι απαραίτητο να

γνωρίζουµε τη διεύθυνση της εντολής στην οποία ϑα µεταβεί η εκτέλεση. Επιπλέον, κάθε

ϕορά που εκτελείται ένα πρόγραµµα, οι διευθύνσεις στις οποίες ϐρίσκονται οι εντολές εί-

ναι διαφορετικές (εξαρτάται από το λειτουργικό σύστηµα το που ϑα εντοπιστεί σηµείο της

µνήµης που να διαθέτει τον απαιτούµενο χώρο για να ϕορτωθεί το πρόγραµµα), άρα δεν µ-

πορούµε να τις γνωρίζουµε εξ αρχής. Για να λυθούν αυτά τα προβλήµατα, χρησιµοποιούµε

σχετικές διευθύνσεις. Πιο συγκεκριµένα, αν χρειαστεί να εκτελέσουµε µια διακλάδωση σε

διαφορετικό σηµείο, προσθέτουµε (ισοδύναµα αφαιρούµε για άλµατα / διακλαδώσεις προς

τα πίσω) την απόσταση µέχρι εκείνο το σηµείο στον µετρητή προγράµµατος και η ϱοή της

εκτέλεσης µεταβαίνει εκεί. Για να υλοποιήσει ο as τη λειτουργία αυτή χρησιµοποιεί σαν

ενδείξεις τις ετικέτες. Κατά τη συγγραφή του προγράµµατος, όταν ϑέλουµε να εκτελέσουµε

39

Page 46: Εγχειρίδιο Χρήσης ΑΤ91 · 2013-03-30 · Εγχειρίδιο χρήσης at91 1. Πρόλογος ουσία επιλέξαµε τον πιο ισχυρό µικροελεγκτή

Εγχειρίδιο χρήσης AT91 Κεφάλαιο 3.2 - GNU Assembler

µια διακλάδωση σε διαφορετικό σηµείο, χρησιµοποιούµε την ετικέτα που έχουµε αναθέσει

σε εκείνο το σηµείο και ο as υπολογίζει αυτόµατα την απόσταση. Για παράδειγµα:

LOOP:MOV R0, R2 @ R2 − > R0...

CMP R0, #4 @ R0 == 4 ???

BEQ LOOP @ If(R0 == 4) Goto LOOP

Το όνοµα της ετικέτας µπορεί να αποτελείται από τους χαρακτήρες A. . . Z, a. . . z, 0. . . 9,

_ και στο τέλος πρέπει να υπάρχει ο χαρακτήρας ’:’ χωρίς κανένα κενό ενδιάµεσα. Για

παράδειγµα:

LOOP: Σωστό

LOOP : Λάθος (Υπάρχει κενό πριν το :)

_LOOP123bf_DataAREA: Σωστό

@df.#Number926*: Λάθος (Περιέχει µη επιτρεπτούς χαρακτήρες)

Γενικά, τα ονόµατα των ετικετών είναι καλό να περιγράφουν το λόγο για τον οποίο

επιλέξαµε να σηµειώσουµε µε την ετικέτα την εντολή. Για παράδειγµα, αν ϑέλουµε να

υλοποιήσουµε ένα ϐρόχο, τα ονόµατα που ταιριάζουν είναι το LOOP ή το WHILE. Αυτή

η προσέγγιση ϐοηθά στην αναγνωσιµότητα του προγράµµατος, όπως και στην αποφυγή

σφαλµάτων λόγω σύγχυσης ονοµάτων. Η επιλογή µιας ετικέτας µε το όνοµα A3bfd είναι

έγκυρη από πλευρά λεξικολογικών κανόνων, αλλά δεν ϐοηθά στην κατανόηση του λόγου

ύπαρξής της. Χρειάζεται προσοχή στην επιλογή ονόµατος ετικέτας, διότι δεν πρέπει να

είναι ίδιο µε το µνηµονικό όνοµα κάποιας εντολής ή κάποιας ντιρεκτίβας.

3.2.2 Ντιρεκτίβες

Ο as µπορεί να δεχθεί εντολές κατά τη διαδικασία της µετάφρασης, ώστε να εκτελέσει

κάποια συγκεκριµένη λειτουργία ή να ερµηνεύσει τον κώδικα που συναντά από εκείνο το

σηµείο και µετά µε ειδικό τρόπο. Η γενική µορφή τους είναι .<directive> [params], όπου

το <directive> είναι το όνοµα της ντιρεκτίβας και [params] µια λίστα µε παραµέτρους που

εξαρτώνται από κάθε ντιρεκτίβα. Οι εντολές αυτές παρουσιάζονται συνοπτικά στον πίνακα

Ντιρεκτίβες (κεφ. 3.2.2, σελ. 41)17.

17Για µια πλήρη λίστα από τις ντιρεκτίβες του as επισκεφτείτε το www.gnu.org

40

Page 47: Εγχειρίδιο Χρήσης ΑΤ91 · 2013-03-30 · Εγχειρίδιο χρήσης at91 1. Πρόλογος ουσία επιλέξαµε τον πιο ισχυρό µικροελεγκτή

3. Εισαγωγή στην Assembly του ΑΤ91 Εγχειρίδιο χρήσης AT91

Ντιρεκτίβα Περιγραφή

.abort Σταµατά η διαδικασία µετάφρασης.

.align Τοποθετεί τα δεδοµένα σε στοιχισµένες διευθύνσεις.

.arm Σηµατοδοτεί την έναρξη του κώδικα.

.asciz Τοποθετεί strings αλφαριθµητικών.

.byte Τοποθετεί bytes.

.data Τοποθετεί τα επόµενα αριθµητικά δεδοµένα σε συγ-

κεκριµένες ϑέσεις.

.equ Αντιστοιχεί µια τιµή σε ένα σύµβολο.

.global ∆ηλώνει ένα καθολικά προσπελάσιµο σύµβολο.

.hword Τοποθετεί halfwords.

.if Εκτελεί τον κώδικα που το ακολουθεί, αν ισχύει η συνθήκη

του if.

.include Εισάγει τον κώδικα άλλου αρχείο στο τρέχον.

.text Τοποθετεί τον κώδικα που ακολουθεί σε συγκεκριµένη

ϑέση.

.word Τοποθετεί words.

Πίνακας 3.16: Ντιρεκτίβες

.abort

Μόλις συναντίσει αυτή τη ντιρεκτίβα ο as, ϑα σταµατήσει αµέσως τη µετάφραση του

προγράµµατος.

.align

Η µορφή αυτής της ντιρεκτίβας είναι .align <num>, όπου το <num> ορίζει τον

αριθµό, µε ϐάση τον οποίο ϑα γίνει η επιθυµητή στοίχιση. Πολλές ϕορές, ϑέλουµε τα

δεδοµένα να τοποθετούνται σε διευθύνσεις που αποτελούν ακέραια πολλαπλάσια κάποιου

αριθµού (για παράδειγµα, οι τιµές των words τοποθετούνται σε διευθύνσεις που είναι πολ-

λαπλάσια του 4). Με την .align µπορούµε να τοποθετήσουµε τα δεδοµένα που ακολουθούν

µε τέτοιο τρόπο, έτσι ώστε να ξεκινούν από διεύθυνση που είναι πολλαπλάσιο του <num>.

Οι ϑέσεις µνήµης από το τελευταίο δεδοµένο που τοποθετήθηκε, µέχρι την στοιχισµένη

διεύθυνση, δεν χρησιµοποιούνται. Για παράδειγµα, µε την .align 6 ϑα αναγκάσουµε τον

as να τοποθετήσει τα επόµενα δεδοµένα στην διεύθυνση που είναι το πλησιέστερο πολ-

λαπλάσιο του 6 (αν το τελευταίο δεδοµένο τοποθετήθηκε στην 0x8000, το επόµενο ϑα

τοποθετηθεί στην 0x8004 και οι 3 ενδιάµεσες ϑέσεις ϑα µείνουν αχρησιµοποίητες).

41

Page 48: Εγχειρίδιο Χρήσης ΑΤ91 · 2013-03-30 · Εγχειρίδιο χρήσης at91 1. Πρόλογος ουσία επιλέξαµε τον πιο ισχυρό µικροελεγκτή

Εγχειρίδιο χρήσης AT91 Κεφάλαιο 3.2 - GNU Assembler

.arm

Με αυτή την εντολή ενηµερώνουµε τον as ότι πρέπει να παράγει κώδικα 32 bits. Η

ντιρεκτίβα αυτή πρέπει να τοποθετείται στην αρχή του προγράµµατος.

.asciz

Με αυτή την εντολή ενηµερώνουµε τον as πως ακολουθεί ένα αλφαριθµητικό string.

Η γενική µορφή της ντιρεκτίβας είναι .asciz ‘‘<string>’’. Για παράδειγµα, οι παρακάτω

εντολές ορίζουν την ετικέτα lesson ως δείκτη του string ‘‘Assembly Cource’’ και την ετικέτα

CPU ως δείκτη του string ‘‘AT91SAM9261’’:

lesson:

.asciz ‘‘Assembly Cource’’

CPU:

.asciz ‘‘AT91SAM9261’’

.byte

Με αυτή την εντολή ενηµερώνουµε τον as πως ακολουθεί µια σειρά από bytes. Η

γενική µορφή της ντιρεκτίβας είναι .byte [,<value>]*, όπου το <value> είναι µια 8 bit

τιµή. Μπορούµε να ορίσουµε µια σειρά από τιµές, οι οποίες ϑα διαχωρίζονται µεταξύ

τους µε κόµµα και ϑα τοποθετηθούν στην µνήµη σε διαδοχικές ϑέσεις, ξεκινώντας από την

πρώτη τιµή, η οποία ϑα τοποθετηθεί στην µικρότερη διεύθυνση. Προσοχή χρειάζεται στην

καταγραφή των τιµών, διότι όλες πρέπει να ϐρίσκονται στην ίδια γραµµή (αν είναι πολλές,

χρησιµοποιείστε την ντιρεκτίβα πάλι, στην επόµενη γραµµή). Για παράδειγµα, οι εντολές

που ακολουθούν τοποθετούν διαδοχικά στη µνήµη τα παρακάτω bytes:

.byte 0x35, 0x42, 0xaa, 0x68

.byte 0x12, 0x60, 0xba, 0xcd

.data

Με αυτή την εντολή ειδοποιούµε τον as πως τα δεδοµένα που ϑα ακολουθήσουν πρέπει

να τα τοποθετήσει στο τµήµα της µνήµης που δεσµεύει για να τοποθετεί µη-σταθερά δε-

δοµένα18.

.equ

Με την εντολή αυτή ορίζουµε ένα σύµβολο ως ενεργό και του αναθέτουµε µια τιµή. Το

σύµβολο αυτό δεν χρησιµοποιείται στο πρόγραµµά µας (δεν δεσµεύεται χώρος για αυτό),

18Τα µη-σταθερά δεδοµένα είναι αυτά, των οποίων η τιµή αλλάζει κατά την εκτέλεση του προγράµµατος

42

Page 49: Εγχειρίδιο Χρήσης ΑΤ91 · 2013-03-30 · Εγχειρίδιο χρήσης at91 1. Πρόλογος ουσία επιλέξαµε τον πιο ισχυρό µικροελεγκτή

3. Εισαγωγή στην Assembly του ΑΤ91 Εγχειρίδιο χρήσης AT91

αλλά χρησιµοποιείται για να αντιστοιχεί ονόµατα σε τιµές (ψευδώνυµα). Η µορφή του εί-

ναι .equ <symbol>, <value>, όπου <symbol> είναι το όνοµα και <value> η τιµή στην

οποία αντιστοιχίζεται. Για παράδειγµα, µε την εντολή .equ FunnyVal, #0x12345678,

αντιστοιχούµε το όνοµα FunnyVal στην τιµή 0x12345678 και µπορούµε να χρησιµοποιή-

σουµε το FunnyVal σαν να χρησιµοποιούσαµε τον ίδιο τον αριθµό. Χρειάζεται προσοχή

ώστε να µην χρησιµοποιήσουµε µνηµονικό όνοµα εντολής ή ετικέτας στο όνοµα του συµ-

ϐόλου, διότι ο as αν ϐρει µια εντολή ή ετικέτα µε όνοµα ίδιο µε του συµβόλου, ϑα το

ερµηνεύσει σαν την τιµή που έχουµε αντιστοιχίσει στο σύµβολο.

.global

Η µορφή του είναι .global <label>, όπου το <label> είναι η ετικέτα που ϑέλουµε να

ορίσουµε σαν καθολική. Με αυτή την εντολή ειδοποιούµε τον as πως πρέπει να εισάγει

την ετικέτα που ϑέλουµε, στη λίστα των συµβόλων που µπορούν να προσπελαστούν από

άλλα προγράµµατα. ΄Οταν ένας µεταφραστής παράγει το εκτελέσιµο πρόγραµµα, συνήθως

δεν το κάνει σε ένα ϐήµα. Σαν πρώτο ϐήµα, παράγει ένα ενδιάµεσο αρχείο που περιέχει

τον εκτελέσιµο κώδικά µας και τις µεταβλητές µας (το ενδιάµεσο αρχείο ονοµάζεται object

file). Αν το πρόγραµµά µας χρησιµοποιεί κώδικα από πολλά αρχεία, τότε στο πρώτο ϐήµα

ϑα γίνει η παραγωγή όλων των object files (ένα για κάθε πηγαίο αρχείο κώδικα). Στο

δεύτερο ϐήµα (γνωστό ως διασύνδεση - linking), ϑα αναλάβει να ελέγξει ποιες συναρτήσεις

καλούνται ανάµεσα στα αρχεία και ϑα συµπεριλάβει µόνο αυτές στο τελικό εκτελέσιµο

αρχείο (αν κάποια συνάρτηση δεν καλείται πουθενά, στο ενδιάµεσο αρχείο ϑα υπάρχει ο

εκτελέσιµος κώδικάς της, αλλά στο τελικό δεν ϑα συµπεριληφθεί). Επίσης ϑα ανακληθούν

σε αυτό το στάδιο οι απαιτούµενες ϐασικές συναρτήσεις από τις ϐιβλιοθήκες object αρχείων

της γλώσσας. Για να µπορέσει να ϐρει τις συναρτήσεις που παρέχει κάθε ενδιάµεσο αρχείο,

εξετάζει τη λίστα καθολικών συµβόλων.

.hword

Η εντολή αυτή έχει την ίδια ακριβώς λειτουργία µε την .byte, µόνο που τώρα µπορούµε

να τοποθετούµε στη µνήµη τιµές εύρους 16 bit. Για παράδειγµα, οι τιµές που εισήχθησαν

µε την .byte ϑα µπορούσαν να εισαχθούν σαν :

.hword 0x4235, 0x68aa

.hword 0x6012, 0xcdba

Παρατηρείστε πως η αναγραφή των αριθµών έχει ϕαινοµενικά αλλάξει τη σειρά των bytes.

Στην πραγµατικότητα, η αλλαγή αυτή είναι επιβεβληµένη, διότι το περισσότερο σηµαντικό

byte ενός halfword τοποθετείται σε µεγαλύτερη διεύθυνση απ’ότι το λιγότερο σηµαντικό.

43

Page 50: Εγχειρίδιο Χρήσης ΑΤ91 · 2013-03-30 · Εγχειρίδιο χρήσης at91 1. Πρόλογος ουσία επιλέξαµε τον πιο ισχυρό µικροελεγκτή

Εγχειρίδιο χρήσης AT91 Κεφάλαιο 3.2 - GNU Assembler

.if

Την εντολή .if τη χρησιµοποιούµε για να ελέγξουµε την τιµή ενός συµβόλου που έχει

δηλωθεί µε την εντολή .equ. ΄Οπως και η .equ, δεν παράγει εκτελέσιµο κώδικα, αλλά

µπορεί να περικλείει κώδικα και να επιτρέπει στον as να τον συµπεριλάβει, αν η συνθήκη

του ικανοποιείται. Για παράδειγµα, ο παρακάτω κώδικας :

.equ DEBUG, 1

...

.if DEBUG

MOV R0, #0x30

.else

MOV R0, #0x10

.endif

επειδή έχει αναθέσει την τιµή 1 στο σύµβολο DEBUG ϑα ικανοποιήσει την συνθήκη του .if

και ο as ϑα συµπεριλάβει την εντολή MOV R0, #0x30. Αν δεν ϑέλαµε να ενεργοποιήσουµε

αυτό το χαρακτηριστικό στο πρόγραµµά µας, ο as ϑα συµπεριλάµβανε την εντολή MOV

R0, #0x10. Η γενική µορφή της εντολή είναι :

.if <expression>

...

.else

...

.endif

Το .else δεν είναι απαραίτητο να υπάρχει και το προσθέτουµε αν ϑέλουµε να χρησι-

µοποιήσουµε εναλλακτικό κώδικα, στην περίπτωση που η συνθήκη δεν ισχύει. Το .endif

σηµατοδοτεί το τέλος της περιοχής που ελέγχεται από την εντολή .if και είναι απαραίτητο

να υπάρχει. Το <expression> είναι µια αριθµητική έκφραση, η οποία πρέπει να είναι

ϑετική για να ισχύει (αν είναι 0 δεν ισχύει).

.include

Με αυτή την εντολή συµπεριλαµβάνουµε στον κώδικά µας τον κώδικα ενός άλλου

πηγαίου αρχείου assembly . Η µορφή της εντολής είναι .include ‘‘<file>’’, όπου το

‘‘<file>’’ είναι το όνοµα του αρχείου που ϑέλουµε να συµπεριλάβουµε. Για παράδειγµα,

αν στο αρχείο first.s υπάρχει ο κώδικας :

.data

ByteArray:

.word 0xcafebaba, 0xdeadbeef, . . ....

44

Page 51: Εγχειρίδιο Χρήσης ΑΤ91 · 2013-03-30 · Εγχειρίδιο χρήσης at91 1. Πρόλογος ουσία επιλέξαµε τον πιο ισχυρό µικροελεγκτή

3. Εισαγωγή στην Assembly του ΑΤ91 Εγχειρίδιο χρήσης AT91

και στο αρχείο second.s υπάρχει ο κώδικας :

.include ‘‘first.c’’...

LDR R0, =ByteArray @ addr(ByteArray) − > R0...

ο as ϑα µεταφράσει το αρχείο second.s σαν να συναντούσε τον κώδικα :

.data

ByteArray:

.word 0xcafebaba, 0xdeadbeef, . . ....

LDR R0, =ByteArray @ addr(ByteArray) − > R0...

.text

Με αυτή την εντολή ειδοποιούµε τον as πως από εκείνο το σηµείο και µετά, ϑα ακολου-

ϑήσει εκτελέσιµος κώδικας. Για παράδειγµα, στις παρακάτω γραµµές εναλλάσονται οι

περιοχές δεδοµένων και κώδικα :

.text

...

LDR R0, =ByteArray @ addr(ByteArray) − > R0...

.data

ByteArray:

.byte 0x35, 0xaa, 0x22, . . .

...

.text

LDR R1, [R0, #0x01] @ 0xaa − > R1...

.word

Η εντολή αυτή έχει την ίδια ακριβώς λειτουργία µε την .byte, µόνο που τώρα µπορούµε

να τοποθετούµε στη µνήµη τιµές εύρους 32 bit. Για παράδειγµα, οι τιµές που εισήχθησαν

µε την .byte ϑα µπορούσαν να εισαχθούν σαν :

45

Page 52: Εγχειρίδιο Χρήσης ΑΤ91 · 2013-03-30 · Εγχειρίδιο χρήσης at91 1. Πρόλογος ουσία επιλέξαµε τον πιο ισχυρό µικροελεγκτή

Εγχειρίδιο χρήσης AT91 Κεφάλαιο 3.3 - Παραδείγµατα

.word 0x68aa4235

.word 0xcdba6012

3.3 Παραδείγµατα

Ο καλύτερος τρόπος για την εξοικείωση µε τη γλώσσα Assembly και την σωστή εκµά-

ϑησή της είναι µέσω της κατανόησης προγραµµάτων και ανάπτυξης νέων. Γι’αυτό και σε

αυτή την ενότητα ϑα παραθέσουµε µια σειρά από προγράµµατα Assembly, ϑα εξηγήσουµε

τη λογική που οδήγησε στον τρόπο ανάπτυξής τους και το πως συνδυάζονται µε τις εντολές

και την αρχιτεκτονική του επεξεργαστή µας.

3.3.1 Μεταφορά δεδοµένων εύρους 32­bit

Μεταφορά δεδοµένων εύρους 32­bit

1 .arm

2 .text

3 .global main

4

5 main:

6 STMDB R13!, R0­R12 @Αποθηκεύουµε τους καταχωρητές που τυχόν ϑα χρησιµοποιήσουµε στο

σωρό του συστήµατος

7 LDR R0, =Value @Εισάγουµε στον R0 τη διεύθυνση που σηµατοδοτεί η ετικέτα Value

8 LDR R1, [R0] @Εισάγουµε στον R1 την τιµή που ϐρίσκεται στη διεύθυνση R0

9

10 LDR R0, =Result @Εισάγουµε στον καταχωρητή R0 τη διεύθυνση της ϑέσης µνήµης όπου

ϑα αποθηκεύσουµε το αποτέλεσµα

11 STR R1, [R0] @Αποθηκεύουµε την τιµή του R1 στη ϑέση µνήµης που περιέχει ο R0

12 LDMIA R13!, R0­R12 @Επαναφέρουµε τις αρχικές τιµές στους καταχωρητές που τυχόν χρησι-

µοποιήσαµε

13 MOV PC, R14 @Μεταφέρουµε τη ϱοή της εκτέλεσης στο σηµείο όπου κλήθηκε η

συνάρτηση main. Αυτό το σηµείο ανήκει στο λειτουργικό σύστηµα και

είναι απαραίτητο να επιστρέψουµε εκεί, ώστε να συνεχίσει η εκτέλεση

των υπόλοιπων προγραµµάτων, αλλά και για να µπορούµε να εισάγουµε

εντολές στο Linux shell

14

15 .data @Ορίζουµε ότι τα παρακάτω δεδοµένα ϑα τοποθετηθούν στην περιοχή

"data" που ορίζει αυτόµατα το λειτουργικό σύστηµα, για τα δεδοµένα των

προγραµµάτων

16 Value:

17 .word 0xCAFEBABA @Το δεδοµένο 0xCAFEBABA τοποθετείται σε ϑέση µνήµης η οποία

σηµειώνεται µε το όνοµα Value

18 Result:

19 .word 0 @Το αποτέλεσµα ϑα τοποθετηθεί στη ϑέση µνήµης Value+4 ή Result

46

Page 53: Εγχειρίδιο Χρήσης ΑΤ91 · 2013-03-30 · Εγχειρίδιο χρήσης at91 1. Πρόλογος ουσία επιλέξαµε τον πιο ισχυρό µικροελεγκτή

3. Εισαγωγή στην Assembly του ΑΤ91 Εγχειρίδιο χρήσης AT91

Στο παραπάνω πρόγραµµα εκτελέσαµε τη µεταφορά των 32 bit δεδοµένων από τη

ϑέση µνήµης Value και στη ϑέση µνήµης Result. Το σύµβολο ‘‘=’’ που ϐρίσκεται πριν

από τις ϑέσεις µνήµης χρησιµοποιείται για να αποθηκευτεί στον καταχωρητή η διεύθυνση

που σηµατοδοτεί η ετικέτα Value ή η Result. Παρατηρείστε επίσης την αποθήκευση των

καταχωρητών στο σωρό του συστήµατος (ελέγχεται από τον R13) πριν αρχίσει η εκτέλεση

του προγράµµατός µας και την ανάκτησή τους, µε την ολοκλήρωση του προγράµµατος.

Επίσης, σηµειώστε πως είναι απαραίτητο να ονοµάσουµε την αρχική συνάρτησή µας (µε

χρήση ετικέτας) main και να την δηλώσουµε σαν .global, ώστε να την εντοπίσει το σύστηµα

όταν προσπαθήσει να εκτελέσει το πρόγραµµά µας19.

3.3.2 ΄Αθροιση αριθµών εύρους 32­bit

΄Αθροιση αριθµών εύρους 32­bit

1 .arm

2 .text

3 .global main

4

5 main:

6 STMDB R13!, R0­R2 @Αποθηκεύουµε τους καταχωρητές που ϑα χρησιµοποιήσουµε

7 LDR R0, =Values @Εισάγουµε στον R0 τη διεύθυνση που σηµατοδοτεί η ετικέτα

Values

8 LDR R1, [R0, #0] @Εισάγουµε στον R1 το περιεχόµενο της µνήµης στο οποίο

δείχνει ο R0

9 LDR R2, [R0, #4] @Εισάγουµε στον R2 το περιεχόµενο της µνήµης που ϐρίσκεται

4 ϑέσεις µετά από αυτή που δείχνει ο R0

10 ADD R2, R2, R1 @Προσθέτουµε το περιεχόµενο του R2 µε το περιεχόµενο του

R1 και το αποθηκεύουµε στον R2

11

12 LDR R0, =Result @Εισάγουµε στον R0 τη διεύθυνση που σηµατοδοτεί η ετικέτα

Result

13 STR R2, [R0] @Αποθηκεύουµε την τιµή του R2 στη ϑέση µνήµης που περιέχει

ο R0

14 LDMIA R13!, R0­R2 @Επαναφέρουµε τις αρχικές τιµές στους καταχωρητές που

χρησιµοποιήσαµε

15 MOV PC, R14 @Μεταφέρουµε τη ϱοή της εκτέλεσης στο σηµείο όπου κλήθηκε

η υπορουτίνα main

16

17 .data @Ορίζουµε ότι τα παρακάτω δεδοµένα ϑα τοποθετηθούν στην

περιοχή "Data" που ορίζει άυτόµατα το λειτουργικό σύστηµα,

για τα δεδοµένα των προγραµµάτων

18 Values: @Τα παρακάτω δεδοµένα τοποθετούνται σε µνήµη που

σηµειώνεται από την ετικέτα Values

19Θεωρείστε πως το όνοµα main είναι προσυµφωνηµένο στα GNU εργαλεία.

47

Page 54: Εγχειρίδιο Χρήσης ΑΤ91 · 2013-03-30 · Εγχειρίδιο χρήσης at91 1. Πρόλογος ουσία επιλέξαµε τον πιο ισχυρό µικροελεγκτή

Εγχειρίδιο χρήσης AT91 Κεφάλαιο 3.3 - Παραδείγµατα

19 .word 0xFFF00000

20 .word 0xCDEF

21 Result: @Τα παρακάτω δεδοµένα τοποθετούνται σε µνήµη που

σηµειώνεται από την ετικέτα Result

22 .word 0

Στο πρόγραµµα αυτό υλοποιήσαµε άθροιση ανάµεσα στα περιεχόµενα των ϑέσεων µ-

νήµης Values και (Values+4). Η διαδικασία ξεκινά µε την αντιγραφή της διεύθυνσης όπου

υπάρχει ο πρώτος αριθµός στον καταχωρητή R0. Αυτό το ϐήµα είναι απαραίτητο, διότι

χωρίς τη διεύθυνση δε µπορούµε να προσπελάσουµε το περιεχόµενο αυτής της ϑέσης µ-

νήµης µε άλλο τρόπο. Από τη στιγµή που γνωρίζουµε την ϑέση µνήµης στην οποία είναι

τοποθετηµένος ο αριθµός, καλούµε την εντολή µεταφοράς του δεδοµένου στον καταχωρητή

R1. Το δεύτερο ϐήµα είναι εξίσου απαραίτητο, διότι η αρχιτεκτονική του επεξεργαστή µας

δεν επιτρέπει την εκτέλεση πράξεων σε ϑέσεις µνήµης εκτός του συνόλου καταχωρητών. Τα

δυο ϐήµατα αυτά ϑα τα ακολουθούµε πάντα, όταν πρόκειται για µεταφορά δεδοµένων από

τη µνήµη προς τους καταχωρητές. Στη συνέχεια πρέπει να υπολογίσουµε τη διεύθυνση του

δεύτερου αριθµού, για τον οποίο το µόνο που γνωρίζουµε είναι πως ϐρίσκεται 4 bytes µετά

από τον προηγούµενο20. Γιάυτό και διευθυνσιοδοτούµε τη ϑέση µνήµης που ϐρίσκεται 4

bytes µετά από τη διεύθυνση που είχαµε αποθηκεύσει στον R0. Η πράξη της πρόσθεσης

χρησιµοποιεί τα δεδοµένα που ϐρίσκονται στους R1, R2 και το άθροισµα το αποθηκεύει

στον R2. Ο στόχος µας είναι να αποθηκεύσουµε το περιεχόµενο του R2 σε συγκεκριµένη

ϑέση µνήµης, η οποία είναι η Result. Επαναλαµβάνουµε τα ϐήµατα που κάναµε για

να ϕέρουµε σε ένα καταχωρητή τη διεύθυνση µιας ϑέσης µνήµης και καταχωρούµε στον

R0 τη διεύθυνση της Result. Με έµµεση αναφορά στη µνήµη (δηλαδή µε χρήση του R0

ως δείκτη) αποθηκεύουµε εκεί τα δεδοµένα που υπάρχουν στον R2. Παρατηρείστε πως

η ϑέση µνήµης Result ϑα µπορούσε να αναφερθεί και σαν (Values+8) αν δε ϑέλαµε να

χρησιµοποιήσουµε την επιπλέον ετικέτα Result.

3.3.3 Σωρός

Σωρός

1 .arm

2 .text

3 .global main

4 nik

5 main:

6 STMDB R13!, R0­R12, R14 @Αποθηκεύουµε τους καταχωρητές που ϑα χρησιµοποιήσουµε

7

20Θυµηθείτε πως οι ϑέσεις στις οποίες τοποθετούνται οι µεταβλητές στη µνήµη δεν είναι προκαθορισµένες

και το λειτουργικό σύστηµα επιλέγει κάθε ϕορά την περιοχή που ϑα τις τοποθετήσει.

48

Page 55: Εγχειρίδιο Χρήσης ΑΤ91 · 2013-03-30 · Εγχειρίδιο χρήσης at91 1. Πρόλογος ουσία επιλέξαµε τον πιο ισχυρό µικροελεγκτή

3. Εισαγωγή στην Assembly του ΑΤ91 Εγχειρίδιο χρήσης AT91

8 LDR R12, =Start @Εισάγουµε στον R12 τη διεύθυνση που σηµατοδοτεί η ετικέτα

Start

9 ADD R12, R12, 0x2C @Προσθέτουµε στην αρχική διεύθυνση του σωρού την τιµή 0x2c

= 4410. Με αυτό τον τρόπο ο R12 περιέχει τη διεύθυνση του

12ου στοιχείου της λίστας

10

11 MOV R0, #4 @Εισάγουµε την τιµή 4 στον R0

12 BL Push @Καλούµε την υπορουτίνα Push, έχοντας στον R0 την τιµή 4

13

14 MOV R0, #2 @Εισάγουµε την τιµή 2 στον R0

15 BL Pop @Καλούµε την υπορουτίνα Pop, έχοντας στον R0 την τιµή 2

16

17 MOV R0, #0xF @Εισάγουµε την τιµή 15 στον R0

18 BL Push @Καλούµε την υπορουτίνα Push, έχοντας στον R0 την τιµή 15

19

20 MOV R0, #0xF @Εισάγουµε πάλι την τιµή 15 στον R0

21 BL Pop @Καλούµε την υπορουτίνα Pop, έχοντας στον R0 την τιµή 15

22

23 LDMIA R13!, R0­R12, PC @Επαναφέρουµε τις αρχικές τιµές στους καταχωρητές που

χρησιµοποιήσαµε και ταυτόχρονα εισάγουµε στον PC την τιµή

του R14, κάτι που ϑα µεταφέρει τη ϱοή εκτέλεσης του προγράµ-

µατος στη ϑέση µνήµης απ’οπου κλήθηκε η συνάρτηση main

24

25 /*——– PUSH ———–*/

26 push: @Ορίζουµε αυτή τη ϑέση µνήµης µε το όνοµα Push. Κάθε

αναφορά σε αυτό το όνοµα ϑα αναφέρεται σε αυτή τη ϑέση µ-

νήµης

27 STMDB R13!, R4 @Αποθηκεύουµε τους καταχωρητές που ϑα χρησιµοποιήσουµε

28 LDR R4, =Start @Εισάγουµε στον R4 τη διεύθυνση που σηµατοδοτεί η ετικέτα

Start

29

30 PushLoop: @Ορίζουµε αυτή τη ϑέση µνήµης µε το όνοµα PushLoop

31 CMP R4, R12 @Συγκρίνουµε το περιεχόµενο του R4 µε το περιεχόµενο του

R12, µε την πράξη της αφαίρεσης, R4­R12

32 BHI PushOvr @Αν R4 > R12 τότε συνεχίζουµε την εκτέλεση από τη διεύθυνση

που είναι σηµειωµένη µε την ετικέτα PushOvr

33 STR R0, [R12] @Αποθηκεύουµε στη ϑέση µνήµης που περιέχεται στον R12 την

τιµή του R0

34 SUB R12, R12, #4 @Αφαιρούµε 4 από την τιµή του R12

35 SUBS R0, R0, #1 @Αφαιρούµε 1 από την τιµή του R0 και ενηµερώνουµε τον

καταχωρητή κατάστασης για το είδος του αποτελέσµατος (µη-

δενικό, αρνητικο, κλπ)

36 BHI PushLoop @Αν η προηγούµενη αφαίρεση δεν παρήγαγε αρνητικό ή µη-

δενικό υπόλοιπο, συνεχίζουµε την εκτέλεση από τη διεύθυνση

που είναι σηµειωµένη από την ετικέτα PushLoop

37

49

Page 56: Εγχειρίδιο Χρήσης ΑΤ91 · 2013-03-30 · Εγχειρίδιο χρήσης at91 1. Πρόλογος ουσία επιλέξαµε τον πιο ισχυρό µικροελεγκτή

Εγχειρίδιο χρήσης AT91 Κεφάλαιο 3.3 - Παραδείγµατα

38 B PushEnd @Εκτελούµε µετάβαση της ϱοής του κώδικα στη ϑέση µνήµης

που έχει σηµειωθεί µε την ετικέτα PushEnd

39 PushOvr: @Ορίζουµε αυτή τη ϑέση µνήµης µε το όνοµα PushOvr.

40 MVN R0, #0 @Αν ϕτάσουµε σε αυτό το σηµείο, σηµαίνει πως έχει σηµειωθεί

σφάλµα και τοποθετούµε στον R0 την τιµή 0xFFFFFFFF για να

ειδοποιήσουµε την συνάρτηση που µας κάλεσε

41

42 PushEnd: @Ορίζουµε αυτή τη ϑέση µνήµης µε το όνοµα PushEnd.

43 LDMIA R13!, R4 @Επαναφέρουµε τις αρχικές τιµές στους καταχωρητές που

χρησιµοποιήσαµε

44 MOV PC, R14 @Μεταφέρουµε τη ϱοή της εκτέλεσης στο σηµείο όπου κλήθηκε

η υπορουτίνα push

45

46 /*——– POP ————*/

47 Pop:

48 STMDB R13!, R4,R5 @Αποθηκεύουµε τους καταχωρητές που ϑα χρησιµοποιήσουµε

49 LDR R4, =Start @Εισάγουµε στον R0 τη διεύθυνση που σηµατοδοτεί η ετικέτα

Start

50 ADD R4, R4, #0x02C @Προσθέτουµε στον R4 την τιµή 4

51

52 PopLoop: @Ορίζουµε αυτή τη ϑέση µνήµης µε το όνοµα PopLoop

53 CMP R12, R4 @Συγκρίνουµε τον R12 µε τον R4, µε την πράξη της αφαίρεσης

R12­R4

54 BCS PopUnd @Αν R12 >= R4 εκτελούµε άλµα στην διεύθυνση που

σηµειώνεται από την ετικέτα PopUnd

55 ADD R12, R12, #4 @Προσθέτουµε στον R12 την τιµή 4

56 LDR R5, [R12] @Εισάγουµε στον R5 την τιµή της διεύθυνσης µνήµης, στην

οποία δείχνει ο R12

57 SUBS R0, R0, #1 @Ελλατώνουµε κατά 1 τον R0

58 BHI PopLoop @Αν ο R0 είναι µεγαλύτερος από 0 εκτελούµε άλµα στη διεύ-

ϑυνση µνήµης που σηµειώνεται από την ετικέτα PopLoop

59

60 B PopEnd @Εκτελούµε άλµα χωρίς συνθήκη στη διεύθυνση µνήµης που

σηµειώνεται από την ετικέτα PopLoop

61 PopUnd: @Ορίζουµε αυτή τη ϑέση µνήµης µε το όνοµα PopUnd

62 MVN R0, #0 @Εισάγουµε στον R0 την τιµή 0xFFFFFFFF

63

64 PopEnd: @Ορίζουµε αυτή τη ϑέση µνήµης µε το όνοµα PopEnd

65 LDMIA R13!, R4,R5 @Επαναφέρουµε τις αρχικές τιµές στους καταχωρητές που

χρησιµοποιήσαµε

66 MOV PC, R14 @Μεταφέρουµε τη ϱοή της εκτέλεσης στο σηµείο όπου κλήθηκε

η υπορουτίνα pop

67

68 .data @Ορίζουµε ότι τα παρακάτω δεδοµένα ϑα τοποθετηθούν στην

περιοχή "Data" που ορίζει άυτόµατα το λειτουργικό σύστηµα,

για τα δεδοµένα των προγραµµάτων

50

Page 57: Εγχειρίδιο Χρήσης ΑΤ91 · 2013-03-30 · Εγχειρίδιο χρήσης at91 1. Πρόλογος ουσία επιλέξαµε τον πιο ισχυρό µικροελεγκτή

3. Εισαγωγή στην Assembly του ΑΤ91 Εγχειρίδιο χρήσης AT91

69 Start: @Τα παρακάτω δεδοµένα τοποθετούνται σε µνήµη που

σηµειώνεται από την ετικέτα Start

70 .word 0,0,0,0,0,0

71 .word 0,0,0,0,0,0

Στο AT91 υπάρχει ήδη ο σωρός του συστήµατος, τον οποίο έχουµε ήδη χρησιµοποιήσει.

Σε αυτό το παράδειγµα δηµιουργούµε ένα νέο δικό µας σωρό. Θυµηθείτε ότι ο σωρός είναι

ένα τµήµα της µνήµης που χρησιµοποιείται για να αποθηκεύει προσωρινά δεδοµένα. Η

λογική που χαρακτηρίζει τη λειτουργία του ϐασίζεται στο ότι δεν µπορούν να προσπελασ-

τούν άµεσα τα δεδοµένα που έχουν αποθηκευτεί, εκτός του πρώτου ή του τελευταίου. Ο

διαχωρισµός αυτός οδηγεί σε δυο κατηγορίες σωρού, την Last­In First­Out (LIFO) και την

First­In First­Out (FIFO). Ο σωρός που υλοποιείται στο παράδειγµά µας είναι LIFO και λει-

τουργία του εµφανίζεται στην εικόνα LIFO (κεφ. 3.9, σελ. 51). ΄Ενα από τα χαρακτηριστικά

της LIFO είναι ότι ξεκινά από µια ϑέση µνήµης και οι εισαγωγές των δεδοµένων γίνονται

σε µικρότερες ϑέσεις µνήµης και όχι σε µεγαλύτερες. ∆ηλαδή, αν η αρχή του σωρού είναι

στη ϑέση 0x8000, το πρώτο στοιχείο ϑα αποθηκευτεί εκεί, το δεύτερο ϑα αποθηκευτεί στην

0x7FFC κλπ.

Σχήµα 3.9: LIFO

Στο δικό µας σωρό ο R12 ϑα παίζει το ϱόλο του δείκτη σωρού, ενώ ο R4 κρατά τα όρια

του σωρού για να αποτρέψουµε περιπτώσεις υπερχείλισης προς τα πάνω και προς τα κάτω.

Ο κώδικάς µας παρέχει τις συναρτήσεις push και pop για αποθήκευση και ανάκτηση από

το σωρό. Ο αριθµός των στοιχείων που ϑα τοποθετηθούν ή ϑα ανακτηθούν από το σωρό εί-

ναι µια παράµετρος αυτών των συναρτήσεων την οποία την περνάµε µέσω του καταχωρητή

R0. Πιο συγκεκριµένα, η συνάρτηση push, περιµένει να ϐρει στον R0 όχι µόνο το πόσα

στοιχεία ϑα εισάγει στο σωρό, αλλά έµµεσα η τιµή του R0 καθορίζει και τη τιµή τους. Τα

στοιχεία που εισάγονται ξεκινούν από τον αριθµό στοιχείων εισαγωγής και καταλήγουν στο

1 (πχ. αν εισάγουµε 3 στοιχεία ϑα εισαχθούν οι αριθµοί 3,2,1). ΄Οταν ξεκινά η εκτέλεση

της push γίνεται έλεγχος για το αν ο σωρός είναι πλήρης, µε τη σύγκριση ανάµεσα στο

κατώτερο όριο και τον δικό µας stack pointer, ο οποίος ϐρίσκεται είναι ο καταχωρητής R12

51

Page 58: Εγχειρίδιο Χρήσης ΑΤ91 · 2013-03-30 · Εγχειρίδιο χρήσης at91 1. Πρόλογος ουσία επιλέξαµε τον πιο ισχυρό µικροελεγκτή

Εγχειρίδιο χρήσης AT91 Κεφάλαιο 3.3 - Παραδείγµατα

και έχει αρχική τιµή το ανώτερο όριο του σωρού. Γίνεται η αποθήκευση του στοιχείου και

ο stack pointer µειώνεται κατά 4, διότι αποθηκεύουµε words. Επιπλεόν, µειώνουµε και

τον R0, ο οποίος όταν ϕτάσει στο 0 ϑα σηµατοδοτήσει το τέλος της διαδικασίας εισαγωγής.

Παρατηρείστε πως πρώτα αποθηκεύουµε τον αριθµό µας και µετά µειώνουµε τον stack

pointer, κάτι που σηµαίνει πως ο stack pointer ϑα δείχνει πάντα στην επόµενη ελεύθερη

ϑέση του σωρού και η επόµενη εισαγωγή ϑα αποθηκεύσει το στοιχείο της σε εκείνη τη

ϑέση. ΄Οταν ϕτάσουµε να εισάγουµε αριθµό και στην τελευταία ϑέση του σωρού, ο stack

pointer ϑα δείξει σε ϑέση µνήµης εκτός της περιοχής του σωρού, κάτι που ϑα ανιχνευτεί

µε τη σύγκριση µε το κατώτερο όριο. Σε αυτή την περίπτωση τοποθετούµε την τιµή 0xffffffff

στον R0, για να ειδοποιήσουµε το χρήστη πως ο σωρός είναι πλήρης.

Η αντίστροφη διαδικασία της εισαγωγής γίνεται µε τη χρήση της συνάρτησης pop, η

οποία αυξάνει τον stack pointer και επιστρέφει την τιµή που υπάρχει σε εκείνη τη ϑέση

µνήµης. Παρατηρείστε πως η διαδικασία λήψης των τιµών εκτελεί τα ϐήµατα αλλαγής του

stack pointer και πρόσβασης της µνήµης µε αντίθετη σειρά. Η σύγκριση που γίνεται τώρα

είναι ανάµεσα στον stack pointer και το ανώτερο όριο του σωρού, οπότε αν ο stack pointer

γίνει ίσος µε αυτό ειδοποιούµε τον χρήστη πως ο σωρός είναι άδειος, γράφοντας την τιµή

0xffffffff στον R0.

Με το παράδειγµά µας δείξαµε τον τρόπο λειτουργίας ενός σωρού LIFO. Υπενθυµίζεται

ότι το σύστηµα ήδη διατηρεί ένα τέτοιο σωρό, χρησιµοποιώντας τον R13 σα stack pointer

ενώ παράλληλα παρέχει τις εντολές µεταφοράς block κατ΄ αναλογία των push & pop.

Κάθε ϕορά δηλαδή που χρησιµοποιούµε την STMDB εισάγουµε καταχωρητές στο σωρό

του συστήµατος και κάθε ϕορά που χρησιµοποιούµε την STMIA αποθηκεύουµε στους

καταχωρητές τις τιµές που ϐρίσκουµε στο σωρό του συστήµατος(στη διεύθυνση που δείχνει

ο R13).

3.3.4 Σύγκριση αριθµών εύρους 8 bit

Σύγκριση αριθµών χωρίς ϐρόγχους επανάληψης

72 .arm

73 .text

74 .global main

75

76 main:

77 STMDB R13!, R0­R12 @Αποθηκεύουµε τους καταχωρητές που ϑα χρησιµοποιήσουµε

78 LDR R0, =Values @Εισάγουµε στον R0 τη διεύθυνση που σηµατοδοτεί η ετικέτα

Values

52

Page 59: Εγχειρίδιο Χρήσης ΑΤ91 · 2013-03-30 · Εγχειρίδιο χρήσης at91 1. Πρόλογος ουσία επιλέξαµε τον πιο ισχυρό µικροελεγκτή

3. Εισαγωγή στην Assembly του ΑΤ91 Εγχειρίδιο χρήσης AT91

79 LDRB R1, [R0, #0] @Εισάγουµε στον R1 το περιεχόµενο της µνήµης στο οποίο

δείχνει ο R0. Προσέξτε το επίθεµα (LDR)B που υποδεικνύει

προσπέλαση 1 byte

80 LDRB R2, [R0, #1] @Εισάγουµε στον R2 το περιεχόµενο της επόµενης ϑέσης µ-

νήµης από αυτή στην οποία δείχνει ο R0

81

82 CMP R2, R1 @Συγκρίνουµε τον R2 µε τον R1, µε πράξη εικονικής αφαίρεσης

R2­R1

83 MOVHI R1, R2 @Αν ο R2 > R1 τότε αποθηκεύουµε στον R1 την τιµή του R2

84

85 LDRB R2, [R0, #2] @Εισάγουµε στον R2 το περιεχόµενο της µεθεπόµενης ϑέσης

µνήµης από αυτή στην οποία δείχνει ο R0

86 CMP R2, R1 @Συγκρίνουµε τον R2 µε τον R1, µε πράξη εικονικής αφαίρεσης

R2­R1

87 MOVHI R1, R2 @Αν ο R2 > R1 τότε αποθηκεύουµε στον R1 την τιµή του R2

88

89 LDRB R2, [R0, #3] @Εισάγουµε στον R2 το περιεχόµενο της ϑέσης µνήµης που

ϐρίσκεται 3 ϑέσεις µετά από αυτή στην οποία δείχνει ο R0

90 CMP R2, R1 @Συγκρίνουµε τον R2 µε τον R1, µε πράξη εικονικής αφαίρεσης

R2­R1

91 MOVHI R1, R2 @Αν ο R2 > R1 τότε αποθηκεύουµε στον R1 την τιµή του R2

92

93 LDRB R2, [R0, #4] @Εισάγουµε στον R2 το περιεχόµενο της ϑέσης µνήµης που

ϐρίσκεται 4 ϑέσεις µετά από αυτή στην οποία δείχνει ο R0

94 CMP R2, R1 @Συγκρίνουµε τον R2 µε τον R1, µε πράξη εικονικής αφαίρεσης

R2­R1

95 MOVHI R1, R2 @Αν ο R2 > R1 τότε αποθηκεύουµε στον R1 την τιµή του R2

96

97 LDR R0, =Result @Εισάγουµε στον R0 τη διεύθυνση που σηµατοδοτεί η ετικέτα

Result

98 STRH R1, [R0] @Αποθηκεύουµε την τιµή του R1 στη ϑέση µνήµης που δείχνει

ο R0 σαν halfword

99 LDMIA R13!, R0­R12 @Επαναφέρουµε τις αρχικές τιµές στους καταχωρητές που

χρησιµοποιήσαµε

100 MOV PC, R14 @Μεταφέρουµε τη ϱοή της εκτέλεσης στο σηµείο όπου κλήθηκε

η υπορουτίνα main

101

102 .data @Ορίζουµε ότι τα παρακάτω δεδοµένα ϑα τοποθετηθούν στην

περιοχή "data" που ορίζει αυτόµατα το λειτουργικό σύστηµα, για

τα δεδοµένα των προγραµµάτων

103 Values: @Τα παρακάτω δεδοµένα τοποθετούνται σε µνήµη που

σηµειώνεται από την ετικέτα Values

104 .byte 0x10, 0x15, 0x20

105 .byte 0x25, 0x30

106

53

Page 60: Εγχειρίδιο Χρήσης ΑΤ91 · 2013-03-30 · Εγχειρίδιο χρήσης at91 1. Πρόλογος ουσία επιλέξαµε τον πιο ισχυρό µικροελεγκτή

Εγχειρίδιο χρήσης AT91 Κεφάλαιο 3.3 - Παραδείγµατα

107 .align 2 @Είναι απαραίτητο τα επόµενα δεδοµένα να τοποθετηθούν σε

διευθύνσεις που είναι πολλαπλάσια του 2, διότι ϑα χρησιµοποιή-

σουµε halfwords

108 Result: @Τα παρακάτω δεδοµένα τοποθετούνται σε µνήµη που

σηµειώνεται από την ετικέτα Result

109 .hword 0 @Εδώ ϑα αποθηκευτεί ο µεγαλύτερος ϑετικός αριθµός

Στο παράδειγµά µας εκτελείται η σύγκριση 5 αριθµών µεταξύ τους και ο µεγαλύτερος

αποθηκεύεται στην ϑέση µνήµης Result. Για την επίλυση του προβλήµατός µας χρησι-

µοποιήσαµε 4 συγκρίσεις. Επειδή όµως, τα ϐήµατα κάθε σύγκρισης είναι ίδια µεταξύ τους

(δηλαδή πρόσβαση στη µνήµη για την ανάκτηση του επόµενου αριθµού προς σύγκριση,

σύγκριση και τέλος αλλαγή του καταχωρητή µε το µεγαλύτερο νούµερο) µπορούµε να

χρησιµοποιήσουµε ένα ϐρόχο επανάληψης και να εκτελέσουµε τις ίδιες εντολές 4 ϕορές.

Σύγκριση αριθµών µε ϐρόγχους επανάληψης

110 .arm

111 .text

112 .global main

113

114 main:

115 STMDB R13!, R0­R12 @Αποθηκεύουµε τους καταχωρητές που ϑα χρησιµοποιήσουµε

116 LDR R0, =Values @Εισάγουµε στον R0 τη διεύθυνση που σηµατοδοτεί η ετικέτα

Values

117 LDRB R1, [R0, #0] @Εισάγουµε στον R1 το περιεχόµενο της µνήµης στο οποίο

δείχνει ο R0, δηλαδή το πρώτο byte

118 ADD R3, R0, #4 @Εισάγουµε στον R3 τη διεύθυνση της ϑέσης µνήµης που

ϐρίσκεται 4 ϑέσεις µετά από αυτή στην οποία δείχνει ο R0,

δηλαδή τη διεύθυνση του τελευταίου byte

119

120 Loop: @Ορίζουµε αυτή τη ϑέση µνήµης µε το όνοµα Loop

121 LDRB R2, [R0, #1]! @Αποθηκεύουµε στον R2 την τιµή της ϑέσης µνήµης που

ϐρίσκεται µια ϑέση µετά από αυτή στην οποία δείχνει ο R0 ενώ

παράλληλα αυξάνουµε τον R0 κατά 1

122 CMP R2, R1 @Συγκρίνουµε τον R2 µε τον R1, µε πράξη εικονικής αφαίρεσης

R2­R1

123 MOVHI R1, R2 @Αν ήταν R2 > R1 αποθηκεύουµε στον R1 την τιµή του R2

124

125 CMP R0, R3 @Συγκρίνουµε τα περιεχόµενα των R0 και R3, µε πράξη

εικονικής αφαίρεσης R0­R3

126 BLO Loop @Αν δεν έχουµε προσπελάσει και το τελευταίο byte µεταβαί-

νουµε στην εντολή που ϐρίσκεται στη διεύθυνση µνήµης που

είναι σηµατοδοτηµένη µε την ετικέτα Loop

127

128 LDR R0, =Result @Εισάγουµε στον R0 τη διεύθυνση που σηµατοδοτεί η ετικέτα

Result

54

Page 61: Εγχειρίδιο Χρήσης ΑΤ91 · 2013-03-30 · Εγχειρίδιο χρήσης at91 1. Πρόλογος ουσία επιλέξαµε τον πιο ισχυρό µικροελεγκτή

3. Εισαγωγή στην Assembly του ΑΤ91 Εγχειρίδιο χρήσης AT91

129 STRH R1, [R0] @Αποθηκεύουµε την τιµή του R1 στη ϑέση µνήµης που δείχνει

ο R0 σαν halfword

130 LDMIA R13!, R0­R12 @Επαναφέρουµε τις αρχικές τιµές στους καταχωρητές που

χρησιµοποιήσαµε

131 MOV PC, R14 @Μεταφέρουµε τη ϱοή της εκτέλεσης στο σηµείο όπου κλήθηκε

η υπορουτίνα main

132

133 .data @Ορίζουµε ότι τα παρακάτω δεδοµένα ϑα τοποθετηθούν στην

περιοχή "Data" που ορίζει άυτόµατα το λειτουργικό σύστηµα,

για τα δεδοµένα των προγραµµάτων

134 Values: @Τα παρακάτω δεδοµένα τοποθετούνται σε µνήµη που

σηµειώνεται από την ετικέτα Values

135 .byte 0x10, 0x15, 0x20

136 .byte 0x25, 0x30

137

138 .align 2 @Είναι απαραίτητο τα επόµενα δεδοµένα να τοποθετηθούν σε

διευθύνσεις που είναι πολλαπλάσια του 2, διότι ϑα χρησιµοποιή-

σουµε halfwords

139 Result: @Τα παρακάτω δεδοµένα τοποθετούνται σε µνήµη που

σηµειώνεται από την ετικέτα Result

140 .hword 0 @Εδώ ϑα αποθηκευτεί ο µεγαλύτερος ϑετικός αριθµός

Η διαδικασία που ακολουθήσαµε για να παράγουµε το παραπάνω αποτέλεσµα ονοµάζε-

ται folding και έχει σχέση µε την συγκέντρωση όµοιων τµηµάτων κώδικα και εκτέλεσή τους

µε χρήση ϐρόχων. Στο παράδειγµά µας, όλες οι συγκρίσεις εκτελούνται µε την ίδια εντολή,

αλλά αυτό που αλλάζει είναι ο καταχωρητής R0, ο οποίος αυξάνεται αυτόµατα µετά από

κάθε πρόσβαση στη µνήµη και περιέχει πάντα την διεύθυνση του επόµενου στοιχείου προς

ανάκτηση. Επιπλέον, χρησιµοποιήσαµε τον καταχωρητή R3 για να αποθηκεύσει το όριο

που πρέπει να συναντήσουµε ώστε να ϕύγουµε από το ϐρόχο (αν δεν τεθεί σωστά το όριο,

η εκτέλεση ϑα µείνει κολληµένη στον ίδιο ϐρόχο επ’άπειρο, οπότε χρειάζεται πολύ µεγάλη

προσοχή στην επιλογή των ορίων). Ο έλεγχος για το όριο υλοποιείται µέσω της εντολής

CMP και του ελέγχου των κατάλληλων σηµαιών κατάστασης (CPSR bits). Η διακλάδωση

στην ετικέτα Loop: ϑα γίνει 4 ϕορές, και µετά η εκτέλεση ϑα συνεχίσει µε την εντολή

ανάκτησης της διεύθυνσης του Result.

Με τη χρήση ϐρόχου υλοποιούµε την επανάληψη µιας διαδικασίας έως ώτου ικανοποι-

ηθεί µια συνθήκη που έχουµε ορίσει. Η γενική µορφή ενός ϐρόχου είναι :

1. ΄Εναρξη.

2. Κώδικας που τυχόν ϑα επαναληφθεί.

3. ΄Ελεγχος συνθήκης. Αν δεν ικανοποιείται πηγαίνουµε στο (2), διαφορετικά συνεχίζουµε τη

ϱοή του κώδικα.

55

Page 62: Εγχειρίδιο Χρήσης ΑΤ91 · 2013-03-30 · Εγχειρίδιο χρήσης at91 1. Πρόλογος ουσία επιλέξαµε τον πιο ισχυρό µικροελεγκτή

Εγχειρίδιο χρήσης AT91 Κεφάλαιο 3.3 - Παραδείγµατα

3.3.5 Πρόσθεση αριθµών εύρους 64 bit

Πρόσθεση αριθµών

141 .arm

142 .text

143 .global main

144

145 main:

146 STMDB R13!, R0­R12 @Αποθηκεύουµε τους καταχωρητές που ϑα χρησιµοποιήσουµε

147 LDR R0, =Values @Εισάγουµε στον R0 τη διεύθυνση που σηµατοδοτεί η ετικέτα

Values

148 LDR R1, [R0, #0] @Εισάγουµε στον R1 το περιεχόµενο της µνήµης στο οποίο

δείχνει ο R0

149 LDR R2, [R0, #8] @Εισάγουµε στον R2 το περιεχόµενο της ϑέσης µνήµης που

ϐρίσκεται 8 ϑέσεις µετά από εκεί που δείχνει ο R0

150 ADDS R3, R1, R2 @Αθροίζουµε τους R1 & R2, αποθηκεύουµε το αποτέλεσµα στον

R3 και κρατάµε το κρατούµενο εξόδου στη σηµαία κρατούµενου

του καταχωρητή κατάστασης, γιατί ϑα µας χρειαστεί αργότερα

151 STR R3, [R0, #0x10] @Αποθηκεύουµε το περιεχόµενο του R3 στη ϑέση του λιγότερο

σηµαντικού µέρους του αποτελέσµατος, δηλαδή 16 ϑέσεις µετά

από την διεύθυνση µνήµης που δείχνει ο R0

152

153 LDR R1, [R0, #4] @Εισάγουµε στον R1 το περιεχόµενο της ϑέσης µνήµης που

ϐρίσκεται 4 ϑέσεις µετά από εκεί που δείχνει ο R0

154 LDR R2, [R0, #0xC] @Εισάγουµε στον R2 το περιεχόµενο της ϑέσης µνήµης που

ϐρίσκεται 12 ϑέσεις µετά από εκεί που δείχνει ο R0

155 ADC R3, R1, R2 @Αθροίζουµε τους R1 & R2 και την τιµή που υπάρχει απο-

ϑηκευµένη στη σηµαία κράτούµενου του καταχωρητή κατάσ-

τασης και αποθηκεύουµε το αποτέλεσµα στον R3

156 STR R3, [R0, #0x14] @Αποθηκεύουµε το περιεχόµενο του R3 στη ϑέση του περισ-

σότερο σηµαντικού µέρους του αποτελέσµατος, δηλαδή 4 ϑέσεις

µετά από την διεύθυνση µνήµης που σηµατοδοτεί η ετικέτα Re­

sult

157 LDMIA R13!, R0­R12 @Επαναφέρουµε τις αρχικές τιµές στους καταχωρητές που

χρησιµοποιήσαµε

158 MOV PC, R14 @Μεταφέρουµε τη ϱοή της εκτέλεσης στο σηµείο όπου κλήθηκε

η υπορουτίνα main

159

160 .data @Ορίζουµε ότι τα παρακάτω δεδοµένα ϑα τοποθετηθούν στην

περιοχή "data" που ορίζει αυτόµατα το λειτουργικό σύστηµα, για

τα δεδοµένα των προγραµµάτων

161 Values: @Τα παρακάτω δεδοµένα τοποθετούνται σε µνήµη που

σηµειώνεται από την ετικέτα Values

162 .word 0x1, 0xFF000000

163 .word 0xFFFFFFFF

164 .word 0xFFFFFE

165

56

Page 63: Εγχειρίδιο Χρήσης ΑΤ91 · 2013-03-30 · Εγχειρίδιο χρήσης at91 1. Πρόλογος ουσία επιλέξαµε τον πιο ισχυρό µικροελεγκτή

3. Εισαγωγή στην Assembly του ΑΤ91 Εγχειρίδιο χρήσης AT91

166 Result: @Τα παρακάτω δεδοµένα τοποθετούνται σε µνήµη που

σηµειώνεται από την ετικέτα Result

167 .word 0,0

Σε αυτό το πρόγραµµα ο σκοπός µας ήταν η πρόσθεση δυο αριθµών εύρους 64 bit. Η

διαδικασία πρόσθεσης αριθµών µεγαλύτερων των 32 bit περιλαµβάνει τα εξής ϐήµατα :

• Αποθήκευση των 32 λιγότερο σηµαντικών bits που δεν έχουν αθροιστεί ακόµη, σε καταχωρητές.

• Πρόσθεση των 2 καταχωρητών µε χρήση κρατουµένου (δηλαδή εντολή ADC) και αποθήκευση

του κρατούµενου εξόδου στον CPSR.

• Αν υπάρχουν bits που δεν έχουν προστεθεί, επανάληψη από το πρώτο ϐήµα.

Στα παραπάνω ϐήµατα χρειάζεται προσοχή στην έναρξη του αλγόριθµου, διότι το CPSR

Carry bit πρέπει να είναι 0 (η πρόσθεση ξεκινά χωρίς κρατούµενο εισόδου). Επιπλέον,

είναι προτεινόµενη η υλοποίηση µε ϐρόχο επανάληψης, ώστε να µην επαναλαµβάνεται

άσκοπα ο ίδιος κώδικας. Στο πρόγραµµά µας επειδή προσθέσαµε 64 bit αριθµούς, δεν

ήταν απαραίτητη η χρήση ϐρόχου, αλλά αν προσθέταµε 128 ή 256 bit αριθµούς, ϑα ήταν

επιβεβληµένη.

Σχήµα 3.10: 64 bit addition

Στην εικόνα παρουσιάζεται η πρόσθεση που εκτελέσαµε. Παρατηρείστε πως η πρώτη

πρόσθεση δηµιουργεί κρατούµενο εξόδου, το οποίο εισέρχεται στην επόµενη ϐαθµίδα.

3.3.6 ∆ιαίρεση αριθµού εύρους 32 bit µε 16 bit διαιρέτη

∆ιαίρεση αριθµού

1 .arm

2 .text

3 .global main

4

5 main:

6 STMDB R13!, R0­R12 @Αποθηκεύουµε τους καταχωρητές που ϑα χρησιµοποιήσουµε

7

8 LDR R0, =Values @Εισάγουµε στον R0 τη διεύθυνση που σηµατοδοτεί η ετικέτα

Values

9

57

Page 64: Εγχειρίδιο Χρήσης ΑΤ91 · 2013-03-30 · Εγχειρίδιο χρήσης at91 1. Πρόλογος ουσία επιλέξαµε τον πιο ισχυρό µικροελεγκτή

Εγχειρίδιο χρήσης AT91 Κεφάλαιο 3.3 - Παραδείγµατα

10 LDR R1, [R0], #4 @Αποθηκεύουµε στον R1 το περιεχόµενο της ϑέσης µνήµης στην

οποία δείχνει ο R0 και αυξάνουµε τον R0 κατά 4

11 LDRH R2, [R0] @Αποθηκεύουµε στον R2 το περιεχόµενο της ϑέσης µνήµης στην

οποία δείχνει ο R0 σαν halfword

12 CMP R2, #0 @Ελέγχουµε αν ο διαιρέτης είναι µηδέν

13 BEQ Err @Αν είναι 0, µεταβαίνουµε στην ϑέση µνήµης που σηµατοδοτεί-

ται από την ετικέτα Err

14

15 MOV R3, #0 @Αποθηκεύουµε την τιµή 0 στον R3

16 CLZ R6, R2 @Αποθηκεύουµε στον R6 τον αριθµό των συνεχόµενων 0 που

ϐρίσκονται στις πιο σηµαντικές ϑέσεις του R2

17 MOV R2, R2, LSL R6 @Ολισθαίνουµε προς τα αριστερά τον R2 κατά τόσες ϑέσεις,

όσες έχουµε αποθηκεύσει στον R6. ∆ηλαδή ϕέρνουµε το πιο

σηµαντικό 1 του αριθµού στην πιο αριστερή ϑέση

18

19 Loop: @Ορίζουµε αυτή τη ϑέση µνήµης µε το όνοµα Loop

20 MOV R3, R3, LSL #1 @Ολισθαίνουµε τον R3 προς τα αριστερά κατά 1

21 CMP R1, R2 @Συγκρίνουµε τον R1 µε τον R2, µε πράξη εικονικής αφαίρεσης

R1­R2

22 ORRCS R3, R3, #1 @Αν ο R1 >= R2 τότε εκτελούµε την λογική πράξη OR του R3

µε τον αριθµό 1

23 SUBCS R1, R1, R2 @Αν ο R1 >= R2 τότε αφαιρούµε το R2 από το R1

24

25 MOV R2, R2, LSR #1 @Ολισθαίνουµε τον R2 προς τα δεξιά κατά 1

26 SUBS R6, R6, #1 @Αφαιρούµε από το R6 τον αριθµό 1 και αποθηκεύουµε το

αποτέλεσµα στον R6

27 BCS Loop @Αν ο R6 είναι µεγαλύτερος του 0, µεταβαίνουµε στη ϑέση

µνήµης που σηµατοδοτείται από την ετικέτα Loop

28

29 B Done @Μεταβαίνουµε στη ϑέση µνήµης που σηµατοδοτείται από την

ετικέτα Done

30 Err: @Ορίζουµε αυτή τη ϑέση µνήµης µε το όνοµα Err

31 MVN R3, #0 @Εισάγουµε στον R3 την τιµή -1

32 Done: @Ορίζουµε αυτή τη ϑέση µνήµης µε το όνοµα Done

33 LDR R0, =Result @Εισάγουµε στον R0 τη διεύθυνση που σηµατοδοτεί η ετικέτα

Result

34 STR R3, [R0], #4 @Αποθηκεύουµε στη ϑέση µνήµη στην οποία δείχνει ο R0 το

περιεχόµενο του R3 και αυξάνουµε τον R0 κατά 4

35 STRH R1, [R0] @Αποθηκεύουµε στη ϑέση µνήµη στην οποία δείχνει ο R0 το

περιεχόµενο του R1 σαν halfword

36

37 LDMIA R13!, R0­R12 @Επαναφέρουµε τις αρχικές τιµές στους καταχωρητές που

χρησιµοποιήσαµε

38 MOV PC, R14 @Μεταφέρουµε τη ϱοή της εκτέλεσης στο σηµείο όπου κλήθηκε

η υπορουτίνα main

39

58

Page 65: Εγχειρίδιο Χρήσης ΑΤ91 · 2013-03-30 · Εγχειρίδιο χρήσης at91 1. Πρόλογος ουσία επιλέξαµε τον πιο ισχυρό µικροελεγκτή

3. Εισαγωγή στην Assembly του ΑΤ91 Εγχειρίδιο χρήσης AT91

40 .data @Ορίζουµε ότι τα παρακάτω δεδοµένα ϑα τοποθετηθούν στην

περιοχή "Data" που ορίζει άυτόµατα το λειτουργικό σύστηµα,

για τα δεδοµένα των προγραµµάτων

41 Values: @Τα παρακάτω δεδοµένα τοποθετούνται σε µνήµη που

σηµειώνεται από την ετικέτα Values

42 .word 0xFFFFFFFE

43 .hword 0xF

44

45 .align 4 @Είναι απαραίτητο τα επόµενα δεδοµένα να τοποθετηθούν σε

διευθύνσεις που είναι πολλαπλάσια του 4

46 Result: @Τα παρακάτω δεδοµένα τοποθετούνται σε µνήµη που

σηµειώνεται από την ετικέτα Result

47 .word 0

48 .hword 0

Ο αλγόριθµος της διαίρεσης χρησιµοποιεί µια σειρά από αφαιρέσεις για να υπολογίσει

το πηλίκο και το υπόλοιπο. Αν χρησιµοποιήσουµε έναν απλοικό αλγόριθµο, µπορούµε

να αρχίσουµε να αφαιρούµε το διαιρέτη από το διαιρεταίο και να µετράµε τις αφαιρέσεις,

µέχρι να γίνει ο διαιρέτης µικρότερος από το διαιρεταίο. Αυτή η προσέγγιση απαιτεί τόσες

αφαιρέσεις, όσες και το πηλίκο, δηλαδή στην χειρότερη περίπτωση 232−1 (στην περίπτωση

που διαιρέσουµε το 232 − 1 µε το 1). Για να επισπεύσουµε τη διαδικασία στον παραπάνω

αλγόριθµο αναλύουµε τον διαιρεταίο σε πολλαπλάσια του διαιρέτη ως εξής :

D = x31 * d * 231 + . . . + xi * d * 2i + . . . + r

Ο όρος D συµβολίζει τον διαιρεταίο, ο d τον διαιρέτη και ο r το υπόλοιπο. Το πηλίκο

σχηµατίζεται από τους όρους :

q = x31 * 231 + . . . + xi * 2i + . . . + x0

Για να σχηµατίσουµε τους όρους D = xi * d * 2i εκτελούµε ολίσθηση στον διαιρέτη,

ξεκινώντας από τη µεγαλύτερη τιµή. Η µεγαλύτερη τιµή που µπορούµε να πάρουµε είναι

η κανονικοποιηµένη µορφή του διαιρέτη21, συνεπώς τιµές µεγαλύτερες από αυτή ϑα είναι

σίγουρα µεγαλύτερες από τον διαιρεταίο και ϑα επιστρέψουν στον συντελεστή τους την τιµή

0, οπότε δεν χρειάζεται να τις εξετάσουµε. Αρχίζουµε να συγκρίνουµε αν η κανονικοποιη-

µένη µορφή είναι µικρότερη ή ίση από τον διαιρεταίο και αν είναι εκτελούµε αφαίρεση

σε αυτές. Για παράδειγµα, αν ο διαιρεταίος είναι ο 0xFE και ο διαιρέτης το 3, κατά την

κανονικοποίηση ϑα µετατρέψουµε τον διαιρέτη σε 0xC0. Ο 0xC0 είναι µικρότερος από

τον 0xFE, άρα ϑα εκτελέσουµε αφαίρεση ανάµεσά τους και ο νέος διαιρεταίος ϑα είναι

η διαφορά τους. ∆ιαπιστώσαµε δηλαδή πως ο διαιρεταίος µας περιέχει την τιµή x6 * d *

26, όπου το x6 = 1. Μετά την αφαίρεση, ολισθαίνουµε δεξιά τον διαιρέτη (γιατί πλέον ο

διαιρεταίος είναι µικρότερος από αυτόν) και αναζητάµε την τιµή x5 * d * 25, µε την ίδια

ακριβώς διαδικασία. Στο τέλος, όταν ϕτάσουµε στον τελευταίο συντελεστή, το αποτέλεσµα

21∆ηλαδή, όταν έχει ολισθήσει τόσες ϑέσεις αριστερά, ώστε το πιο σηµαντικό 1 να έχει έρθει στη ϑέση 31

59

Page 66: Εγχειρίδιο Χρήσης ΑΤ91 · 2013-03-30 · Εγχειρίδιο χρήσης at91 1. Πρόλογος ουσία επιλέξαµε τον πιο ισχυρό µικροελεγκτή

Εγχειρίδιο χρήσης AT91 Κεφάλαιο 3.3 - Παραδείγµατα

της αφαίρεσης ϑα είναι µικρότερο από το διαιρέτη (ο οποίος ϑα έχει επανέρθει στην αρχική

τιµή του, δηλαδή ϑα έχει ολισθήσει δεξιά τόσες ϑέσεις όσες είχε ολισθήσει αριστερά στην

αρχή) και ϑα αποτελεί το υπόλοιπο της διαίρεσης. Ο σχηµατισµός του πηλίκου µπορεί

να γίνει µε 2 τρόπους, µε τον πρώτο να είναι η ενεργοποίηση του αντίστοιχου bit του

καταχωρητή (πχ. για το συντελεστή 6 ϑα ενεργοποιήσουµε το 7ο bit κλπ). Ο δεύτερος

τρόπος είναι η ενεργοποίηση του λιγότερου σηµαντικού bit του καταχωρητή που περιέχει

το πηλίκο και η ολίσθηση της τιµής σε κάθε επανάληψη του αλγορίθµου. Για παράδειγµα,

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

Αν δεν υπάρχει ο αµέσως µικρότερος συντελεστής, ο καταχωρητής ϑα ολισθήσει αριστερά

κατά µια ϑέση και στο λιγότερο σηµαντικό bit δεν ϑα εισαχθεί τίποτα (ϑα µείνει 0). Στο

τέλος του αλγορίθµου, το bit που εισάγαµε πρώτο ϑα έχει ϕτάσει στην 7η ϑέση, το επόµενο

στην 6η κλπ.

60

Page 67: Εγχειρίδιο Χρήσης ΑΤ91 · 2013-03-30 · Εγχειρίδιο χρήσης at91 1. Πρόλογος ουσία επιλέξαµε τον πιο ισχυρό µικροελεγκτή

Περιβάλλον εργασίας

Με το γενικό τίτλο «περιβάλλον εργασίας» αναφερόµαστε σύντοµα σε αυτό το κεφάλαιο

στην πλατφόρµα υλικού, στο λειτουργικό σύστηµα, στα εργαλεία ανάπτυξης και αποσ-

ϕαλµάτωσης και στα εργαλεία συγγραφής του κώδικα. Η περιγραφή µας παραµένει

συνοπτική για το καθένα, καθώς το AT91 συµπεριφέρεται σαν οποιοδήποτε άλλο Unix

σύστηµα.

4.1 Υλικό

Το ΑΤ91 είναι µια εµπορικά διαθέσιµη πλακέτα ανάπτυξης συστηµάτων, σχεδιασµένη

από την εταιρεία ATMEL. Πέρα από το ολοκληρωµένο του µικροελεγκτή AT91SAM9261,

παρέχει ένα ευρύ σύνολο από περιφερειακά (µετατροπείς από αναλογικό σε ψηφιακό,

προσαρµογείς για USB, Ethernet, ...) που διευκολύνουν τη διασύνδεση του συστήµατός

µας.

4.2 Λειτουργικό σύστηµα

Το λειτουργικό σύστηµα που υιοθετήθηκε για τη πρώτη έκδοση του ΑΤ91, είναι το

Linux (Snapgear distribution), µε πυρήνα στην έκδοση 2.6.20. Πρόκειται για µια έκ-

δοση του Linux αναπτυγµένη για τον επεξεργαστή ARM926EJ­S, µε υποστήριξη αρκετών

προγραµµάτων οδηγών, µε προσαρµογές των οποίων το λειτουργικό σύστηµα µπορεί να

προσπελάσει τις διάφορες περιφερειακές συσκευές και εξωτερικές µνήµες (LCD οθόνη, US­

B ϑύρα, µνήµη Flash κλπ). Η πρώτη οθόνη που εµφανίζεται µετά την έναρξη λειτουργίας

του συστήµατος είναι η οθόνη εισαγωγής στο σύστηµα στην οποία ο χρήστης πρέπει να

εισάγει το όνοµα χρήστη (login) root και αµέσως µετά το κωδικό support, ο οποίος δεν

εµφανίζεται στην οθόνη κατά την πληκτρολόγηση. Με την εισαγωγή των στοιχείων, ο χρή-

στης εισέρχεται στο shell του λειτουργικού, όπου µπορεί να εισάγει οποιαδήποτε εντολή

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

να εισάγουν εντολές στο shell του συστήµατος για να εκτελεστούν οι διάφορες λειτουργίες.

61

Page 68: Εγχειρίδιο Χρήσης ΑΤ91 · 2013-03-30 · Εγχειρίδιο χρήσης at91 1. Πρόλογος ουσία επιλέξαµε τον πιο ισχυρό µικροελεγκτή

Εγχειρίδιο χρήσης AT91 Κεφάλαιο 4.2 - Λειτουργικό σύστηµα

Οι ϐασικές εντολές που υποστηρίζονται καταγράφονται στον πίνακα Εντολές Linux (κεφ.

4.2, σελ. 62).

Cmd Περιγραφή Cmd Περιγραφή

as Εκτελεί τον assembler cd Αλλαγή καταλόγου

cat Προβολή δεδοµένων αρχείου cp Αντιγραφή αρχείων

df Ελεύθερος χώρος αποθήκευσης kill Τερµατισµός διεργασίας

ld GNU Linker ls Λίστα αρχείων καταλόγου

make Μετάφραση κώδικα mkdir ∆ηµιουργεία καταλόγου

mount ∆έσµευση περιφεριακού mv Μετακίνηση αρχείου

nm GNU πληροφορίες εκτελέσιµου ps Λίστα διεργασιών

rm ∆ιαγραφή αρχείων umount Αποδέσµευση περιφεριακού

Πίνακας 4.24: Εντολές Linux

cat

Με την εντολή cat εµφανίζουµε στην οθόνη το περιεχόµενο ενός αρχείου. Η σύνταξη

της εντολής είναι :

cat < filename >

όπου το < filename > είναι το όνοµα του αρχείου. Για παράδειγµα, η εντολή cat /etc/­

motd ϑα προβάλει το λογότυπο που εµφανίζεται κατά την εισαγωγή στο σύστηµα.

cd

Με την εντολή cd µεταβαίνουµε από τον τρέχοντα κατάλογο σε έναν άλλο. Η σύνταξη

της εντολής είναι :

cd < destination >

όπου το < destination > είναι ο προορισµός µας. Για παράδειγµα, η εντολή cd .. ϑα µας

µεταφέρει στον κατάλογο που περιέχει τον τρέχοντα, στον οποίο ϐρισκόµαστε.

cp

Με την εντολή cp αντιγράφουµε ένα αρχείο σε µια άλλη ϑέση, στο σύστηµα αρχείων.

Η σύνταξη της εντολής είναι :

cp < filename > < destination >

όπου το < filename > είναι το όνοµα του αρχείου και το < destination > ο προορισµός

του. Για παράδειγµα, η εντολή cp /etc/motd /storage ϑα αντιγράψει το αρχείο /etc/motd

στον κατάλογο /storage.

62

Page 69: Εγχειρίδιο Χρήσης ΑΤ91 · 2013-03-30 · Εγχειρίδιο χρήσης at91 1. Πρόλογος ουσία επιλέξαµε τον πιο ισχυρό µικροελεγκτή

4.Περιβάλλον εργασίας Εγχειρίδιο χρήσης AT91

df

Με την εντολή df εµφανίζουµε στην οθόνη τον ελεύθερο χώρο στο σύστηµα αρχείων

(file system). Η εντολή δεν χρειάζεται παραµέτρους.

kill

Με την εντολή kill στέλνουµε σήµατα (software signals) σε διεργασίες. Η σύνταξη της

εντολής είναι :

kill ­< signum > < pid >

όπου το < signum > είναι ο αριθµός του σήµατος που ϑέλουµε να στείλουµε και < pid >

ο αριθµός της διεργασίας. Για παράδειγµα, η εντολή kill ­9 38 ϑα στείλει το σήµα τύπου 9

στην διεργασία 38 (το σήµα τύπου 9 είναι σήµα τερµατισµού και συνεπώς ϑα σταµατήσει

τη διεργασία).

ls

Με την εντολή ls εµφανίζουµε τα αρχεία του τρέχοντος καταλόγου. Η σύνταξη της

εντολής είναι :

ls [­alF]

όπου το ­alF αφορά την εµφάνιση των αρχείων σε λίστα µε πληροφορίες για µέγεθος και

είναι προαιρετικό.

make

Με την εντολή make µεταγλωτίζουµε πηγαίο κώδικα σε εκτελέσιµο πρόγραµµα. Το

script αναλαµβάνει να καλέσει τα κατάλληλα εργαλεία και να εισάγει τις κατάλληλες

παραµέτρους, ώστε να ολοκληρωθεί αυτή η διαδικασία. Η σύνταξη της εντολής είναι :

make tool < srcfile > < destfile >

tool είναι το εργαλείο µεταγλώττισης. Για το εργαστήριο προγραµµατισµού σε συµβολική

γλώσσα το εργαλείο αυτό είναι ο as (gnu assembler). Για το εργαστήριο µικροϋπολογιστών

ϑα χρησιµοποιήσετε ως εργαλείο µεταγλώττισης τον gcc (gnu C compiler). < srcfile >

είναι το όνοµα του αρχείου µε τον πηγαίο κώδικά µας. Για αρχεία assembly είναι καλό

να δίνετε τη κατάληξη .s, ενώ για αρχεία γλώσσας C, την κατάληξη .c Τέλος, < destfile >

το όνοµα του τελικού εκτελέσιµου. Για παράδειγµα, η εντολή make as foo.s bar

µεταγλωτίζει το πηγαίο αρχείο συµβολικής γλώσσας foo.s, παράγει το ενδιάµεσο αρχείο

bar.o (object αρχείο) και τελικά το εκτελέσιµο bar.

63

Page 70: Εγχειρίδιο Χρήσης ΑΤ91 · 2013-03-30 · Εγχειρίδιο χρήσης at91 1. Πρόλογος ουσία επιλέξαµε τον πιο ισχυρό µικροελεγκτή

Εγχειρίδιο χρήσης AT91 Κεφάλαιο 4.2 - Λειτουργικό σύστηµα

mkdir

Με την εντολή mkdir δηµιουργούµε νέους καταλόγους. Η σύνταξη της εντολής είναι :

mkdir < folder >

όπου το < folder > είναι το όνοµα του καταλόγου. Για παράδειγµα, η εντολή mkdir exer1

δηµιουργεί τον κατάλογο exer1 µέσα στον τρέχοντα κατάλογο.

mount

Με την εντολή mount εισάγουµε περιφερειακά, όπως USB stick στο σύστηµα αρχείων.

Η σύνταξη της εντολής είναι :

mount < device > < folder >

όπου το < device > είναι το όνοµα της συσκευής και το < folder > είναι το όνοµα υπάρ-

χοντος καταλόγου, µέσω του οποίου ϑα προσπελαύνουµε τα περιεχόµενα της συσκευής.

Για παράδειγµα, για να συνδέσουµε ένα USB stick στον κατάλογο mnt ϑα πρέπει να δώ-

σουµε είτε την εντολή mount /dev/sda /mnt είτε την εντολή mount /dev/sda1 /mnt,

ανάλογα µε τη χωρητικότητα του stick µας. Με τη χρήση του cd µπορούµε να µεταβούµε

σε αυτόν τον κατάλογο και µε το ls να δούµε τα αρχεία που υπάρχουν στο stick.

mv

Με την εντολή mv µετακινούµε ένα αρχείο σε µια άλλη ϑέση, στο σύστηµα αρχείων. Η

σύνταξη της εντολής είναι :

mv < filename > < destination >

όπου το < filename > είναι το όνοµα του αρχείου και το < destination > ο προορισµός

του. Για παράδειγµα, η εντολή mv /etc/motd /storage ϑα µεταφέρει το αρχείο /etc/motd

στον κατάλογο /storage και ϑα το διαγράψει από την αρχική του ϑέση. Με αυτή την εντολή

µπορούµε να µετονοµάζουµε και αρχεία, αν τα µετακινούµε στον ίδιο κατάλογο (πχ. mv

/etc/motd /etc/hello.txt).

ps

Με την εντολή ps προβάλλουµε τις διεργασίες που εκτελούνται στο σύστηµα. Η εντολή

δεν χρειάζεται παραµέτρους.

64

Page 71: Εγχειρίδιο Χρήσης ΑΤ91 · 2013-03-30 · Εγχειρίδιο χρήσης at91 1. Πρόλογος ουσία επιλέξαµε τον πιο ισχυρό µικροελεγκτή

4.Περιβάλλον εργασίας Εγχειρίδιο χρήσης AT91

rm

Με την εντολή rm διαγράφουµε αρχεία και καταλόγους. Η σύνταξη της εντολής είναι :

rm [­r] < filename >

όπου το ­r είναι προαιρετικό (χρησιµοποιείται όταν ϑέλουµε να διαγράψουµε ένα κατάλο-

γο) και το < filename > είναι το όνοµα του αρχείου/καταλόγου που ϑα διαγραφεί (πχ.

rm ask1.s ϑα διαγράψει το αρχείο ask1.s).

umount

Με την εντολή umount αποδεσµεύουµε περιφερειακά από το σύστηµα αρχείων, όπως

για παράδειγµα το USB stick. Η διαδικασία αποδέσµευσης είναι απαραίτητη για την

ενηµέρωση των περιφερειακών µε τα σωστά δεδοµένα και τον ασφαλή τους τερµατισµό. Η

σύνταξη της εντολής είναι :

umount < folder >

όπου το < folder > είναι το όνοµα υπάρχοντος καταλόγου, στον οποίο έχουµε δεσµεύσει

µια συσκευή. Για παράδειγµα, η εντολή umount /mnt αποσυνδέει ένα USB stick που

είχε δεσµευτεί στον κατάλογο mnt. Για να µπορέσει να ολοκληρωθεί σωστά η εντολή δε

ϑα πρέπει αυτός ο κατάλογος ή οποιοσδήποτε υποκατάλογός του να µη χρησιµοποιείται

από κανένα πρόγραµµα, ούτε καν από το λειτουργικό σύστηµα. ∆ηλαδή ϑα πρέπει να

εκτελέσουµε την umount /mnt ϐρισκόµενοι σε άλλο κατάλογο του συστήµατός µας.

4.3 GNU tools

Τα εργαλεία ανάπτυξης περιλαµβάνουν τον Assembler, το Linker, το Debugger και

τον InfoViewer. Τα δυο πρώτα εργαλεία καλούνται από το αυτοµατοποιηµένο αρχείο εν-

τολών make, ο Debugger µε την εντολή gdb (στη τρέχουσα έκδοση firmware του AT91

δυστυχώς πρέπει να τον καλείτε ως /storage/.gnu/gdb) και ο InfoViewer µε την εν-

τολή nm. Ο Debugger αποτελεί το ϐασικό εργαλείο ϐηµατικής εκτέλεσης και εξέτασης

των καταχωρητών και των µνηµών22. Η σύνταξη της εντολής είναι /storage/.gnu/gdb

< executable >, όπου το < executable > είναι το όνοµα του εκτελέσιµου αρχείου. Ο De­

bugger δέχεται εντολές µέσω της κονσόλας, που καθορίζουν τις ενέργειες που ϑα εκτελέσει

22Στο ΑΤ91 δεν υπάρχει η δυνατότητα εξέτασης συγκεκριµένης ϑέσης µνήµης από το shell, λόγω της

ενσωµάτωσης της µονάδας διαχείρισης µνήµης (MMU) στο ολοκληρωµένο του µικροελεγκτή. Σε επίπεδο

λογισµικού µόνο ιδεατές διευθύνσεις είναι διαθέσιµες και αυτές µόνο όταν µια συγκεκριµένη διαδικασία εκ-

τελείται. Ο τερµατισµός µιας διαδικασίας σηµαίνει και την αποδέσµευση του χώρου µνήµης που κατέλαβε

για την εκτέλεσή της.

65

Page 72: Εγχειρίδιο Χρήσης ΑΤ91 · 2013-03-30 · Εγχειρίδιο χρήσης at91 1. Πρόλογος ουσία επιλέξαµε τον πιο ισχυρό µικροελεγκτή

Εγχειρίδιο χρήσης AT91 Κεφάλαιο 4.3 - GNU tools

στη συνέχεια. Οι εντολές αυτές σχετίζονται µε σηµεία παύσης (breakpoints) και σηµεία

ελέγχου (watchpoints), καθώς και πληροφορίες για το περιεχόµενο των ϑέσεων µνήµης

και καταχωρητών.

Περιγράφουµε παρακάτω τις δυνατότητες που µας δίνονται εντός του περιβάλλοντος

εκτέλεσης του Debugger, αφού δηλαδή δώσουµε την εντολή

/storage/.gnu/gdb < file >

όπου < file > είναι το εκτελέσιµο αρχείο που προσπαθούµε να τρέξουµε ϐηµατικά γα

αποσφαλµάτωση ή για να αποδείξουµε την ορθή λειτουργία του. Το πρόγραµµα µας,

κατά την εκκίνηση του Debugger, ϐρίσκεται σε ανενεργή κατάσταση και δεν έχει αρ-

χίσει να εκτελείται. Για να ξεκινήσει χρησιµοποιούµε την εντολή run. Το πρόγραµµα

ϑα ολοκληρωθεί και ο Debugger ϑα ειδοποιήσει πως το πρόγραµµα τερµατίστηκε. Γι-

α να διακόψουµε τη ϱοή της εκτέλεσης και να επιστρέψουµε στον Debugger πρέπει να

τοποθετήσουµε ένα breakpoint σε όποια γραµµή κώδικα ϑέλουµε να σταµατήσει η εκ-

τέλεση του προγράµµατος. Μόλις σταµατήσει, µπορούµε να δούµε το περιεχόµενο των

καταχωρητών και οποιασδήποτε ϑέσης µνήµης, όπως και να αλλάξουµε τα περιεχόµε-

να τους. Τα breakpoints µπορούµε να τα εισάγουµε µε την εντολή break. Οι τρόποι

εισαγωγής τους εµφανίζονται στον πίνακα Breakpoints (κεφ. 4.3, σελ. 66).

Breakpoint Παράδειγµα

break <label> Τοποθετεί το breakpoint στη ϑέση που χαρακτηρίζεται από την ετικέ-

τα <label>.

break <line> Τοποθετεί το breakpoint στην γραµµή <line> του πηγαίου αρχείου.

break <*address> Τοποθετεί το breakpoint στην διεύθυνση <address> της µνήµης.

Πίνακας 4.25: Καταχωρητές

Για παράδειγµα, µε την εντολή break main τοποθετούµε ένα breakpoint στην πρώτη

εντολή του προγράµµατός µας, κάτι το οποίο ϑα µας χρησιµεύσει πολλές ϕορές και είναι

επιθυµητό να γίνεται πριν την έναρξη εκτέλεσης του προγράµµατος µε τη run. Αν γνωρί-

Ϲουµε ότι υπάρχει µια εντολή πρόσβασης στη µνήµη, στη ϑέση µνήµης 0x80c0 µπορούµε

να τοποθετήσουµε ένα breakpoint εκεί, µε την εντολή break *0x80c0. Αν η πρόσβαση αυτή

γίνεται στη γραµµή 15 του πηγαίου κώδικα, µπορούµε να χρησιµοποιήσουµε την εναλ-

λακτική εντολή break 15. Τέλος, αν ϑέλουµε να τοποθετήσουµε ένα breakpoint 3 εντολές

µετά από µια ετικέτα (πχ. main), χρησιµοποιούµε την εντολή break *(main+12), όπου το 12

σηµαίνει 12 bytes µετά από την ετικέτα, λόγω του ότι κάθε εντολή καταλαµβάνει 4 bytes.

66

Page 73: Εγχειρίδιο Χρήσης ΑΤ91 · 2013-03-30 · Εγχειρίδιο χρήσης at91 1. Πρόλογος ουσία επιλέξαµε τον πιο ισχυρό µικροελεγκτή

4.Περιβάλλον εργασίας Εγχειρίδιο χρήσης AT91

Για να προβάλλουµε τη λίστα µε όλα τα breakpoints που έχουµε ϑέσει, χρησιµοποιούµε

την εντολή info break [n], η οποία παρουσιάζει αριθµηµένα τα breakpoints23 και τη ϑέση

στην οποία ϐρίσκονται. Αν εισάγουµε και τον προαιρετικό αριθµό n, ϑα προβληθούν µόνο

οι πληροφορίες για το n breakpoint (πχ. µε την εντολή info break 3 ϑα προβάλουµε τις

πληροφορίες του τρίτου breakpoint). Η διαγραφή ενός breakpoint γίνεται µε την εντολή

clear <line>, όπου line είναι ο αριθµός της γραµµής στην οποία έχει τεθεί το breakpoint

(πχ. µε την εντολή clear 12 ϑα διαγραφεί το breakpoint που έχει τεθεί στη γραµµή 12). Ο

εναλλακτικός τρόπος διαγραφής ενός breakpoint γίνεται µε την εντολή delete <breaknum>,

όπου το breaknum είναι ο αριθµός του breakpoint (πχ. µε την εντολή delete 2 ϑα δια-

γραφεί το 2ο breakpoint).

Για να εµφανίσουµε τα περιεχόµενα µιας ϑέσης µνήµης χρησιµοποιούµε την εντολή

x/nfu < address >, όπου το n καθορίζει το πόσες διαδοχικές τιµές ϑα προβληθούν, το f τον

τρόπο προβολής και το u το µέγεθος των τιµών. Ο τρόπος προβολής µπορεί να είναι ένας

από τους ακόλουθους :

x ∆εκαεξαδική προβολή

d Προσηµασµένη δεκαδική προβολή

u Μη-προσηµασµένη δεκαδική προβολή

o Οκταδική προβολή

t ∆υαδική προβολή

a Προβολή διεύθυνσης

c Προβολή χαρακτήρα ASCII

s Προβολή string

Ο τρόπος προβολής σχετίζεται µε το πως επιθυµούµε να ϐλέπουµε τις τιµές και δεν

επηρρεάζει το µέγεθος τους. Το επιθυµητό µέγεθος επιλέγεται µε τη χρήση των παρακάτω

εντολών :

b Κάθε τιµή έχει µέγεθος 1 byte

h Κάθε τιµή έχει µέγεθος 2 bytes (halfword). Ξεκινά σε διεύθυνση που είναι ακέραιο πολλαπλάσιο του 2.

w Κάθε τιµή έχει µέγεθος 4 bytes (word). Ξεκινά σε διεύθυνση που είναι ακέραιο πολλαπλάσιο του 4.

g Κάθε τιµή έχει µέγεθος 8 bytes (giantword). Ξεκινά σε διεύθυνση που είναι ακέραιο πολλαπλάσιο του 8.

Το πεδίο διεύθυνση address της εντολής µπορεί να είναι απόλυτη διεύθυνση (πχ. x/wx

0x10544), ή σχετική µε τη χρήση ετικετών (πχ. x/wx (&Values + 2)). Τα παραδείγµατα

που αναγράφονται στον πίνακα Προβολή τιµών (κεφ. 4.3, σελ. 68), δείχνουν διάφορους

τρόπους προβολής τιµών µνήµης.

23Η αρίθµηση γίνεται µε ϐάση τη σειρά εισαγωγής, των breakpoints

67

Page 74: Εγχειρίδιο Χρήσης ΑΤ91 · 2013-03-30 · Εγχειρίδιο χρήσης at91 1. Πρόλογος ουσία επιλέξαµε τον πιο ισχυρό µικροελεγκτή

Εγχειρίδιο χρήσης AT91 Κεφάλαιο 4.3 - GNU tools

Εστω ότι στο .data κοµµάτι του κώδικά µας έχουµε δηλώσει :

Values:

.word 0x40302010, 0x80706050

.word 0x54204948, 0x45524548

Εντολή Παράδειγµα

x/2xw &Values Θα εµφανίσει τις τιµές 0x40302010 & 0x80706050

x/3xb ((char*)&Values+1) Θα εµφανίσει τις τιµές 0x20, 0x30, 0x40. Προσέξτε πως χρησι-

µοποιήσαµε το casting (char*) για να ενηµερώσουµε τον Debugger

πως η διεύθυνση αναφέρεται σε bytes και το b για να πάρουµε µόνο

1 byte για κάθε τιµή. Αν δεν χρησιµοποιούσαµε το (char*) ϑα εµ-

ϕανίζαµε τις τιµές 0x50, 0x60, 0x70, διότι η διεύθυνση ϑα ξεκίναγε

από 1 word µετά το Values και όχι ένα byte, όπως εµείς ϑέλαµε.

x/2xh ((short*)&Values+1) Θα εµφανίσει τις τιµές 0x4030, 0x6050. Εδώ χρησιµοποιήσαµε το

casting (short*) για να ενηµερώσουµε τον Debugger πως η διεύθυνση

αναφέρεται σε halfwords και το h για να πάρουµε 2 bytes για κάθε

τιµή. Αν δεν χρησιµοποιούσαµε το (short*) ϑα εµφανίζαµε τις τιµές

0x6050, 0x8070, διότι η διεύθυνση ϑα ξεκίναγε από 1 word µετά το

Values και όχι ένα halfword, όπως εµείς ϑέλαµε.

x/dh &Values Θα εµφανίσει την τιµή 8208 (δεκαδική τιµή του halfword 0x2010).

∆εν χρησιµοποιούµε casting διότι δεν προσθέτουµε κάποια τιµή στην

ετικέτα.

x/dh ((short*)&Values+3) Θα εµφανίσει την τιµή -32656 (προσηµασµένη δεκαδική).

x/uh ((short*)&Values+3) Θα εµφανίσει την τιµή 32880 (µη-προσηµασµένη δεκαδική).

x/s &Values+2 Θα εµφανίσει το string HI THERE.

Πίνακας 4.27: Προβολή τιµών

΄Ενας εναλλακτικός τρόπος προβολής των δεδοµένων είναι µε τη χρήση της εντολής

p/f < variable >, όπου εδώ µπορούµε να εισάγουµε µόνο τον τρόπο προβολής και για να

επιλέξουµε το µέγεθος και τη διεύθυνση χρησιµοποιούµε τροποποίηση τύπου (casting).

Η τυπική λειτουργία της εντολής προβάλει ένα word, το οποίο είναι το περιεχόµενο της

ετικέτας που εισάγουµε σαν παράµετρο. Για παράδειγµα, µε την εντολή p/x Values ϑα

εµφανιστεί η τιµή 0x40302010. Για να εµφανίσουµε το τρίτο byte, η εντολή γίνεται p/x

*((char*)&Values+2). Το πλεονέκτηµα της εντολής αυτής είναι ότι µπορεί να προβάλει το

περιεχόµενο των καταχωρητών, όπως p/f $< register >. Για παράδειγµα, µε την εντολή

p/x $r0 µπορούµε να εξετάσουµε το περιεχόµενο του R0, µε την εντολή p/x $pc µπορούµε

68

Page 75: Εγχειρίδιο Χρήσης ΑΤ91 · 2013-03-30 · Εγχειρίδιο χρήσης at91 1. Πρόλογος ουσία επιλέξαµε τον πιο ισχυρό µικροελεγκτή

4.Περιβάλλον εργασίας Εγχειρίδιο χρήσης AT91

να εξετάσουµε το περιεχόµενο του R15 και µε την εντολή p/t $cpsr µπορούµε να εµ-

ϕανίσουµε δυαδικά το περιεχόµενο του CPSR. ΄Ενας δεύτερος τρόπος προβολής όλων των

καταχωρητών είναι µε την εντολή info registers, όπου προβάλεται το περιεχόµενο όλων των

καταχωρητών.

Μέσα από τον Debugger µπορούµε ϕυσικά και να αλλάζουµε τις τιµές των ϑέσεων

µνήµης και των καταχωρητών, µε την εντολή set < expr >, όπου expr είναι µια έκφραση

ανάθεσης, όπως η set Values = 0x450 που ϑέτει την σηµειωµένη από την ετικέτα Values

ϑέση µνήµης στην τιµή 0x450. ΄Ενα αντίστοιχο παράδειγµα µε καταχωρητές αποτελεί η

εντολή set $r0 = 0xFF, όπου αλλάζει την τιµή του R0 σε 255. Οι ϑέσεις µνήµης που µ-

πορούν να επιλεγούν, σχηµατίζονται και µε casting ανάλογα µε τη ϑέση τους και το εύρος

της τιµής, όπως µε την εντολή set *((char*)&Values+2) = 0x45, όπου ϑέτει το byte που

ϐρίσκεται 2 ϑέσεις µετά από τη διεύθυνση που σηµειώνει η ετικέτα, στην τιµή 0x45.

Για να εξετάσουµε τα αποτελέσµατα που παράγονται από τις εντολές του προγράµ-

µατός µας, έχουµε τη δυνατότητα να συνεχίσουµε την εκτέλεση του προγράµµατος ϐη-

µατικά (δηλαδή µια προς µια τις εντολές) ή κανονικά (όπου η εκτέλεση σταµατά µε την

ολοκλήρωση του προγράµµατος ή µε την συνάντηση κάποιου breakpoint). Η κανονική

εκτέλεση, µετά από διακοπή, γίνεται µε την εντολή continue ή µόνο c, ενώ η ϐηµατική εκ-

τέλεση γίνεται µε την εντολή step. Σε περιπτώσεις όπου υπάρχουν κλήσεις σε υπορουτίνες,

η εντολή step ϑα ακολουθήσει τη διακλάδωση και ϑα σταµατήσει στην πρώτη εντολή της

υπορουτίνας, κάτι το οποίο δεν είναι πάντα επιθυµητό. Γι’αυτό το λόγο µπορούµε να χρησι-

µοποιήσουµε την εντολή next ή n, η οποία έχει την ίδια λειτουργία µε την step, αλλά όταν

συναντά κλήσεις σε υπορουτίνες εκτελεί κανονικά τον κώδικα και σταµατά στην επόµενη

γραµµή από την κλήση (δεν κάνει ϐηµατική εκτέλεση του κώδικα της υπορουτίνας).

Μπορούµε τέλος µέσα από τον Debugger να ϑυµηθούµε ένα τµήµα από εντολές του

πηγαίου µας αρχείου, µε τη χρήση της εντολής list [<line_start>] [,<line_end>], όπου αν δεν

εισάγουµε καµία παράµετρο εµφανίζονται 10 γραµµές κώδικα γύρω από την γραµµή προς

εκτέλεση, αν εισάγουµε την πρώτη παράµετρο εµφανίζονται 10 γραµµές κώδικα γύρω από

την γραµµή που εισάγαµε και αν εισάγουµε και τις 2 παραµέτρους εµφανίζονται οι γραµ-

µές κώδικα ανάµεσα στην πρώτη και τη δεύτερη γραµµή. Για παράδειγµα, µε την εντολή

list 15 ϑα εµφανιστούν οι γραµµές 10. . . 19, ενώ µε την εντολή list 15,18 ϑα εµφανιστούν

οι γραµµές 15. . . 18. Παρόµοια λειτουργία έχει και η εντολή disassemble [<addr_start>]

[<addr_end>], µε τη διαφορά πως τώρα εµφανίζεται ο κώδικας στις ϑέσεις µνήµης που

έχει ϕορτωθεί. Οι παράµετροι τώρα είναι διευθύνσεις µνήµης και αν δεν εισάγουµε καµία,

ϑα εµφανιστεί ο κώδικας που υπάρχει σε 10 ϑέσεις γύρω από την τρέχουσα εντολή προς

εκτέλεση. Αν εισάγουµε την πρώτη ϑα εµφανιστεί ο κώδικας που περικλείει τις 10 ϑέσεις

69

Page 76: Εγχειρίδιο Χρήσης ΑΤ91 · 2013-03-30 · Εγχειρίδιο χρήσης at91 1. Πρόλογος ουσία επιλέξαµε τον πιο ισχυρό µικροελεγκτή

Εγχειρίδιο χρήσης AT91 Κεφάλαιο 4.4 - Ευκολίες

γύρω από τη συγκεκριµένη ϑέση που εισάγαµε και αν εισάγουµε και τις 2 παραµέτρους

ϑα εµφανιστεί ο κώδικας που υπάρχει ανάµεσα σε αυτές τις διευθύνσεις µνήµης. Γι-

α παράδειγµα, µε την εντολή disassemble (main+20) ϑα εµφανιστούν οι εντολές από τη

ϑέση main έως τη ϑέση main+40 (αφού κάθε εντολή καταλαµβάνει 4 bytes). Με την εντολή

disassemble (main+8) (main+16) ϑα εµφανιστούν 3 εντολές. Η χρησιµότητα της εντολής

disassemble εµφανίζεται σε περιπτώσεις που υπάρχουν συναρτήσεις που δεν έχουν επι-

πλέον πληροφορία για λόγους αποσφαλµάτωσης, οπότε δεν µπορεί να εντοπιστεί πηγαίος

κώδικας.

Επεξήγηση

΄Οταν εκτελείται η διαδικασία µεταγλώτισης και σύνδεσης του αρχείου, για να παραχθεί ο

εκτελέσιµος κώδικας, τα εργαλεία δέχονται µια σειρά από παραµέτρους που καθορίζουν

το πως ϑα ολοκληρωθεί αυτή η διαδικασία και τι ϑα συµπεριληφθεί στο τελικό αρχείο.

Μια από τις επιλογές είναι και η προσθήκη επιπλέον πληροφορίας για λόγους αποσ-

ϕαλµάτωσης. Την πληροφορία αυτή χρησιµοποιεί ο gdb για να προβάλει κείµενο του πη-

γαίου αρχείου κώδικα, ονόµατα συναρτήσεων και επιπλέον πληροφορίες για το εκτελέσ-

ιµο. Κατά την διαδικασία της σύνδεσης όµως, µπορεί να χρησιµοποιηθούν συναρτήσεις

της ϐιβλιοθήκης του συστήµατος, οι οποίες ϐρίσκονται σε αρχεία ϐιβλιοθήκης χωρίς επι-

πλέον πληροφορίες για λόγους µεγέθους, αφού η εισαγωγή πλεονάζουσας πληροφορίας

που δεν σχετίζεται µε την εκτέλεση αλλά µε την αποσφαλµάτωση προσθέτει άσκοπο χώρο

στο αρχείο. Γι’αυτό το λόγο, αν χρειαστεί να συµπεριλάβουµε κώδικα χωρίς πληροφορία

αποσφαλµάτωσης, ο µόνος τρόπος προβολής του είναι µε τη χρήση του disassemble.

4.4 Ευκολίες

∆εδοµένης της µικρής οθόνης του ΑΤ91, πολλές ϕορές χρειάζεται µετακίνηση ως προς

τον οριζόντιο άξονα, είτε σύµπτυξη ή µεγέθυνση της γραµµατοσειράς ώστε να έχουµε περισ-

σότερη πληροφορία διαθέσιµη. Στο ΑΤ91, έχουν ενσωµατωθεί δύο συνδυασµοί πλήκτρων

για την εκτέλεση αυτών των λειτουργιών :

• Ο συνδυασµός πλήκτρων Alt + Control+ ← και Alt + Control+ → επιτρέπει τη

µετακίνηση (scrolling) της οθόνης προς τα αριστετρά και τα δεξιά αντίστοιχα.

• Ο συνδυασµός πλήκτρων Alt+ ↑ και Alt+ ↓ επιτρέπει τη σύµπτυξη και την αραίωση

(µέσω της αλλαγής γραµµατοσειράς) αντίστοιχα των γραµµών κειµένου που είναι

ορατές σε µία πλήρη οθόνη του ΑΤ91.

70

Page 77: Εγχειρίδιο Χρήσης ΑΤ91 · 2013-03-30 · Εγχειρίδιο χρήσης at91 1. Πρόλογος ουσία επιλέξαµε τον πιο ισχυρό µικροελεγκτή

Εξοµοιωτής

5.1 Γενικά

Ο εξοµοιωτής του AT91 (προϊόν της εταιρίας KEIL) είναι ένα πλήρες εργαλείο ανάπ-

τυξης και ελέγχου εφαρµογών για διάφορες αρχιτεκτονικές της εταιρείας ARM και τις

υλοποιήσεις τους από πληθώρα εταιρειών. Ο πλήρης εξοµοιωτής αποτελεί καταχωρηµένο

εµπορικό προϊόν υψηλού κόστους. Εσάς σας παρέχεται η δωρεάν έκδοσή του, η οποία

είναι υπεραρκετή για εκπαιδευτικούς σκοπούς. Ο εξοµοιωτής λειτουργεί σε περιβάλλον

Microsoft Windows XP / Vista και διατίθεται και για εγκατάσταση στο δικό σας προσωπικό

υπολογιστή, ακολουθώντας µια διαδικασία εγκατάστασης που περιγράφεται πιο κάτω. Ο

εξοµοιωτής επιτρέπει τη δυνατότητα ανάπτυξης και συγγραφής πηγαίου κώδικα, παραγ-

ωγής εκτελέσιµου κώδικα και αποσφαλµάτωσής του µέσω ϐηµατικής εκτέλεσης σε συν-

ϑήκες εξοµοίωσης που περιγράφουν ακριβώς την αρχιτεκτονική του επεξεργαστή µας. Με

τον εξοµοιωτή είναι δυνατή η ελεγχόµενη ανάπτυξη εφαρµογών χωρίς την ύπαρξη του

AT91, ώστε να είναι δυνατή η συγγραφή των εργασιών και εκτός του εργαστηρίου. Πριν τη

χρήση του πρέπει να γίνουν µια σειρά από ϱυθµίσεις, ώστε να επιλεγεί ο αντίστοιχος µε το

AT91 τύπος επεξεργαστή και τα κατάλληλα εργαλεία µετάφρασης.

5.2 Ρυθµίσεις

Πριν την εγκατάσταση του εξοµοιωτή, είναι απαραίτητη η εγκατάσταση των GNU ερ-

γαλείων (τα οποία έχουν ως προεπιλεγµένο κατάλογο εγκατάστασης τον C:\Cygnus και

προτείνεται να µην αλλαχθεί αν δεν συντρέχουν άλλοι λόγοι). Η εγκατάσταση αυτών γίνε-

ται µε την εκτέλεση του αρχείου gccarm331.exe. Ακολούθως ϑα πρέπει να εκτελέσετε

το αρχείο mdk311.exe, το οποίο ϑα εγκαταστήσει όλο το περιβάλλον του εξοµοιωτή, για

διάφορους υποστηριζόµενους επεξεργαστές και µικροελεγκτές. Στη συνέχεια ϑα πρέπει να

πληροφορήσουµε τον εξοµοιωτή και τα εργαλεία µετάφρασης, για την αρχιτεκτονική την

οποία ϑέλουµε να εξοµοιώσουµε.

΄Ετσι, µετά την έναρξη του εξοµοιωτή, δηµιουργούµε ένα νέο Project επιλέγοντας από

το menu Project την επιλογή New Project... και επιλέγουµε τον κατάλογο όπου ϑα απο-

71

Page 78: Εγχειρίδιο Χρήσης ΑΤ91 · 2013-03-30 · Εγχειρίδιο χρήσης at91 1. Πρόλογος ουσία επιλέξαµε τον πιο ισχυρό µικροελεγκτή

Εγχειρίδιο χρήσης AT91 Κεφάλαιο 5.2 - Ρυθµίσεις

ϑηκευτούν τα αρχεία µας. Ο εξοµοιωτής ϑα προτρέψει στη συνέχεια να επιλέξουµε το

στοχευόµενο επεξεργαστή / µικροελεγκτή για τον οποίο ϑα διαµορφωθεί ο κώδικάς µας.

Επιλέγουµε συνεπώς την εταιρία Atmel και από τους επεξεργαστές που παρουσιάζονται τον

AT91SAM9261(εικόνα Επιλογή επεξεργαστή, κεφ. 5.11, σελ. 72). Στην ερώτηση για το αν

στο project που δηµιουργήθηκε ϑα συµπεριληφθεί και το πρότυπο αρχείο αρχικοποίησης,

επιλέγουµε όχι.

Σχήµα 5.11: Επιλογή επεξεργαστή

Σχήµα 5.12: Εισαγωγή Αρχείων

Για να δηµιουργήσουµε ένα νέο αρχείο πηγαίου κώδικα, επιλέγουµε το New... από

72

Page 79: Εγχειρίδιο Χρήσης ΑΤ91 · 2013-03-30 · Εγχειρίδιο χρήσης at91 1. Πρόλογος ουσία επιλέξαµε τον πιο ισχυρό µικροελεγκτή

5.Εξοµοιωτής Εγχειρίδιο χρήσης AT91

το menu File, το οποίο ϑα ανοίξει ένα παράθυρο πληκτρολόγησης κειµένου. Αποθηκεύ-

ουµε το πηγαίο κώδικα στον κατάλογο που δηµιουργήσαµε για το project, µε την επιλογή

Save As... του menu File και δίνουµε στο αρχείο µας ένα όνοµα, χρησιµοποιώντας πάντα

την κατάληξη .s για τα αρχεία συµβολικής γλώσσας ή .c για τα αρχεία γλώσσας C (για

παράδειγµα, exer1.s, ask2.c κλπ). Μόλις ολοκληρωθεί αυτή η διαδικασία, επιλέγουµε

στο Project workspace το Target 1 και µε δεξί κλικ στο Source Group 1 επιλέγουµε την

επιλογή Add Files to Group ‘‘Source Group 1’’ (εικόνα Εισαγωγή Αρχείων, κεφ. 5.12, σελ.

72). Επιλέγοντας το αρχείο πηγαίου κώδικα που δηµιουργήθηκε αµέσως πριν στο παρά-

ϑυρο που εµφανίζεται και πατώντας το Add, το αρχείο πηγαίου κώδικα που δηµιουργήσαµε

εισάγεται στο Project24. Μετά από αυτό επιλέγουµε το Close.

Σχήµα 5.13: Επιλογή Καταλόγων

Σκοπός στη συνέχεια είναι να µεταφράσουµε το πηγαίο κώδικά µας σε εκτελέσιµο,

µέσω των εργαλείων GNU. Για να ενηµερωθεί ο εξοµοιωτής ότι ως εργαλεία µετάφρασης

ϑέλουµε τα GNU εργαλεία, επιλέγουµε από το Project menu το manage και εκεί το Com­

ponents, Environment, Books. Στην καρτέλα που ανοίγει επιλέγουµε το Folders/Exten­

24Αν εισάγετε αρχείο Assembly επιλέξτε το files of type: Asm source file(*.s; *.src; *.a*), ώστε να εµφανιστεί

το αρχείο.

73

Page 80: Εγχειρίδιο Χρήσης ΑΤ91 · 2013-03-30 · Εγχειρίδιο χρήσης at91 1. Πρόλογος ουσία επιλέξαµε τον πιο ισχυρό µικροελεγκτή

Εγχειρίδιο χρήσης AT91 Κεφάλαιο 5.3 - Χρήση

sions tab (εικόνα Επιλογή Καταλόγων, κεφ. 5.13, σελ. 73). Από τις τρεις πιθανές επιλογές

συνεργαζόµενων εργαλείων µετάφρασης ϑα πρέπει να επιλέξουµε τη τελευταία Use GNU

compiler και να συµπληρώσουµε το πρώτο πεδίο (GNU­Tool­Prefix) µε το κείµενο arm­

uclibc­ και το δεύτερο πεδίο (Cygnus Folder) µε τον κατάλογο που εγκαταστάθηκαν τα

GNU tools (αν χρησιµοποιήσαµε τον προεπιλεγµένο C:\Cygnus δε χρειάζεται να πειράξ-

ουµε τίποτε). Η τελευταία ϱύθµιση αφορά στο µοντέλο του επεξεργαστή που ϑα χρησι-

µοποιηθεί από τον Assembler. Από το Project menu επιλέγουµε την επιλογή Options for

Target. Στη καρτέλα που εµφανίζεται επιλέγουµε το Assembler tab και στο πεδίο Misc

Controls προσθέτουµε το ­mcpu=arm926ej. Αφού ολοκληρωθούν όλα τα παραπάνω ϐή-

µατα, ο εξοµοιωτής µας είναι έτοιµος να παράγει και να εκτελεί κώδικα, ακριβώς όπως και

το AT91.

5.3 Χρήση

Η διαδικασία παραγωγής εκτελέσιµου αρχείου γίνεται µε την επιλογή Build target στο

Project menu. Αυτό ϑα ξεκινήσει τη µετάφραση του προγράµµατος σας και ϑα εµφανίσει

µηνύµατα στην κονσόλα κειµένου που υπάρχει στο κατώτερο µέρος της εφαρµογής. Η

τελευταία γραµµή που ϑα τυπωθεί αναφέρει και το πόσα σφάλµατα συνάντησε κατά τη

µετάφραση ο GNU assembler. Αν υπάρχει έστω και ένα error, δεν ϑα παραχθεί εκτελέσιµο

αρχείο (εικόνα Μηνύµατα, κεφ. 5.14, σελ. 74).

Σχήµα 5.14: Μηνύµατα

Σε περίπτωση σφάλµατος, ο GNU assembler ϑα µας ειδοποιήσει πως το σφάλµα έχει

παρουσιαστεί σε συγκεκριµένη γραµµή και ϑα προσπαθήσει να µας εξηγήσει το είδος του

σφάλµατος (πχ. λανθασµένη εντολή, λανθασµένα σηµεία στίξης). Από τη στιγµή που η

διαδικασία ολοκληρωθεί επιτυχώς, µπορούµε να επιλέξουµε την έναρξη αποσφαλµάτωσης

Start/Stop debug session από το Debug menu. Θα εµφανιστεί ένα νέο παράθυρο το οποίο

περιέχει τα περιεχόµενα της µνήµης (δηλαδή το δυαδικό εκτελέσιµο κώδικα) και ξεκινά

από τη διεύθυνση που υπάρχει στον PC. Ο PC (R15) µαζί µε τους υπόλοιπους καταχωρητές

εµφανίζονται στο αριστερό τµήµα της οθόνης και η τιµή τους µπορεί να αλλαχθεί ανά πάσα

στιγµή µε την επιλογή τους µε το ποντίκι (η επιλογή ϑα εµφανίσει ένα διάστικτο ορθογώνιο

74

Page 81: Εγχειρίδιο Χρήσης ΑΤ91 · 2013-03-30 · Εγχειρίδιο χρήσης at91 1. Πρόλογος ουσία επιλέξαµε τον πιο ισχυρό µικροελεγκτή

5.Εξοµοιωτής Εγχειρίδιο χρήσης AT91

γύρω από τον καταχωρητή, το οποίο σηµαίνει ότι έχει επιλεγεί) και το πάτηµα του κουµ-

πιού F2.

Το πρόγραµµά µας έχει τοποθετηθεί αυτόµατα στη διεύθυνση 0x8000, οπότε για να

αρχίσουµε να το εκτελούµε πρέπει να αλλάξουµε την τιµή του PC σε 0x8000. ΄Ενα κίτρινο

ϐελάκι δίπλα από την γραµµή κώδικα εµφανίζεται για να δείξει την επόµενη προς εκτέ-

λεση εντολή (εικόνα Εκτελέσιµος Κώδικας, κεφ. 5.15, σελ. 75). Για να εκτελεστεί η εντολή

Σχήµα 5.15: Εκτελέσιµος Κώδικας

επιλέγουµε το Step από το Debug menu και παρατηρούµε πως ο PC αυξήθηκε κατά 4

και δείχνει στην επόµενη εντολή. Η επιλογή Step Over του Debug menu κάνει την ίδια

δουλειά µε την Step, αλλά όταν συναντά κλήση εντολών διακλάδωσης δεν τις ακολουθεί

(ϑεωρεί ότι καλείται συνάρτηση, ο εξοµοιωτής εκτελεί τον κώδικα της συνάρτησης και στα-

µατά αµέσως µετά από την επιστροφή της συνάρτησης).

Σαν εξάσκηση στη χρήση του εξοµοιωτή, ας δούµε το ακόλουθο παράδειγµα. ∆ηµιουργή-

στε ένα νέο Project και γράψτε το παρακάτω πρόγραµµα. ∆ώστε του το όνοµα Sample1.s

και προσθέστε το στο Project.

75

Page 82: Εγχειρίδιο Χρήσης ΑΤ91 · 2013-03-30 · Εγχειρίδιο χρήσης at91 1. Πρόλογος ουσία επιλέξαµε τον πιο ισχυρό µικροελεγκτή

Εγχειρίδιο χρήσης AT91 Κεφάλαιο 5.3 - Χρήση

Stack

1 .arm

2 .text

3 .global main

4

5 main:

6 STMDB R13!, R0­R2, R14

7

8 LDR R1, =Values

9 LDR R2, [R1,#0]

10 MOV R2, R2, LSL #0x02

11 STR R2, [R1, #4]

12

13 LDMIA R13!, R0­R2, PC

14

15 .data

16 Values:

17 .word 0x10, 0xFFFFFFFF

Επιλέξτε το Build target από το Project menu και αν όλες οι ϱυθµίσεις είναι σωστές,

ϑα σας εµφανίσει 0 σφάλµατα και 0 ειδοποιήσεις, εκτός από ένα µήνυµα πως ο linker δεν

µπορεί να ϐρει το σύµβολο start και ϑα τοποθετήσει τον κώδικα στη διεύθυνση 0x8000.

Αφού ξεκινήσετε τη διαδικασία αποσφαλµάτωσης και πριν εκτελέσετε τη 1η εντολή,

ϐάλτε τις ακόλουθες τιµές στους καταχωρητές : R0=0xAA, R1=0xBB, R2=0xCC, R13 =

0x301000, R14 = 0x7777 και R15=0x8000. Εχοντας ϐάλει το µετρητή προγράµµατος

στη 1η εντολή του κώδικά µας, είµαστε έτοιµοι να την εκτελέσουµε. Ας δούµε όµως τι

περιµένουµε να γίνει. Η εντολή αποθηκεύει τον R14 και τους τρεις καταχωρητές R2 ­

R0 στο σωρό. Προσέξτε ότι αυτό κάνει επιτακτική την αρχικοποίηση του R13 πριν την

εκτέλεση του προγράµµατός µας, όπως και σε κάθε άλλο πρόγραµµα που χρησιµοποιεί

το σωρό. Σύµφωνα µε τις αναθέσεις µας ο καταχωρητής σωρού δείχνει στη διεύθυνση

0x301000. Ας δούµε λοιπόν αν όντως ϑα εκτελεστεί σωστά αυτή η εντολή κοιτάζοντας τα

περιεχόµενα των ϑέσεων µνήµης γύρω από αυτή τη διεύθυνση. Για να δείτε τα περιεχόµ-

ενα της µνήµης επιλέξτε το Memory Window από το menu View και στο παράθυρο που

εµφανίζεται εισάγετε τη διεύθυνση 0x300FD0 στο πεδίο Address. Εκτελέστε τη 1η εν-

τολή και παρατηρείστε τις αλλαγές στη µνήµη. Ακολούθως, το πρόγραµµά µας, ϕέρνει

τη διεύθυνση Values στον καταχωρητή R1, την τιµή που υπάρχει σε αυτή τη διεύθυνση

µνήµης στον καταχωρητή R2, πολλαπλασιάζει µε 4 αυτή την τιµή και την αποθηκεύει στην

επόµενη διεύθυνση από την αρχική. ΄Ολα αυτά όµως συνδέονται µε µια άλλη περιοχή της

µνήµης, γύρω από τη διεύθυνση 0x8000. Χρησιµοποιώντας ένα δεύτερο παράθυρο µ-

νήµης µεταβείτε συνεπώς στη περιοχή αυτή της µνήµης και εκτελέστε ϐηµατικά το κώδικά

σας µέχρι την γραµµή 9. Θα δείτε κατ’ αυτό το τρόπο τη διεύθυνση της ετικέτας Values

76

Page 83: Εγχειρίδιο Χρήσης ΑΤ91 · 2013-03-30 · Εγχειρίδιο χρήσης at91 1. Πρόλογος ουσία επιλέξαµε τον πιο ισχυρό µικροελεγκτή

5.Εξοµοιωτής Εγχειρίδιο χρήσης AT91

που έχει αποθηκευτεί στον καταχωρητή R1 και η τιµή της είναι 0x8120. Για να δείτε

τα περιεχόµενα της µνήµης εκεί επιλέξτε το 3ο Memory Window και στο παράθυρο που

εµφανίζεται εισάγετε την διεύθυνση αυτή στο πεδίο Address (εικόνα Μνήµη, κεφ. 5.16,

σελ. 77).

Σχήµα 5.16: Μνήµη

Θα παρατηρήσετε πως στην πάνω-αριστερή πλευρά του παραθύρου υπάρχουν τα 2

words του προγράµµατός µας. Εκτελώντας ϐηµατικά και τα επόµενα ϐήµατα, µέχρι τη

γραµµή 13, ϑα παρατηρήσετε πως τα περιεχόµενα της διεύθυνσης 0x8124 ϑα πάρουν

την τιµή 0x00000040. Εκτός του να παρατηρείτε τα δεδοµένα που αποθηκεύονται στη

µνήµη, µπορείτε και να αλλάξετε την τιµή τους, επιλέγοντας το κελί µνήµης που επι-

ϑυµείτε και µε δεξί κλικ επιλέγοντας Modify Memory. Επίσης, µπορείτε να αλλάξετε τον

τρόπο παρουσίασης τους (σε µορφή byte, int κλπ) επιλέγοντας από το pop­up menu που

εµφανίζεται µε δεξί κλικ στο Memory window, µια από τις επιλογές unsigned, signed, dec­

imal κλπ. Μπορείτε συνεπώς ϐάζοντας διαφορετική αρχική τιµή στη ϑέση µνήµης 0x8120

και επαναφέροντας τον PC στη 1η εντολή (ϐάζοντάς του τιµή 0x8000) να δοκιµάσετε το πως

συµπεριφέρεται το πρόγραµµα και για άλλες τιµές. Η τελευταία εντολή τέλος αποκαθιστά

τα αρχικά περιεχόµενα των καταχωρητών που αποθηκεύσαµε στο σωρό και επαναφέρει το

δείκτη σωρού στην αρχική τιµή.

77

Page 84: Εγχειρίδιο Χρήσης ΑΤ91 · 2013-03-30 · Εγχειρίδιο χρήσης at91 1. Πρόλογος ουσία επιλέξαµε τον πιο ισχυρό µικροελεγκτή

Εγχειρίδιο χρήσης AT91 Κεφάλαιο 5.3 - Χρήση

78

Page 85: Εγχειρίδιο Χρήσης ΑΤ91 · 2013-03-30 · Εγχειρίδιο χρήσης at91 1. Πρόλογος ουσία επιλέξαµε τον πιο ισχυρό µικροελεγκτή

Instruction Set

Σε αυτό το κεφάλαιο παρουσιάζονται οι πιο συχνά χρησιµοποιούµενες εντολές του

επεξεργαστή µας. Το υποσύνολο εντολών που παρουσιάζεται υπερκαλύπτει τις ανάγκες του

εργαστηρίου προγραµµατισµού σε συµβολική γλώσσα. Για κάθε εντολή δίνεται η γενική

µορφή της, µια σύντοµη περιγραφή για τη λειτουργία της, αναλύονται οι διαφορετικοί

παράµετροι που µπορεί να δεχτεί και παρέχεται σύντοµος ψευδοκώδικας που περιγράφει

λεπτοµερώς τις ενέργειες που εκτελεί.

79

Page 86: Εγχειρίδιο Χρήσης ΑΤ91 · 2013-03-30 · Εγχειρίδιο χρήσης at91 1. Πρόλογος ουσία επιλέξαµε τον πιο ισχυρό µικροελεγκτή

Εγχειρίδιο χρήσης AT91 Κεφάλαιο 6.1 - Αριθµητικές Εντολές

6.1 Αριθµητικές Εντολές

6.1.1 ADC

31 28 27 26 25 24 23 22 21 20 19 16 15 12 11 0

cond 0 0 Ι 0 1 0 1 S Rn Rd Shifter operand

Η εντολή ADC (Add with Carry) προσθέτει την έξοδο του ολισθητή και το Carry bit στην τιµή του Rn. Απο-

ϑηκεύει το αποτέλεσµα στον καταχωρητή Rd. Οι σηµαίες κατάστασης ανανεώνονται κατ’ επιλογή, ανάλογα µε

το αποτέλεσµα.

Σύνταξη

ADC<cond>S < Rd >, < Rn >, < shifter_operand >

<cond> Περιέχει τη συνθήκη ϐάσει της οποίας εκτελείται η εντολή. Αν δεν έχει

συµπληρωθεί, η εντολή εκτελείται πάντα.

S ΄Οταν υπάρχει ενεργοποιεί την ανανέωση των σηµαιών κατάστασης µε ϐάση

το αποτέλεσµα της εντολής. ∆υο τύποι ανανέωσης µπορούν να συµβούν :

• Αν ο Rd δεν είναι ο R15, οι σηµαίες κατάστασης N & Z τίθενται

ανάλογα µε το αποτέλεσµα της πράξης και οι σηµαίες C & V ανάλο-

γα µε το αν έχει δηµιουργηθεί κρατούµενο (υπερχείληση κατά µη-

προσηµασµένη πρόσθεση) ή προσηµασµένη υπερχείλιση. Οι υπ-

όλοιπες σηµαίες κατάστασης δεν επηρρεάζονται.

• Αν ο Rd είναι ο R15, ο SPSR του ενεργού processor mode αντιγράφε-

ται στον CPSR. Αν εκτελεστεί ενώ είµαστε σε User ή System mode

δηµιουργείται σφάλµα, επειδή αυτά τα modes δεν έχουν SPSR.

< Rd > Ορίζει τον καταχωρητή που ϑα αποθηκευτεί το αποτέλεσµα.

< Rn > Ορίζει τον καταχωρητή που περιέχει τον πρώτο όρο της πρόσθεσης.

< shifter_operand > Ορίζει τον δεύτερο όρο της πρόσθεσης (περιγραφή στο κεφ. 2.3.2, σελ. 2.3.2).

Λειτουργία

Αν Ισχύειcond τότε

Rd = Rn + shifter_operand + C_flag

Αν S == 1 και Rd == 15 τότε

CPSR = SPSR

∆ιαφορετικά αν S == 1 τότε

N_flag = Rd[31]

Z_flag = (αν Rd == 0 τότε 1 διαφορετικά 0)

C_flag = (Κρατούµενο πρόσθεσης)

V_flag = (Υπερχείλιση πρόσθεσης)

Χρήση

Η εντολή αυτή συνήθως χρησιµοποιείται για την υλοποίηση προσθέσεων ανάµεσα σε όρους που έχουν εύρος

µεγαλύτερο από 32 bits. Για παράδειγµα, οι εντολές :

ADDS R4, R0, R2 @R0 + R2 − > R4

ADC R5, R1, R3 @R1 + R3 + Carry − > R5

εκτελούν την πρόσθεση των 64bit αριθµών R0 + R1 * 232 µε R2 + R3 * 232. Αρχικά προσθέτουµε τα 32

λιγότερο σηµαντικά bits, αποθηκεύουµε το κρατούµενο και το διαδίδουµε στην επόµενη πρόσθεση.

80

Page 87: Εγχειρίδιο Χρήσης ΑΤ91 · 2013-03-30 · Εγχειρίδιο χρήσης at91 1. Πρόλογος ουσία επιλέξαµε τον πιο ισχυρό µικροελεγκτή

6.Instruction Set Εγχειρίδιο χρήσης AT91

6.1.2 ADD

31 28 27 26 25 24 23 22 21 20 19 16 15 12 11 0

cond 0 0 Ι 0 1 0 0 S Rn Rd Shifter operand

Η εντολή ADD προσθέτει το αποτέλεσµα του ολισθητή στην τιµή του Rn και αποθηκεύει το αποτέλεσµα στον

καταχωρητή Rd. σηµαίες κατάστασης ανανεώνονται κατ’ επιλογή, ανάλογα µε το αποτέλεσµα.

Σύνταξη

ADD<cond>S < Rd >, < Rn >,< shifter_operand >

<cond> Περιέχει τη συνθήκη ϐάσει της οποίας εκτελείται η εντολή. Αν δεν έχει

συµπληρωθεί, η εντολή εκτελείται πάντα.

S ΄Οταν υπάρχει ενεργοποιεί την ανανέωση των σηµαιών κατάστασης ϐάσει του

αποτελέσµατος της εντολής. ∆υο τύποι ανανέωσης µπορούν να συµβούν :

• Αν ο Rd δεν είναι ο R15, οι σηµαίες κατάστασης N & Z τίθενται

ανάλογα µε το αποτέλεσµα της πράξης και οι σηµαίες C & V ανάλο-

γα µε το αν έχει δηµιουργηθεί κρατούµενο (υπερχείληση κατά µη-

προσηµασµένη πρόσθεση) ή προσηµασµένη υπερχείλιση. Οι υπ-

όλοιπες σηµαίες κατάστασης δεν επηρρεάζονται.

• Αν ο Rd είναι ο R15, ο SPSR του ενεργού processor mode αντιγράφε-

ται στον CPSR. Αν εκτελεστεί ενώ είµαστε σε User ή System mode

δηµιουργείται σφάλµα, επειδή αυτά τα modes δεν έχουν SPSR.

< Rd > Ορίζει τον καταχωρητή που ϑα αποθηκευτεί το αποτέλεσµα.

< Rn > Ορίζει τον καταχωρητή που περιέχει τον πρώτο όρο της πρόσθεσης.

< shifter_operand > Ορίζει τον δεύτερο όρο της πρόσθεσης (περιγραφή στο κεφ. 2.3.2, σελ. 2.3.2).

Λειτουργία

Αν Ισχύειcond τότε

Rd = Rn + shifter_operand

Αν S == 1 και Rd == 15 τότε

CPSR = SPSR

∆ιαφορετικά αν S == 1 τότε

N_flag = Rd[31]

Z_flag = (αν Rd == 0 τότε 1 διαφορετικά 0)

C_flag = (Κρατούµενο πρόσθεσης)

V_flag = (Υπερχείλιση πρόσθεσης)

Χρήση

Η εντολή αυτή χρησιµοποιείται για την υλοποίηση προσθέσεων ανάµεσα σε όρους µε εύρος µικρότερο ή ίσο

των 32 bits.

81

Page 88: Εγχειρίδιο Χρήσης ΑΤ91 · 2013-03-30 · Εγχειρίδιο χρήσης at91 1. Πρόλογος ουσία επιλέξαµε τον πιο ισχυρό µικροελεγκτή

Εγχειρίδιο χρήσης AT91 Κεφάλαιο 6.1 - Αριθµητικές Εντολές

6.1.3 AND

31 28 27 26 25 24 23 22 21 20 19 16 15 12 11 0

cond 0 0 Ι 0 0 0 0 S Rn Rd Shifter operand

Η εντολή AND εκτελεί τη λογική πράξη ΚΑΙ ανάµεσα στα ψηφία του Rn και του αποτελέσµατος του ολισθητή

και αποθηκεύει το αποτέλεσµα στον καταχωρητή Rd. Οι σηµαίες κατάστασης ανανεώνονται κατ’ επιλογή,

ανάλογα µε το αποτέλεσµα.

Σύνταξη

AND<cond>S < Rd >, < Rn >,< shifter_operand >

<cond> Περιέχει τη συνθήκη ϐάσει της οποίας εκτελείται η εντολή. Αν δεν έχει

συµπληρωθεί, η εντολή εκτελείται πάντα.

S ΄Οταν υπάρχει ενεργοποιεί την ανανέωση του CPSR µε ϐάση το αποτέλεσµα

της εντολής. ∆υο τύποι ανανέωσης µπορούν να συµβούν :

• Αν ο Rd δεν είναι ο R15, οι σηµαίες κατάστασης Ν & Ζ τίθενται ανάλο-

γα µε το αποτέλεσµα της πράξης και η σηµαία C ανάλογα µε το αν

έχει δηµιουργηθεί κρατούµενο από ολίσθηση. Οι υπόλοιπες σηµαίες

δεν επηρρεάζονται.

• Αν ο Rd είναι ο R15, ο SPSR του ενεργού processor mode αντιγράφε-

ται στον CPSR. Αν εκτελεστεί ενώ είµαστε σε User ή System mode

δηµιουργείται σφάλµα, επειδή αυτά τα modes δεν έχουν SPSR.

< Rd > Ορίζει τον καταχωρητή που ϑα αποθηκευτεί το αποτέλεσµα.

< Rn > Ορίζει τον καταχωρητή που περιέχει τον πρώτο όρο της λογικής πράξης.

< shifter_operand > Ορίζει τον δεύτερο όρο της λογικής πράξης (περιγραφή στο κεφ. 2.3.2, σελ.

2.3.2).

Λειτουργία

Αν Ισχύειcond τότε

Rd = Rn AND shifter_operand

Αν S == 1 και Rd == 15 τότε

CPSR = SPSR

∆ιαφορετικά αν S == 1 τότε

N_flag = Rd[31]

Z_flag = (αν Rd == 0 τότε 1 διαφορετικά 0)

C_flag = (Bit από ολίσθηση (αν έχει γίνει), αλλιώς 0)

V_flag = (Ανεπηρέαστο)

Χρήση

Με την εντολή AND µπορούµε πολύ εύκολα να αποµονώσουµε συγκεκριµένα ψηφία ενός καταχωρητή. Για

παράδειγµα, µε τις εντολές :

MOV R4, #0x82 @#0x82 − > R4

AND R5, R5, R4 @R5 AND R4 − > R5

αποµονώνουµε τα bits 7 και 1 (η αρίθµηση των bits ξεκινά από το 0, το οποίο αντιστοιχεί το λιγότερο σηµαντικό)

και ελέγχουµε αν έχουν την τιµή 125.

25Το λογικό AND δύο ψηφίων µε το ένα να είναι 1, παρέχει αποτέλεσµα ίσο µε την τιµή του άλλου ψηφίου.

82

Page 89: Εγχειρίδιο Χρήσης ΑΤ91 · 2013-03-30 · Εγχειρίδιο χρήσης at91 1. Πρόλογος ουσία επιλέξαµε τον πιο ισχυρό µικροελεγκτή

6.Instruction Set Εγχειρίδιο χρήσης AT91

6.1.4 BIC

31 28 27 26 25 24 23 22 21 20 19 16 15 12 11 0

cond 0 0 Ι 1 1 1 0 S Rn Rd Shifter operand

Η εντολή BIC (Bit Clear) εκτελεί λογικό AND των ψηφίων του Rn και του συµπληρώµατος της εξόδου του

ολισθητή και αποθηκεύει το αποτέλεσµα στον καταχωρητή Rd. Οι σηµαίες κατάστασης ανανεώνονται κατ’

επιλογή, ανάλογα µε το αποτέλεσµα.

Σύνταξη

BIC<cond>S < Rd >, < Rn >, < shifter_operand >

<cond> Περιέχει τη συνθήκη ϐάσει της οποίας εκτελείται η εντολή. Αν δεν έχει

συµπληρωθεί, η εντολή εκτελείται πάντα.

S ΄Οταν υπάρχει ενεργοποιεί την ανανέωση των σηµαιών κατάστασης µε ϐάση

το αποτέλεσµα της εντολής. ∆υο τύποι ανανέωσης µπορούν να συµβούν :

• Αν ο Rd δεν είναι ο R15, οι σηµαίες Ν & Ζ τίθενται ανάλογα µε

το αποτέλεσµα της πράξης και η σηµαία C ανάλογα µε το αν έχει

δηµιουργηθεί κρατούµενο από ολίσθηση. Οι υπόλοιπες σηµαίες δεν

επηρρεάζονται.

• Αν ο Rd είναι ο R15, ο SPSR του ενεργού processor mode αντιγράφε-

ται στον CPSR. Αν εκτελεστεί ενώ είµαστε σε User ή System mode

δηµιουργείται σφάλµα, επειδή αυτά τα modes δεν έχουν SPSR.

< Rd > Ορίζει τον καταχωρητή που ϑα αποθηκευτεί το αποτέλεσµα.

< Rn > Ορίζει τον καταχωρητή που περιέχει τον πρώτο όρο της λογικής πράξης.

< shifter_operand > Ορίζει τον δεύτερο όρο της λογικής πράξης (περιγραφή στο κεφ. 2.3.2, σελ.

2.3.2).

Λειτουργία

Αν Ισχύειcond τότε

Rd = Rn AND NOT shifter_operand

Αν S == 1 και Rd == 15 τότε

CPSR = SPSR

∆ιαφορετικά αν S == 1 τότε

N_flag = Rd[31]

Z_flag = (αν Rd == 0 τότε 1 διαφορετικά 0)

C_flag = (Bit από ολίσθηση (αν έχει γίνει), αλλιώς 0)

V_flag = (Ανεπηρέαστο)

Χρήση

Η εντολή αυτή χρησιµοποιείται όταν ϑέλουµε να κάνουµε 0 συγκεκριµένα ψηφία ενός καταχωρητή. Για

παράδειγµα, η εντολή :

BIC R5, R5, #0x44 @R5 AND NOT #0x44 − > R5

καθαρίζει τα bits 6 και 2 από τον καταχωρητή R5.

83

Page 90: Εγχειρίδιο Χρήσης ΑΤ91 · 2013-03-30 · Εγχειρίδιο χρήσης at91 1. Πρόλογος ουσία επιλέξαµε τον πιο ισχυρό µικροελεγκτή

Εγχειρίδιο χρήσης AT91 Κεφάλαιο 6.1 - Αριθµητικές Εντολές

6.1.5 CLZ

31 28 27 26 25 24 23 22 21 20 19 16 15 12 11 8 7 6 5 4 3 0

cond 0 0 0 1 0 1 1 0 0 0 0 0 Rd 0 0 0 0 0 0 0 1 Rm

Η εντολή CLZ (Count Leading Zeros) επιστρέφει τον αριθµό των συνεχόµενων 0, που υπάρχουν στα πιο

σηµαντικά ψηφία του Rm. Το αποτέλεσµα το αποθηκεύει στον καταχωρητή Rd.

Σύνταξη

CLZ<cond> < Rd >, < Rm >

<cond> Περιέχει τη συνθήκη ϐάσει της οποίας εκτελείται η εντολή. Αν δεν έχει συµπληρωθεί, η

εντολή εκτελείται πάντα.

< Rd > Ορίζει τον καταχωρητή που ϑα αποθηκευτεί το αποτέλεσµα.

< Rm > Ορίζει τον καταχωρητή, στον οποίο ϑα γίνει η µέτρηση των 0.

Λειτουργία

Αν Ισχύειcond τότε

Αν Rm == 0 τότε

Rd = 32

∆ιαφορετικά

Rd = 31 ­ #(bit position of most significant 1)

Χρήση

Η εντολή αυτή συνήθως χρησιµοποιείται όταν ϑέλουµε να κανονικοποιήσουµε ένα καταχωρητή, έτσι ώστε το

περισσότερο σηµαντικό ‘1’ του να εµφανίζεται στην ϑέση 31, την πιο σηµαντική ϑέση. Τη χηρσιµοποιούµε

δηλαδή για να καθορίσουµε το πόσες ϑέσεις αριστερής ολίσθησης χρειαζόµαστε. Για παράδειγµα :

CLZ R5, R4 @ leading_zeros(R4) − > R5

MOV R4, R4, LSL R5 @ R4 * 2R5− > R4

αν ο R4 περιέχει την τιµή 0x49, ο R5 ϑα αποθηκεύσει την τιµή 25 (δυαδική αναπαράσταση του 0x49 είναι

00000000_00000000_00000000_01001001) και µετά την ολίσθηση ϑα γίνει 0x92000000.

84

Page 91: Εγχειρίδιο Χρήσης ΑΤ91 · 2013-03-30 · Εγχειρίδιο χρήσης at91 1. Πρόλογος ουσία επιλέξαµε τον πιο ισχυρό µικροελεγκτή

6.Instruction Set Εγχειρίδιο χρήσης AT91

6.1.6 CMN

31 28 27 26 25 24 23 22 21 20 19 16 15 12 11 0

cond 0 0 Ι 1 0 1 1 1 Rn 0 0 0 0 Shifter operand

Η εντολή CMN (Compare Negative) εκτελεί σύγκριση ανάµεσα στον Rn και στο αντίθετο (σε αριθµητική

συµπληρώµατος ως προς 2) αποτέλεσµα του ολισθητή. Οι σηµαίες κατάστασης ενηµερώνονται πάντα, ανάλο-

γα µε το αποτέλεσµα της σύγκρισης (η σύγκριση υλοποιείται µε πρόσθεση).

Σύνταξη

CMN<cond> < Rn >,< shifter_operand >

<cond> Περιέχει τη συνθήκη ϐάσει της οποίας εκτελείται η εντολή. Αν δεν έχει

συµπληρωθεί, η εντολή εκτελείται πάντα.

< Rn > Ορίζει τον καταχωρητή που περιέχει τον πρώτο όρο της σύγκρισης.

< shifter_operand > Ορίζει τον δεύτερο όρο της σύγκρισης (περιγραφή στο κεφ. 2.3.2, σελ. 2.3.2).

Λειτουργία

Αν Ισχύει cond τότε

alu_out = Rn + shifter_operand

N_flag = alu_out[31]

Z_flag = (αν alu_out == 0 τότε 1 διαφορετικά 0)

C_flag = (Κρατούµενο πρόσθεσης)

V_flag = (Υπερχείληση πρόσθεσης)

Χρήση

Η εντολή αυτή χρησιµοποιείται όταν ϑέλουµε να ελέγξουµε το είδος του αποτελέσµατος µιας πρόσθεσης (αν

δηλαδή προκαλεί υπερχείλιση, κρατούµενο κλπ), ενώ δεν είναι απαραίτητη η αποθήκευση του αποτελέσµατος.

85

Page 92: Εγχειρίδιο Χρήσης ΑΤ91 · 2013-03-30 · Εγχειρίδιο χρήσης at91 1. Πρόλογος ουσία επιλέξαµε τον πιο ισχυρό µικροελεγκτή

Εγχειρίδιο χρήσης AT91 Κεφάλαιο 6.1 - Αριθµητικές Εντολές

6.1.7 CMP

31 28 27 26 25 24 23 22 21 20 19 16 15 12 11 0

cond 0 0 Ι 1 0 1 0 1 Rn 0 0 0 0 Shifter operand

Η εντολή CMP (Compare) εκτελεί σύγκριση ανάµεσα στον Rn και το αποτέλεσµα του ολισθητή. Οι σηµαίες

κατάστασης ενηµερώνονται πάντα, ανάλογα µε το αποτέλεσµα της σύγκρισης (η σύγκριση υλοποιείται µε

αφαίρεση).

Σύνταξη

CMP<cond> < Rn >, < shifter_operand >

<cond> Περιέχει τη συνθήκη ϐάσει της οποίας εκτελείται η εντολή. Αν δεν έχει

συµπληρωθεί, η εντολή εκτελείται πάντα.

< Rn > Ορίζει τον καταχωρητή που περιέχει τον πρώτο όρο της σύγκρισης.

< shifter_operand > Ορίζει τον δεύτερο όρο της σύγκρισης (περιγραφή στο κεφ. 2.3.2, σελ. 2.3.2).

Λειτουργία

Αν Ισχύει cond τότε

alu_out = Rn ­ shifter_operand

N_flag = alu_out[31]

Z_flag = (αν alu_out == 0 τότε 1 διαφορετικά 0)

C_flag = (NOT Κρατούµενο αφαίρεσης)

V_flag = (Υπερχείληση αφαίρεσης)

86

Page 93: Εγχειρίδιο Χρήσης ΑΤ91 · 2013-03-30 · Εγχειρίδιο χρήσης at91 1. Πρόλογος ουσία επιλέξαµε τον πιο ισχυρό µικροελεγκτή

6.Instruction Set Εγχειρίδιο χρήσης AT91

6.1.8 EOR

31 28 27 26 25 24 23 22 21 20 19 16 15 12 11 0

cond 0 0 Ι 0 0 0 1 S Rn Rd Shifter operand

Η εντολή EOR εκτελεί τη λογική πράξη ΑΠΟΚΛΕΙΣΤΙΚΟ-Η του Rn µε το αποτέλεσµα του ολισθητή και απο-

ϑηκεύει το αποτέλεσµα στον καταχωρητή Rd. Οι σηµαίες κατάστασης ενηµερώνονται κατ’ επιλογή, ανάλογα

µε το αποτέλεσµα.

Σύνταξη

EOR<cond>S < Rd >, < Rn >, < shifter_operand >

<cond> Περιέχει τη συνθήκη ϐάσει της οποίας εκτελείται η εντολή. Αν δεν έχει

συµπληρωθεί, η εντολή εκτελείται πάντα.

S ΄Οταν υπάρχει ενεργοποιεί την ανανέωση των σηµαιών κατάστασης µε ϐάση

το αποτέλεσµα της εντολής. ∆υο τύποι ανανέωσης µπορούν να συµβούν :

• Αν ο Rd δεν είναι ο R15, οι σηµαίες Ν & Ζ τίθενται ανάλογα µε

το αποτέλεσµα της πράξης και η σηµαία C ανάλογα µε το αν έχει

δηµιουργηθεί κρατούµενο από ολίσθηση. Οι υπόλοιπες σηµαίες δεν

επηρρεάζονται.

• Αν ο Rd είναι ο R15, ο SPSR του ενεργού processor mode αντιγράφε-

ται στον CPSR. Αν εκτελεστεί ενώ είµαστε σε User ή System mode

δηµιουργείται σφάλµα, επειδή αυτά τα modes δεν έχουν SPSR.

< Rd > Ορίζει τον καταχωρητή που ϑα αποθηκευτεί το αποτέλεσµα.

< Rn > Ορίζει τον καταχωρητή που περιέχει τον πρώτο όρο της λογικής πράξης.

< shifter_operand > Ορίζει τον δεύτερο όρο της λογικής πράξης (περιγραφή στο κεφ. 2.3.2, σελ.

2.3.2).

Λειτουργία

Αν Ισχύειcond τότε

Rd = Rn OR shifter_operand

Αν S == 1 και Rd == 15 τότε

CPSR = SPSR

∆ιαφορετικά αν S == 1 τότε

N_flag = Rd[31]

Z_flag = (αν Rd == 0 τότε 1 διαφορετικά 0)

C_flag = (Bit από ολίσθηση (αν έχει γίνει), αλλιώς 0)

V_flag = (Ανεπηρέαστο)

Χρήση

Με την εντολή EOR αντιστρέφουµε συγκεκριµένα ψηφία ενός καταχωρητή. Για παράδειγµα οι :

MOV R4, #0xC0 @#0xC0 − > R4

EOR R5, R5, R4 @R5 XOR R4 − > R5

αντιστρέφουν τα ψηφία 7 και 6 (η αρίθµηση των ψηφίων ξεκινά από το 0, το οποίο αντιστοιχεί το λιγότερο

σηµαντικό) του καταχωρητή R526.

26Αν εκτελεστεί η πράξη EOR ανάµεσα σε 2 ψηφία µε το ένα είναι 0, το αποτέλεσµα ϑα είναι ίσο µε την τιµή

του άλλου bit. Αν το ένα ψηφίο είναι 1, το αποτέλεσµα ϑα είναι το αντίθετο του άλλου.

87

Page 94: Εγχειρίδιο Χρήσης ΑΤ91 · 2013-03-30 · Εγχειρίδιο χρήσης at91 1. Πρόλογος ουσία επιλέξαµε τον πιο ισχυρό µικροελεγκτή

Εγχειρίδιο χρήσης AT91 Κεφάλαιο 6.1 - Αριθµητικές Εντολές

6.1.9 MLA

31 28 27 26 25 24 23 22 21 20 19 16 15 12 11 8 7 6 5 4 3 0

cond 0 0 0 0 0 0 1 S Rd Rn Rs 1 0 0 1 Rm

Η εντολή MLA (MuLtiply and Accumulate) πολλαπλασιάζει προσηµασµένα ή µη προσηµασµένα έντελα για να

παράγει αποτέλεσµα εύρους 32 ψηφίων, το οποίο προστίθεται σε τρίτο όρισµα, και αποθηκεύει το αποτέλεσµα

στον καταχωρητή Rd. Οι σηµαίες κατάστασης ανανεώνονται κατ’ επιλογή, ανάλογα µε το αποτέλεσµα.

Σύνταξη

MLA<cond>S < Rd >, < Rm >, < Rs >, < Rn >

<cond> Περιέχει τη συνθήκη ϐάσει της οποίας εκτελείται η εντολή. Αν δεν έχει συµπληρωθεί, η

εντολή εκτελείται πάντα.

S ΄Οταν υπάρχει ενεργοποιεί την ανανέωση των σηµαιών κατάστασης µε ϐάση το αποτέ-

λεσµα της εντολής. Επηρρεάζονται µόνο οι σηµαίες Ν & Ζ.

< Rd > Ορίζει τον καταχωρητή που ϑα αποθηκευτεί το αποτέλεσµα.

< Rm > Ορίζει τον καταχωρητή που περιέχει τον πρώτο όρο του πολλαπλασιασµού.

< Rs > Ορίζει τον καταχωρητή που περιέχει τον δεύτερο όρο του πολλαπλασιασµού.

< Rn > Ορίζει τον καταχωρητή που περιέχει την τιµή που ϑα προστεθεί στο γινόµενο του πολ-

λαπλασιασµού.

Λειτουργία

Αν Ισχύειcond τότε

Rd = (Rm * Rs) + Rn

Αν S == 1 τότε

N_flag = Rd[31]

Z_flag = (αν Rd == 0 τότε 1 διαφορετικά 0)

C_flag = (Ανεπηρέαστο)

V_flag = (Ανεπηρέαστο)

Σηµειώσεις

R15 Η χρήση του R15 στη ϑέση των < Rd >,< Rm >, < Rs >, < Rn > ϑα

προκαλέσει απρόβλεπτα αποτελέσµατα.

Rd & Rm Η χρήση του ίδιου καταχωρητή για τον < Rd > & < Rm > ϑα προκαλέσει

απρόβλεπτα αποτελέσµατα.

Πρόσηµο Επειδή η εντολή MLA παράγει µόνο τα 32 λιγότερα σηµαντικά ψηφία του

64ψήφιου γινοµένου, ο πολλαπλασιασµός ϑα δώσει τα ίδια αποτελέσµατα

για προσηµασµένους και µη προσηµασµένους αριθµούς.

88

Page 95: Εγχειρίδιο Χρήσης ΑΤ91 · 2013-03-30 · Εγχειρίδιο χρήσης at91 1. Πρόλογος ουσία επιλέξαµε τον πιο ισχυρό µικροελεγκτή

6.Instruction Set Εγχειρίδιο χρήσης AT91

6.1.10 MUL

31 28 27 26 25 24 23 22 21 20 19 16 15 12 11 8 7 6 5 4 3 0

cond 0 0 0 0 0 0 0 S Rd 0 0 0 0 Rs 1 0 0 1 Rm

Η εντολή MUL (MULtiply) πολλαπλασιάζει προσηµασµένα ή µη προσηµασµένα έντελα για να παράγει αποτέ-

λεσµα εύρους 32 ψηφίων και αποθηκεύει το αποτέλεσµα στον καταχωρητή Rd. Οι σηµαίες κατάστασης

ανανεώνονται κατ’ επιλογή, ανάλογα µε το αποτέλεσµα.

Σύνταξη

MUL<cond>S < Rd >, < Rm >, < Rs >

<cond> Περιέχει τη συνθήκη ϐάσει της οποίας εκτελείται η εντολή. Αν δεν έχει συµπληρωθεί, η

εντολή εκτελείται πάντα.

S ΄Οταν υπάρχει ενεργοποιεί την ανανέωση των σηµαιών κατάστασης µε ϐάση το αποτέ-

λεσµα της εντολής. Επηρρεάζονται µόνο οι σηµαίες Ν & Ζ.

< Rd > Ορίζει τον καταχωρητή που ϑα αποθηκευτεί το αποτέλεσµα.

< Rm > Ορίζει τον καταχωρητή που περιέχει τον πρώτο όρο του πολλαπλασιασµού.

< Rs > Ορίζει τον καταχωρητή που περιέχει τον δεύτερο όρο του πολλαπλασιασµού.

Λειτουργία

Αν Ισχύειcond τότε

Rd = (Rm * Rs)

Αν S == 1 τότε

N_flag = Rd[31]

Z_flag = (αν Rd == 0 τότε 1 διαφορετικά 0)

C_flag = (Ανεπηρέαστο)

V_flag = (Ανεπηρέαστο)

Σηµειώσεις

R15 Η χρήση του R15 στη ϑέση των < Rd >, < Rm >, < Rs > ϑα προκαλέσει

απρόβλεπτα αποτελέσµατα.

Rd & Rm Η χρήση του ίδιου καταχωρητή για τον < Rd > & < Rm > ϑα προκαλέσει

απρόβλεπτα αποτελέσµατα.

Πρόσηµο Επειδή η εντολή MUL παράγει µόνο τα 32 λιγότερα σηµαντικά ψηφία του

64ψήφιου γινοµένου, ο πολλαπλασιασµός ϑα δώσει τα ίδια αποτελέσµατα

για προσηµασµένους και µη προσηµασµένους αριθµούς.

89

Page 96: Εγχειρίδιο Χρήσης ΑΤ91 · 2013-03-30 · Εγχειρίδιο χρήσης at91 1. Πρόλογος ουσία επιλέξαµε τον πιο ισχυρό µικροελεγκτή

Εγχειρίδιο χρήσης AT91 Κεφάλαιο 6.1 - Αριθµητικές Εντολές

6.1.11 ORR

31 28 27 26 25 24 23 22 21 20 19 16 15 12 11 0

cond 0 0 Ι 1 1 0 0 S Rn Rd Shifter operand

Η εντολή ORR εκτελεί το λογικό Η ανάµεσα στον Rn και στο αποτέλεσµα του ολισθητή και αποθηκεύει το

αποτέλεσµα στον καταχωρητή Rd. Οι σηµαίες κατάστασης ανανεώνονται κατ’ επιλογή, ανάλογα µε το αποτέ-

λεσµα.

Σύνταξη

ORR<cond>S < Rd >, < Rn >, < shifter_operand >

<cond> Περιέχει τη συνθήκη ϐάσει της οποίας εκτελείται η εντολή. Αν δεν έχει

συµπληρωθεί, η εντολή εκτελείται πάντα.

S ΄Οταν υπάρχει ενεργοποιεί την ανανέωση των σηµαιών κατάστασης µε ϐάση

το αποτέλεσµα της εντολής. ∆υο τύποι ανανέωσης µπορούν να συµβούν :

• Αν ο Rd δεν είναι ο R15, οι σηµαίες bits N & Z τίθενται ανάλογα µε

το αποτέλεσµα της πράξης και η σηµαία C ανάλογα µε το κρατούµενο

ολίσθησης.

• Αν ο Rd είναι ο R15, ο SPSR του ενεργού processor mode αντιγράφε-

ται στον CPSR. Αν εκτελεστεί ενώ είµαστε σε User ή System mode

δηµιουργείται σφάλµα, επειδή αυτά τα modes δεν έχουν SPSR.

< Rd > Ορίζει τον καταχωρητή που ϑα αποθηκευτεί το αποτέλεσµα.

< Rn > Ορίζει τον καταχωρητή που περιέχει τον πρώτο όρο της λογικής πράξης.

< shifter_operand > Ορίζει τον δεύτερο όρο της λογικής πράξης (περιγραφή στο κεφ. 2.3.2, σελ.

2.3.2).

Λειτουργία

Αν Ισχύειcond τότε

Rd = Rn OR shifter_operand

Αν S == 1 και Rd == 15 τότε

CPSR = SPSR

∆ιαφορετικά αν S == 1 τότε

N_flag = Rd[31]

Z_flag = (αν Rd == 0 τότε 1 διαφορετικά 0)

C_flag = (Bit από ολίσθηση (αν έχει γίνει), αλλιώς 0)

V_flag = (Ανεπηρέαστο)

Χρήση

Με την εντολή ORR µπορούµε πολύ εύκολα να ϑέσουµε συγκεκριµένα ψηφία σε ένα καταχωρητή. Για

παράδειγµα, οι :

MOV R4, #0xC0 @#0xC0 − > R4

ORR R5, R5, R4 @R5 ORR R4 − > R5

ϑέτουν (κάνουν 1) τα ψηφία 7 και 6 (η αρίθµηση των bits ξεκινά από το 0, το οποίο αντιστοιχεί το λιγότερο

σηµαντικό) του καταχωρητή R5.

90

Page 97: Εγχειρίδιο Χρήσης ΑΤ91 · 2013-03-30 · Εγχειρίδιο χρήσης at91 1. Πρόλογος ουσία επιλέξαµε τον πιο ισχυρό µικροελεγκτή

6.Instruction Set Εγχειρίδιο χρήσης AT91

6.1.12 RSB

31 28 27 26 25 24 23 22 21 20 19 16 15 12 11 0

cond 0 0 Ι 0 0 1 1 S Rn Rd Shifter operand

Η εντολή RSB (Reverse SuBtract) αφαιρεί τον Rn από το αποτέλεσµα του ολισθητή και αποθηκεύει το αποτέ-

λεσµα στον καταχωρητή Rd. Οι σηµαίες κατάστασης ανανεώνονται κατ’ επιλογή, ανάλογα µε το αποτέλεσµα.

Σύνταξη

RSB<cond>S < Rd >, < Rn >, < shifter_operand >

<cond> Περιέχει τη συνθήκη ϐάσει της οποίας εκτελείται η εντολή. Αν δεν έχει

συµπληρωθεί, η εντολή εκτελείται πάντα.

S ΄Οταν υπάρχει ενεργοποιεί την ανανέωση των σηµαιών κατάστασης µε ϐάση

το αποτέλεσµα της εντολής. ∆υο τύποι ανανέωσης µπορούν να συµβούν :

• Αν ο Rd δεν είναι ο R15, οι σηµαίες Ν & Ζ τίθενται ανάλογα µε το

αποτέλεσµα της πράξης και οπι σηµαίες C & V ανάλογα µε το αν

έχει δηµιουργηθεί κρατούµενο (υπερχείληση κατά µη-προσηµασµένη

αφαίρεση) ή προσηµασµένη υπερχείλιση. Οι υπόλοιπες σηµαίες δεν

επηρρεάζονται.

• Αν ο Rd είναι ο R15, ο SPSR του ενεργού processor mode αντιγράφε-

ται στον CPSR. Αν εκτελεστεί ενώ είµαστε σε User ή System mode

δηµιουργείται σφάλµα, επειδή αυτά τα modes δεν έχουν SPSR.

< Rd > Ορίζει τον καταχωρητή που ϑα αποθηκευτεί το αποτέλεσµα.

< Rn > Ορίζει τον καταχωρητή που περιέχει τον δεύτερο όρο της αφαίρεσης.

< shifter_operand > Ορίζει τον πρώτο όρο της αφαίρεσης (περιγραφή στο κεφ. 2.3.2, σελ. 2.3.2).

Λειτουργία

Αν Ισχύειcond τότε

Rd = shifter_operand ­ Rn

Αν S == 1 και Rd == 15 τότε

CPSR = SPSR

∆ιαφορετικά αν S == 1 τότε

N_flag = Rd[31]

Z_flag = (αν Rd == 0 τότε 1 διαφορετικά 0)

C_flag = (ΝΟΤ Κρατούµενο αφαίρεσης)

V_flag = (Υπερχείλιση αφαίρεσης)

Χρήση

Πέρα από τη προφανή της χρήση, η εντολή αυτή µπορεί να χρησιµοποιηθεί και για την εύρεση του συµπληρώ-

µατος ως προς 2 :

RSB R4, R4, #0 @ ­R4 − > R4

και για να υπολογίστεί το γινόµενο (2n − 1) ∗ Rn :

RSB R4, R4, R4, LSL #8 @ (28 ∗ R4) − R4− > R4

91

Page 98: Εγχειρίδιο Χρήσης ΑΤ91 · 2013-03-30 · Εγχειρίδιο χρήσης at91 1. Πρόλογος ουσία επιλέξαµε τον πιο ισχυρό µικροελεγκτή

Εγχειρίδιο χρήσης AT91 Κεφάλαιο 6.1 - Αριθµητικές Εντολές

6.1.13 RSC

31 28 27 26 25 24 23 22 21 20 19 16 15 12 11 0

cond 0 0 Ι 0 1 1 1 S Rn Rd Shifter operand

Η εντολή RSC (Reverse Subtract with Carry) αφαιρεί το (Rn + ΝΟΤ CPSR C bit) από το αποτέλεσµα του

ολισθητή και αποθηκεύει το αποτέλεσµα στον καταχωρητή Rd. Οι σηµαίες κατάστασης ανανεώνονται κατ’

επιλογή, ανάλογα µε το αποτέλεσµα.

Σύνταξη

RSC<cond>S < Rd >, < Rn >, < shifter_operand >

<cond> Περιέχει τη συνθήκη ϐάσει της οποίας εκτελείται η εντολή. Αν δεν έχει

συµπληρωθεί, η εντολή εκτελείται πάντα.

S ΄Οταν υπάρχει ενεργοποιεί την ανανέωση των σηµαιών κατάστασης µε ϐάση

το αποτέλεσµα της εντολής. ∆υο τύποι ανανέωσης µπορούν να συµβούν :

• Αν ο Rd δεν είναι ο R15, οι σηµαίες Ν & Ζ τίθενται ανάλογα µε το

αποτέλεσµα της πράξης και οι σηµαίες C & V ανάλογα µε το αν έ-

χει δηµιουργηθεί κρατούµενο (υπερχείληση κατά µη-προσηµασµένη

αφαίρεση) ή προσηµασµένη υπερχείλιση. Οι υπόλοιπες σηµαίες δεν

επηρρεάζονται.

• Αν ο Rd είναι ο R15, ο SPSR του ενεργού processor mode αντιγράφε-

ται στον CPSR. Αν εκτελεστεί ενώ είµαστε σε User ή System mode

δηµιουργείται σφάλµα, επειδή αυτά τα modes δεν έχουν SPSR.

< Rd > Ορίζει τον καταχωρητή που ϑα αποθηκευτεί το αποτέλεσµα.

< Rn > Ορίζει τον καταχωρητή που περιέχει τον δεύτερο όρο της αφαίρεσης.

< shifter_operand > Ορίζει τον πρώτο όρο της αφαίρεσης (περιγραφή στο κεφ. 2.3.2, σελ. 2.3.2).

Λειτουργία

Αν Ισχύειcond τότε

Rd = shifter_operand ­ Rn ­ NOT(CPSR C bit

Αν S == 1 και Rd == 15 τότε

CPSR = SPSR

∆ιαφορετικά αν S == 1 τότε

N_flag = Rd[31]

Z_flag = (αν Rd == 0 τότε 1 διαφορετικά 0)

C_flag = (ΝΟΤ Κρατούµενο αφαίρεσης)

V_flag = (Υπερχείλιση αφαίρεσης)

Χρήση

Η εντολή αυτή µπορεί να χρησιµοποιηθεί για την εύρεση του συµπληρώµατος ως προς 2 ενός 64ψηφιου

αριθµού, αποθηκευµένου για παράδειγµα στους καταχωρητές R0 & R1, µε το λιγότερο σηµαντικό word στον

R0, µε την ακολουθία εντολών :

RSBS R2, R0, #0 @ ­R0 − > R2

RSC R3, R1, #0 @ ­R1 − > R3

92

Page 99: Εγχειρίδιο Χρήσης ΑΤ91 · 2013-03-30 · Εγχειρίδιο χρήσης at91 1. Πρόλογος ουσία επιλέξαµε τον πιο ισχυρό µικροελεγκτή

6.Instruction Set Εγχειρίδιο χρήσης AT91

Σηµειώσεις

Αν ενεργοποιηθεί η ανανέωση των σηµαιών (έχει τεθεί το S), η σηµαία C γίνεται :

1 Αν δεν υπάρχει κρατούµενο

0 Αν υπάρχει κρατούµενο

Με άλλα λόγια, η σηµαία C χρησιµοποιείται σαν ΝΟΤ(carry). Η αντιστροφή αυτή γίνεται για τις επόµενες

πράξεις. Για παράδειγµα, οι εντολές SBC & RSC χρησιµοποιούν τη σηµαία C σαν ΝΟΤ(carry), και εκτελούν

απλή αφαίρεση αν είναι 1 ή αφαιρούν ένα επιπλέον αν είναι 0 (δηλαδή #(αποτέλεσµα της αφαίρεσης) -1). Οι

συνθήκες εκτέλεσης HS & LO είναι ισοδύναµες µε τις CS & CC αντίστοιχα.

93

Page 100: Εγχειρίδιο Χρήσης ΑΤ91 · 2013-03-30 · Εγχειρίδιο χρήσης at91 1. Πρόλογος ουσία επιλέξαµε τον πιο ισχυρό µικροελεγκτή

Εγχειρίδιο χρήσης AT91 Κεφάλαιο 6.1 - Αριθµητικές Εντολές

6.1.14 SBC

31 28 27 26 25 24 23 22 21 20 19 16 15 12 11 0

cond 0 0 Ι 0 1 1 0 S Rn Rd Shifter operand

Η εντολή SBC (SuBtract with Carry) αφαιρεί την τιµή του αποτελέσµατος του ολισθητή από το [Rn +

ΝΟΤ(σηµαία C] και αποθηκεύει το αποτέλεσµα στον καταχωρητή Rd. Οι σηµαίες κατάστασης ανανεώνον-

ται κατ’ επιλογή, ανάλογα µε το αποτέλεσµα.

Σύνταξη

SBC<cond>S < Rd >, < Rn >, < shifter_operand >

<cond> Περιέχει τη συνθήκη ϐάσει της οποίας εκτελείται η εντολή. Αν δεν έχει

συµπληρωθεί, η εντολή εκτελείται πάντα.

S ΄Οταν υπάρχει ενεργοποιεί την ανανέωση των σηµαιών κατάστασης µε ϐάση

το αποτέλεσµα της εντολής. ∆υο τύποι ανανέωσης µπορούν να συµβούν :

• Αν ο Rd δεν είναι ο R15, οι σηµαίες N & Z τίθενται ανάλογα µε

το αποτέλεσµα της πράξης και οι σηµαίες C & V ανάλογα µε το αν

έχει δηµιουργηθεί κρατούµενο (υπερχείληση κατά µη-προσηµασµένη

αφαίρεση) ή προσηµασµένη υπερχείλιση. Οι υπόλοιπες σηµαίες δεν

επηρρεάζονται.

• Αν ο Rd είναι ο R15, ο SPSR του ενεργού processor mode αντιγράφε-

ται στον CPSR. Αν εκτελεστεί ενώ είµαστε σε User ή System mode

δηµιουργείται σφάλµα, επειδή αυτά τα modes δεν έχουν SPSR.

< Rd > Ορίζει τον καταχωρητή που ϑα αποθηκευτεί το αποτέλεσµα.

< Rn > Ορίζει τον καταχωρητή που περιέχει τον πρώτο όρο της αφαίρεσης.

< shifter_operand > Ορίζει τον δεύτερο όρο της αφαίρεσης (περιγραφή στο κεφ. 2.3.2, σελ. 2.3.2).

Λειτουργία

Αν Ισχύειcond τότε

Rd = Rn ­ shifter_operand ­ NOT(CPSR C bit

Αν S == 1 και Rd == 15 τότε

CPSR = SPSR

∆ιαφορετικά αν S == 1 τότε

N_flag = Rd[31]

Z_flag = (αν Rd == 0 τότε 1 διαφορετικά 0)

C_flag = (ΝΟΤ Κρατούµενο αφαίρεσης)

V_flag = (Υπερχείλιση αφαίρεσης)

Χρήση

Η εντολή αυτή µπορεί να χρησιµοποιηθεί για την αφαίρεση τιµών µεγαλύτερου εύρους από 32 ψηφία. Για

παράδειγµα, αφαίρεση της τιµής που ϐρίσκεται στους καταχωρητές R0 & R1 από την τιµή που ϐρίσκεται

στους καταχωρητές R2 & R3, επιτυγχάνεται µε :

SUBS R2, R2, R0 @ R2 ­ R0 − > R2

SBC R3, R3, R1 @ R3 ­ R1 − > R3

Σηµειώσεις

Αν ενεργοποιηθεί η ανανέωση των σηµαιών (έχει τεθεί το S), η σηµαία C γίνεται :

94

Page 101: Εγχειρίδιο Χρήσης ΑΤ91 · 2013-03-30 · Εγχειρίδιο χρήσης at91 1. Πρόλογος ουσία επιλέξαµε τον πιο ισχυρό µικροελεγκτή

6.Instruction Set Εγχειρίδιο χρήσης AT91

1 Αν δεν υπάρχει κρατούµενο

0 Αν υπάρχει κρατούµενο

Με άλλα λόγια, η σηµαία C χρησιµοποιείται σαν ΝΟΤ(carry). Η αντιστροφή αυτή γίνεται για τις επόµενες

πράξεις. Για παράδειγµα, οι εντολές SBC & RSC χρησιµοποιούν τη σηµαία C σαν ΝΟΤ(carry), και εκτελούν

απλή αφαίρεση αν είναι 1 ή αφαιρούν ένα επιπλέον αν είναι 0 (δηλαδή #(αποτέλεσµα της αφαίρεσης) -1). Οι

συνθήκες εκτέλεσης HS & LO είναι ισοδύναµες µε τις CS & CC αντίστοιχα.

95

Page 102: Εγχειρίδιο Χρήσης ΑΤ91 · 2013-03-30 · Εγχειρίδιο χρήσης at91 1. Πρόλογος ουσία επιλέξαµε τον πιο ισχυρό µικροελεγκτή

Εγχειρίδιο χρήσης AT91 Κεφάλαιο 6.1 - Αριθµητικές Εντολές

6.1.15 SMLAL

31 28 27 26 25 24 23 22 21 20 19 16 15 12 11 8 7 6 5 4 3 0

cond 0 0 0 0 1 1 1 S RdHi RdLo Rs 1 0 0 1 Rm

Η εντολή SMLAL (Signed Multiply and Accumulate Long operands) πολλαπλασιάζει προσηµασµένα έντελα

για να παράγει αποτέλεσµα εύρους 64 ψηφίων, το οποίο προστίθεται στον 64ψηφίο αριθµό που έχει τα 32

πιο σηµαντικά ψηφία του στον RdHi και τα 32 λιγότερο σηµαντικά ψηφία του στον καταχωρητή RdLo. Το πιο

σηµαντικό µέρος του αποτελέσµατος αποθηκεύεται στον RdHi και το λιγότερο σηµαντικό στον καταχωρητή

RdLo.

Σύνταξη

SMLAL<cond>S < RdLo >, < RdHi >, < Rm >, < Rs >

<cond> Περιέχει τη συνθήκη ϐάσει της οποίας εκτελείται η εντολή. Αν δεν έχει συµπληρωθεί, η

εντολή εκτελείται πάντα.

S ΄Οταν υπάρχει ενεργοποιεί ανανέωση των σηµαιών κατάστασης µε ϐάση το αποτέλεσµα

της εντολής. Επηρρεάζονται µόνο οι σηµαίες Ν & Ζ ανάλογα µε το αποτέλεσµα της

πράξης.

< RdLo > Ορίζει τον καταχωρητή που περιέχει το λιγότερο σηµαντικό word που ϑα αθροιστεί µε

το γινόµενο και ϑα αποθηκεύσει το λιγότερο σηµαντικό word του αποτελέσµατος.

< RdHi > Ορίζει τον καταχωρητή που περιέχει το περισσότερο σηµαντικό word που ϑα αθροιστεί

µε το γινόµενο και ϑα αποθηκεύσει το περισσότερο σηµαντικό word του αποτελέσµατος.

< Rm > Ορίζει τον καταχωρητή που περιέχει τον πρώτο όρο του πολλαπλασιασµού.

< Rs > Ορίζει τον καταχωρητή που περιέχει τον δεύτερο όρο του πολλαπλασιασµού.

Λειτουργία

Αν Ισχύειcond τότε

RdLo = (Rm * Rs)[31:0] + RdLo

RdHi = (Rm * Rs)[63:32] + RdHi

Αν S == 1 τότε

N_flag = RdHi[31]

Z_flag = (αν RdHi == 0 και RdLo == 0 τότε 1 διαφορετικά 0)

C_flag = (Ανεπηρέαστο)

V_flag = (Ανεπηρέαστο)

Σηµειώσεις

R15 Η χρήση του R15 στη ϑέση των < RdHi >, < RdLo >, < Rm >, < Rs >

ϑα προκαλέσει απρόβλεπτα αποτελέσµατα.

RdHi, RdLo & Rm Οι καταχωρητές αυτοί πρέπει να είναι διαφορετικοί µεταξύ τους, διαφορετικά

το αποτέλεσµα δεν είναι προβλέψιµο.

96

Page 103: Εγχειρίδιο Χρήσης ΑΤ91 · 2013-03-30 · Εγχειρίδιο χρήσης at91 1. Πρόλογος ουσία επιλέξαµε τον πιο ισχυρό µικροελεγκτή

6.Instruction Set Εγχειρίδιο χρήσης AT91

6.1.16 SMULL

31 28 27 26 25 24 23 22 21 20 19 16 15 12 11 8 7 6 5 4 3 0

cond 0 0 0 0 1 1 0 S RdHi RdLo Rs 1 0 0 1 Rm

Η εντολή SMULL (Signed MULtiply Long operands) πολλαπλασιάζει προσηµασµένα έντελα για να παράγει

αποτέλεσµα εύρους 64 ψηφίων. Το πιο σηµαντικό µέρος του γινοµένου αποθηκεύεται στον RdHi και το

λιγότερο σηµαντικό στον καταχωρητή RdLo.

Σύνταξη

SMULL<cond>S < RdLo >, < RdHi >, < Rm >, < Rs >

<cond> Περιέχει τη συνθήκη ϐάσει της οποίας εκτελείται η εντολή. Αν δεν έχει συµπληρωθεί, η

εντολή εκτελείται πάντα.

S ΄Οταν υπάρχει ενεργοποιεί ανανέωση των σηµαιών κατάστασης µε ϐάση το αποτέλεσµα

της εντολής. Επηρρεάζονται µόνο οι σηµαίες Ν & Ζ ανάλογα µε το αποτέλεσµα της

πράξης.

< RdLo > Ορίζει τον καταχωρητή που ϑα αποθηκεύσει το λιγότερο σηµαντικό word του γινοµένου.

< RdHi > Ορίζει τον καταχωρητή που περιέχει το περισσότερο σηµαντικό word του γινοµένου.

< Rm > Ορίζει τον καταχωρητή που περιέχει τον πρώτο όρο του πολλαπλασιασµού.

< Rs > Ορίζει τον καταχωρητή που περιέχει τον δεύτερο όρο του πολλαπλασιασµού.

Λειτουργία

Αν Ισχύειcond τότε

RdLo = (Rm * Rs)[31:0]

RdHi = (Rm * Rs)[63:32]

Αν S == 1 τότε

N_flag = RdHi[31]

Z_flag = (αν RdHi == 0 και RdLo == 0 τότε 1 διαφορετικά 0)

C_flag = (Ανεπηρέαστο)

V_flag = (Ανεπηρέαστο)

Σηµειώσεις

R15 Η χρήση του R15 στη ϑέση των < RdHi >,< RdLo >, < Rm >, < Rs >

ϑα προκαλέσει απρόβλεπτα αποτελέσµατα.

RdHi, RdLo & Rm Οι καταχωρητές αυτοί πρέπει να είναι διαφορετικοί µεταξύ τους, διαφορετικά

το αποτέλεσµα δεν είναι προβλέψιµο.

97

Page 104: Εγχειρίδιο Χρήσης ΑΤ91 · 2013-03-30 · Εγχειρίδιο χρήσης at91 1. Πρόλογος ουσία επιλέξαµε τον πιο ισχυρό µικροελεγκτή

Εγχειρίδιο χρήσης AT91 Κεφάλαιο 6.1 - Αριθµητικές Εντολές

6.1.17 SUB

31 28 27 26 25 24 23 22 21 20 19 16 15 12 11 0

cond 0 0 Ι 0 0 1 0 S Rn Rd Shifter operand

Η εντολή SUB (SUBtract) αφαιρεί την έξοδο του ολισθητή από τον Rn και αποθηκεύει το αποτέλεσµα στον

καταχωρητή Rd. Οι σηµαίες κατάστασης ανανεώνονται κατ’ επιλογή, ανάλογα µε το αποτέλεσµα.

Σύνταξη

SUB<cond>S < Rd >, < Rn >, < shifter_operand >

<cond> Περιέχει τη συνθήκη ϐάσει της οποίας εκτελείται η εντολή. Αν δεν έχει

συµπληρωθεί, η εντολή εκτελείται πάντα.

S ΄Οταν υπάρχει ενεργοποιεί την ανανέωση των σηµαιών κατάστασης µε ϐάση

το αποτέλεσµα της εντολής. ∆υο τύποι ανανέωσης µπορούν να συµβούν :

• Αν ο Rd δεν είναι ο R15, οι σηµαίες κατάστασης N & Z τίθεν-

ται ανάλογα µε το αποτέλεσµα της πράξης και οι σηµαίες C & V

ανάλογα µε το αν έχει δηµιουργηθεί κρατούµενο (υπερχείληση κατά

µη-προσηµασµένη αφαίρεση) ή προσηµασµένη υπερχείλιση. Οι υπ-

όλοιπες σηµαίες δεν επηρρεάζονται.

• Αν ο Rd είναι ο R15, ο SPSR του ενεργού processor mode αντιγράφε-

ται στον CPSR. Αν εκτελεστεί ενώ είµαστε σε User ή System mode

δηµιουργείται σφάλµα, επειδή αυτά τα modes δεν έχουν SPSR.

< Rd > Ορίζει τον καταχωρητή που ϑα αποθηκευτεί το αποτέλεσµα.

< Rn > Ορίζει τον καταχωρητή που περιέχει τον πρώτο όρο της αφαίρεσης.

< shifter_operand > Ορίζει τον δεύτερο όρο της αφαίρεσης (περιγραφή στο κεφ. 2.3.2, σελ. 2.3.2).

Λειτουργία

Αν Ισχύειcond τότε

Rd = Rn ­ shifter_operand

Αν S == 1 και Rd == 15 τότε

CPSR = SPSR

∆ιαφορετικά αν S == 1 τότε

N_flag = Rd[31]

Z_flag = (αν Rd == 0 τότε 1 διαφορετικά 0)

C_flag = (ΝΟΤ Κρατούµενο αφαίρεσης)

V_flag = (Υπερχείλιση αφαίρεσης)

Χρήση

Η εντολή αυτή µπορεί να χρησιµοποιηθεί και για µείωση τιµής µε ταυτόχρονο έλεγχο, αφού η λειτουργία

της είναι ίδια µε την εντολή CMP, µε τη διαφορά πως η SUBS αποθηκεύει το αποτέλεσµα και σε κάποιον

καταχωρητή.

Σηµειώσεις

Αν ενεργοποιηθεί η ανανέωση των σηµαιών (έχει τεθεί το S), η σηµαία C γίνεται :

1 Αν δεν υπάρχει κρατούµενο

0 Αν υπάρχει κρατούµενο

98

Page 105: Εγχειρίδιο Χρήσης ΑΤ91 · 2013-03-30 · Εγχειρίδιο χρήσης at91 1. Πρόλογος ουσία επιλέξαµε τον πιο ισχυρό µικροελεγκτή

6.Instruction Set Εγχειρίδιο χρήσης AT91

Με άλλα λόγια, η σηµαία C χρησιµοποιείται σαν ΝΟΤ(carry). Η αντιστροφή αυτή γίνεται για τις επόµενες

πράξεις. Για παράδειγµα, οι εντολές SBC & RSC χρησιµοποιούν τη σηµαία C σαν ΝΟΤ(carry), και εκτελούν

απλή αφαίρεση αν είναι 1 ή αφαιρούν ένα επιπλέον αν είναι 0 (δηλαδή #(αποτέλεσµα της αφαίρεσης) -1). Οι

συνθήκες εκτέλεσης HS & LO είναι ισοδύναµες µε τις CS & CC αντίστοιχα.

99

Page 106: Εγχειρίδιο Χρήσης ΑΤ91 · 2013-03-30 · Εγχειρίδιο χρήσης at91 1. Πρόλογος ουσία επιλέξαµε τον πιο ισχυρό µικροελεγκτή

Εγχειρίδιο χρήσης AT91 Κεφάλαιο 6.1 - Αριθµητικές Εντολές

6.1.18 TEQ

31 28 27 26 25 24 23 22 21 20 19 16 15 12 11 0

cond 0 0 Ι 1 0 0 1 1 Rn 0 0 0 0 Shifter operand

Η εντολή TEQ (Test EQuivalence) εκτελεί σύγκριση ανάµεσα στην τιµή του καταχωρητή Rn και το αποτέλεσµα

του ολισθητή. Οι σηµαίες κατάστασης ενηµερώνονται πάντα, ανάλογα µε το αποτέλεσµα της σύγκρισης. Η

σύγκριση διενεργείται µε λογικό EOR.

Σύνταξη

TEQ<cond> < Rn >, < shifter_operand >

<cond> Περιέχει τη συνθήκη ϐάσει της οποίας εκτελείται η εντολή. Αν δεν έχει

συµπληρωθεί, η εντολή εκτελείται πάντα.

< Rn > Ορίζει τον καταχωρητή που περιέχει τον πρώτο όρο της σύγκρισης.

< shifter_operand > Ορίζει τον δεύτερο όρο της σύγκρισης (περιγραφή στο κεφ. 2.3.2, σελ. 2.3.2).

Λειτουργία

Αν Ισχύει cond τότε

alu_out = Rn EOR shifter_operand

N_flag = alu_out[31]

Z_flag = (αν alu_out == 0 τότε 1 διαφορετικά 0)

C_flag = (Bit από ολίσθηση (αν έχει γίνει), αλλιώς 0)

V_flag = (Ανεπηρέαστο)

Χρήση

Η εντολή αυτή χρησιµοποιείται για να γίνει έλεγχος για ισότητα, χωρίς όµως να αλλάξει η τιµή της σηµαίας

V, κάτι που δεν αποφεύγεται µε την CMP.

100

Page 107: Εγχειρίδιο Χρήσης ΑΤ91 · 2013-03-30 · Εγχειρίδιο χρήσης at91 1. Πρόλογος ουσία επιλέξαµε τον πιο ισχυρό µικροελεγκτή

6.Instruction Set Εγχειρίδιο χρήσης AT91

6.1.19 TST

31 28 27 26 25 24 23 22 21 20 19 16 15 12 11 0

cond 0 0 Ι 1 0 0 0 1 Rn 0 0 0 0 Shifter operand

Η εντολή TST (TeST) εκτελεί σύγκριση ανάµεσα στο καταχωρητή Rn και το αποτέλεσµα του ολισθητή. Οι

σηµαίες κατάστασης ενηµερώνονται πάντα, ανάλογα µε το αποτέλεσµα της σύγκρισης. Η σύγκριση διενεργεί-

ται µε λογικό AND.

Σύνταξη

TST<cond> < Rn >, < shifter_operand >

<cond> Περιέχει τη συνθήκη ϐάσει της οποίας εκτελείται η εντολή. Αν δεν έχει

συµπληρωθεί, η εντολή εκτελείται πάντα.

< Rn > Ορίζει τον καταχωρητή που περιέχει τον πρώτο όρο της σύγκρισης.

< shifter_operand > Ορίζει τον δεύτερο όρο της σύγκρισης (περιγραφή στο κεφ. 2.3.2, σελ. 2.3.2).

Λειτουργία

Αν Ισχύει cond τότε

alu_out = Rn AND shifter_operand

N_flag = alu_out[31]

Z_flag = (αν alu_out == 0 τότε 1 διαφορετικά 0)

C_flag = (Bit από ολίσθηση (αν έχει γίνει), αλλιώς 0)

V_flag = (Ανεπηρέαστο)

Χρήση

Η εντολή αυτή χρησιµοποιείται για να ελέγξουµε αν µια οµάδα ψηφίων του Rn είναι ενεργοποιηµένα ή µη.

101

Page 108: Εγχειρίδιο Χρήσης ΑΤ91 · 2013-03-30 · Εγχειρίδιο χρήσης at91 1. Πρόλογος ουσία επιλέξαµε τον πιο ισχυρό µικροελεγκτή

Εγχειρίδιο χρήσης AT91 Κεφάλαιο 6.1 - Αριθµητικές Εντολές

6.1.20 UMLAL

31 28 27 26 25 24 23 22 21 20 19 16 15 12 11 8 7 6 5 4 3 0

cond 0 0 0 0 1 0 1 S RdHi RdLo Rs 1 0 0 1 Rm

Η εντολή UMLAL (Unsigned MuLtiply and Accumulate Long operands) πολλαπλασιάζει µη-προσηµασµένα

έντελα για να παράγει αποτέλεσµα εύρους 64 ψηφίων, του οποίου το πιο σηµαντικό µέρος προστίθεται µε

τον RdHi και το λιγότερο σηµαντικό µε τον καταχωρητή RdLo. Το πιο σηµαντικό µέρος του αθροίσµατος

αποθηκεύεται στον RdHi και το λιγότερο σηµαντικό στον καταχωρητή RdLo.

Σύνταξη

UMLAL<cond>S < RdLo >, < RdHi >, < Rm >, < Rs >

<cond> Περιέχει τη συνθήκη ϐάσει της οποίας εκτελείται η εντολή. Αν δεν έχει συµπληρωθεί, η

εντολή εκτελείται πάντα.

S ΄Οταν υπάρχει ενεργοποιεί την ανανέωση των σηµαιών κατάστασηςµε ϐάση το αποτέλεσ-

µα της εντολής. Επηρρεάζονται µόνο οι σηµαίες Ν & Ζ ανάλογα µε το αποτέλεσµα της

πράξης.

< RdLo > Ορίζει τον καταχωρητή που περιέχει το λιγότερο σηµαντικό word που ϑα αθροιστεί µε

το γινόµενο και ϑα αποθηκεύσει το λιγότερο σηµαντικό word του αποτελέσµατος.

< RdHi > Ορίζει τον καταχωρητή που περιέχει το περισσότερο σηµαντικό word που ϑα αθροιστεί

µε το γινόµενο και ϑα αποθηκεύσει το περισσότερο σηµαντικό word του αποτελέσµατος.

< Rm > Ορίζει τον καταχωρητή που περιέχει τον πρώτο όρο του πολλαπλασιασµού.

< Rs > Ορίζει τον καταχωρητή που περιέχει τον δεύτερο όρο του πολλαπλασιασµού.

Λειτουργία

Αν Ισχύειcond τότε

RdLo = (Rm * Rs)[31:0] + RdLo

RdHi = (Rm * Rs)[63:32] + RdHi

Αν S == 1 τότε

N_flag = RdHi[31]

Z_flag = (αν RdHi == 0 και RdLo == 0 τότε 1 διαφορετικά 0)

C_flag = (Ανεπηρέαστο)

V_flag = (Ανεπηρέαστο)

Σηµειώσεις

R15 Η χρήση του R15 στη ϑέση των < RdHi >, < RdLo >, < Rm >, < Rs >

ϑα προκαλέσει απρόβλεπτα αποτελέσµατα.

RdHi, RdLo & Rm Οι καταχωρητές αυτοί πρέπει να είναι διαφορετικοί µεταξύ τους, διαφορετικά

το αποτέλεσµα δεν είναι προβλέψιµο.

102

Page 109: Εγχειρίδιο Χρήσης ΑΤ91 · 2013-03-30 · Εγχειρίδιο χρήσης at91 1. Πρόλογος ουσία επιλέξαµε τον πιο ισχυρό µικροελεγκτή

6.Instruction Set Εγχειρίδιο χρήσης AT91

6.1.21 UMULL

31 28 27 26 25 24 23 22 21 20 19 16 15 12 11 8 7 6 5 4 3 0

cond 0 0 0 0 1 0 0 S RdHi RdLo Rs 1 0 0 1 Rm

Η εντολή UMULL (Unsigned MULtiply Long operands) πολλαπλασιάζει µη-προσηµασµένα έντελα για να

παράγει αποτέλεσµα εύρους 64 ψηφίων. Το περισσότερο σηµαντικό µέρος του γινοµένου αποθηκεύεται στον

RdHi και το λιγότερο σηµαντικό στον καταχωρητή RdLo.

Σύνταξη

UMULL<cond>S < RdLo >, < RdHi >, < Rm >, < Rs >

<cond> Περιέχει τη συνθήκη ϐάσει της οποίας εκτελείται η εντολή. Αν δεν έχει συµπληρωθεί, η

εντολή εκτελείται πάντα.

S ΄Οταν υπάρχει, ενεργοποιεί την ανανέωση των σηµαιών κατάστασης. Μόνο οι σηµαίες Ν

& Ζ επηρρεάζονται, ανάλογα µε το αποτέλεσµα της πράξης.

< RdLo > Ορίζει τον καταχωρητή που ϑα αποθηκεύσει το λιγότερο σηµαντικό word του γινοµένου.

< RdHi > Ορίζει τον καταχωρητή που περιέχει το περισσότερο σηµαντικό word του γινοµένου.

< Rm > Ορίζει τον καταχωρητή που περιέχει τον πρώτο όρο του πολλαπλασιασµού.

< Rs > Ορίζει τον καταχωρητή που περιέχει τον δεύτερο όρο του πολλαπλασιασµού.

Λειτουργία

Αν Ισχύειcond τότε

RdLo = (Rm * Rs)[31:0]

RdHi = (Rm * Rs)[63:32]

Αν S == 1 τότε

N_flag = RdHi[31]

Z_flag = (αν RdHi == 0 και RdLo == 0 τότε 1 διαφορετικά 0)

C_flag = (Ανεπηρέαστο)

V_flag = (Ανεπηρέαστο)

Σηµειώσεις

R15 Η χρήση του R15 στη ϑέση των < RdHi >,< RdLo >, < Rm >, < Rs >

ϑα προκαλέσει απρόβλεπτα αποτελέσµατα.

RdHi, RdLo & Rm Οι καταχωρητές αυτοί πρέπει να είναι διαφορετικοί µεταξύ τους, διαφορετικά

το αποτέλεσµα δεν είναι προβλέψιµο.

103

Page 110: Εγχειρίδιο Χρήσης ΑΤ91 · 2013-03-30 · Εγχειρίδιο χρήσης at91 1. Πρόλογος ουσία επιλέξαµε τον πιο ισχυρό µικροελεγκτή

Εγχειρίδιο χρήσης AT91 Κεφάλαιο 6.2 - Εντολές Μετακίνησης

6.2 Εντολές Μετακίνησης

6.2.1 LDM

31 28 27 26 25 24 23 22 21 20 19 16 15 0

cond 1 0 0 P U 0 W 1 Rn Register_list

Η εντολή LDM (LoaD Multiple) µεταφέρει block δεδοµένων από την εξωτερική µνήµη στους καταχωρητές.

Σύνταξη

LDM<cond> < addressing_mode >< Rn > !, < registers >

<cond> Περιέχει τη συνθήκη µε ϐάση την οποία εκτελείται η εντολή. Αν δεν έχει

συµπληρωθεί, η εντολή εκτελείται πάντα.

<addressing_mode> Ορίζει τον τρόπο διευθυνσιοδότησης της µνήµης (περιγραφή στο κεφ. 2.3.3,

σελ. 20).

< Rn > Ορίζει τον καταχωρητή που ϑα χρησιµοποιηθεί στον τρόπο διευθυν-

σιοδότησης της µνήµης. Αν χρησιµοποιηθεί ο R15 ϑα έχουµε απροσδιόριστα

αποτελέσµατα.

! Αν υπάρχει, σηµατοδοτεί την ανανέωση του Rn µετά την ολοκλήρωση της

εντολής. Αν δεν υπάρχει, το περιεχόµενο του Rn δεν µεταβάλλεται.

< registers > Ορίζει µια λίστα από καταχωρητές χωρισµένους µε κόµµα, η οποία περικλεί-

εται από και . Οι καταχωρητές λαµβάνουν τις τιµές τους ξεκινώντας από

τον µικρότερο προς τον µεγαλύτερο (από R0 προς R15) και ο πρώτος απο-

ϑηκεύει τα δεδοµένα της πρώτης ϑέσης µνήµης που προσπελαύνεται, ενώ ο

τελευταίος της τελευταίας. Για κάθε καταχωρητή 0. . . 15 που συµετέχει στη

λίστα, ενεργοποιείται και το αντίστοιχο ψηφίο του πεδίου της εντολής.

Λειτουργία

Αν Ισχύειcond τότε

address = start_address

for i = 0 to 14

Αν register_list[i] == 1 τότε

Ri = Memory[address,4]

address = address + 4

Αν register_list[15] == 1 τότε

value = Memory[address,4]

pc = value AND 0xFFFFFFFE

address = address + 4

Σηµειώσεις

Περιορισµοί Αν ο καταχωρητής Rn υπάρχει στη λίστα και έχει ενεργοποιηθεί η ενηµέρωση

του µετά την εκτέλεση της εντολής, η τελική τιµή είναι απροσδιόριστη.

Unaligned Αν ο καταχωρητής Rd δεν περιέχει διεύθυνση που είναι πολλαπλάσιο του 4,

ϑα σηµειωθεί εξαίρεση Data Abord.

104

Page 111: Εγχειρίδιο Χρήσης ΑΤ91 · 2013-03-30 · Εγχειρίδιο χρήσης at91 1. Πρόλογος ουσία επιλέξαµε τον πιο ισχυρό µικροελεγκτή

6.Instruction Set Εγχειρίδιο χρήσης AT91

6.2.2 LDR

31 28 27 26 25 24 23 22 21 20 19 16 15 12 11 0

cond 0 1 Ι P U 0 W 1 Rn Rd addr_mode

Η εντολή LDR (LoaD Register) µεταφέρει ένα δεδοµένο 32 ψηφίων από την εξωτερική µνήµη σε ένα καταχωρητή.

Η διεύθυνση της µνήµης υπολογίζεται από το πεδίο addr_mode και η αποθήκευση γίνεται στον καταχωρητή

Rd. Αν η διεύθυνση δεν είναι σωστά στοιχισµένη (aligned) σε πολλαπλάσιο του 4, η τιµή ολισθαίνει δεξιά κατά

8 * ψηφία[1:0] της διεύθυνσης (δηλαδή αν αυτά τα ψηφία είναι ίσα µε 3, η ολίσθηση ϑα γίνει κατά 24 ϑέσεις

δεξιά). Σε ένα Little Endian σύστηµα όπως το δικό µας, η διεύθυνση που δίνουµε είναι η διεύθυνση του

λιγότερο σηµαντικού byte του word που ϑέλουµε να µεταφέρουµε. Αν ο Rd είναι ο R15, τότε ο επεξεργαστής

ϑα εκτελέσει την λήψη του word, ϑα το αποθηκεύσει στον program counter και ϑα εκτελέσει διακλάδωση σε

αυτή τη διεύθυνση.

Σύνταξη

LDR<cond> < Rd >, < addressing_mode >

<cond> Περιέχει τη συνθήκη ϐάσει της οποίας εκτελείται η εντολή. Αν δεν έχει

συµπληρωθεί, η εντολή εκτελείται πάντα.

< Rd > Ορίζει τον καταχωρητή που ϑα αποθηκεύσει το word από τη µνήµη.

< addressing_mode > Ορίζει τον τρόπο διευθυνσιοδότησης της µνήµης (περιγραφή στο κεφ. 2.3.3,

σελ. 20).

Λειτουργία

Αν Ισχύειcond τότε

Αν address[1:0] == 2’b00 τότε

value = Memory[address,4]

∆ιαφορετικά αν address[1:0] == 2’b01 τότε

value = Memory[address,4] Rotate_right 8

∆ιαφορετικά αν address[1:0] == 2’b10 τότε

value = Memory[address,4] Rotate_right 16

∆ιαφορετικά αν address[1:0] == 2’b11 τότε

value = Memory[address,4] Rotate_right 24

Αν Rd is R15 τότε

pc = value AND 0xFFFFFFFE

∆ιαφορετικά

Rd = value

Χρήση

Αν η εντολή αυτή χρησιµοποιεί τον R15 σαν καταχωρητή ϐάσης, µπορεί να εκτελεστεί µεταθετός (position­

independent) κώδικας, δηλαδή κώδικας που δεν ϑα προσπελαύνει απόλυτες διευθύνσεις µνήµης, αλλά διευ-

ϑύνσεις σχετικές µε τη διεύθυνση που εκτελείται τώρα. Για παράδειγµα, αν γνωρίζουµε πως οι τιµές που ϑα

επεξεργαστούµε ϐρίσκονται 85 bytes µετά από την εντολή µεταφοράς, µπορούµε να προσθέσουµε την τιµή

του PC και το 85 και να µεταφέρουµε από εκείνη τη διεύθυνση τα δεδοµένα. Επειδή το λειτουργικό σύστηµα

κάθε ϕορά τοποθετεί τον κώδικα του προγράµµατός µας όπου εντοπίσει ελεύθερο χώρο στη µνήµη, οι διευ-

ϑύνσεις στις οποίες τοποθετείται ο εκτελέσιµος κώδικάς µας δεν είναι ίδιες κάθε ϕορά, οπότε µας εξυπηρετεί

το γεγονός πως προσπελαύνουµε δεδοµένα σε σχετικές και όχι σε απόλυτες διευθύνσεις.

105

Page 112: Εγχειρίδιο Χρήσης ΑΤ91 · 2013-03-30 · Εγχειρίδιο χρήσης at91 1. Πρόλογος ουσία επιλέξαµε τον πιο ισχυρό µικροελεγκτή

Εγχειρίδιο χρήσης AT91 Κεφάλαιο 6.2 - Εντολές Μετακίνησης

Σηµειώσεις

Περιορισµοί Αν το < addressing_mode > ορίζει ενηµέρωση του καταχωρητή ϐάσης µετά

την πρόσβαση στη µνήµη και χρησιµοποιούµε τον ίδιο καταχωρητή στα Rd

& Rn, η τελική τιµή του Rd είναι απροσδιόριστη.

Unaligned Αν ο καταχωρητής Rd δεν περιέχει διεύθυνση που είναι πολλαπλάσιο του 4,

ϑα σηµειωθεί εξαίρεση Data Abord.

106

Page 113: Εγχειρίδιο Χρήσης ΑΤ91 · 2013-03-30 · Εγχειρίδιο χρήσης at91 1. Πρόλογος ουσία επιλέξαµε τον πιο ισχυρό µικροελεγκτή

6.Instruction Set Εγχειρίδιο χρήσης AT91

6.2.3 LDRB

31 28 27 26 25 24 23 22 21 20 19 16 15 12 11 0

cond 0 1 Ι P U 1 W 1 Rn Rd addr_mode

Η εντολή LDRB (LoaD Register with Byte) µεταφέρει ένα δεδοµένο 8 ψηφίων από την εξωτερική µνήµη σε

ένα καταχωρητή, επεκτείνοντάς το στα 32 ψηφία µε προσθήκη 24 ’0’ στα περισσότερο σηµαντικά ψηφία του.

Σύνταξη

LDR<cond>B < Rd >, < addressing_mode >

<cond> Περιέχει τη συνθήκη ϐάσει της οποίας εκτελείται η εντολή. Αν δεν έχει

συµπληρωθεί, η εντολή εκτελείται πάντα.

< Rd > Ορίζει τον καταχωρητή στον οποίο αποθηκευθεί το δεδοµένο.

< addressing_mode > Ορίζει τον τρόπο διευθυνσιοδότησης της µνήµης (περιγραφή στο κεφ. 2.3.3,

σελ. 20).

Λειτουργία

Αν Ισχύειcond τότε

Rd = Memory[address, 1]

Σηµειώσεις

Περιορισµοί Αν το < addressing_mode > ορίζει ενηµέρωση του καταχωρητή ϐάσης µετά

την πρόσβαση στη µνήµη και χρησιµοποιούµε τον ίδιο καταχωρητή στα Rd

& Rn, η τελική τιµή του Rd είναι απροσδιόριστη.

107

Page 114: Εγχειρίδιο Χρήσης ΑΤ91 · 2013-03-30 · Εγχειρίδιο χρήσης at91 1. Πρόλογος ουσία επιλέξαµε τον πιο ισχυρό µικροελεγκτή

Εγχειρίδιο χρήσης AT91 Κεφάλαιο 6.2 - Εντολές Μετακίνησης

6.2.4 LDRH

31 28 27 26 25 24 23 22 21 20 19 16 15 12 11 8 7 6 5 4 3 0

cond 0 0 0 P U Ι W 1 Rn Rd addr_mode 1 0 1 1 addr_mode

Η εντολή LDRH (LoaD Register with Halfword) µεταφέρει ένα δεδοµένο 16 ψηφίων από την εξωτερική µνήµη

σε ένα καταχωρητή, επεκτείνοντάς το στα 32 ψηφία µε προσθήκη 16 ’0’ στα περισσότερο σηµαντικά ψηφία του.

Σύνταξη

LDR<cond>H < Rd >, < addressing_mode >

<cond> Περιέχει τη συνθήκη ϐάσει της οποίας εκτελείται η εντολή. Αν δεν έχει

συµπληρωθεί, η εντολή εκτελείται πάντα.

< Rd > Ορίζει τον καταχωρητή στον οποίο ϑα αποθηκευθεί το δεδοµένο.

< addressing_mode > Ορίζει τον τρόπο διευθυνσιοδότησης της µνήµης (περιγραφή στο κεφ. 2.3.3,

σελ. 20).

Λειτουργία

Αν Ισχύειcond τότε

Αν address[0] == 0 τότε

data = Memory[address, 2]

∆ιαφορετικά

data = UNPREDICTABLE

Rd = data

Σηµειώσεις

Περιορισµοί Αν το < addressing_mode > ορίζει ενηµέρωση του καταχωρητή ϐάσης µετά

την πρόσβαση στη µνήµη και χρησιµοποιούµε τον ίδιο καταχωρητή στα Rd

& Rn, η τελική τιµή του Rd είναι απροσδιόριστη.

Unaligned Αν η διεύθυνση δεν είναι πολλαπλάσιο του 2, η τιµή που αποθηκεύεται στον

καταχωρητή είναι απροσδιόριστη και ϑα προκληθεί εξαίρεση Data Abort.

108

Page 115: Εγχειρίδιο Χρήσης ΑΤ91 · 2013-03-30 · Εγχειρίδιο χρήσης at91 1. Πρόλογος ουσία επιλέξαµε τον πιο ισχυρό µικροελεγκτή

6.Instruction Set Εγχειρίδιο χρήσης AT91

6.2.5 LDRSB

31 28 27 26 25 24 23 22 21 20 19 16 15 12 11 8 7 6 5 4 3 0

cond 0 0 0 P U Ι W 1 Rn Rd addr_mode 1 1 0 1 addr_mode

Η εντολή LDRSB (LoaD Register with Signed Byte) µεταφέρει ένα δεδοµένο 8 ψηφίων από την εξωτερική µ-

νήµη σε ένα καταχωρητή, επεκτείνοντάς το στα 32 ψηφία µε προσθήκη 24 ψηφίων προσήµου στα περισσότερο

σηµαντικά ψηφία του.

Σύνταξη

LDR<cond>SB < Rd >, < addressing_mode >

<cond> Περιέχει τη συνθήκη ϐάσει της οποίας εκτελείται η εντολή. Αν δεν έχει

συµπληρωθεί, η εντολή εκτελείται πάντα.

< Rd > Ορίζει τον καταχωρητή στον οποίο ϑα αποθηκευθεί το δεδοµένο.

< addressing_mode > Ορίζει τον τρόπο διευθυνσιοδότησης της µνήµης (περιγραφή στο κεφ. 2.3.3,

σελ. 20).

Λειτουργία

Αν Ισχύειcond τότε

data = Memory[address, 1]

Rd = SignExtend(data)

Σηµειώσεις

Περιορισµοί Αν το < addressing_mode > ορίζει ενηµέρωση του καταχωρητή ϐάσης µετά

την πρόσβαση στη µνήµη και χρησιµοποιούµε τον ίδιο καταχωρητή στα Rd

& Rn, η τελική τιµή του Rd είναι απροσδιόριστη.

109

Page 116: Εγχειρίδιο Χρήσης ΑΤ91 · 2013-03-30 · Εγχειρίδιο χρήσης at91 1. Πρόλογος ουσία επιλέξαµε τον πιο ισχυρό µικροελεγκτή

Εγχειρίδιο χρήσης AT91 Κεφάλαιο 6.2 - Εντολές Μετακίνησης

6.2.6 LDRSH

31 28 27 26 25 24 23 22 21 20 19 16 15 12 11 8 7 6 5 4 3 0

cond 0 0 0 P U Ι W 1 Rn Rd addr_mode 1 1 1 1 addr_mode

Η εντολή LDRSH (LoaD Register with Signed Halfword) µεταφέρει ένα δεδοµένο 16 ψηφίων από την εξω-

τερική µνήµη σε ένα καταχωρητή, επεκτείνοντάς το στα 32 ψηφία µε προσθήκη 16 ψηφίων προσήµου στα

περισσότερο σηµαντικά ψηφία του.

Σύνταξη

LDR<cond>SH < Rd >, < addressing_mode >

<cond> Περιέχει τη συνθήκη ϐάσει της οποίας εκτελείται η εντολή. Αν δεν έχει

συµπληρωθεί, η εντολή εκτελείται πάντα.

< Rd > Ορίζει τον καταχωρητή στον οποίο ϑα αποθηκευθεί το δεδοµένο.

< addressing_mode > Ορίζει τον τρόπο διευθυνσιοδότησης της µνήµης (περιγραφή στο κεφ. 2.3.3,

σελ. 20).

Λειτουργία

Αν Ισχύειcond τότε

Αν address[0] == 0 τότε

data = Memory[address, 2]

∆ιαφορετικά

data = UNPREDICTABLE

Rd = SignExtend(data)

Σηµειώσεις

Περιορισµοί Αν το < addressing_mode > ορίζει ενηµέρωση του καταχωρητή ϐάσης µετά

την πρόσβαση στη µνήµη και χρησιµοποιούµε τον ίδιο καταχωρητή στα Rd

& Rn, η τελική τιµή του Rd είναι απροσδιόριστη.

Unaligned Αν η διεύθυνση δεν είναι πολλαπλάσιο του 2, η τιµή που αποθηκεύεται στον

καταχωρητή είναι απροσδιόριστη και ϑα προκληθεί εξαίρεση Data Abort.

110

Page 117: Εγχειρίδιο Χρήσης ΑΤ91 · 2013-03-30 · Εγχειρίδιο χρήσης at91 1. Πρόλογος ουσία επιλέξαµε τον πιο ισχυρό µικροελεγκτή

6.Instruction Set Εγχειρίδιο χρήσης AT91

6.2.7 MCR

31 28 27 26 25 24 23 21 20 19 16 15 12 11 8 7 5 4 3 0

cond 1 1 1 0 opcode_1 0 CRn Rd cp_num opcode_2 1 CRm

Η εντολή MCR (Move to Coprocessor from Register) µεταφέρει την τιµή του καταχωρητή Rd, στον συνεπεξερ-

γαστή cpu_num. Αν δεν υπάρχει ο συγκεκριµένος συνεπεξεργαστής, η εντολή ϑα δηµιουργήσει την εξαίρεση

Undefined Instruction.

Σύνταξη

MCR<cond> < coproc >, < opcod_1 >,< Rd >, < CRn >,< CRm > , < opcod_2 >

<cond> Περιέχει τη συνθήκη ϐάσει της οποίας εκτελείται η εντολή. Αν δεν έχει

συµπληρωθεί, η εντολή εκτελείται πάντα.

< coproc > Ορίζει το όνοµα του συνεπεξεργαστή και ϑέτει την κατάλληλη τιµή στο πεδίο

cp_num της εντολής. Οι γενικές τιµές είναι από p0 εώς p15.

< opcod_1 > Εντολή που εξαρτάται από τον συνεπεξεργαστή.

< Rd > Ορίζει τον καταχωρητή, του οποίου η τιµή ϑα µεταφερθεί στο συνεπεξερ-

γαστή. Αν χρησιµοποιήσουµε τον R15, το αποτέλεσµα ϑα είναι απροσδιόρισ-

το.

< CRn > Ο καταχωρητής του συνεπεξεργαστή που ϑα αποθηκεύσει την τιµή.

< CRm > ∆εύτερος καταχωρητής του συνεπεξεργαστή που ϑα συµµετάσχει στη

µεταφορά.

< opcod_2 > Εντολή που εξαρτάται από τον συνεπεξεργαστή. Αν αγνοηθεί, ϑεωρείται 0.

Λειτουργία

Αν Ισχύειcond τότε

Send Rd to Coprocessor[cpu_num]

111

Page 118: Εγχειρίδιο Χρήσης ΑΤ91 · 2013-03-30 · Εγχειρίδιο χρήσης at91 1. Πρόλογος ουσία επιλέξαµε τον πιο ισχυρό µικροελεγκτή

Εγχειρίδιο χρήσης AT91 Κεφάλαιο 6.2 - Εντολές Μετακίνησης

6.2.8 MOV

31 28 27 26 25 24 23 22 21 20 19 16 15 12 11 0

cond 0 0 Ι 1 1 0 1 S 0 0 0 0 Rd Shift_operand

Η εντολή MOV (move) µεταφέρει το αποτέλεσµα του ολισθητή στον καταχωρητή Rd. Οι σηµαίες κατάστασης

ανανεώνονται κατ’ επιλογή, ανάλογα µε το αποτέλεσµα.

Σύνταξη

MOV<cond>S < Rd >, < shifter_operand >

<cond> Περιέχει τη συνθήκη ϐάσει της οποίας εκτελείται η εντολή. Αν δεν έχει

συµπληρωθεί, η εντολή εκτελείται πάντα.

S ΄Οταν υπάρχει, ενεργοποιεί την ανανέωση των σηµαιών κατάστασης µε ϐάση

το αποτέλεσµα της εντολής. ∆υο τύποι ανανέωσης µπορούν να συµβούν :

• Αν ο Rd δεν είναι ο R15, οι σηµαίες Ν & Ζ τίθενται ανάλογα µε την τιµή

που µετακινείται και η σηµαία C ανάλογα µε το αν έχει δηµιουργηθεί

κρατούµενο από ολίσθηση. Οι υπόλοιπες σηµαίες κατάστασης δεν

επηρρεάζονται.

• Αν ο Rd είναι ο R15, ο SPSR του ενεργού processor mode αντιγράφε-

ται στον CPSR. Αν εκτελεστεί ενώ είµαστε σε User ή System mode

δηµιουργείται σφάλµα, επειδή αυτά τα modes δεν έχουν SPSR.

< Rd > Ορίζει τον καταχωρητή που ϑα αποθηκευτεί η τιµή.

< shifter_operand > Ορίζει την πηγή της τιµής (περιγραφή στο κεφ. 2.3.2, σελ. 16).

Λειτουργία

Αν Ισχύειcond τότε

Rd = shifter_operand

Αν S == 1 και Rd == 15 τότε

CPSR = SPSR

∆ιαφορετικά αν S == 1 τότε

N_flag = Rd[31]

Z_flag = (αν Rd == 0 τότε 1 διαφορετικά 0)

C_flag = (Bit από ολίσθηση (αν έχει γίνει), αλλιώς 0)

V_flag = (Ανεπηρέαστο)

Χρήση

Η εντολή αυτή χρησιµοποιείται για να µετακινήσει την τιµή από έναν καταχωρητή σε έναν άλλο, να τοποθετήσει

µια σταθερά σε ένα καταχωρητή, να εκτελέσει ολίσθηση χωρίς να ακολουθήσει κάποια άλλη πράξη ή να

εκτελέσει διακλάδωση αν ο Rd είναι ο R15.

112

Page 119: Εγχειρίδιο Χρήσης ΑΤ91 · 2013-03-30 · Εγχειρίδιο χρήσης at91 1. Πρόλογος ουσία επιλέξαµε τον πιο ισχυρό µικροελεγκτή

6.Instruction Set Εγχειρίδιο χρήσης AT91

6.2.9 MRC

31 28 27 26 25 24 23 21 20 19 16 15 12 11 8 7 5 4 3 0

cond 1 1 1 0 opcode_1 1 CRn Rd cp_num opcode_2 1 CRm

Η εντολή MRC (Move to Register from Coprocessor) µεταφέρει ένα έντελο από τον συνεπεξεργαστή cpu_num

στον καταχωρητή Rd.Αν δεν υπάρχει ο συγκεκριµένος συνεπεξεργαστής, η εντολή ϑα δηµιουργήσει την εξ-

αίρεση Undefined Instruction.

Σύνταξη

MRC<cond> < coproc >, < opcod_1 >,< Rd >, < CRn >,< CRm > , < opcod_2 >

<cond> Περιέχει τη συνθήκη ϐάσει της οποίας εκτελείται η εντολή. Αν δεν έχει

συµπληρωθεί, η εντολή εκτελείται πάντα.

< coproc > Ορίζει το όνοµα του συνεπεξεργαστή και ϑέτει την κατάλληλη τιµή στο πεδίο

cp_num της εντολής. Οι γενικές τιµές είναι από p0 εώς p15.

< opcod_1 > Εντολή που εξαρτάται από τον συνεπεξεργαστή.

< Rd > Ορίζει τον καταχωρητή, στον οποίο ϑα µεταφερθεί η τιµή από τον συνεπεξερ-

γαστή. Αν χρησιµοποιήσουµε τον R15, ϑα ενηµερωθούν οι σηµαίες κατάσ-

τασης αντί του καταχωρητή.

< CRn > Ο καταχωρητής του συνεπεξεργαστή που περιέχει την τιµή.

< CRm > ∆εύτερος καταχωρητής του συνεπεξεργαστή που ϑα συµµετάσχει στη

µεταφορά.

< opcod_2 > Εντολή που εξαρτάται από τον συνεπεξεργαστή. Αν αγνοηθεί, ϑεωρείται 0.

Λειτουργία

Αν Ισχύειcond τότε

data = value from Coprocessor[cpu_num]

Αν Rd is R15 τότε

N_flag = data[31]

Z_flag = data[30]

C_flag = data[29]

V_flag = data[27]

∆ιαφορετικά

Rd = data

113

Page 120: Εγχειρίδιο Χρήσης ΑΤ91 · 2013-03-30 · Εγχειρίδιο χρήσης at91 1. Πρόλογος ουσία επιλέξαµε τον πιο ισχυρό µικροελεγκτή

Εγχειρίδιο χρήσης AT91 Κεφάλαιο 6.2 - Εντολές Μετακίνησης

6.2.10 MRS

31 28 27 26 25 24 23 22 21 20 19 16 15 12 11 0

cond 0 0 0 1 0 R 0 0 0 0 0 0 Rd 0 0 0 0 0 0 0 0 0 0 0 0

Η εντολή MRS (Move PSR to Register) µεταφέρει την τιµή του CPSR ή του SPSR στον καταχωρητή Rd.

Σύνταξη

MRS<cond> < Rd >, CPSR

MRS<cond> < Rd >, SPSR

<cond> Περιέχει τη συνθήκη ϐάσει της οποίας εκτελείται η εντολή. Αν δεν έχει

συµπληρωθεί, η εντολή εκτελείται πάντα.

< Rd > Ορίζει τον καταχωρητή, στον οποίο ϑα µεταφερθεί η τιµή από τον αντίστοιχο

PSR.

Λειτουργία

Αν Ισχύειcond τότε

Αν R == 1 τότε

Rd = SPSR

∆ιαφορετικά

Rd = CPSR

114

Page 121: Εγχειρίδιο Χρήσης ΑΤ91 · 2013-03-30 · Εγχειρίδιο χρήσης at91 1. Πρόλογος ουσία επιλέξαµε τον πιο ισχυρό µικροελεγκτή

6.Instruction Set Εγχειρίδιο χρήσης AT91

6.2.11 MSR

Immediate operand:

31 28 27 26 25 24 23 22 21 20 19 16 15 12 11 8 7 0

cond 0 0 1 1 0 R 1 0 field_mask 1 1 1 1 rotate_imm 8_bit_immediate

Register operand:

31 28 27 26 25 24 23 22 21 20 19 16 15 12 11 8 7 6 5 4 3 0

cond 0 0 0 1 0 R 1 0 field_mask 1 1 1 1 0 0 0 0 0 0 0 0 Rm

Η εντολή MSR (Move to xPSR) µεταφέρει µια τιµή (άµεση τιµή περιεχόµενη στην εντολή ή προερχόµενη από

τον Rd) στον CPSR ή τον SPSR.

Σύνταξη

MSR<cond>CPSR_ < fields >, # < immediate >

MSR<cond>CPSR_ < fields >, < Rm >

MSR<cond>SPSR_ < fields >, # < immediate >

MSR<cond>SPSR_ < fields >, < Rm >

<cond> Περιέχει τη συνθήκη ϐάσει της οποίας εκτελείται η εντολή. Αν δεν έχει

συµπληρωθεί, η εντολή εκτελείται πάντα.

< fields > Μπορεί να είναι ένας συνδιασµός των παρακάτω :

c Θέτει το ψηφίο 16 της εντολής (control).

x Θέτει το ψηφίο 17 της εντολής (extension).

s Θέτει το ψηφίο 18 της εντολής (status).

f Θέτει το ψηφίο 19 της εντολής (flags).

< immediate > Η άµεση τιµή που ϑα µεταφερθεί στον CPSR ή SPSR. Οι αποδεκτές τιµές

έχουν εύρος 8 ψηφία ή έχουν προέλθει από ολίσθηση µιας τιµής 8 ψηφίων

(από 0 ως 31 ϑέσεις).

< Rm > Είναι ο καταχωρητής, του οποίου η τιµή ϑα µεταφερθεί στον CPSR ή SPSR.

Λειτουργία

Αν Ισχύειcond τότε

Αν opcode[25] == 1 τότε

operand = 8_bit_immediate ROR (rotate_imm*2)

∆ιαφορετικά

operand = Rm

Αν R == 0 τότε

Αν field[0] == 1 AND PrivilegedMode τότε

CPSR[23:0] = operand[23:0]

Αν field[1] == 1 AND PrivilegedMode τότε

CPSR[15:8] = operand[15:8]

Αν field[2] == 1 AND PrivilegedMode τότε

CPSR[23:16] = operand[23:16]

Αν field[3] == 1 τότε

115

Page 122: Εγχειρίδιο Χρήσης ΑΤ91 · 2013-03-30 · Εγχειρίδιο χρήσης at91 1. Πρόλογος ουσία επιλέξαµε τον πιο ισχυρό µικροελεγκτή

Εγχειρίδιο χρήσης AT91 Κεφάλαιο 6.2 - Εντολές Μετακίνησης

CPSR[31:24] = operand[31:24]

∆ιαφορετικά

Αν field[0] == 1 AND HasSPSR τότε

SPSR[23:0] = operand[23:0]

Αν field[1] == 1 AND HasSPSR τότε

SPSR[15:8] = operand[15:8]

Αν field[2] == 1 AND HasSPSR τότε

SPSR[23:16] = operand[23:16]

Αν field[3] == 1 AND HasSPSR τότε

SPSR[31:24] = operand[31:24]

116

Page 123: Εγχειρίδιο Χρήσης ΑΤ91 · 2013-03-30 · Εγχειρίδιο χρήσης at91 1. Πρόλογος ουσία επιλέξαµε τον πιο ισχυρό µικροελεγκτή

6.Instruction Set Εγχειρίδιο χρήσης AT91

6.2.12 MVN

31 28 27 26 25 24 23 22 21 20 19 16 15 12 11 0

cond 0 0 Ι 1 1 1 1 S 0 0 0 0 Rd Shift_operand

Η εντολή MVN (MoVe Negative) µεταφέρει το συµπλήρωµα ως προς 1 της εξόδου του ολισθητή στον Rd. Οι

σηµαίες κατάστασης ανανεώνονται κατ’ επιλογή, ανάλογα µε το αποτέλεσµα.

Σύνταξη

MVN<cond>S < Rd >, < shifter_operand >

<cond> Περιέχει τη συνθήκη ϐάσει της οποίας εκτελείται η εντολή. Αν δεν έχει

συµπληρωθεί, η εντολή εκτελείται πάντα.

S ΄Οταν υπάρχει, ενεργοποιεί την ανανέωση των σηµαιών κατάστασης µε ϐάση

το αποτέλεσµα της εντολής. ∆υο τύποι ανανέωσης µπορούν να συµβούν :

• Αν ο Rd δεν είναι ο R15, οι σηµαίες κατάστασης Ν & Ζ τίθενται ανάλο-

γα µε την τιµή που µετακινείται και η σηµαία C ανάλογα µε το αν έχει

δηµιουργηθεί κρατούµενο από ολίσθηση. Οι υπόλοιπες σηµαίες δεν

επηρρεάζονται.

• Αν ο Rd είναι ο R15, ο SPSR του ενεργού processor mode αντιγράφε-

ται στον CPSR. Αν εκτελεστεί ενώ είµαστε σε User ή System mode

δηµιουργείται σφάλµα, επειδή αυτά τα modes δεν έχουν SPSR.

< Rd > Ορίζει τον καταχωρητή που ϑα αποθηκευτεί η τιµή.

< shifter_operand > Ορίζει την πηγή της τιµής (περιγραφή στο κεφ. 2.3.2, σελ. 16).

Λειτουργία

Αν Ισχύειcond τότε

Rd = NOT shifter_operand

Αν S == 1 και Rd == 15 τότε

CPSR = SPSR

∆ιαφορετικά αν S == 1 τότε

N_flag = Rd[31]

Z_flag = (αν Rd == 0 τότε 1 διαφορετικά 0)

C_flag = (Bit από ολίσθηση (αν έχει γίνει), αλλιώς 0)

V_flag = (Ανεπηρέαστο)

Χρήση

Αν η εντολή αυτή χρησιµοποιείται για να υπολογιστεί το συµπλήρωµα ως προς 1 της τιµής ενός καταχωρητή.

117

Page 124: Εγχειρίδιο Χρήσης ΑΤ91 · 2013-03-30 · Εγχειρίδιο χρήσης at91 1. Πρόλογος ουσία επιλέξαµε τον πιο ισχυρό µικροελεγκτή

Εγχειρίδιο χρήσης AT91 Κεφάλαιο 6.2 - Εντολές Μετακίνησης

6.2.13 STM

31 28 27 26 25 24 23 22 21 20 19 16 15 0

cond 1 0 0 P U 0 W 0 Rn Register_list

Η εντολή STM (STore Multiple) µεταφέρει block δεδοµένων από τους καταχωρητές στην εξωτερική µνήµη.

Σύνταξη

STM<cond> < addressing_mode >< Rn > !, < registers >

<cond> Περιέχει τη συνθήκη ϐάσει της οποίας εκτελείται η εντολή. Αν δεν έχει

συµπληρωθεί, η εντολή εκτελείται πάντα.

<addressing_mode> Ορίζει τον τρόπο διευθυνσιοδότησης της µνήµης (περιγραφή στο κεφ. 2.3.3,

σελ. 20).

< Rn > Ορίζει τον καταχωρητή που ϑα χρησιµοποιηθεί στον τρόπο διευθυν-

σιοδότησης της µνήµης. Αν χρησιµοποιηθεί ο R15 ϑα έχουµε απροσδιόριστα

αποτελέσµατα.

! Αν υπάρχει, σηµατοδοτεί την ανανέωση του Rn µετά την ολοκλήρωση της

εντολής. Αν δεν υπάρχει, το περιεχόµενο του Rn δεν µεταβάλλεται.

< registers > Ορίζει µια λίστα από καταχωρητές χωρισµένους µε κόµµα, η οποία περικ-

λύεται από και . Οι καταχωρητές δίνουν τις τιµές τους ξεκινώντας από

τον µικρότερο προς τον µεγαλύτερο (από R0 προς R15) και ο πρώτος απο-

ϑηκεύεται στην πρώτη ϑέση µνήµης που προσπελαύνεται, ενώ ο τελευταίος

στην τελευταία. Για κάθε καταχωρητή 0. . . 15 που συµετέχει στη λίστα, εν-

εργοποιείται και το αντίστοιχο ψηφίο του πεδίου της εντολής.

Λειτουργία

Αν Ισχύειcond τότε

address = start_address

for i = 0 to 14

Αν register_list[i] == 1 τότε

Memory[address,4] = Ri

address = address + 4

Σηµειώσεις

Περιορισµοί Αν ο καταχωρητής Rn υπάρχει στη λίστα και έχει ενεργοποιηθεί η ενηµέρωση

του µετά την εκτέλεση της εντολής, η τελική τιµή είναι απροσδιόριστη.

Unaligned Αν ο καταχωρητής Rd δεν περιέχει διεύθυνση που είναι πολλαπλάσιο του 4,

ϑα σηµειωθεί εξαίρεση Data Abord.

118

Page 125: Εγχειρίδιο Χρήσης ΑΤ91 · 2013-03-30 · Εγχειρίδιο χρήσης at91 1. Πρόλογος ουσία επιλέξαµε τον πιο ισχυρό µικροελεγκτή

6.Instruction Set Εγχειρίδιο χρήσης AT91

6.2.14 STR

31 28 27 26 25 24 23 22 21 20 19 16 15 12 11 0

cond 0 1 Ι P U 0 W 1 Rn Rd addr_mode

Η εντολή STR (STore Register) αποθηκεύει τη τιµή ενός καταχωρητή (32 ψηφία) και στην εξωτερική µνήµη. Η

διεύθυνση της µνήµης υπολογίζεται από το πεδίο addr_mode και το δεδοµένο προέρχεται από τον καταχωρητή

Rd.

Σύνταξη

STR<cond> < Rd >, < addressing_mode >

<cond> Περιέχει τη συνθήκη ϐάσει της οποίας εκτελείται η εντολή. Αν δεν έχει

συµπληρωθεί, η εντολή εκτελείται πάντα.

< Rd > Ορίζει τον καταχωρητή που περιέχει το δεδοµένο που ϑα αποθηκευτεί στη

µνήµη.

< addressing_mode > Ορίζει τον τρόπο διευθυνσιοδότησης της µνήµης (περιγραφή στο κεφ. 2.3.3,

σελ. 20).

Λειτουργία

Αν Ισχύειcond τότε

Memory[address,4] = Rd

Χρήση

Αν η εντολή αυτή χρησιµοποιεί τον R15 σαν καταχωρητή ϐάσης, µπορεί να εκτελεστεί position­independent

κώδικας, δηλαδή κώδικας που δεν ϑα προσπελαύνει απόλυτες διευθύνσεις µνήµης, αλλά διευθύνσεις σχετικές

µε τη διεύθυνση που εκτελείται τώρα. Για παράδειγµα, αν γνωρίζουµε πως οι τιµές που ϑα επεξεργαστούµε

ϐρίσκονται 85 bytes µετά από την εντολή µεταφοράς, µπορούµε να προσθέσουµε την τιµή του pc και το 85

και να µεταφέρουµε σε εκείνη τη διεύθυνση τα δεδοµένα. Επειδή το λειτουργικό σύστηµα µπορεί να ϕορτώσει

στη µνήµη τον κώδικα του προγράµµατός µας όπου εντοπίσει ελεύθερο χώρο, δεν είναι ίδιες οι διευθύνσεις

που ϕορτώνεται κάθε ϕορά, οπότε µας εξυπηρετεί το γεγονός πως προσπελαύνουµε δεδοµένα σε σχετικές και

όχι σε απόλυτες διευθύνσεις.

Σηµειώσεις

Περιορισµοί Αν το < addressing_mode > ορίζει ενηµέρωση του καταχωρητή ϐάσης µετά

την πρόσβαση στη µνήµη και χρησιµοποιούµε τον ίδιο καταχωρητή στα Rd

& Rn, η τελική τιµή του Rd είναι απροσδιόριστη.

Unaligned Αν ο καταχωρητής Rd δεν περιέχει διεύθυνση που είναι πολλαπλάσιο του 4,

ϑα σηµειωθεί εξαίρεση Data Abord.

119

Page 126: Εγχειρίδιο Χρήσης ΑΤ91 · 2013-03-30 · Εγχειρίδιο χρήσης at91 1. Πρόλογος ουσία επιλέξαµε τον πιο ισχυρό µικροελεγκτή

Εγχειρίδιο χρήσης AT91 Κεφάλαιο 6.2 - Εντολές Μετακίνησης

6.2.15 STRB

31 28 27 26 25 24 23 22 21 20 19 16 15 12 11 0

cond 0 1 Ι P U 1 W 0 Rn Rd addr_mode

Η εντολή STRB (STore Register Byte) µεταφέρει ένα δεδοµένο 8 ψηφίων από ένα καταχωρητή στην εξωτερική

µνήµη.

Σύνταξη

STR<cond>B < Rd >,< addressing_mode >

<cond> Περιέχει τη συνθήκη ϐάσει της οποίας εκτελείται η εντολή. Αν δεν έχει

συµπληρωθεί, η εντολή εκτελείται πάντα.

< Rd > Ορίζει τον καταχωρητή που περιέχει το δεδοµένο που ϑα αποθηκευθεί στη

µνήµη.

< addressing_mode > Ορίζει τον τρόπο διευθυνσιοδότησης της µνήµης (περιγραφή στο κεφ. 2.3.3,

σελ. 20).

Λειτουργία

Αν Ισχύειcond τότε

Memory[address, 1] = Rd[7:0]

Σηµειώσεις

Περιορισµοί Αν το < addressing_mode > ορίζει ενηµέρωση του καταχωρητή ϐάσης µετά

την πρόσβαση στη µνήµη και χρησιµοποιούµε τον ίδιο καταχωρητή στα Rd

& Rn, η τελική τιµή του Rd είναι απροσδιόριστη.

120

Page 127: Εγχειρίδιο Χρήσης ΑΤ91 · 2013-03-30 · Εγχειρίδιο χρήσης at91 1. Πρόλογος ουσία επιλέξαµε τον πιο ισχυρό µικροελεγκτή

6.Instruction Set Εγχειρίδιο χρήσης AT91

6.2.16 STRH

31 28 27 26 25 24 23 22 21 20 19 16 15 12 11 8 7 6 5 4 3 0

cond 0 0 0 P U Ι W 0 Rn Rd addr_mode 1 0 1 1 addr_mode

Η εντολή STRH (STore Register Halfword) µεταφέρει ένα δεδοµένο 16 ψηφίων από ένα καταχωρητή στην

εξωτερική µνήµη.

Σύνταξη

STRH<cond>H < Rd >, < addressing_mode >

<cond> Περιέχει τη συνθήκη ϐάσει της οποίας εκτελείται η εντολή. Αν δεν έχει

συµπληρωθεί, η εντολή εκτελείται πάντα.

< Rd > Ορίζει τον καταχωρητή που περιέχει το δεδοµένο που ϑα αποθηκευθεί στη

µνήµη.

< addressing_mode > Ορίζει τον τρόπο διευθυνσιοδότησης της µνήµης (περιγραφή στο κεφ. 2.3.3,

σελ. 20).

Λειτουργία

Αν Ισχύειcond τότε

Αν address[0] == 0 τότε

data = Rd[15:0]

∆ιαφορετικά

data = UNPREDICTABLE

Memory[address,2] = data

Σηµειώσεις

Περιορισµοί Αν το < addressing_mode > ορίζει ενηµέρωση του καταχωρητή ϐάσης µετά

την πρόσβαση στη µνήµη και χρησιµοποιούµε τον ίδιο καταχωρητή στα Rd

& Rn, η τελική τιµή του Rd είναι απροσδιόριστη.

Unaligned Αν η διεύθυνση δεν είναι πολλαπλάσιο του 2, η τιµή που αποθηκεύεται στον

καταχωρητή είναι απροσδιόριστη και ϑα προκληθεί εξαίρεση Data Abort.

121

Page 128: Εγχειρίδιο Χρήσης ΑΤ91 · 2013-03-30 · Εγχειρίδιο χρήσης at91 1. Πρόλογος ουσία επιλέξαµε τον πιο ισχυρό µικροελεγκτή

Εγχειρίδιο χρήσης AT91 Κεφάλαιο 6.2 - Εντολές Μετακίνησης

6.2.17 SWP

31 28 27 26 25 24 23 22 21 20 19 16 15 12 11 8 7 6 5 4 3 0

cond 0 0 0 1 0 0 0 0 Rn Rd 0 0 0 0 1 0 0 1 Rm

Η εντολή SWP (SWaP) ανταλλάσει τιµές ανάµεσα σε µια ϑέση µνήµης και ένα καταχωρητή. Η τιµή του

καταχωρητή Rm αποθηκεύεται στη ϑέση µνήµης που υποδεικνύεται από τον καταχωρητή Rn και η τιµή που

υπήρχε εκεί αποθηκεύεται στον καταχωρητή Rd. Αν χρησιµοποιηθεί ο ίδιος καταχωρητής στη ϑέση των Rn &

Rm, ϑα γίνει ανταλλαγή τιµών ανάµεσα στον ίδιο καταχωρητή και τη µνήµη.

Σύνταξη

SWP<cond> < Rd >, < Rm >, [< Rn >]

<cond> Περιέχει τη συνθήκη ϐάσει της οποίας εκτελείται η εντολή. Αν δεν έχει

συµπληρωθεί, η εντολή εκτελείται πάντα.

< Rd > Ορίζει τον καταχωρητή στον οποίο ϑα αποθηκευθεί το δεδοµένο της µνήµη.

< Rm > Ορίζει τον καταχωρητή που περιέχει το δεδοµένο που ϑα αποθηκευθεί στη

µνήµη.

< Rn > Ορίζει τον καταχωρητή που περιέχει τη διεύθυνση της µνήµης.

Λειτουργία

Αν Ισχύειcond τότε

Αν Rn[1:0] == 0’b00 τότε

temp = Memory[Rn,4]

∆ιαφορετικά αν Rn[1:0] == 0’b01 τότε

temp = Memory[Rn,4] ROR 8

∆ιαφορετικά αν Rn[1:0] == 0’b10 τότε

temp = Memory[Rn,4] ROR 16

∆ιαφορετικά αν Rn[1:0] == 0’b11 τότε

temp = Memory[Rn,4] ROR 24

Memory[Rn,4] = Rm

Rd = temp

122

Page 129: Εγχειρίδιο Χρήσης ΑΤ91 · 2013-03-30 · Εγχειρίδιο χρήσης at91 1. Πρόλογος ουσία επιλέξαµε τον πιο ισχυρό µικροελεγκτή

6.Instruction Set Εγχειρίδιο χρήσης AT91

6.2.18 SWPB

31 28 27 26 25 24 23 22 21 20 19 16 15 12 11 8 7 6 5 4 3 0

cond 0 0 0 1 0 1 0 0 Rn Rd 0 0 0 0 1 0 0 1 Rm

Η εντολή SWPB (SWaP Byte) ανταλλάσει τιµές εύρους 8 ψηφίων ανάµεσα σε µία ϑέση µνήµης και έναν

καταχωρητή (χρησιµοποιώντας τα λιγότερο σηµαντικά ψηφία του). Η τιµή του καταχωρητή Rm αποθηκεύεται

στη ϑέση µνήµης που υποδεικνύεται από τον καταχωρητή Rn και η τιµή που υπήρχε εκεί αποθηκεύεται στον

καταχωρητή Rd. Αν χρησιµοποιηθεί ο ίδιος καταχωρητής στη ϑέση των Rn & Rm, ϑα γίνει ανταλλαγή τιµών

ανάµεσα στον ίδιο καταχωρητή και τη µνήµη.

Σύνταξη

SWP<cond>B < Rd >, < Rm >, [< Rn >]

<cond> Περιέχει τη συνθήκη ϐάσει της οποίας εκτελείται η εντολή. Αν δεν έχει

συµπληρωθεί, η εντολή εκτελείται πάντα.

< Rd > Ορίζει τον καταχωρητή στον οποίο ϑα αποθηκευθεί το δεδοµένο της µνήµη.

< Rm > Ορίζει τον καταχωρητή που περιέχει το δεδοµένο που ϑα αποθηκευθεί στη

µνήµη.

< Rn > Ορίζει τον καταχωρητή που περιέχει τη διεύθυνση της µνήµης.

Λειτουργία

Αν Ισχύειcond τότε

temp = Memory[Rn,1]

Memory[Rn,1] = Rm[7:0]

Rd = temp

Σηµείωση

Οι εντολές SWP & SWPB µπορούν να χρησιµοποιηθούν για την υλοποίηση σηµαφόρων.

123

Page 130: Εγχειρίδιο Χρήσης ΑΤ91 · 2013-03-30 · Εγχειρίδιο χρήσης at91 1. Πρόλογος ουσία επιλέξαµε τον πιο ισχυρό µικροελεγκτή

Εγχειρίδιο χρήσης AT91 Κεφάλαιο 6.3 - Εντολές ∆ιακλάδωσης

6.3 Εντολές ∆ιακλάδωσης

6.3.1 B,BL

31 28 27 26 25 24 23 0

cond 1 0 1 L signed_immed_24

Οι εντολές B (Branch) & BL (Branch and Link) οδηγούν τον επεξεργαστή σε διακλάδωση και αλλαγή της ϱοής

εκτέλεσης του προγράµµατος.

Σύνταξη

BL<cond> < target_address >

L Ενεργοποιεί την αποθήκευση µιας διεύθυνσης επιστροφής στον καταχωρητή

R14.

<cond> Περιέχει τη συνθήκη ϐάσει της οποίας εκτελείται η εντολή. Αν δεν έχει

συµπληρωθεί, η εντολή εκτελείται πάντα.

< target_address > Ορίζει την διεύθυνση όπου ϑα γίνει η διακλάδωση. Η διεύθυνση υπολογίζεται

µε τα ακόλουθα ϐήµατα :

1. Γίνεται προσηµασµένη επέκταση της άµεσης τιµής <

target_address > που παρέχεται στην εντολή (ψηφία 23 έως

0 του κωδικού λειτουργίας) από τα 24 στα 32 ψηφία.

2. Το αποτέλεσµα ολισθαίνει αριστερά κατά 2 ψηφία.

3. Η ολισθηµένη τιµή προστίθεται στο (PC + 8).

Η παραπάνω διαδικασία µας επιτρέπει να εκτελέσουµε διακλάδωση σε µια

απόσταση ±32MB από τη ϑέση που δείχνει ο PC.

Λειτουργία

Αν Ισχύειcond τότε

Αν L == 1 τότε

LR = address of next instruction

PC = PC + SignExtend(immed_24) LeftShift 2

Χρήση

Η εντολή BL χρησιµοποιείται για να υλοποιήσει µια κλήση υπορουτίνας. Η επιστροφή από την υπορουτίνα

γίνεται µε την αντιγραφή του R14 στον R15. Η τιµή που δίνεται στην εντολή δεν χρειάζεται να είναι αριθµός

αλλά ετικέτα, διότι ο Assembler εκτελεί την µετάφραση της ετικέτας σε µετατόπιση.

124

Page 131: Εγχειρίδιο Χρήσης ΑΤ91 · 2013-03-30 · Εγχειρίδιο χρήσης at91 1. Πρόλογος ουσία επιλέξαµε τον πιο ισχυρό µικροελεγκτή

6.Instruction Set Εγχειρίδιο χρήσης AT91

6.3.2 BX

31 28 27 26 25 24 23 22 21 20 19 16 15 12 11 8 7 6 5 4 3 0

cond 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 Rm

Οι εντολή BX (Branch and eXchange) οδηγεί τον επεξεργαστή σε διακλάδωση στη διεύθυνση που ϐρίσκεται

αποθηκευµένη στον καταχωρητή Rm, ενώ µπορεί και να αλλάξει κατάσταση εκτέλεσης εντολών από ARM σε

Thumb. Η διεύθυνση της µνήµης πρέπει να είναι πολλαπλάσιο του 4.

Σύνταξη

BX<cond> < Rm >

<cond> Περιέχει τη συνθήκη ϐάσει της οποίας εκτελείται η εντολή. Αν δεν έχει

συµπληρωθεί, η εντολή εκτελείται πάντα.

< Rm > Ορίζει τον καταχωρητή που περιέχει τη διεύθυνση διακλάδωσης.

Λειτουργία

Αν Ισχύειcond τότε

T Flag == Rm[0] τότε

LR = address of next instruction

PC = Rm AND 0xFFFFFFFE

Χρήση

Η εντολή BX µπορεί να χρησιµοποιηθεί σε περιπτώσεις όπου µια διεύθυνση της κύριας µνήµης έχει απο-

ϑηκευτεί σε ένα καταχωρητή και ϑέλουµε να εκτελέσουµε διακλάδωση σε εκείνη τη ϑέση. Εκτός από την

λειτουργία αλλαγής είδους εκτελέσιµου κώδικα ARM, Thumb, είναι ακριβώς ίδια στη λειτουργία µε µια MOV

στον PC.

125