Atmel avr assembler

Compilatorul funcționează cu fișiere sursă care conțin instrucțiuni, etichete și directive. Instrucțiunile și directivele au, de regulă, unul sau mai mulți operanzi.







Linia de cod nu poate fi mai lungă de 120 de caractere.

Orice șir poate începe cu o etichetă, care este un set de caractere care se termină într-un colon. Etichetele sunt utilizate pentru a indica locația la care se transferă controlul în timpul tranzițiilor și, de asemenea, pentru a specifica numele variabilelor.

Șirul de intrare poate avea una din cele patru forme:

Pozițiile din paranteze pătrate sunt opționale. Textul după punct și virgulă (;) și până la sfârșitul liniei este ignorat de compilator. Etichetele, instrucțiunile și directivele sunt descrise mai detaliat mai jos.

etichetă: .EQU var1 = 100; Setați var1 la 100 (Aceasta este o directivă)
.EQU var2 = 200; Setează var2 la 200

Instrucțiuni pentru procesoarele AVR

Mai jos este un set de instrucțiuni pentru procesoarele AVR, o descriere mai detaliată a acestora poate fi găsită în Cartea de date AVR.

Instrucțiuni aritmetice și logice


Assembler nu distinge cazul caracterelor.

Operanzii pot fi din următoarele tipuri:

Instrucțiuni de asamblare

Compilatorul susține o serie de directive. Directivele nu sunt traduse direct în cod. În schimb, ele sunt folosite pentru a indica poziția din memoria programului, definiția macrocomenzilor, inițializarea memoriei și așa mai departe. Lista de directive este prezentată în tabelul următor.

Toate directivele sunt precedate de o perioadă.

BYTE - Rezerva de octeți în RAM

Direcția BYTE rezervă octeți în RAM. Dacă doriți să puteți face referire la o zonă de memorie selectată, directiva BYTE trebuie să fie precedată de o etichetă. Directiva ia un parametru obligatoriu, care indică numărul de octeți alocați. Această directivă poate fi utilizată numai în segmentul de date (vezi directivele CSEG și DSEG). Bytes-urile alocate nu sunt inițializate.

sintaxa:
MARK. Expresia BYTE

exemplu:
.DSEG
var1: .BYTE este un număr; rezervă 1 octet pentru var1
tabel: .BYTE tab_size; rezervează tab_size bytes

.CSEG
Ldi r30, scăzut (var1); Încarcă octetul scăzut al registrului Z
Ldi r31, mare (var1); Încarcă octetul înalt al registrului Z
Ld r1, Z; Încarcă VAR1 în registrul 1

CSEG - Segmentul de software

Directiva CSEG definește începutul unui segment de software. Fișierul sursă poate consta din mai multe segmente de program care sunt combinate într-un singur segment de program atunci când sunt compilate. Segmentul de programe este segmentul implicit. Segmentele de software au contoare de poziție proprii, care nu sunt considerate byte-byte, ci ca și cum ar fi. Directiva ORG poate fi utilizată pentru a plasa codul și constantele în locația dorită a segmentului. Directiva CSEG nu are parametri.

exemplu:
.DSEG══════════════════════; Începerea segmentului de date
vartab. BYTE 4; A fost rezervat 4 octeți în RAM

.CSEG══════════════════════; Începutul segmentului de cod
const :. DW ═ ═ 2 2; Plasați constanta 0x0002 în memoria programului
Mov r1, r.e. Efectuați acțiuni

DB - Definiți octeți în bliț sau EEPROM

Directiva DB rezervă numărul necesar de octeți în memoria programului sau în EEPROM. Dacă doriți să puteți face referire la o anumită zonă de memorie, directiva DB trebuie să fie precedată de o etichetă. Directiva DB trebuie să aibă cel puțin un parametru. Această directivă poate fi plasată numai în segmentul de programe (CSEG) sau în segmentul EEPROM (ESEG).

Parametrii transmiși la directivă sunt o secvență de expresii separate prin virgule. Fiecare expresie trebuie să fie în intervalul sau numărul (-128..255), sau ca urmare a calculului ar trebui să dea un rezultat în același interval, în caz contrar numărul de octeți trunchiate, cu NO alertarea.

În cazul în care directiva devine mai mult de un parametru, iar curentul este un segment de program, parametrii sunt ambalate în cuvinte (prima opțiune - baitul cel mai puțin semnificativ), iar în cazul în care numărul este parametri impare, ultima expresie va fi trunchiat la octetul și este scris ca un cuvânt la octetul superior este zero, chiar dacă atunci există o altă directivă DB.

