Assemblage richtlijnen. Richtlijnen voor gegevensdefinitie. LISTMAC – Schakel macro-uitbreiding in de lijst in

Labels
Een label in assembleertaal kan de volgende symbolen bevatten:


Letters: A tot Z en a tot z
Cijfers: 0 tot 9
Speciale tekens: vraagteken (?)
punt (.) (alleen eerste teken)
"commercieel" teken (@)
onderstrepen (_)
dollar ($)

Het eerste teken in het label moet een letter of een speciaal teken zijn. Een getal kan niet het eerste teken van een label zijn, en de tekens $ en ? hebben soms een speciale betekenis en worden over het algemeen niet aanbevolen voor gebruik. Er wordt standaard geen onderscheid gemaakt tussen hoofdletters en kleine letters, maar het onderscheid kan worden ingeschakeld door een of andere optie in te stellen opdrachtregel assembler Maximale lengte tags - 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 overeenkomstige registers aan te duiden.
Als het label zich vóór de processorinstructie bevindt, staat er onmiddellijk daarna altijd een “:” (dubbele punt) symbool, dat de assembler vertelt een variabele te maken met deze naam die het adres van de huidige instructie bevat:
sommige_loop:

loopne een_loop
Wanneer een label vóór een assembler-richtlijn verschijnt, is dit meestal een van de operanden van die richtlijn en wordt de dubbele punt niet opgenomen:

codesg-segment
loedsw; een woord uit een string lezen,
cmp bijl,7; als het 7 is, verlaat u de lus
codesg eindigt
Laten we eens kijken naar richtlijnen die rechtstreeks met labels en hun waarden werken: LABEL, EQU en =.

LABEL-richtlijn

Labeltype De LABEL-richtlijn definieert een label en specificeert het type ervan. Het type kan een van de volgende zijn: BYTE (byte), WORD (woord), DWORD (dubbel woord), FWORD (6 bytes), QWORD (quad word), TBYTE (10 bytes), NEAR (dichtbij label), FAR (ver). etiket). Het label krijgt een waarde die gelijk is aan het adres van de volgende opdracht of volgende gegevens, en het type dat expliciet is opgegeven. Afhankelijk van het type commando
mov label,0 zal een byte (woord, dubbel woord, enz.) gevuld met nullen in het geheugen schrijven, en het commando
call label zal een korte of lange oproep doen naar de subroutine.

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

EQU-richtlijn

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

waarheid gelijk 1
message1 equ "Probeer opnieuw$"
var2 gelijk 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 te introduceren die gemeenschappelijk zijn voor het hele programma, 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 accepteren. Bovendien kan het label dat door deze richtlijn wordt gespecificeerd, worden overschreven.

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

Jmp$

voert een onvoorwaardelijke vertakking op zichzelf uit, zodat er vanuit één commando een eeuwige lus ontstaat.

Om deze hele kwestie beter te begrijpen, heb ik een klein programma geschreven. Nog steeds dezelfde “Hello World”, maar op een nieuwe manier :) Tekst hieronder:

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



Laten we de montagelijsten zorgvuldig bekijken en het verschil vinden.



Interessant genoeg heeft TASM het LEA-commando samengevoegd tot in dit geval als de MOV-instructie (bewerkingscode BA), en MASM assembleerde de LEA-instructie in een andere bewerkingscode - 8D16, waardoor de programmagrootte met 1 byte werd vergroot. Ik weet nog niet waarom hij dit heeft besloten, maar het zou interessant zijn om erachter te komen.

De MASM-, TASM- en WASM-assemblers verschillen van elkaar. Het maken van eenvoudige programma's voor hen kent echter vrijwel geen verschillen, met uitzondering van de montage en het koppelen zelf.

Dus ons eerste programma voor MASM, TASM en WASM dat output geeft Engelse brief"A" op de huidige cursorpositie, dat wil zeggen aan de linkerkant bovenste hoek 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 taal worden getypt teksteditor- bijvoorbeeld in NotePad vanuit WINDOWS (maar niet in Word of andere "verfijnde"). Ik raad echter een "geavanceerde" teksteditor aan met syntaxisaccentuering, zoals PSPad (zie sectie). Vervolgens slaan we dit bestand met de extensie .asm op in bijvoorbeeld de map MYPROG. Laten we het bestand atest noemen. We hebben dus: C:\MYPROG\atest.asm.

