Programmeren in machinecodes en in assembler. AVR-montagerichtlijnen

Assemblers MASM, TASM en WASM zijn verschillend. Het maken van eenvoudige programma's voor hen verschilt echter praktisch niet, met uitzondering van de montage en het koppelen zelf.

Dus ons eerste programma voor MASM, TASM en WASM, dat de Engelse letter "A" weergeeft op de huidige cursorpositie, dat wil zeggen in de linkerbovenhoek van het scherm:

Model tiny .code ORG 100h start: MOV AH, 2 MOV DL, 41h INT 21h INT 20h END start Deze tekst kan in elke eenvoudige teksteditor worden getypt - bijvoorbeeld in het Kladblok van WINDOWS (maar niet in Word of anderszins " fancy "). Ik raad echter een "geavanceerde" teksteditor aan met syntaxisaccentuering, zoals PSPad (zie sectie). Vervolgens slaan we dit bestand op met bijvoorbeeld de extensie .asm in de map MYPROG. Laten we het bestand atest noemen. We kregen dus: C: \ MYPROG \ atest.asm.

OPMERKING
Merk op dat we in het eerste commando 2 hebben geschreven in plaats van 02h. MASM, TASM en WASM nemen, net als Emu8086, zulke vrijheden. Hoewel je 02h kunt schrijven, zal er geen fout zijn.

Uitleg over het programma:

.model klein- 1e lijn. De .model-richtlijn definieert het geheugenmodel voor een bepaald bestandstype. In ons geval is dit een bestand met de COM-extensie, dus we selecteren het kleine model, dat de code-, gegevens- en stapelsegmenten combineert. Het kleine model is ontworpen om COM-bestanden te maken.

.code- 2e lijn. Deze richtlijn begint een codesegment.

ORG 100u- 3e lijn. Dit commando stelt de waarde van de programmateller in op 100h, omdat DOS bij het laden van het COM-bestand in het geheugen de eerste 256 bytes toewijst aan het PSP-gegevensblok (decimaal getal 256 is gelijk aan hexadecimaal 100h). De programmacode bevindt zich pas na dit blok. Alle programma's die in COM-bestanden worden gecompileerd, moeten met deze richtlijn beginnen.

start: MOV AH, 02h- 4e lijn. Het startlabel bevindt zich voor het eerste commando in het programma en wordt gebruikt in de END-instructie om aan te geven met welk commando het programma begint. De MOV-instructie plaatst de waarde van de tweede operand in de eerste operand. Dat wil zeggen, de waarde 02h wordt in het AH-register geplaatst. Waarom wordt dit gedaan? 02h is een DOS-functie die een teken op het scherm afdrukt. We schrijven een programma voor DOS, dus we gebruiken de commando's van dit besturingssysteem (OS). En we schrijven deze functie (of liever het nummer ervan) in het AH-register, omdat interrupt 21h dit specifieke register gebruikt.

MOV DL, 41 uur- 5e lijn. De tekencode "A" wordt opgeslagen in het DL-register. De ASCII-tekencode voor "A" is 41 uur.

INT 21u- 6e lijn. Dit is precies de interrupt 21h - het commando dat de DOS-systeemfunctie aanroept die is gespecificeerd in het AH-register (in ons voorbeeld is dit de 02h-functie). INT 21h-opdracht is het belangrijkste middel voor interactie van programma's met het besturingssysteem.

INT 20u- 7e lijn. Dit is een interrupt die het besturingssysteem vertelt het programma af te sluiten en de besturing over te dragen aan de consoletoepassing. In het geval dat het programma al is gecompileerd en gestart vanuit het besturingssysteem, zal de opdracht INT 20h ons terugbrengen naar het besturingssysteem (bijvoorbeeld naar DOS).

EINDE begin- 8e lijn. De END-instructie beëindigt het programma en geeft aan op welk label de uitvoering moet beginnen.

Bepaal het apparaat waarvoor het is gecompileerd

De parameters die aan de richtlijn worden doorgegeven, zijn een reeks uitdrukkingen, gescheiden door komma's. Elke uitdrukking moet een getal zijn in het bereik (-128..255), of in

het resultaat van de berekening zou een resultaat in hetzelfde bereik moeten geven, anders wordt het getal afgekapt tot een byte, en ZONDER waarschuwingen af ​​te geven.

Als de richtlijn meer dan één parameter ontvangt en de stroom is een programmasegment, dan zijn de parameters verpakt in woorden (de eerste parameter is de minst significante byte), en als

het aantal parameters oneven is, dan wordt de laatste uitdrukking afgekapt tot een byte en geschreven als een woord met de meest significante byte gelijk aan nul, zelfs als er nog een is

DB-richtlijn.

Syntaxis:
LABEL: .DB expressielijst

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

De parameters die aan de richtlijn worden doorgegeven, zijn een reeks uitdrukkingen, gescheiden door komma's. Elke uitdrukking moet een getal zijn in het bereik (-32768..65535), of

als resultaat van de berekening zou het een resultaat in hetzelfde bereik moeten geven, anders wordt het nummer afgekapt tot een woord, en ZONDER waarschuwingen af ​​te geven.

Syntaxis:
LABEL: .DW expressielijst

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

Syntaxis:
.ENDMACRO

Voorbeeld:
.MACRO SUBI16; Begin met het definiëren van een macro
subi r16, laag (@ 0); Trek de minst significante byte van de eerste parameter af
sbci r17, hoog (@ 0); Trek de meest significante byte van de eerste parameter af
.ENDMACRO

EQU - Stel constante expressie in

De EQU-richtlijn kent een waarde toe aan het label. Dit label kan later in expressies worden gebruikt. Het label waaraan door deze richtlijn een waarde wordt toegekend kan niet worden

wordt opnieuw toegewezen en de waarde ervan kan niet worden gewijzigd.

Syntaxis:
.EQU label = uitdrukking

Voorbeeld:
.EQU io_offset = 0x23
.EQU-porta = io_offset + 2

CSEG; Begin van gegevenssegment
clr r2; Wis register r2
uit porta, r2; Schrijf naar poort A

ESEG - EEPROM-segment

De ESEG-richtlijn definieert het begin van het EEPROM-segment. Een bronbestand kan uit meerdere EEPROM-segmenten bestaan ​​die bij compilatie tot één segment worden gecombineerd.

Een EEPROM-segment bestaat meestal alleen uit richtlijnen,

href = "# DW - Definieer constante woord(en) in programmageheugen en EEPROM"> DW

en etiketten. EEPROM-segmenten hebben hun eigen

byte positie tellers. De richtlijn kan worden gebruikt om te plaatsen

variabelen op de gewenste locatie van de EEPROM. De richtlijn heeft geen parameters.

Syntaxis:
.ESEG

Voorbeeld:
var1: .BYTE 1; reserveer 1 byte voor var1
tabel: .BYTE tab_size; reserveer tab_size bytes.

ESEG
eevar1: .DW 0xffff; initialiseer 1 woord in EEPROM

EXIT - Bestand afsluiten

Bij het tegenkomen van de EXIT-richtlijn, stopt de compiler met het compileren van dit bestand. Als de richtlijn wordt gebruikt in een bijgevoegd bestand (zie de richtlijn

href = "# INCLUDE - Voeg nog een bestand toe"> INCLUDE

), dan gaat de compilatie verder vanaf de regel die volgt op de INCLUDE-richtlijn.

Als het bestand niet genest is, stopt de compilatie.

Syntaxis:
.UITGANG

Voorbeeld:
.UITGANG; Dit bestand afsluiten

INCLUDE - Voeg nog een bestand toe

Nadat aan de INCLUDE-richtlijn is voldaan, opent de compiler het daarin gespecificeerde bestand, compileert het totdat het bestand eindigt of de richtlijn wordt aangetroffen

href = "# EXIT - Dit bestand afsluiten"> EXIT

, dan gaat het verder met het compileren van het initiële bestand vanaf de regel die volgt op de richtlijn

ERBIJ BETREKKEN. Het bijgevoegde bestand kan ook INCLUDE-richtlijnen bevatten.

Syntaxis:
.INCLUDE "bestandsnaam"

Voorbeeld:
; iodefs.asm-bestand:
.EQU sreg = 0x3f; Statusregister
.EQU sphigh = 0x3e; Hoge byte van de stapelaanwijzer
.EQU slow = 0x3d; Lage byte van de stapelaanwijzer

; incdemo.asm-bestand
.INCLUSIEF iodefs.asm; Poortdefinities insluiten
in r0, sreg; Statusregister lezen

LIST - Genereer vermelding inschakelen

De LIST-richtlijn vertelt de compiler om een ​​lijst te maken. Listing is een combinatie van assembly-code, adressen en opcodes. Door

Standaard is het genereren van lijsten ingeschakeld, maar deze richtlijn wordt gebruikt in combinatie met de richtlijn om lijsten van afzonderlijke delen van de bronbestanden te krijgen.

Syntaxis:
.LIJST

Voorbeeld:

LISTMAC - Uitbreiden van macro's in lijst inschakelen

Na de LISTMAC-richtlijn zal de compiler de inhoud van de macro in de lijst weergeven. Standaard toont de lijst alleen de aanroep van de macro en de doorgegeven

opties.

Syntaxis:
.LISTMAC

Voorbeeld:
.MACRO MACX; Macrodefinitie
voeg r0, @ 0 toe; Macro lichaam
eor r1, @ 1

LISTMAC; Uitvouwbare macro's inschakelen
MACX r2, r1; De macro aanroepen (de lijst toont de hoofdtekst van de macro)

MACRO - Macro starten

De definitie van een macro begint met de MACRO-richtlijn. De naam van de macro wordt als parameter aan de richtlijn doorgegeven. Wanneer u de naam van de macro later in de tekst van het programma tegenkomt,

de compiler vervangt deze naam door de hoofdtekst van de macro. Een macro kan maximaal 10 parameters hebben, waarnaar in zijn hoofdtekst wordt verwezen via @ [e-mail beveiligd] Wanneer aangeroepen, worden de parameters weergegeven

gescheiden door comma's. De definitie van een macro eindigt met een richtlijn.

Standaard bevat de lijst alleen een aanroep van de macro; om de macro uit te vouwen, moet u de instructie gebruiken. De macro in de lijst wordt weergegeven met een +-teken.

Syntaxis:
.MACRO macronaam

Voorbeeld:
.MACRO SUBI16; Macrodefinitie start
subi @ 1, laag (@ 0); Trek de lage byte van parameter 0 af van parameter 1
sbci @ 2, hoog (@ 0); Trek de hoge byte van parameter 0 af van parameter 2
.ENDMACRO; Einde van macro's

CSEG; Start van het programmaonderdeel
SUBI16 0x1234, r16, r17; Trek 0x1234 af van r17: r16

NOLIST - Het genereren van vermeldingen uitschakelen

De NOLIST-richtlijn vertelt de compiler om te stoppen met het genereren van de lijst. Lijst is een combinatie van montagecode, adressen en

operatiecodes. Het genereren van lijsten is standaard ingeschakeld, maar kan door deze richtlijn worden uitgeschakeld. Bovendien kan deze richtlijn worden gebruikt

in combinatie met een richtlijn voor het verkrijgen van lijsten van afzonderlijke onderdelen

bronbestanden

Syntaxis:
.NOLIST

Voorbeeld:
.NOLIST; Genereren van vermelding uitschakelen
.INCLUSIEF "macro.inc"; Bijgevoegde bestanden worden niet
.INCLUSIEF "const.def"; weergegeven in de lijst
.LIJST; Generatie van vermelding inschakelen

ORG - Positie in segment instellen

De ORG-richtlijn stelt de positieteller gelijk aan de gegeven waarde, die als parameter wordt doorgegeven. Voor het datasegment stelt het de positieteller in op

SRAM (RAM), voor het programmasegment is dit de programmateller en voor het EEPROM-segment is dit de positie in de EEPROM. Als de richtlijn wordt voorafgegaan door een label (op dezelfde regel), dan

het label bevindt zich op het adres dat is opgegeven in de richtlijnparameter. Voordat de compilatie begint, zijn de programmateller en EEPROM-teller nul en is de RAM-teller 32

(aangezien de adressen 0-31 bezet zijn door registers). Houd er rekening mee dat bytetellers worden gebruikt voor RAM en EEPROM en woord-voor-woordtellers voor het programmasegment.

Syntaxis:
.ORG expressie

Voorbeeld:
.DSEG; Begin van gegevenssegment

ORG 0x37; Stel het SRAM-adres in op 0x37
variabele: .BYTE 1; Reserveer een byte op adres 0x37H

CSEG
.ORG 0x10; Stel softwareteller in op 0x10
mov r0, r1; Deze opdracht bevindt zich op 0x10

SET - Stel het variabele symbolische equivalent van een uitdrukking in

De SET-richtlijn kent een bepaalde betekenis toe aan een naam. Deze naam kan later in uitdrukkingen worden gebruikt. Bovendien, in tegenstelling tot de richtlijn

href = "# EQU - Stel een symbool in dat gelijk is aan een uitdrukking"> EQU

de naamwaarde kan worden gewijzigd door een andere SET-richtlijn.

Syntaxis:
.SET naam = uitdrukking

Voorbeeld:
.SET io_offset = 0x23
.SET porta = io_offset + 2

CSEG; Begin codesegment
clr r2; Register wissen 2

Tags
Een label in de assembleertaal kan de volgende tekens bevatten:


Letters: A tot Z en a tot z
Cijfers: 0 tot 9
Speciale tekens: vraagteken (?)
punt (.) (alleen eerste teken)
commerciële vloer teken (@)
laag streepje (_)
dollar ($)

Het eerste teken in het label moet een letter of speciaal teken zijn. Het cijfer mag niet het eerste teken van het label zijn, maar de tekens $ en? hebben soms een speciale betekenis en worden meestal niet aanbevolen voor gebruik. Hoofdletters en kleine letters zijn standaard hetzelfde, maar het verschil kan worden gemaakt door een optie op de assembler-opdrachtregel op te geven. De maximale labellengte is 31 tekens. Voorbeelden van labels: COUNT, PAGE25, $ E10. Het wordt aanbevolen om beschrijvende en semantische labels te gebruiken. Registernamen zoals AX, DI of AL zijn gereserveerd en worden alleen gebruikt om de bijbehorende registers aan te duiden.
Als het label voor de processorinstructie wordt geplaatst, staat het symbool ":" (dubbele punt) er altijd direct achter, wat de assembler vertelt om een ​​variabele met deze naam te maken die het adres van de huidige instructie bevat:
some_loop:

loopne some_loop
Wanneer een label voor een assembler-richtlijn wordt geplaatst, blijkt het meestal een van de operanden van die richtlijn te zijn en wordt de dubbele punt niet gebruikt:

codesg-segment
lodsw; lees een woord uit een string,
cmp bijl, 7; als het 7 is - verlaat de lus
codesg eindigt
Overweeg de richtlijnen die rechtstreeks werken met labels en hun waarden: LABEL, EQU en =.

LABEL-richtlijn

Label label type De LABEL richtlijn definieert een label en definieert het type. Het type kan een van de volgende zijn: BYTE, WORD, DWORD, FWORD, QWORD, TBYTE, 10 bytes, NEAR, FAR ). Het label krijgt een waarde die gelijk is aan het adres van het volgende commando of de volgende data, en het expliciet gespecificeerde type. Afhankelijk van het type commando
mov label, 0 zal naar het geheugen een byte (woord, dubbel woord, etc.) schrijven gevuld met nullen, en het commando
call label zal een nabije of verre subroutine oproep uitvoeren.

Met behulp van de LABEL-richtlijn is het handig om toegang tot dezelfde gegevens, zowel bytes als woorden, te organiseren door twee labels met verschillende typen voor de gegevens te definiëren.

EQU-richtlijn

De EQU-richtlijn kent een waarde toe aan het label, die wordt gedefinieerd als het resultaat van de integer-expressie aan de rechterkant. Het resultaat van deze uitdrukking kan een geheel getal, een adres of een willekeurige tekenreeks zijn:
equ label expressie

waarheid gelijk 1
message1 equ "Probeer opnieuw $"
var2 gelijk aan 4
cmp bijl, waarheid; cmp bijl, 1
db bericht1; db "Probeer opnieuw $"
mov bijl, var2; mov ax, 4 De EQU-richtlijn wordt meestal gebruikt om parameters in te voeren die voor het hele programma gelden, vergelijkbaar met het #define-commando van de C-preprocessor.

richtlijn =

De = richtlijn is gelijk aan EQU, maar het label dat het definieert kan alleen gehele waarden aannemen. Bovendien kan het door deze richtlijn gespecificeerde label worden overschreven.

Elke assembler biedt een hele reeks speciale voorgedefinieerde labels - dit kan de huidige datum (@datum of ?? datum), processortype (@cpu) of de naam van een bepaald programmasegment zijn, maar het enige vooraf gedefinieerde label dat door alle assemblers wordt ondersteund we overwegen is $ ... Het komt altijd overeen met het huidige adres. Bijvoorbeeld het commando

Jmp $

voert een onvoorwaardelijke sprong op zichzelf uit, zodat uit één instructie een eeuwige lus ontstaat.

Om de hele zaak beter te begrijpen, heb ik een klein programma geschreven. Dezelfde "Hello World", maar op een nieuwe manier :) De tekst staat hieronder:

Het programma is samengesteld door TASM en MASM, maar het EXE-bestand dat is samengesteld door MASM is één byte groter. Merk op dat de opdracht mov dx, offset msg is vervangen door de opdracht lea dx, msgb. LEA plaatst het offset-adres van de opgegeven gegevens in de DX, d.w.z. doet hetzelfde als de opdracht mov met offset. Ik raad aan om dit onder de debugger te bekijken.



We kijken goed naar de montagelijsten en vinden het verschil.



Interessant genoeg assembleerde TASM de LEA-instructie in dit geval als een MOV-instructie (bewerkingscode BA), en MASM assembleerde de LEA-instructie in een andere opcode - 8D16, die de programmagrootte met 1 byte verhoogde. Ik weet nog niet waarom hij besloot dit te doen, maar het zou interessant zijn om erachter te komen.

Richtlijnen zijn commando's van de compiler. De aangifte van elk van hen moet beginnen met een punt. De praktijk leert dat in elke assembler slechts ongeveer 10 ... 20 richtlijnen het meest intensief worden gebruikt. Alle andere zijn ofwel optioneel of zijn verantwoordelijk voor het beheren van slechts kleine eigenschappen van de compiler. De "hoofd"-richtlijnen, typisch voor assembleurs van andere processors, omvatten de richtlijnen.equ, .org, .def, .сseg, .dseg, enz. Welnu, richtlijnen zoals dq, .exit, .listmac zijn echt heel zeldzaam in echte programma's. Hieronder vindt u een lijst, beschrijving en voorbeelden van het gebruik van de richtlijnen van de eigen assembler van AVR-microcontrollers.

De .include-richtlijn vervangt een tekstbestand op de plaats van het programma waar het wordt gebruikt. Daarnaast kan het vervangingsbestand zelf ook een .include-instructie bevatten. Als het bestand zich in de projectdirectory of in een van de servicemappen bevindt, mag in plaats van het volledige pad alleen een link naar de naam worden opgegeven.

.Inclusief richtlijn
Syntaxis schrijven:
.include "(bestandspad)"
Gebruiksvoorbeeld:

Voeg "m8def.inc" toe; voeg standaard headerbestand in

De .exit-richtlijn vertelt de assembler waar het bronbestand eindigt. Alle operators na de richtlijn worden onzichtbaar voor de compiler. Als .exit voorkomt in een include-bestand, dan eindigt de project-assembly met de regel waar de .include-instructie zich bevindt. Bij afwezigheid van de .exit-richtlijn, wordt de laatste regel van de brontekst beschouwd als het build-eindpunt.

.Exit-richtlijn
Syntaxis schrijven:
.Uitgang
Gebruiksvoorbeeld:

Afsluiten; einde van bestand

De richtlijnen .nolist en .list bepalen het lijstbestand, dat meestal wordt gegenereerd nadat het project is gebouwd. De eerste verbiedt, en de andere staat dienovereenkomstig de uitvoer van informatie naar een bestand toe. De .list-richtlijn heft het effect van .nolist op en vice versa.

.Nolist, .list richtlijnen
Syntaxis schrijven:
.nolist, .list
Gebruiksvoorbeeld:

Nolist; verbied de uitvoer van de tekst van het bestand "m8def.inc". Neem "m8def.inc" op; in de programmalijst file.list; ga door met het uitvoeren van informatie

De.equ-richtlijn kent een numerieke waarde toe aan een symbolische naam. De symbolische naam moet uniek zijn en kan tijdens het schrijven van het programma niet worden gewijzigd. De richtlijn kan niet worden gebruikt om symbolische namen toe te kennen aan algemene registers.

de.equ richtlijn
Syntaxis schrijven:
.equ (symbolische naam) = (uitdrukking)
Gebruiksvoorbeeld:

Equ DDRB = 0x17; DDRB-naam toewijzen aan 0x17 .equ PORTB = DDRB + 1; PORTB-naam toewijzen aan 0x18

De .set-richtlijn doet hetzelfde als de .equ-richtlijn. Maar in tegenstelling tot de laatste kan de symbolische naam overal in het programma opnieuw worden gedefinieerd.

.Stel richtlijn in
Syntaxis schrijven:
.set (symbolische naam) = (uitdrukking)
Gebruiksvoorbeeld:

Stel OFFSET = 0x100 in; wijst de OFFSET-naam toe aan 0x100. .set OFFSET = OFFSET + 1, overschrijven OFFSET-waarde:

De .def-richtlijn kent een symbolische naam toe aan een van de registers voor algemene doeleinden. In het verdere verloop van het programma kan deze naam worden overschreven door de .undef-richtlijn.

.Def, .undef richtlijnen
Syntaxis schrijven:
.def (symbolische naam) = (hoofdlettergebruik)
.undef (symbolische naam)
Gebruiksvoorbeeld:

Def temp = R16; wijs de naam temp toe aan het register R16 .undef temp; annuleer verder gebruik van de naam temp

De richtlijnen db, .dw, .dd, .dq zijn ontworpen om het geheugen van de microcontroller te reserveren voor geïnitialiseerde gegevens. Ze kunnen allemaal alleen worden gebruikt in code- en EEPROM-segmenten. Het verschil tussen deze richtlijnen ligt in de bitbreedte van de weergegeven gegevens. De db-richtlijn reserveert bytes, .dw - woorden, .dd - dubbele woorden. In zeldzame gevallen kan het ook handig zijn om de .dq-richtlijn te gebruiken om een ​​back-up te maken van 64-bits gegevens.

Db, .dw, .dd, .dq richtlijnen
Syntaxis schrijven:
(label): .db (8-bits gegevens)
(label): .dw (16-bits gegevens)
(label): .dd (32-bits gegevens)
(label): .dq (64-bits gegevens)
Gebruiksvoorbeeld:

Label: .db 0xFA, 250, -6, 0b11111010 .dw 0xFADE, 64222, -1314, 0b1111101011011110 .dd 0xFADEEFCA, 4208914378, -86052918 .dq 0xFADEEFCAEFBACDEF, 18077149109325211089

De .byte-richtlijn reserveert geheugen voor niet-geïnitialiseerde gegevens in de SRAM- en EEPROM-segmenten.

.Byte richtlijn
Syntaxis schrijven:
(label): .byte (hoeveelheid gegevens waarvan een back-up moet worden gemaakt)
Gebruiksvoorbeeld:

Equ PAGESIZE = 0x20 buffer:. byte 2 * PAGINAGROOTTE; reserveer 64 bytes in SRAM

De richtlijnen dseg, .eseg, .cseg definiëren respectievelijk het begin van data, EEPROM en codesegmenten. In het bronbestand kan elk van de segmenten slechts in één instantie worden weergegeven. Als al deze instructies in het programma ontbreken, gaat de compiler er standaard van uit dat alle operators zich in de codesectie bevinden.

Dseg, .eseg, .cseg richtlijnen
Syntaxis schrijven:
.dseg
.eseg
.cseg
Gebruiksvoorbeeld:

Dseg; begin van datasegmentbuffer:. byte 32; reserve 32 bytes voor buffer in SRAM .cseg; begin van codesegment rjmp initial. string: .db "ATmega8", 0; string opgeslagen in FLASH-geheugen .eseg; begin van EEPROM-geheugensegment _var: .byte 2; reserve 2 bytes voor de variabele _var _cnst: .db 0xAA; reserveer een byte voor de variabele _cnst = 0xAA

Met de.org-richtlijn kan de compiler een startadres instellen binnen code-, data- en EEPROM-segmenten. Bij gebruik in een codesegment specificeert de richtlijn het adres van het 16-bits programmawoord.

richtlijn.org
Syntaxis schrijven:
.org (startadres)
Gebruiksvoorbeeld:

Equ SRAM_START = 0x60 .equ RAMEND = 0x045F .dseg; begin van datasegment .org SRAM_START; reserveer 32 bytes in SRAM voor buffer, buffer:. byte 32; beginnend bij adres 0x60 .cseg; begin van code segment.org 0; reset vector op adres 0 rjmp initial. .org 0x50; start van het hoofdprogramma vanaf adres 0x50 initial: ldi temp, high (RAMEND); initialisatie van de stack out SPH, temp ldi temp, low (RAMEND) out SPL, temp.

Richtlijnen.macro, .endmacro (.endm), die respectievelijk het begin en einde van de macro definiëren.

Richtlijnen.macro, .endmacro (.endm)
Syntaxis schrijven:
.macro (macronaam)
Gebruiksvoorbeeld:

Macro set_bit; declareer de macro voor het instellen van de poortbit sbi @ 0, @ 1; set bit @ 1 van het poortregister @ 0 sbi @ 0-1, @ 1; stel regel @ 1 van het DDRx-register .endm in op uitvoer. set_bit PORTB, 0; zet op lijn 0 van poort B logica 1

De .listmac-richtlijn maakt uitgebreide uitvoer van de tekst van macro's in het lijstbestand mogelijk. In dit geval wordt de volledige inhoud van elke macrodefinitie die in het programma wordt aangetroffen, weergegeven. Als de richtlijn niet wordt gebruikt, wordt de code in de macro niet weergegeven.

.Listmac richtlijn
Syntaxis schrijven:
.listmac
Gebruiksvoorbeeld:

Listmac; sta uitbreiden van macrotekst in lijstbestand toe

De richtlijnen .message, .warning, .error zijn ontworpen om aanvullende informatie over de voortgang van de programmacompilatie weer te geven in het venster voor het samenstellen van het project. De .message-richtlijn genereert een bericht voor de regel waarin de aanroep is aangetroffen. Het gebruik van .warning zal resulteren in een waarschuwing en .error zal resulteren in een foutmelding. In het laatste geval stopt de montage van het project.

.Bericht, .waarschuwing, .foutrichtlijnen
Syntaxis schrijven:
.bericht "(tekstbericht)"
.warning "(waarschuwingstekst)"
.error "(foutberichttekst)"
Gebruiksvoorbeeld:

Bericht "Macro's zijn hier gebeld." .waarschuwing "Te hoge frequentie!" .error "Verkeerd macro-argument!"

Een groep voorwaardelijke compilatierichtlijnen .ifdef, .ifndef, .if, .else, elif, .endif worden gebruikt om programmacode in te voegen, afhankelijk van verschillende voorwaarden. De .ifdef-richtlijn controleert op de verklaring van een symbolische naam. De richtlijn kan worden gevolgd door een reeks opdrachten die in de tekst worden vervangen als de testvoorwaarde "waar" is (de naam is gedeclareerd). De .ifndef-richtlijn is het tegenovergestelde.Ifdef controleert op het ontbreken van een symbolische naamdeclaratie. De .if-richtlijn voert codevervanging uit wanneer wordt voldaan aan de vergelijkingsvoorwaarde die is opgegeven als parameter. De commando's die moeten worden uitgevoerd als de voorwaarde van de .if-richtlijn "false" is - bevinden zich na de .els-richtlijn. Vertakkingen van het type "if" - "then" kunnen verschillende niveaus van nesting hebben dankzij de .elif-richtlijn. Elk checker-blok dat begint met .ifdef, .ifndef, .if moet worden afgesloten met de.endif-richtlijn.

If, .ifdef, .ifndef, .else, elif, .endif richtlijnen
Syntaxis schrijven:
.ifdef (karakter) (of .ifndef (karakter))
.if (voorwaarde)
.else (uitdrukking) (of .elif (voorwaarde))
.stop als
Gebruiksvoorbeeld:

Macro del_ms; macro die de tijdvertraging vormt in ms ifndef FREQ; als de FREQ-constante (frequentie in Hz) niet is gedeclareerd, .waarschuwing "Undefined FREQ constan!" ; geef een waarschuwing en ec FREQ = 1000000; zet de standaard op 1 MHz; endif .equ DELAY = (@ 0 * FREQ) / 4000; waarde voor het instellen van de tijdvertraging als DELAY> 65535; als DELAY groter is dan 2 bytes, fout "Integer overflow in DELAY!" ; implementatie van de macro is niet mogelijk. anders druk op XL; sla de werkregisters op XL, XH druk XH ldi XH, hoog (DELAY); tijdvertragingscyclus ldi XL, laag (DELAY) sbiw XH: XL, 1 brne PC-1 pop XH pop XL: herstel de werkregisters XH, XL van de stapel .endif .endm. .equ FREQ = 2.000.000, 2 MHz klokdeclaratie. del_ms 25; vormt een vertraging van 25 ms

Bij het schrijven van programma's in assembler worden richtlijnen gebruikt die aan de compiler de positie van het programma in het geheugen aangeven, macro's definiëren, geheugen initialiseren, enz. De lijst met richtlijnen en hun beschrijving wordt gegeven in de tabel. 1.8. Alle richtlijnen beginnen met een punt. Laten we kort de functies opsommen die worden uitgevoerd door richtlijnen in elk van de segmenten.

Het programmasegment wordt geopend met de .CSEG-richtlijn. Als het programma met dit segment begint, kan de richtlijn ontbreken. In een programmasegment kunt u met behulp van de .ORG-richtlijn het begin van het segment specificeren.

De DB-richtlijn voor een segment definieert één byte, of groep bytes, van constanten die naar het Flash-geheugen worden geschreven. De DW-richtlijn definieert een woord of een groep woorden die als constanten in het geheugen moeten worden opgeslagen. Het begin van het schrijven van constanten wordt bepaald door het label dat voorafgaat aan de overeenkomstige richtlijn. De opgesomde constanten worden gescheiden door komma's.

De .DEF-richtlijn kent een symbolische naam toe aan het register. De .EQU, .SET-richtlijnen kennen een waarde toe aan de naam. De naam waaraan door de .EQU-richtlijn een waarde is toegewezen, kan niet opnieuw worden toegewezen en de waarde kan niet worden gewijzigd. De naam die is toegewezen door de .ET-richtlijn kan worden gewijzigd door een andere .ET-richtlijn.

De DEVICE-richtlijn definieert het type doelmicrocontroller dat zal worden gebruikt om het programma uit te voeren. De aanwezigheid van deze richtlijn verbindt de middelen voor het controleren van programma-instructies met betrekking tot een fysiek apparaat, waarschuwing over de onmogelijkheid om sommige instructies uit te voeren, de grootte van het gebruikte geheugen, enz.

De instructie .INCLUDE met de bestandsnaam wordt gebruikt om een ​​ander bestand in de programmatekst op te nemen.

Tabel 1.8. Lijst met richtlijnen

Richtlijn

Beschrijving

Reserve bytes in RAM

Programmasegment

Definieer byte - constante in Flash-geheugen of

Een symbolische naam toewijzen aan een register

Specificeert het apparaat waarvoor moet worden gecompileerd

programma

Gegevenssegment

Definieert een woord in Flash-geheugen of EEPROM

Einde van de macro

Stel constante expressie in

EEPROM-segment

Verlaat het bestand

Voeg nog een bestand toe

Generatie van vermelding inschakelen

Uitbreiden van macro's in lijst inschakelen

Macro starten

Genereren van vermelding uitschakelen

Positie in segment instellen

Variabele instellen op equivalente uitdrukking

De richtlijnen .MACRO en .ENDMACRO omlijsten de macrodefinitie. Een macrodefinitie kan maximaal 10 parameters hebben met vaste namen @ 0,…, @ 9. Bij het aanroepen van een macro worden de parameters gespecificeerd als een lijst in de volgorde van nummering.

Het datasegment begint met de .DSEG-richtlijn. De .ORG- en BYTE-richtlijnen kunnen in het segment worden gebruikt. De BYTE-richtlijn definieert het aantal bytes dat wordt gebruikt tijdens de uitvoering van het programma. Het gereserveerde gebied begint op het adres dat op het label vóór de richtlijn is vermeld.

Een EEPROM-segment begint met de .ESEG-richtlijn. De richtlijnen .ORG, .DB, .DW kunnen in het segment worden gebruikt. De DB-richtlijn op een segment definieert één of een groep bytes die naar de EEPROM moeten worden geschreven. De DW-richtlijn definieert een woord of een groep woorden die in paren van 2 bytes in het EEPROM-geheugen moeten worden geschreven. Het begin van het schrijven van bytes en woorden wordt bepaald door het label dat voorafgaat aan de bijbehorende richtlijn.

De richtlijnen .LIST, .NOLIST, .LISTMAC worden gebruikt om de output van de lijst te beheren.