sintaxa:
LABEL: Lista de expresii .DB

exemplu:
.CSEG
consts. DB 0, 255, 0b01010101, -128, 0xaa

DEF - Atribuiți un nume simbolic în registru

Directiva DEF vă permite să vă referiți la registru printr-un nume simbolic. Numele atribuit poate fi utilizat în întreaga porțiune a programului pentru accesarea acestui registru. Un registru poate avea mai multe nume diferite. Numele simbolic poate fi realocat ulterior în program.

sintaxa:
.DEF Symbolic_name = Înregistrează-te

.CSEG
Îldi temp, 0xf0; Încarcă 0xf0 în registrul temp (R16)
Íin ior, 0x3f; Citiți SREG în registrul ior (R0)
Ёeor temp, ior; Registrele temp și ior sunt adăugate la categoriile exclusive sau

DEVICE - Definiți dispozitivul pentru care este compilat programul

Directiva DEVICE vă permite să specificați pentru ce dispozitiv este compilat programul. Când se utilizează această directivă, compilatorul va emite un avertisment dacă se constată o instrucțiune pe care microcontrolerul nu o acceptă. De asemenea, va fi emis un avertisment dacă segmentul de software sau segmentul EEPROM depășește dimensiunea permisă de dispozitiv. Dacă directiva nu este utilizată, atunci toate instrucțiunile sunt considerate acceptabile și nu există restricții privind dimensiunea segmentelor.

sintaxa:
.DEVICE AT90S1200 | AT90S2313 | AT90S2323 | AT90S2333 | AT90S2343 | AT90S4414 | AT90S4433 | AT90S4434 | AT90S8515 | AT90S8534 | AT90S8535 | ATtiny11 | ATtiny12 | ATtiny22 | ATmega603 | ATmega103

exemplu:
.DEVICE AT90S1200; AT90S1200

.CSEG
═══════ împinge r30══; Această instrucțiune va declanșa un avertisment
Statul; deoarece AT90S1200 nu o are

DSEG - Segment de date

Directiva DSEG specifică începutul unui segment de date. Fișierul sursă poate consta din mai multe segmente de date, care sunt combinate într-un segment atunci când sunt compilate. Segmentul de date constă de obicei numai în directive și etichete BYTE. Segmentele de date au propriile contoare de octeți. Directiva ORG poate fi utilizată pentru a plasa variabile în locația dorită a RAM-ului. Directiva nu are parametri.

exemplu:
.DSEG═══════════════════════; Începerea segmentului de date
var1: ═ .BYTE ═ ═ 1 1 1; rezerva 1 octet pentru var1
tabel: .BYTE tab_size; rezervați tab_size bytes.

.CSEG
Ldi r30, scăzut (var1); Încărcați octetul scăzut al registrului Z






Ldi r31, mare (var1); Descărcați octetul superior al registrului Z
Ld r1, Z; Descărcați var1 pentru a înregistra r1

DW - Definiți cuvinte în Flash sau EEPROM

Directiva DW își rezervă numărul necesar de cuvinte în memoria programului sau în EEPROM. Dacă doriți să puteți face referire la o zonă de memorie selectată, directiva DW trebuie să fie precedată de o etichetă. Directiva DW trebuie să aibă cel puțin un parametru. Această directivă poate fi plasată numai în segmentul de programe (CSEG) sau în segmentul EEPROM (ESEG).

Parametrii transmiși la directivă sunt o secvență de expresii separate prin virgule. Fiecare expresie trebuie să fie în intervalul sau numărul (-32768..65535), sau ca urmare a calculului ar trebui să dea un rezultat în același interval, în caz contrar numărul este trunchiat la cuvântul, fără nici un avertisment.

sintaxa:
MARK. Listă de expresii DW

exemplu:
.CSEG
varlist: .DW 0, 0xffff, 0b1001110001010101, -32768, 65535

ENDMACRO - Sfârșitul macro-ului

Directiva definește sfârșitul definiției macro și nu ia parametri. Pentru informații despre definirea macrocomenzilor, consultați directiva MACRO.

exemplu:
.MACRO SUBI; Începutul definiției macro
Subi r16, scăzut (@ 0); Reduceți octetul scăzut al primului parametru
Sbci r17, mare (@ 0); Reduceți octetul înalt al primului parametru
.ENDMACRO

EQU - Setați expresia constantă

Directiva EQU atribuie o etichetă unei valori. Această etichetă poate fi utilizată ulterior în expresii. A cărui etichetă îi este atribuită valoarea acestei directive nu poate fi realocată și valoarea acesteia nu poate fi modificată.