OPMERKING
Houd er rekening mee dat we in het eerste commando 2 hebben geschreven in plaats van 02h. MASM, TASM en WASM staan, net als Emu8086, dergelijke ‘vrijheden’ toe. Hoewel u 02u kunt schrijven, zal er geen fout optreden.

Uitleg bij het programma:

.model klein– 1e lijn. De .model-richtlijn definieert het geheugenmodel voor een specifiek bestandstype. In ons geval is dit een bestand met COM-extensie, dus kiezen we voor het kleine model, dat code-, data- en stapelsegmenten combineert. Het kleine model is ontworpen om bestanden van het COM-type te maken.

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

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

aanvang: MOV AH, 02u– 4e regel. Het startlabel wordt vóór het eerste commando in het programma geplaatst en zal in de END-richtlijn worden gebruikt 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 dat de waarde 02h in het AN-register wordt geplaatst. Waarom wordt dit gedaan? 02h is een DOS-functie die een teken op het scherm weergeeft. We schrijven een programma voor DOS, dus we gebruiken de commando's hiervan besturingssysteem(OS). En we schrijven deze functie (of beter gezegd het nummer ervan) in het AH-register, omdat interrupt 21h dit register gebruikt.

MOV DL, 41u– 5e regel. De tekencode "A" wordt in het DL-register ingevoerd. De ASCII-code voor het teken "A" is 41h.

INT 21u– 6e regel. Dit is dezelfde interrupt 21h - het commando dat veroorzaakt systeem functie DOS gespecificeerd in het AN-register (in ons voorbeeld is dit functie 02h). Het INT 21h-commando is het belangrijkste interactiemiddel tussen programma's en het besturingssysteem.

INT 20u– 7e regel. Dit is een interrupt die het besturingssysteem vertelt het programma af te sluiten en de besturing over te dragen aan de consoletoepassing. Als 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 regel. De END-richtlijn beëindigt het programma en geeft aan op welk punt de uitvoering ervan moet beginnen.

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

Er wordt een programmasegment geopend met de .CSEG-richtlijn. Als het programma met dit segment begint, ontbreekt de richtlijn mogelijk. In een programmasegment kunt u de .ORG-richtlijn gebruiken om het begin van het segment aan te geven.

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

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

De .DEVICE-richtlijn specificeert het type doelmicrocontroller dat zal worden gebruikt om het programma uit te voeren. De aanwezigheid van deze richtlijn maakt controles mogelijk voor programma-instructies met betrekking tot fysiek apparaat, waarschuwing over de onmogelijkheid om bepaalde instructies uit te voeren, de grootte van het gebruikte geheugen, enz.

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

Tabel 1.8. Lijst met richtlijnen

Richtlijn

Beschrijving

Reserveer bytes in RAM

Programmasegment

Definieer een byte - een constante in Flash-geheugen of

Wijs een symbolische naam toe aan een register

Specificeert het apparaat waarvoor moet worden gecompileerd

programma

Gegevenssegment

Definieert een woord in Flash-geheugen of EEPROM

Einde macro

Stel constante expressie in

EEPROM-segment

Sluit het bestand af

Voeg nog een bestand toe

Schakel het genereren van vermeldingen in

Schakel macro-uitbreiding in de lijst in

Begin van macro

Schakel het genereren van vermeldingen uit

Positie in segment instellen

Stel een variabele in op een equivalente expressie

De richtlijnen .MACRO en .ENDMACRO omlijsten de macrodefinitie. Een macrodefinitie kan maximaal 10 parameters bevatten vaste namen@0,…,@9. Bij het aanroepen van een macrodefinitie worden de parameters opgegeven als een lijst in numerieke volgorde.

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

