Programmering i maskinkoder och assemblerspråk. AVR Monteringsdirektiv

MASM-, TASM- och WASM-montörerna skiljer sig från varandra. Men att skapa enkla program för dem har praktiskt taget inga skillnader, med undantag för monteringen och själva länkningen.

Så vårt första program för MASM, TASM och WASM som ger ut engelskt brev"A" in nuvarande position markören, det vill säga till vänster övre hörnet skärm:

Model tiny .code ORG 100h start: MOV AH,2 MOV DL,41h INT 21h INT 20h END start Denna text kan skrivas på vilket enkelt språk som helst textredigerare- till exempel i NotePad från WINDOWS (men inte i Word eller andra "sofistikerade"). Jag rekommenderar dock en "avancerad" textredigerare med syntaxmarkering, såsom PSPad (se avsnitt). Sedan sparar vi den här filen med filtillägget .asm, till exempel i mappen MYPROG. Låt oss kalla filen atest. Så vi fick: C:\MYPROG\atest.asm.

NOTERA
Observera att i det första kommandot skrev vi 2 istället för 02h. MASM, TASM och WASM, liksom Emu8086, tillåter sådana "friheter". Även om du kan skriva 02h - det blir inget fel.

Förklaringar till programmet:

.modell liten– 1:a raden. .model-direktivet definierar minnesmodellen för en specifik filtyp. I vårt fall är detta en fil med en COM-tillägg, så vi väljer den lilla modellen, som kombinerar kod, data och stacksegment. Den lilla modellen är designad för att skapa COM-filer.

.koda– 2:a raden. Detta direktiv börjar ett kodsegment.

ORG 100h– 3:e raden. Detta kommando ställer in programräknaren till 100h eftersom när en COM-fil laddas in i minnet allokerar DOS de första 256 byten till PSP-datablocket ( decimal nummer 256 är lika med hexadecimal 100h). Programkoden finns först efter detta block. Alla program som kompileras till COM-filer måste börja med detta direktiv.

start: MOV AH, 02h– 4:e raden. Startetiketten placeras före det första kommandot i programmet och kommer att användas i END-direktivet för att indikera vilket kommando programmet börjar med. MOV-instruktionen placerar värdet på den andra operanden i den första operanden. Det vill säga att värdet 02h placeras i AN-registret. Varför görs detta? 02h är en DOS-funktion som visar ett tecken på skärmen. Vi skriver ett program för DOS, så vi använder kommandona för detta operativ system(OS). Och vi skriver denna funktion (eller snarare dess nummer) i AH-registret, eftersom interrupt 21h använder detta register.

MOV DL, 41h– 5:e raden. Teckenkoden "A" matas in i DL-registret. ASCII-koden för tecknet "A" är 41h.

INT 21h– 6:e raden. Detta är samma avbrott 21h - kommandot som orsakar systemfunktion DOS specificerad i AN-registret (i vårt exempel är detta funktion 02h). INT 21h-kommandot är det huvudsakliga sättet för interaktion mellan program och operativsystemet.

INT 20h– 7:e raden. Detta är ett avbrott som talar om för operativsystemet att avsluta programmet och överföra kontrollen till konsolapplikationen. Om programmet redan har kompilerats och startat från operativsystemet, kommer INT 20h-kommandot att returnera oss till OS (till exempel till DOS).

SLUT start– 8:e raden. END-direktivet avslutar programmet samtidigt som det anger vid vilken tidpunkt dess exekvering ska börja.

Bestäm enheten för vilken den är kompilerad

Parametrarna som skickas till direktivet är en sekvens av uttryck separerade med kommatecken. Varje uttryck måste vara antingen ett tal i intervallet (-128...255) eller

resultatet av beräkningen bör ge ett resultat i samma intervall, i annat numret trunkeras till en byte och UTAN att utfärda varningar.

Om ett direktiv tar emot mer än en parameter och det aktuella programsegmentet är så packas parametrarna i ord (den första parametern är den låga byten), och om

antalet parametrar är udda, då kommer det sista uttrycket att trunkeras till en byte och skrivas som ett ord med den mest signifikanta byten lika med noll, även om det finns ett annat nästa

DB-direktivet.

Syntax:
LABEL: .DB expression_list

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

