Assemblage richtlijnen. EXIT – Sluit het bestand af. EQU – Geef een naam aan de uitdrukking

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.

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 bronbestand elk segment kan in slechts één exemplaar 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 De assembleer-programmeertaal bevat altijd microcontroller, maar dit is niet beperkt tot de reeks opdrachten van deze taal. Het punt is dat je het proces van het uitzenden van het programma zelf moet kunnen beheren. Een volledige lijst met richtlijnen wordt gegeven in de taalbeschrijving, en sommige daarvan zullen hier in detail worden besproken.

Het eerste dat lastig is bij het gebruik van alleen machineopdrachten is de noodzaak om te onthouden welke gegevens zich in welke geheugencel bevinden. Bij het lezen van een programma is het moeilijk om constanten van variabelen te onderscheiden, omdat ze in commando's alleen verschillen door het type adressering. Deze moeilijkheid kan worden overwonnen door identificatiegegevens te gebruiken. U kunt aan elke geheugencel een identificatiecode toewijzen en daardoor met deze identificatiecode als variabele werken.

equ-richtlijn Hiermee kunt u namen toewijzen aan variabelen en constanten. Nu kunt u op één plaats een adres aan een variabele toewijzen en de variabele-ID in het hele programma gebruiken. Het is waar dat de programmeur verantwoordelijk is voor het gebruik van de identificatie als variabele, maar als het tijdens het schrijven van een programma nodig is om het adres van een variabele te wijzigen, kan dit op één plek in het programma worden gedaan, in plaats van via het hele programma, waarbij we uitzoeken of het getal 10 een constante is in dit specifieke commando, het adres van de cel of het aantal herhalingen in de cyclus. Alle noodzakelijke wijzigingen worden door de vertaler zelf aangebracht. Een voorbeeld van het toewijzen van variabelen wordt gegeven in het voorbeeld in Lijst 1.


Lijst 1. Variabelen toewijzen met behulp van de equ-richtlijn

Zoals u in het bovenstaande voorbeeld kunt zien, vergroot het gebruik van identifiers de begrijpelijkheid van het programma aanzienlijk, omdat de naam van de variabele de functie weergeeft waarvoor deze variabele verantwoordelijk is.

Met behulp van de equ-richtlijn kunt u niet alleen variabelen, maar ook constanten toewijzen. Zoals eerder vermeld hangt de vraag of een identificatie als variabele of als constante zal worden gebruikt af van de commando's en soorten adressering die de programmeur gebruikt.

Als een ID eenmaal is toegewezen, kan deze in de toekomst niet meer worden gewijzigd. Als u opnieuw precies dezelfde ID-naam probeert toe te wijzen, wordt er een foutmelding weergegeven.

richtlijn instellen. Als u op verschillende plaatsen in het programma verschillende nummers aan dezelfde ID moet toewijzen, moet u de set-instructie gebruiken. Het gebruik van deze richtlijn is volledig identiek aan het gebruik van de equ-richtlijn en zal daarom niet met een voorbeeld worden geïllustreerd.

Constanten die zijn toegewezen door de equ-richtlijn kunnen slechts in één opdracht worden gebruikt. Heel vaak is het nodig om met een tabel met constanten te werken, zoals een conversietabel, tabellen met elementaire functies of syndromen van foutcorrectiecodes. Dergelijke constanten worden niet gebruikt in de vertaalfase, maar worden opgeslagen in het programmageheugen van de microcontroller. Om constanten in het programmageheugen van de microcontroller in te voeren, worden de db- en dw-richtlijnen gebruikt.

db-richtlijn gebruikt om constanten van één byte in het programmageheugen op te slaan. Een voorbeeld van het gebruik van de db-richtlijn wordt getoond in Listing 2.


Listing 2. Constanten toewijzen met behulp van de db-richtlijn

In dit voorbeeld wordt een functie-subroutine gebruikt die een binair decimaal getal omzet in een code met zeven segmenten. De BCD-code wordt via de accumulator aan deze functie doorgegeven en de zevensegmentcode wordt via hetzelfde register teruggestuurd naar het oproepende programma.

In de db-richtlijn kunt u meerdere constanten tegelijk opgeven, gescheiden door komma's. U kunt ze allemaal tegelijkertijd gebruiken, maar meestal is het verstandig om voor elke constante een opmerking te plaatsen, zoals in het vorige voorbeeld is gedaan. Op deze manier wordt het programma begrijpelijker en is het gemakkelijker om de fout te vinden.