Een segment van het EEPROM-type begint met de .ESEG-richtlijn. De richtlijnen .ORG, .DB, .DW kunnen in een segment worden gebruikt. De .DB-richtlijn in een segment specificeert éé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 naar het EEPROM-geheugen worden geschreven. Het begin van het opnemen van bytes en woorden wordt bepaald door het label dat aan de overeenkomstige richtlijn voorafgaat.

De .LIST, .NOLIST, .LISTMAC richtlijnen worden gebruikt om de uitvoer van een lijst te controleren.

Richtlijnen zijn compilerbesturingsopdrachten. De verklaring 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 optioneel of verantwoordelijk voor het controleren van slechts kleine compilereigenschappen. Tot de “basis”-richtlijnen, die ook typisch zijn voor assemblers van andere processors, behoren de richtlijnen .equ, .org, .def, .сseg, .dseg, enz.. Welnu, richtlijnen als .dq, .exit, .listmac in echte programma's zijn echt heel zeldzaam. Hieronder vindt u een lijst, beschrijving en voorbeelden van het gebruik van richtlijnen uit de eigen assembler van AVR-microcontrollers.

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

Richtlijn.include
Syntaxis schrijven:
.include "(bestandspad)"
Gebruiksvoorbeeld:

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

De .exit-richtlijn vertelt de assembler waar het bestand eindigt brontekst. Alle instructies na de richtlijn worden onzichtbaar voor de compiler. Als .exit voorkomt in een opgenomen bestand, eindigt de projectbuild met de regel waar de .include-richtlijn zich bevindt. Als er geen .exit-richtlijn is, wordt rekening gehouden met het eindpunt van de build laatste regel brontekst.

Richtlijn.exit
Syntaxis schrijven:
.Uitgang
Gebruiksvoorbeeld:

Afsluiten; einde van bestand

De richtlijnen .nolist en .list beheren 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 heeft voorrang op de actie van .nolist en omgekeerd.

Richtlijnen.nolist, .list
Syntaxis schrijven:
.nolist, .lijst
Gebruiksvoorbeeld:

Nolist ;verbied de uitvoer van de tekst van het bestand “m8def.inc” .include "m8def.inc" ;in de programmalijst file.list ;ga door met de uitvoer van informatie

De .equ-richtlijn kent aan sommige een symbolische naam toe numerieke waarde. De symbolische naam moet uniek zijn en kan niet worden gewijzigd terwijl het programma wordt geschreven. De richtlijn kan niet worden gebruikt om symbolische namen aan registers toe te kennen algemeen doel.

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

Equ DDRB = 0x17 ;stel de DDRB-naam in op 0x17 .equ PORTB = DDRB + 1 ;stel de PORTB-naam in op 0x18

De .set-richtlijn heeft hetzelfde effect als .equ. Maar in tegenstelling tot laatstgenoemde kan een symbolische naam overal in het programma opnieuw worden gedefinieerd.

Richtlijn.set
Syntaxis schrijven:
.set (symbolische naam) = (expressie)
Gebruiksvoorbeeld:

Stel OFFSET = 0x100 in; een naam toekennen OFFSET-waarden 0x100 .

.set OFFSET = OFFSET + 1 ;overschrijf OFFSET-waarde De .def-richtlijn wijst een symbolische naam toe aan een van de registers voor algemene doeleinden. In het verdere verloop van het programma voornaam

kan worden overschreven door de .undef-richtlijn.
Syntaxis schrijven:
Richtlijnen .def, .undef
.def (symbolische naam) = (hoofdlettergebruik)
Gebruiksvoorbeeld:

.undef (symbolische naam)

Def temp = R16 ;geef register R16 de naam temp .undef temp ;annuleer verder gebruik van de naam temp

De richtlijnen .db, .dw, .dd, .dq zijn bedoeld om microcontrollergeheugen te reserveren voor geïnitialiseerde gegevens. Ze kunnen allemaal alleen worden gebruikt in code- en EEPROM-geheugensegmenten. Het verschil tussen deze richtlijnen is de bitdiepte van de weergegeven gegevens. De .db-richtlijn reserveert bytes, .dw reserveert woorden, .dd reserveert dubbele woorden. In zeldzame gevallen kan het ook handig zijn om de .dq-richtlijn te gebruiken, die 64-bits gegevens reserveert.
Syntaxis schrijven:
Richtlijnen.db, .dw, .dd, .dq
(label): .db (8-bits gegevens)
(label): .dw (16-bits gegevens)
(label): .dd (32-bits gegevens)
Gebruiksvoorbeeld:

(label): .dq (64-bits gegevens)

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

De.byte-richtlijn reserveert geheugen voor niet-geïnitialiseerde gegevens in de SRAM- en EEPROM-segmenten.
Syntaxis schrijven:
Richtlijn.byte
Gebruiksvoorbeeld:

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

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

Richtlijnen .dseg, .eseg, .cseg
Syntaxis schrijven:
.dseg
.eseg
.cseg
Gebruiksvoorbeeld:

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

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

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

Equ SRAM_START = 0x60 .equ RAMEND = 0x045F .dseg ;begin van data segment.org SRAM_START ;32 bytes in SRAM gereserveerd voor een buffer, buffer: . byte 32 ;beginnend op adres 0x60 .cseg ;begin van code segment.org 0 ;reset vector op adres 0 rjmp initial .

.org 0x50 ;start het hoofdprogramma op adres 0x50 aanvankelijk: ldi temp,high(RAMEND) ;stapelinitialisatie uit SPH,temp ldi temp,low(RAMEND) uit SPL,temp .

De richtlijnen .macro en .endmacro (.endm) definiëren respectievelijk het begin en het einde van de macro.
Syntaxis schrijven:
Richtlijnen.macro, .endmacro (.endm)
Gebruiksvoorbeeld:

.macro (macronaam)

Macro set_bit ;declaratie van de macro voor het instellen van de poort bit sbi @0,@1 ;set bit @1 van het poortregister @0 sbi @0-1,@1 ;configuratieregel @1 van het DDRx-register .endm voor uitvoer .

set_bit PORTB,0 ;zet poort B logica 1 op lijn 0
Syntaxis schrijven:
De .listmac-richtlijn maakt uitgebreide weergave van macrotekst in het lijstbestand mogelijk. In dit geval wordt de inhoud van elke macrodefinitie die in het programma wordt aangetroffen, in zijn geheel weergegeven. Als de richtlijn niet wordt gebruikt, wordt de code in de macro niet gegeven.
Gebruiksvoorbeeld:

Richtlijn.listmac

.listmac Listmac ;sta het uitbreiden van macrotekst in het lijstbestand toe over de voortgang van de programmacompilatie. De .message-richtlijn genereert een bericht voor de lijn waarop de oproep is aangetroffen. Het gebruik van .warning resulteert in een waarschuwing, en .error resulteert in een foutmelding. In het laatste geval stopt de bouw van het project.

Richtlijnen .bericht, .waarschuwing, .fout
Syntaxis schrijven:
.message "(sms-bericht)"
.warning "(waarschuwingstekst)"
.error "(foutmeldingstekst)"
Gebruiksvoorbeeld:

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

Een groep voorwaardelijke compilatierichtlijnen.ifdef, .ifndef, .if, .else, elif, .endif worden gebruikt voor invoegingen programmacode afhankelijk van verschillende omstandigheden. De .ifdef-richtlijn controleert op de aanwezigheid van een symbolische naamdeclaratie. De richtlijn kan worden gevolgd door een reeks opdrachten die in de tekst worden ingevoegd als de testvoorwaarde “waar” is (de naam is gedeclareerd). De .ifndef-richtlijn is het tegenovergestelde van .ifdef, die controleert op de afwezigheid van een symbolische naamdeclaratie. De .if-richtlijn voert codevervanging uit wanneer aan de vergelijkingsvoorwaarde die als parameter is opgegeven, is voldaan. Commando's die moeten worden uitgevoerd als de voorwaarde van de .if-richtlijn 'false' is, bevinden zich na de .else-richtlijn. Vertakkingen zoals “if” - “then” kunnen verschillende niveaus van nesting hebben dankzij de .elif-richtlijn. Elk controleblok dat begint met .ifdef, .ifndef, .if moet worden afgesloten met een .endif-instructie.

Richtlijnen if, .ifdef, .ifndef, .else, elif, .endif
Syntaxis schrijven:
.ifdef (teken) (of .ifndef (teken))
.if (voorwaarde)
.else (expressie) (of .elif (voorwaarde))
.endif
Gebruiksvoorbeeld:

Macro del_ms ;macro die een tijdvertraging genereert in ms.ifndef FREQ ;als de FREQ-constante (frequentie in Hz) niet is gedeclareerd, .warning "Ongedefinieerde FREQ-constan!" ;geef een waarschuwing en.equ FREQ = 1000000 ;wijs de standaardwaarde toe aan 1 MHz.endif .equ DELAY = (@0*FREQ)/4000 ;instelwaarde voor tijdvertraging.if DELAY > 65535 ;als DELAY groter is dan 2 bytes , dan fout “Overloop van gehele getallen in DELAY!” ;implementatie van de macro is niet mogelijk.else push XL ;bewaar de werkregisters XL, XH push XH ldi XH,high(DELAY) ;vertragingscyclus ldi XL,low(DELAY) sbiw XH:XL,1 brne PC-1 pop XH pop XL ;herstel werkregisters XH, XL van de stapel .endif .endm . .equ FREQ = 2000000 ;ad klok frequentie

2 MHz. del_ms 25 ;vorming van een tijdsvertraging van 25 ms

Bepaal het apparaat waarvoor het is samengesteld

het resultaat van de berekening moet een resultaat opleveren in hetzelfde bereik, anders wordt het getal ingekort tot een byte en ZONDER waarschuwingen te geven.

Als een richtlijn meer dan één parameter ontvangt en het huidige programmasegment dat is, worden de parameters in woorden verpakt (de eerste parameter is de lage byte), en als

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

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 expressies, gescheiden door komma's. Elke expressie moet een getal zijn in het bereik (-32768..65535) of

als resultaat van de berekening moet het een resultaat opleveren in hetzelfde bereik, anders wordt het getal ingekort tot een woord, en ZONDER waarschuwingen te geven.

Syntaxis:
LABEL: .DW-expressielijst

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

Syntaxis:
.ENDMACRO

Voorbeeld:
.MACRO SUBI16; Een macrodefinitie beginnen
subi r16,laag(@0) ; Trek de lage byte van de eerste parameter af
sbci r17,hoog(@0) ; Trek de hoge byte van de eerste parameter af
.ENDMACRO

EQU – Stel constante expressie in

De EQU-richtlijn kent een waarde toe aan een label. Dit label kan later in expressies worden gebruikt. Een label waarvan de waarde door deze richtlijn wordt toegekend, kan dat niet zijn

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

Syntaxis:
.EQU-label = expressie

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. Bronbestand kan uit meerdere EEPROM-segmenten bestaan, die tijdens het compileren tot één segment worden gecombineerd.

Een EEPROM-segment bestaat doorgaans alleen uit richtlijnen,

href="#DW - Definieer constante woorden in het programmageheugen en EEPROM">DW

en merken. EEPROM-segmenten hebben hun eigen segmenten

byte-positietellers. De richtlijn kan worden gebruikt om te plaatsen

variabelen op de gewenste plaats in de EEPROM. De richtlijn kent 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 – Sluit het bestand af

Na ontmoet te hebben EXIT-richtlijn de compiler stopt met compileren dit bestand. Als de richtlijn wordt gebruikt in een bijgevoegd bestand (zie richtlijn

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

), waarna de compilatie verdergaat vanaf de regel die volgt op de INCLUDE-richtlijn.

Als het bestand niet is genest, stopt de compilatie.

Syntaxis:
.UITGANG

Voorbeeld:
.UITGANG ; Sluit dit bestand af

INCLUSIEF – Voeg nog een bestand toe

Nadat hij een INCLUDE-richtlijn is tegengekomen, opent de compiler het daarin gespecificeerde bestand en compileert het totdat het bestand eindigt of de richtlijn wordt aangetroffen

href="#EXIT - Sluit dit bestand af">EXIT

, gaat vervolgens 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 shigh = 0x3e ; Stapelwijzer hoge byte
.EQU splow = 0x3d; Lage byte van de stapelwijzer