Parametrarna som skickas till direktivet är en sekvens av uttryck separerade med kommatecken. Varje uttryck måste vara antingen ett tal i intervallet (-32768..65535) eller

som ett resultat av beräkningen måste det ge ett resultat i samma intervall, annars trunkeras talet till ett ord, och UTAN att utfärda varningar.

Syntax:
LABEL: .DW expressionlist

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

Syntax:
.ENDMACRO

Exempel:
.MACRO SUBI16 ; Börja en makrodefinition
subi r16,låg(@0) ; Subtrahera den första parameterns låga byte
sbci r17,high(@0) ; Subtrahera den första parameterns höga byte
.ENDMACRO

EQU – Ställ in konstant uttryck

EQU-direktivet tilldelar ett värde till en etikett. Denna etikett kan senare användas i uttryck. En etikett vars värde tilldelas av detta direktiv kan inte vara det

är omtilldelad och dess värde kan inte ändras.

Syntax:
.EQU-etikett = uttryck

Exempel:
.EQU io_offset = 0x23
.EQU porta = io_offset + 2

CSEG; Start av datasegment
clr r2; Rensa register r2
ut porta,r2 ; Skriv till port A

ESEG – EEPROM-segment

ESEG-direktivet definierar början av EEPROM-segmentet. Källfilen kan bestå av flera EEPROM-segment, som kombineras till ett segment under kompileringen.

Ett EEPROM-segment består vanligtvis endast av direktiv,

href="#DW - Definiera konstant(a) ord i programminnet och EEPROM">DW

och märken. EEPROM-segment har sina egna

byte positionsräknare. Direktivet kan användas för att placera

variabler på önskad plats i EEPROM. Direktivet har inga parametrar.

Syntax:
.ESEG

Exempel:
var1: .BYTE 1 ; reservera 1 byte för var1
tabell: .BYTE tab_size ; reservera tab_size bytes.

ESEG
eevar1: .DW 0xffff ; initialisera 1 ord i EEPROM

EXIT – Avsluta filen

När kompilatorn stöter på ett EXIT-direktiv, slutar den kompileringen. den här filen. Om direktivet används i en bifogad fil (se direktivet

href="#INCLUDE - Inkludera en annan fil">INCLUDE

), sedan fortsätter kompileringen från raden efter INCLUDE-direktivet.

Om filen inte är kapslad stoppas kompileringen.

Syntax:
.UTGÅNG

Exempel:
.UTGÅNG ; Avsluta den här filen

INKLUDERA – Bifoga en annan fil

Efter att ha träffats INKLUDERA direktiv kompilatorn öppnar filen som anges i den, kompilerar den tills filen slutar eller direktivet påträffas

href="#EXIT - Avsluta den här filen">AVSLUTA

, fortsätter sedan kompileringen initial fil från linjen efter direktivet

OMFATTA. Den bifogade filen kan också innehålla INCLUDE-direktiv.

Syntax:
.INCLUDE "filnamn"

Exempel:
; iodefs.asm fil:
.EQU sreg = 0x3f ; Statusregister
.EQU sphigh = 0x3e; Stackpekare hög byte
.EQU flöde = 0x3d; Låg byte av stackpekaren

; incdemo.asm-filen
.INKLUDERA iodefs.asm ; Nest-portdefinitioner
i r0,sreg ; Läs statusregistret

LIST – Aktivera listgenerering

LIST-direktivet säger åt kompilatorn att skapa en lista. Listan är en kombination av monteringskod, adresser och opkoder. Förbi

Som standard är listgenerering aktiverat, men detta direktiv används tillsammans med direktivet för att få listor över enskilda delar av källfiler.

Syntax:
.LISTA

Exempel:

LISTMAC – Aktivera makroexpansion i listning

Efter LISMAC-direktivet kommer kompilatorn att visa innehållet i makrot i listan. Som standard visar listningen endast makroanropet och det överförda

alternativ.

Syntax:
.LISTMAC

Exempel:
.MACRO MACX ; Makro definition
lägg till r0,@0; Makrokropp
eor r1,@1

LISTMAC; Aktivera makroexpansion
MACX r2,r1; Anropa ett makro (kroppen av makrot kommer att visas i listan)

MAKRO – Start av ett makro

MAKRO-direktivet börjar definitionen av ett makro. Makrots namn skickas till direktivet som en parameter. Om du stöter på ett makronamn senare i programtexten,