sintaxa:
.EQU label = expresie

exemplu:
.EQU io_offset = 0x23
.Portul EQU = io_offset + 2

.CSEG════════════════; Începerea segmentului de date
A clr r2; Reglați registrul r2
Out porta, r2; Scrie la portul A

Segmentul ESEG - EEPROM

Directiva ESEG specifică începutul segmentului EEPROM. Fișierul sursă poate consta din mai multe segmente EEPROM, care sunt combinate într-un segment atunci când sunt compilate. Segmentul EEPROM constă de obicei numai din directivele DB. DW și etichete. Segmentele EEPROM au propriile contoare pentru poziția numărătorilor de octeți. Directiva ORG poate fi utilizată pentru a plasa variabile în locația dorită a EEPROM-ului. Directiva nu are parametri.

exemplu:
.DSEG═══════════════════; Începerea segmentului de date
var1: .BYTE este; rezerva 1 octet pentru var1
tabel: .BYTE tab_size; rezervați tab_size bytes.

.ESEG
eevar1. DW 0xffff; inițializați 1 cuvânt în EEPROM

EXIT - Ieșiți din fișier

Îndeplinind directiva EXIT, compilatorul oprește compilarea acestui fișier. În cazul în care directiva este utilizată în fișierul atașat (a se vedea. INCLUDE directivă), elaborarea continuă cu rândul următor după INCLUDE directivei. Dacă fișierul nu este imbricat, compilația se oprește.

exemplu:
.EXIT═; Ieșiți din acest fișier

INCLUDE - Atașați un alt fișier

În conformitate cu directiva INCLUDE, compilatorul deschide fișierul specificat în acesta, îl compilează până când fișierul este complet sau se întâlnește direcția EXIT. apoi continuă să compileze fișierul inițial din linie urmând directiva INCLUDE. Un fișier atașat poate conține, de asemenea, directive INCLUDE.

sintaxa:
.INCLUDE "nume de fișier"

exemplu:
; Fișierul iodefs.asm:
.EQU sreg = 0x3f; Registrul de stare
.EQU sphigh = 0x3; Înalt octet al indicatorului de stivă
.EQU splow = 0x3d; Notă redusă a indicatorului de stivă

; fișierul incdemo.asm
.INCLUDE iodefs.asm; Încurajați definițiile porturilor
În r0, sregionie; Citiți registrul de stare

LIST - Activați generarea înregistrării

exemplu:
.NOLIST═══════════════; Dezactivați generarea înregistrării
.INCLUDE "macro.inc"; Fișiere atașate nu vor fi
.INCLUDE "const.def"; afișate în listă
.LIST═════════════════; Activați generarea listei

LISTMAC - Activați extinderea macro-ului în listă

După directiva LISTMAC, compilatorul va afișa conținutul macro-ului în listă. În mod implicit, în lista sunt afișate numai apelurile macro și parametrii trecuți.

.LISTMAC═══════════; Activați implementarea macrocomenzilor
MACX r2, r1; Apelarea macrocomenzii (corpul macro-ului va fi afișat în listă)

MACRO - Începutul macrocomenzii

Prin directiva MACRO începe definiția macro. Ca parametru, numele macro este transmis directivei. Atunci când o macrocomandă apare mai târziu în textul programului, compilatorul înlocuiește acest nume cu corpul macrocomenzii. O macro poate avea până la 10 parametri, care în corpul său sunt accesați prin @ 0-9. Când apelați, parametrii sunt enumerați prin virgule. Definiția macrocomenzii se termină cu directiva ENDMACRO.

În mod implicit, numai înregistrarea macro este inclusă în înregistrare, trebuie să utilizați directiva LISTMAC pentru a implementa macrocomanda. Macroul din listă este afișat cu un semn +.

sintaxa:
.MACRO nume macro

exemplu:
.MACRO SUBI; Început de macrocomenzi
Subi 1, scăzut (@ 0); Reduceți octetul scăzut al parametrului 0 din parametrul 1
Sbci2, mare (@ 0); Reduceți octetul înalt al parametrului 0 din parametrul 2
.ENDMACRO══════════════════════; Sfârșitul macrocomenzilor

.CSEG══════════════════════════; Începerea segmentului de program
SUBI16 0x1234, r16, r17; Scădere 0x1234 din r17: r16

NOLIST - Opriți generarea listei

exemplu:
.NOLIST═══════════════; Dezactivați generarea înregistrării
.INCLUDE "macro.inc"; Fișiere atașate nu vor fi
.INCLUDE "const.def"; afișate în listă
.LIST═════════════════; Activați generarea listei