; incdemo.asm-bestand
.INCLUSIEF iodefs.asm ; Definities van Nest-poorten
in r0,sreg; Statusregister lezen

LIST – Schakel het genereren van vermeldingen in

De LIST-richtlijn vertelt de compiler dat hij een lijst moet maken. De lijst is een combinatie van assemblagecode, adressen en opcodes. Door

Standaard is het genereren van vermeldingen ingeschakeld, maar deze richtlijn wordt gebruikt in combinatie met de richtlijn voor het verkrijgen van vermeldingen afzonderlijke onderdelen bronbestanden.

Syntaxis:
.LIJST

Voorbeeld:

LISTMAC – Schakel macro-uitbreiding in de lijst in

Na de LISTMAC-richtlijn toont de compiler de inhoud van de macro in de lijst. Standaard toont de lijst alleen de macro-oproep en de verzonden

parameters.

Syntaxis:
.LISTMAC

Voorbeeld:
.MACRO MACX; Macro-definitie
voeg r0,@0 toe; Macrolichaam
eof r1,@1

LISTMAC; Schakel macro-uitbreiding in
MACXr2,r1; Een macro aanroepen (de hoofdtekst van de macro wordt in de lijst weergegeven)

MACRO – Begin van een macro

De definitie van een macro begint met de MACRO-richtlijn. De naam van de macro wordt als parameter aan de richtlijn doorgegeven. Als u verderop in de programmatekst een macronaam tegenkomt,

de compiler vervangt deze naam door de hoofdtekst van de macro. Een macro kan maximaal 10 parameters bevatten, die toegankelijk zijn via @0-@9 in de hoofdtekst. Wanneer u wordt aangeroepen, worden de parameters weergegeven

gescheiden door komma's. De macrodefinitie eindigt met een richtlijn.

Standaard wordt alleen de macro-aanroep opgenomen in de lijst; vouw de macro uit, u moet de richtlijn gebruiken. De macro in de lijst wordt weergegeven met een +-teken.

Syntaxis:
.MACRO macronaam

Voorbeeld:
.MACRO SUBI16; Begin van macrodefinitie
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 macrodefinitie

CSEG; Begin van het programmasegment
SUBI16 0x1234,r16,r17; Trek 0x1234 af van r17:r16

NOLIST – Schakel het genereren van vermeldingen uit

De NOLIST-richtlijn vertelt de compiler dat hij moet stoppen met het genereren van lijsten. De lijst is een combinatie van montagecode, adressen en

bedieningscodes. Het genereren van vermeldingen is standaard ingeschakeld, maar kan door deze richtlijn worden uitgeschakeld. Daarnaast kan deze richtlijn worden gebruikt

samen met een richtlijn om lijsten van afzonderlijke onderdelen te verkrijgen

bronbestanden

Syntaxis:
.NOLIST

Voorbeeld:
.NOLIST ; Schakel het genereren van vermeldingen uit
.INCLUSIEF "macro.inc"; Bijgevoegde bestanden zijn dat niet
.INCLUSIEF "const.def"; weergegeven in de lijst
.LIJST; Schakel het genereren van vermeldingen in

ORG – Positie in segment instellen

De ORG-richtlijn stelt de positieteller in op een bepaalde waarde, die als parameter wordt doorgegeven. Voor het datasegment wordt de positieteller ingesteld op

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

Het label wordt geplaatst op het adres dat is opgegeven in de richtlijnparameter. Voordat het compileren begint, zijn de programmateller en EEPROM-teller gelijk aan nul en is de RAM-teller gelijk aan 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 ; Zet de programmateller op 0x10
mov r0,r1; Deze opdracht bevindt zich op adres 0x10

SET – Stel het variabele symbolische equivalent van een uitdrukking in

De SET-richtlijn kent een waarde toe aan een naam. Deze naam kan later in expressies worden gebruikt. Bovendien in tegenstelling tot de richtlijn

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

de waarde van de naam kan worden gewijzigd door een andere SET-richtlijn.

Syntaxis:
.SET naam = expressie

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

CSEG; Begin van codesegment
clr r2; Register wissen 2