kompilatorn ersätter detta namn med brödtexten i makrot. Ett makro kan ha upp till 10 parametrar, som nås via @0-@9 i dess kropp. När de anropas listas parametrarna

separerade av kommatecken. Makrodefinitionen avslutas med ett direktiv.

Som standard ingår bara makroanropet i listan för att utöka makrot, måste du använda direktivet. Makrot i listan visas med ett +-tecken.

Syntax:
.MACRO makronamn

Exempel:
.MACRO SUBI16 ; Början av makrodefinition
subi @1,låg(@0) ; Subtrahera den låga byten av parameter 0 från parameter 1
sbci @2,high(@0) ; Subtrahera hög byte av parameter 0 från parameter 2
.ENDMACRO ; Slut på makrodefinition

CSEG; Start av programsegment
SUBI16 0x1234,r16,r17 ; Subtrahera 0x1234 från r17:r16

NOLIST – Stäng av listgenerering

NOLIST-direktivet säger åt kompilatorn att sluta generera listor. Listan är en kombination av monteringskod, adresser och

operationskoder. Som standard är listgenerering aktiverat, men kan inaktiveras av detta direktiv. Dessutom kan detta direktiv användas

tillsammans med ett direktiv för att få listor över enskilda delar

källfiler

Syntax:
.NOLIST

Exempel:
.NOLIST ; Inaktivera listgenerering
.INCLUDE "macro.inc" ; Bifogade filer kommer inte att finnas
.INCLUDE "const.def" ; visas i listan
.LISTA ; Aktivera generering av listor

ORG – Ställ in position i segment

ORG-direktivet sätter positionsräknaren till ett givet värde, som skickas som en parameter. För datasegmentet ställer den positionsräknaren till

SRAM (RAM), för ett programsegment är detta programräknaren, och för ett EEPROM-segment är detta läget i EEPROM. Om direktivet föregås av en etikett (på samma rad) då

etiketten placeras på den adress som anges i direktivparametern. Innan kompileringen startar är programräknaren och EEPROM-räknaren lika med noll och RAM-räknaren är lika med 32

(eftersom adresserna 0-31 är upptagna av register). Observera att byte-räknare används för RAM och EEPROM, och ordräknare används för programsegmentet.

Syntax:
.ORG uttryck

Exempel:
.DSEG; Start av datasegment

ORG 0x37 ; Ställ in SRAM-adressen till 0x37
variabel: .BYTE 1 ; Boka en byte på adressen 0x37H

CSEG
.ORG 0x10 ; Ställ in programräknaren på 0x10
mov r0,r1; Detta kommando kommer att finnas på adressen 0x10

SET – Ställ in variabelns symboliska ekvivalent för ett uttryck

SET-direktivet tilldelar ett namn ett värde. Detta namn kan senare användas i uttryck. Dessutom i motsats till direktivet

href="#EQU - Sätt en symbol lika med ett uttryck">EQU

värdet på namnet kan ändras av ett annat SET-direktiv.

Syntax:
.SET namn = uttryck

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

CSEG; Start av kodsegment
clr r2; Rensa register 2

Taggar
En etikett på assemblerspråk kan innehålla följande symboler:


Bokstäver: A till Ö och A till Ö
Siffror: 0 till 9
Specialtecken: frågetecken (?)
punkt (.) (endast första tecknet)
"kommersiellt" tecken (@)
understreck (_)
dollar ($)

Det första tecknet i etiketten måste vara en bokstav eller ett specialtecken. Ett nummer kan inte vara det första tecknet i en etikett, och tecknen $ och ? ibland har speciella betydelser och rekommenderas i allmänhet inte för användning. Versaler och gemener särskiljs inte som standard, men distinktionen kan aktiveras genom att ställa in ett eller annat alternativ i kommandorad assemblerare Maximal längd taggar - 31 tecken. Exempel på etiketter: COUNT, PAGE25, $E10. Det rekommenderas att använda beskrivande och semantiska etiketter. Registernamn som AX, DI eller AL är reserverade och används endast för att indikera motsvarande register.
Om etiketten är placerad före processorinstruktionen, omedelbart efter den finns det alltid en ":" (kolon) symbol, som talar om för assemblern att skapa en variabel med detta namn som innehåller adressen till den aktuella instruktionen:
some_loop:

loopne some_loop
När en etikett visas före ett assemblerdirektiv är det vanligtvis en av operanderna i det direktivet och kolon ingår inte:

codesg segment
lodsw ; läsa ett ord från en sträng,
cmp yxa,7 ; om det är 7 - lämna slingan
codesg slutar
Låt oss titta på direktiv som fungerar direkt med etiketter och deras värden: LABEL, EQU och =.

LABEL-direktivet

Etiketttyp LABEL-direktivet definierar en etikett och specificerar dess typ. Typen kan vara en av: BYTE (byte), WORD (ord), DWORD (dubbelt ord), FWORD (6 byte), QWORD (quad word), TBYTE (10 byte), NEAR (nära etikett), FAR (fjärrt) etikett). Etiketten ges ett värde som är lika med adressen för nästa kommando eller nästa data, och den typ som anges explicit. Beroende på typ av kommando
mov label,0 kommer att skriva en byte (ord, dubbelord, etc.) fylld med nollor i minnet, och kommandot
call label kommer att ringa ett kort eller långt samtal till subrutinen.

Med LABEL-direktivet är det bekvämt att organisera åtkomst till samma data, både bytes och ord, genom att definiera två etiketter med olika typer framför datan.

EQU-direktivet

EQU-direktivet tilldelar ett värde till en etikett, som bestäms som resultatet av heltalsuttrycket på höger sida. Resultatet av detta uttryck kan vara ett heltal, en adress eller vilken teckensträng som helst:
etikett equ uttryck

sanning lika 1
message1 equ "Försök igen$"
var2 ekv 4
cmp yxa,sanning ; cmp yxa,1
db meddelande1; db "Försök igen$"
mov axe,var2 ; mov ax, 4 EQU-direktivet används oftast för att introducera parametrar som är gemensamma för hela programmet, liknande kommandot #define för C-förprocessorn.

Direktiv =

Direktivet = är ekvivalent med EQU, men etiketten som den definierar kan bara acceptera heltalsvärden. Dessutom kan etiketten som anges i detta direktiv åsidosättas.

Varje assembler erbjuder en hel uppsättning speciella fördefinierade etiketter - detta kan vara Det aktuella datumet(@date eller ??date), processortyp (@cpu), eller namnet på ett visst programsegment, men den enda fördefinierade etiketten som stöds av alla assemblers vi har tittat på är $ . Den motsvarar alltid den aktuella adressen. Till exempel kommandot

Jmp$

utför en ovillkorlig gren på sig själv, så att en evig loop skapas från ett kommando.

För att bättre förstå hela den här saken skrev jag ett litet program. Alla likadana " Hej världen”, men på ett nytt sätt :) Text nedan:

Programmet är sammansatt av TASM och MASM, men EXE-filen som satts samman av MASM är en byte större. Vi märker att kommandot mov dx,offset msg har ersatts med kommandot lea dx,msgb. LEA placerar offsetadressen för den specificerade datan i DX, dvs. gör samma sak som kommandot mov med offset. Jag rekommenderar att du tittar på detta under felsökaren.



Låt oss titta noga på monteringslistorna och hitta skillnaden.



Intressant nog samlade TASM ihop LEA-kommandot till I detta fall som MOV-instruktionen (opcode BA), och MASM satte ihop LEA-instruktionen till en annan opcode - 8D16, vilket ökade programstorleken med 1 byte. Jag vet inte varför han bestämde sig för att göra detta ännu, men det skulle vara intressant att ta reda på det.

Direktiv är kompilatorkontrollkommandon. Deklarationen för var och en av dem måste börja med en punkt. Praxis visar att i alla montörer används endast cirka 10...20 direktiv mest intensivt. Alla andra är antingen valfria eller ansvariga för att endast kontrollera mindre kompilatoregenskaper. De "grundläggande" direktiven, som också är typiska för montörer av andra processorer, inkluderar direktiven .equ, .org, .def, .сseg, .dseg, etc.. Tja, sådana direktiv som .dq, .exit, .listmac in riktiga programär verkligen mycket sällsynta. Nedan finns en lista, beskrivning och exempel på användningsdirektiv från den proprietära sammanställaren av AVR-mikrokontroller.

.include-direktivet ersätter textfil till den plats i programmet där den används. Utöver detta kan själva ersättningsfilen också innehålla ett .include-direktiv. Om filen finns i projektkatalogen eller i en av tjänstemapparna, istället för fullständig sökväg, är det tillåtet att endast ange en länk till hans namn.

direktiv.inkludera
Skriva syntax:
.include "(filsökväg)"
Användningsexempel:

Inkludera "m8def.inc"; infoga standardhuvudfilen

.exit-direktivet talar om för assemblern var filen slutar källtext. Alla uttalanden efter direktivet blir osynliga för kompilatorn. Om .exit förekommer i en inkluderad fil, slutar projektbygget med raden där .include-direktivet finns. Om det inte finns något .exit-direktiv övervägs slutpunkten för bygget sista raden källtext.

Direktiv.exit
Skriva syntax:
.utgång
Användningsexempel:

Avsluta ;slut på filen

.nolist- och .list-direktiven styr listningsfilen, som vanligtvis genereras efter att projektet har byggts. Den första av dem förbjuder, och den andra tillåter följaktligen utmatning av information till en fil. .list-direktivet åsidosätter åtgärden för .nolist och vice versa.

Direktiver.nolist, .list
Skriva syntax:
.nolist, .list
Användningsexempel:

Nolist ;förbjud utmatning av texten i filen "m8def.inc" .inkludera "m8def.inc" ;i programlistan file.list ;fortsätt utmatning av information

.equ-direktivet tilldelar vissa ett symboliskt namn numeriskt värde. Det symboliska namnet måste vara unikt och kan inte ändras medan programmet skrivs. Direktivet kan inte användas för att tilldela symboliska namn till register generell mening.

Direktiv.ekv
Skriva syntax:
.equ (symboliskt namn) = (uttryck)
Användningsexempel:

Equ DDRB = 0x17 ;ställ DDRB-namnet till 0x17 .equ PORTB = DDRB + 1 ;ställ PORTB-namnet till 0x18

.set-direktivet har samma effekt som .equ. Men till skillnad från det senare kan ett symboliskt namn omdefinieras var som helst i programmet.

Direktiv.set
Skriva syntax:
.set (symboliskt namn) = (uttryck)
Användningsexempel:

Ställ in OFFSET = 0x100; tilldela namnet OFFSET till värdet 0x100. .set OFFSET = OFFSET + 1; åsidosätt OFFSET-värdet

.def-direktivet tilldelar ett symboliskt namn till ett av de allmänna registren. I programmets fortsatta gång förnamn kan åsidosättas av .undef-direktivet.

Direktiv .def, .undef
Skriva syntax:
.def (symboliskt namn) = (case)
.undef (symboliskt namn)
Användningsexempel:

Def temp = R16 ;tilldela register R16 namn temp .undef temp ;avbryt vidare användning namn temp

.db, .dw, .dd, .dq-direktiven är avsedda att reservera mikrokontrollerminne för initierad data. Alla kan endast användas i kod- och EEPROM-minnessegment. Skillnaden mellan dessa direktiv är bitdjupet för de representerade data. .db-direktivet reserverar bytes, .dw reserverar ord, .dd reserverar dubbla ord. I sällsynta fall kan det också vara det bekväm att använda directive.dq, som reserverar 64-bitars data.

Direktiv.db, .dw, .dd, .dq
Skriva syntax:
(etikett): .db (8-bitars data)
(etikett): .dw (16-bitars data)
(etikett): .dd (32-bitars data)
(etikett): .dq (64-bitars data)
Användningsexempel:

Etikett: .db 0xFA, 250, -6, 0b11111010 .dw 0xFADE, 64222, -1314, 0b1111101011011110 8077149609196178927, -521103510453211

Byte-direktivet reserverar minne för oinitierade data i SRAM- och EEPROM-segmenten.

Direktiv.byte
Skriva syntax:
(etikett): .byte (mängd data att reservera)
Användningsexempel:

Equ PAGESIZE = 0x20 buffert: . byte 2*PAGESIZE; reserverar 64 byte i SRAM

.dseg, .eseg, .cseg-direktiven definierar början av data-, EEPROM- respektive kodsegmenten. I källfilen Varje segment kan endast representeras i ett exemplar. Om alla dessa direktiv saknas i programmet, anser kompilatorn som standard att alla satser finns i kodsektionen.

Direktiv .dseg, .eseg, .cseg
Skriva syntax:
.dseg
.eseg
.cseg
Användningsexempel:

Dseg ;början av datasegmentbuffert: . byte 32 ;reserverar 32 byte för en buffert i SRAM .cseg ;början av kodsegmentet rjmp initial . sträng: .db "ATmega8",0 ;sträng lagrad i FLASH-minne.eseg ;början av EEPROM-minnessegmentet _var: .byte 2 ;reserverar 2 byte för variabeln _var _cnst: .db 0xAA ;reserverar en byte för variabeln _cnst = 0xAA

The.org-direktivet låter dig ställa in kompilatorns startadress inom kod-, data- och EEPROM-segment. När det används i ett kodsegment specificerar direktivet platsadressen för ett 16-bitars programord.

Direktiv.org
Skriva syntax:
.org (startadress)
Användningsexempel:

Equ SRAM_START = 0x60 .equ RAMEND = 0x045F .dseg ;början av data segment.org SRAM_START ;reserverar 32 byte i SRAM för en buffert, buffert: . byte 32 ;börjar på adress 0x60 .cseg ;start av kod segment.org 0 ;återställ vektor på adress 0 rjmp initial . .org 0x50 ;starta huvudprogrammet på adress 0x50 initial: ldi temp,high(RAMEND) ;stackinitiering ut SPH,temp ldi temp,låg(RAMEND) ut SPL,temp .

.macro, .endmacro (.endm)-direktiven definierar början respektive slutet av makrot.

Direktivs.macro, .endmacro (.endm)
Skriva syntax:
.macro (makronamn)
Användningsexempel:

Makro set_bit ;deklaration av makrot för inställning av portbiten sbi @0,@1 ;set bit @1 i portregistret @0 sbi @0-1,@1 ;konfigurera rad @1 i DDRx-registret .endm för utdata . set_bit PORTB,0 ;set port B logik 1 på rad 0

Direktivet.listmac tillåter utökad utmatning av makrotext i listningsfilen. I detta fall visas innehållet i varje makrodefinition som påträffas i programmet i sin helhet. Om direktivet inte används ges inte koden inuti makrot.

Direktiv.listmac
Skriva syntax:
.listmac
Användningsexempel:

Listmac ;tillåt expanderande makrotext i listningsfilen

.message, .warning, .error-direktiven är avsedda att matas ut till projektbyggfönstret ytterligare information om framstegen i programsammanställningen. .message-direktivet genererar ett meddelande för linjen där dess anrop påträffades. Att använda .warning resulterar i en varning och .error resulterar i ett felmeddelande. I det senare fallet stoppas projektbygget.

Direktiv .meddelande, .varning, .fel
Skriva syntax:
.meddelande "(sms)"
.warning "(varningstext)"
.error "(felmeddelandetext)"
Användningsexempel:

Meddelande "Makron har anropats här." .varning "För hög frekvens!" .error "Fel makroargument!"

En grupp villkorliga kompileringsdirektiv.ifdef, .ifndef, .if, .else, elif, .endif används för infogningar programkod beroende på olika förhållanden. .ifdef-direktivet kontrollerar förekomsten av en symbolisk namndeklaration. Direktivet kan följas av en uppsättning kommandon som kommer att infogas i texten om testvillkoret är "sant" (namnet har deklarerats). .ifndef-direktivet är motsatsen till .ifdef, som kontrollerar att det inte finns någon symbolisk namndeklaration. .if-direktivet utför kodsubstitution när jämförelsevillkoret som anges som dess parameter är uppfyllt. Kommandon som måste utföras om villkoret för .if-direktivet är "false" finns efter .else-direktivet. Förgreningar som "om" - "då" kan ha flera nivåer av häckning tack vare .elif-direktivet. Varje kontrollblock som börjar med .ifdef, .ifndef, .if måste stängas med ett .endif-direktiv.

Direktiv if, .ifdef, .ifndef, .else, elif, .endif
Skriva syntax:
.ifdef (tecken) (eller .ifndef (tecken))
.if (skick)
.else (uttryck) (eller .elif (villkor))
.endif
Användningsexempel:

Makro del_ms ;makro som genererar en tidsfördröjning i ms.ifndef FREQ ;om FREQ-konstanten (frekvens i Hz) inte deklareras, .warning "Odefinierad FREQ-konstan!" ;avge en varning och.equ FREQ = 1000000 ;tilldela standardvärdet till 1 MHz.endif .equ DELAY = (@0*FREQ)/4000 ;tidsfördröjningsinställningsvärde.om DELAY > 65535 ;om DELAY är större än 2 byte , sedan felet "Heltalsspill i DELAY!" ;implementering av makrot är inte möjligt. annat tryck XL ;spara arbetsregistren XL, XH tryck XH ldi XH,hög(DELAY) ;tidsfördröjningscykel ldi XL,låg(DELAY) sbiw XH:XL,1 brne PC-1 pop XH pop XL ;återställ arbetsregister XH, XL .endif .endm från stacken. .equ FREQ = 2000000 ;ad klockfrekvens 2 MHz. del_ms 25 ;bildning av en tidsfördröjning på 25 ms

När man skriver program i Assembly-språk används direktiv som anger för kompilatorn var programmet är placerat i minnet, definierar makron, initialiserar minne etc. Listan över direktiv och deras beskrivningar ges i tabell. 1.8. Alla direktiv börjar med en prick. Låt oss kort lista de funktioner som utförs av direktiven i varje segment.

Ett programsegment öppnas med .CSEG-direktivet. Om programmet börjar med detta segment kan direktivet saknas. I ett programsegment kan du använda .ORG-direktivet för att ange början av segmentet.

DB-direktivet i ett segment definierar en byte eller grupp av byte av konstanter som skrivs till Flash-minnet. .DW-direktivet definierar ett ord eller en grupp av ord som skrivs till minnet som konstanter. Början av registreringskonstanter bestäms av etiketten som föregår motsvarande direktiv. Uppräknade konstanter separeras med kommatecken.

.DEF-direktivet tilldelar registret ett symboliskt namn. .EQU, .SET-direktiven tilldelar ett värde till namnet. Ett namn som tilldelas ett värde av .EQU-direktivet kan inte omtilldelas och värdet kan inte ändras. Ett namn som tilldelats av ett .SET-direktiv kan ändras av ett annat .SET-direktiv.

.DEVICE-direktivet anger vilken typ av målmikrokontroller som kommer att användas för att köra programmet. Förekomsten av detta direktiv möjliggör kontroller för programinstruktioner i förhållande till fysisk enhet, varning om omöjligheten att utföra vissa instruktioner, storleken på minnet som används osv.

.INCLUDE-direktivet med ett filnamn används för att inkludera en annan fil i programtexten.

Tabell 1.8. Förteckning över direktiv

Direktiv

Beskrivning

Reservera byte i RAM

Programsegment

Definiera en byte - en konstant i Flash-minnet eller

Tilldela ett symboliskt namn till ett register

Anger enheten för vilken den är kompilerad

program

Datasegment

Definierar ett ord i Flash-minnet eller EEPROM

Slut på makro

Ställ in konstant uttryck

EEPROM-segment

Avsluta filen

Bifoga en annan fil

Aktivera generering av listor

Aktivera makroexpansion i listning

Start av makro

Stäng av listgenerering

Ställ in position i segment

Ställ in en variabel till ett ekvivalent uttryck

.MACRO- och .ENDMACRO-direktiven ramar in makrodefinitionen. En makrodefinition kan ha upp till 10 parametrar med fasta namn @0,…,@9. Vid anrop av en makrodefinition anges parametrarna som en lista i numerisk ordning.

Datasegmentet börjar med .DSEG-direktivet. Direktiven .ORG och .BYTE kan användas i ett segment. BYTE-direktivet anger antalet byte som kommer att nås under programexekveringen. Det reserverade området börjar på den adress som anges av etiketten före direktivet.

Ett segment av EEPROM-typ börjar med .ESEG-direktivet. Direktiven .ORG, .DB, .DW kan användas i ett segment. .DB-direktivet i ett segment specificerar en eller en grupp byte som ska skrivas till EEPROM. DW-direktivet definierar ett ord eller en grupp av ord som skrivs till EEPROM-minnet i par om 2 byte. Början av inspelning av bytes och ord bestäms av etiketten som föregår motsvarande direktiv.

.LIST, .NOLIST, .LISTMAC-direktiven används för att styra utdata från en lista.