Dezelfde richtlijn maakt het gemakkelijk om inscripties op te schrijven die later op het ingebouwde display of beeldscherm moeten worden weergegeven universele computer, via een interface verbonden met het apparaat dat wordt ontwikkeld. Een voorbeeld van het gebruik van de db-richtlijn om inscripties in het programmageheugen van de microcontroller in te voeren, wordt weergegeven in Figuur 3.

Figuur 3. De db-instructie gebruiken om inscripties in het programmageheugen van de microcontroller te schrijven.

dw-richtlijn Hiermee kunt u getallen van twee bytes in het programmageheugen opslaan. In deze richtlijn kunnen, net als in de db-richtlijn, getallen worden ingevoerd, gescheiden door komma's. Een voorbeeldlijst van een programmafragment wordt getoond in Figuur 4.

Figuur 4. Toepassing van de dw-richtlijn.

Figuur 4 toont een fragment van de programmalijst, zodat u kunt volgen welke bytes in het programmageheugen van de microcontroller worden ingevoerd. In het meest rechter kolom De lijst toont de adressen waarin de getallen die de operanden van de dw-richtlijn zijn, zullen worden ingevoerd. De volgende kolom toont getallen van twee bytes die in het programmageheugen van de microcontroller worden opgeslagen. Houd er rekening mee dat, hoewel de eerste twee operanden uit slechts één cijfer bestaan, er vier hexadecimale cijfers (een getal van twee bytes) in het geheugen van de microcontroller zijn opgeslagen.

Bij het vertalen van de brontekst van programma's wordt ervan uitgegaan dat de eerste instructie zich op adres nul bevindt. Het adres van volgende opdrachten is afhankelijk van de lengte en het aantal voorgaande opdrachten. Een voorbeeldlijst van het eerste gedeelte van het programma wordt getoond in Figuur 5.

Figuur 5. Voorbeeld van een programmaoverzicht.

Soms moet u de opdracht ordenen volgens specifiek adres. Dit is meestal nodig bij het gebruik van interrupts, waarbij de eerste instructie van het interrupthandlerprogramma precies op de interruptvector moet liggen. Dit kan worden gedaan met behulp van het nop-commando om de gaten tussen interruptvectoren op te vullen, maar het is beter om de ORG-richtlijn te gebruiken.

org richtlijn is bedoeld om de waarde van zijn operand naar de segmentadresteller te schrijven. Dat wil zeggen dat u met deze richtlijn op elk adres een opdracht (of gegevens) in het geheugen van de microcontroller kunt plaatsen. Een voorbeeld van het gebruik van de ORG-richtlijn om interruptroutines op interruptvectoren te plaatsen, wordt weergegeven in Figuur 6.

Figuur 6. Voorbeeld van het gebruik van de ORG-richtlijn.

Opgemerkt moet worden dat bij gebruik van deze richtlijn een situatie mogelijk is waarin de programmeur de vertaler opdracht geeft om te plaatsen nieuwe code programma op een plaats die al geschreven is, dus het gebruik van deze richtlijn is alleen toegestaan ​​in extreme gevallen. Meestal is dit het gebruik van interruptvectoren.

gebruik maken van richtlijn Bij het gebruik van interrupts is de tijd die de programma-interrupthandler in beslag neemt van cruciaal belang. Deze tijd kan aanzienlijk worden verkort door een afzonderlijke registerbank toe te wijzen voor interruptverwerking. U kunt een afzonderlijke bank met registers selecteren met behulp van de USING-richtlijn. Het banknummer van de gebruikte registers wordt in de richtlijn aangegeven als een operand. Een voorbeeld van het gebruik van de USING-richtlijn voor de routine voor het afhandelen van interrupts van timer 0 wordt getoond in Figuur 7.

Figuur 7. Voorbeeld van het gebruik van de USING-richtlijn.

CALL-richtlijn. Het MCS-51-gebruikt drie onvoorwaardelijke sprongopdrachten. De keuze voor een bepaalde instructie hangt af van de locatie in het programmageheugen, maar de programmeur weet dit meestal niet. Om fouten te voorkomen, moet u daarom de langste LJMP-opdracht gebruiken. Dit leidt tot meer lange programma's en tot extra belasting van de linkeditor. De vertaler kan kiezen beste optie onvoorwaardelijke sprongopdrachten. Om dit te doen, moet u in plaats van een microcontrolleropdracht de call-instructie gebruiken.

De overige richtlijnen zijn bedoeld om segmenten te besturen, en zullen daarom later worden besproken bij het bespreken van het werken met programma's die uit meerdere modules bestaan.

Literatuur:

Lees samen met het artikel "ASM-51 Programmeertaalrichtlijnen":


http://site/Progr/progr.php

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.

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.