ORG - Setați poziția în segment

SET - Setați echivalentul simbolic variabil al expresiei

Directiva directivă SET atribuie un nume unei valori. Acest nume poate fi folosit ulterior în expresii. Și, spre deosebire de directiva EQU, valoarea numelui poate fi modificată printr-o altă directivă SET.

sintaxa:
.SET nume = expresie

exemplu:
.SET io_offset = 0x23
.Portul SET = io_offset + 2

.CSEG════════════════; Începutul segmentului de cod
A clr r2; Caz clar 2
Out porta, r2; Scrie la portul A

Compilatorul permite utilizarea expresiilor în program care pot fi operanzi. semne de operațiuni și funcții. Toate expresiile sunt de 32 de biți.

Următorii operanzi pot fi utilizați:

  • Etichete definite de utilizator (da semnificația poziției lor).
  • Variabilele definite de directiva SET
  • Constante definite de directiva EQU
  • Numerele indicate în formatul:
    • Zecimal (acceptat în mod implicit): 10, 255
    • Hexadecimal (două opțiuni pentru scriere): 0x0a, $ 0a, 0xff, $ ff
    • Binar: 0b00001010, 0b11111111
    • Octal (începe de la zero): 010, 077
  • PC - valoarea curentă a contorului de programe (Programm Counter)

Compilatorul acceptă o serie de operațiuni care sunt listate în tabel (cu cât este mai mare poziția din tabel, cu atât este mai mare prioritatea operației). Expresiile pot fi închise în paranteze, astfel de expresii sunt evaluate înainte de expresii în afara parantezelor.

Sunt definite următoarele funcții:

  • LOW (expresie) returnează octetul scăzut al expresiei
  • HIGH (expresie) returnează al doilea octet al expresiei
  • BYTE2 (expresie) este aceeași cu HIGH
  • BYTE3 (expresie) returnează al treilea octet al expresiei
  • BYTE4 (expresie) returnează al patrulea octet al expresiei
  • LWRD (expresie) returnează biții 0 la 15 din expresie
  • HWRD (expresie) returnează biții 16-31 din expresie
  • PAGE (expresie) returnează biții 16-21 ai expresiei
  • EXP2 (expresie) întoarce 2 la puterea (expresie)
  • LOG2 (expresie) returnează partea intregă a log2 (expresie)

Utilizarea programului

Deschiderea fișierelor

Mesaje de eroare

După compilarea programului, apare o casetă de mesaj. Orice erori detectate de compilator vor fi listate în această fereastră. Dacă selectați o linie cu un mesaj de eroare, rândul fișierului sursă în care se găsește eroarea devine roșu. Dacă eroarea se află în fișierul atașat, atunci această evidențiere nu va apărea.

Dacă faceți dublu clic pe o linie în fereastra mesajului, fereastra de fișier cu eroarea specificată devine activă și cursorul este plasat la începutul liniei care conține eroarea. Dacă fișierul cu eroare nu este deschis (de exemplu, acesta este un fișier atașat), acesta va fi deschis automat.

Rețineți că, dacă ați făcut modificări surselor (linii adăugate sau șterse), informațiile despre numerele de linie din caseta de mesaj nu sunt corecte.

Unele setări ale programului pot fi modificate prin intermediul elementului de meniu "Opțiuni".

În caseta de text, intitulat „Extensie List-fișier“, a intrat extensia utilizată pentru listarea a fișierului, iar în câmpul „extensia Output-fișier“ este extensia pentru fișierele cu rezultatul compilării unui program. În dreptunghiul "Formatul fișierului de ieșire" puteți selecta formatul fișierului de ieșire (de regulă se utilizează formatul de ieșire Intel). Cu toate acestea, acest lucru nu afectează fișierul obiect (folosit de AVR Studio), care are întotdeauna același format și extensia OBJ. Dacă există un segment EEPROM în fișierul sursă, fișierul cu extensia EEP va fi, de asemenea, creat. Setările specificate în această fereastră sunt stocate permanent, iar data viitoare când porniți programul, acestea nu trebuie reinstalate.

Opțiunea "Salvați înainte de asamblare" indică programului să salveze automat fereastra activă (și numai ea) înainte de compilare.

Dacă doriți să închideți toate ferestrele deschise când închideți programul, bifați caseta "Închideți toate ferestrele înainte de a ieși".

Atmel, AVR sunt mărci comerciale înregistrate ale Atmel Corporation

Traducere de Ruslan Shimkevich, [email protected]







Trimiteți-le prietenilor: