Basis assembler-richtlijnen. LISTMAC – Schakel macro-uitbreiding in de lijst in. INCLUSIEF – Voeg nog een bestand toe

De assembleerprogrammeertaal omvat altijd de machinecodes van de microcontroller, maar dit is niet beperkt tot de set commando's 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 lastige 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 ID 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 de identificatie zal worden gebruikt als een variabele of als een constante 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 exact 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 binaire decimale code wordt via de accumulator naar deze functie verzonden 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. Je kunt ze allemaal tegelijk gebruiken, maar meestal is het verstandig om elke constante van commentaar te voorzien, 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 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

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 regel. 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.

MOVDL, 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.

Een van essentiële elementen Dit deel van het boek bevat voorbeelden van programma's in machinecode en in ASSEMBLY-taal. In de afdrukken van deze programma's zullen we dit moeten gebruiken

genaamd MONTAGERICHTLIJNEN en nu waarschijnlijk de meest handige tijd om een ​​idee te geven van wat het is.

We zullen naar de volgende richtlijnen kijken: ORG, EQU, DEFB, DEFW, DEFM en END, maar voordat we ze gaan overwegen, moeten we het volgende goed begrijpen:

1. ASSEMBLY-richtlijnen zijn geen opdrachten van de Z8 0-processor en hebben in die zin geen relatie met de Z8 0-machinecode.

2. ASSEMBLER is een programma dat door u geschreven tekst in de vorm van geheugensteuntjes vertaalt (vertaalt) naar objectcode, oftewel machinecode. En deze ASSEMBLY-richtlijnen zijn enkele opdrachten voor het assemblageprogramma. Ze zijn niet vertaald en worden niet opgenomen in de objectcode, maar ze zullen het voor u gemakkelijker maken om het in geheugensteuntjes geschreven programma te schrijven en, belangrijker nog, te lezen.

3. Er zijn heel veel ASSEMBLY-programma's en elk ervan kan zijn eigen richtlijnen hebben. Ze kunnen dezelfde richtlijnen hebben, maar verschillende vereisten voor het gebruik ervan. Kortom, u moet specifieke methoden vaststellen voor het gebruik van ASSEMBLY-richtlijnen volgens de instructies voor het assemblageprogramma dat u gebruikt (bijvoorbeeld EDITAS, GENS 3, GENS 4, ZEUS, enz.). En hoewel er geen standaarden zijn, kunnen er toch enkele fundamentele concepten worden geïdentificeerd, en we zullen ons daarop concentreren.

3.1. Opmerkingen.

We beginnen met het eenvoudigste: opmerkingen. Ze zijn geschreven na het symbool ";". (puntkomma).

Je begrijpt natuurlijk dat alles wat commentaar is, in MONTAGE zit machinecode compileert niet - dit heeft geen zin. Ze dienen alleen om het voor u gemakkelijker te maken om met een vermelding om te gaan die iemand anders of u zelf heeft samengesteld, maar al lang geleden.

Bijvoorbeeld:

10 60001 LD E,A 2 0

Zoals je kunt zien, kan de lijn dat wel

; Geladen in register E met -; batterij druk. ; Heb het met één verlaagd.

gewoon uit de opmerking.

Labels.

Labels vereenvoudigen het schrijven van programma's in ASSEMBLY-geheugensteuntjes enorm. Bij de sprongbewerkingen JP, JR, DJNZ en het aanroepen van de subroutines CALL kunt u niet het adres specificeren waarnaar u wilt springen, maar in plaats daarvan een label vervangen. Aan de andere kant, als u opdrachten voor dit adres schrijft, plaatst u daar ook een markering, bijvoorbeeld:

10 60001 BEGIN LD B,0 4

20 60003 OPNIEUW INC. HL

40 60005 DJNZ, OPNIEUW

3.2.

250 260 270

60110 60111 60113

LD A,(HL) CP 80H JR NZ,BEGIN

Zoals je kunt zien, is het erg handig. Je kunt meteen zien dat vanaf regel 40 de terugkeer naar het AGAIN-label gaat als register B niet nul bereikt. Regel 270 keert terug naar het BEGIN-label.

Het is absoluut zinvol om een ​​naam voor het label te kiezen die overeenkomt met de betekenis van de handeling die wordt uitgevoerd - dit maakt de programmalijst gemakkelijker te lezen en te begrijpen.

Tijdens het compileren berekent het assemblageprogramma zelf de waarden van de vereiste offsets in processorinstructies en vervangt deze in plaats van labels. Dus in regel 40 zal de objectcode bijvoorbeeld DJNZ FCH bevatten, in plaats van DJNZ AGAIN, wat hetzelfde is.

In het vorige voorbeeld hebben we zeer spaarzaam gebruik gemaakt van labels. Feit is dat zowel de verwijzing naar het etiket als het etiket zelf in dezelfde procedure plaatsvonden. Maar wat als u toegang wilt krijgen tot een label dat zich in een andere procedure bevindt die u gisteren hebt geschreven en gecompileerd, en wat als u de overstap naar een ROM-procedure moet maken en het label wilt gebruiken? In dit geval zal de EQU-richtlijn u helpen. Ze kent een label toe numerieke waarde. Uiteraard wordt deze richtlijn tijdens het compileren op geen enkele manier omgezet in machinecode, maar als er verwijzingen naar dit label in de programmatekst voorkomen, wordt de waarde uit de EQU-richtlijn vervangen.

In uw programma moet u bijvoorbeeld herhaaldelijk ROM-procedures oproepen, bijvoorbeeld CLEAR (1EACH=7 8 52) en OUT-LINE (1856H=6230). Vervolgens geeft u aan het begin van uw programma op

noem ze bijvoorbeeld CLEAR

richtlijn

waarden aan hun merken, n

en UIT L.

DUIDELIJK

EQ 7 8 52

UIT L

EQU 62 3 0

LABEL

EQU60016

telefoongesprek

jij kent deze

procedures of

door merk.

60001

LD HL, (ETIKET)

60004

LD BC, 0008

60007

LD DE, (04 52)

60010

BEL DUIDELIJK

60013

BEL L

60016

Meteen

ben je schuldig

waarschuwen,

voorbeelden

vanuit het oogpunt

software

voorbeelden van hoe bepaalde ASSEMBLY-richtlijnen worden gebruikt en of u voorbeelden nodig heeft echte betekenis, dan zul je het iets later ontvangen, in de volgende hoofdstukken, waar we het zullen onderzoeken praktische technieken programmeren.

Laten we nog eens naar het vorige voorbeeld kijken. In regel 30 sturen we naar het HL-registerpaar wat zich bevindt in het adres waarnaar wordt verwezen door het LABEL-label, dat volgens de EQU-richtlijn verwijst naar adres 60016.

De cellen 60016 en 60017 bevatten dus enkele gegevens die later door het programma kunnen worden gebruikt. U kunt deze gegevens vóór het compileren zelf naar de cellen sturen. En je hoeft hiervoor geen machinecode te gebruiken. Beginwaarden in geheugencellen kunt u instellen met behulp van de richtlijnen DEFB, DEFW en DEFM.

DEFB - DEFINE BYTE - stel een byte in.

DEFW - DEFINE WORD - stel een "woord" in (een "woord" is twee opeenvolgende bytes. Meestal is dit een adres.) DEFM - DEFINE MESSAGE - stel een bericht in (dit zijn verschillende opeenvolgende bytes). Doorgaans leggen assemblageprogramma's een limiet op aan het aantal bytes dat kan worden gespecificeerd door één DEFM-richtlijn, bijvoorbeeld niet meer dan vijf. Maar dit hoeft u geen zorgen te maken. Als u een lang bericht wilt specificeren, kunt u zoveel DEFM-regels op een rij plaatsen als u wilt.

DEFB specificeert dus één enkele byte (0...255), DEFW specificeert twee opeenvolgende bytes (0...65535) en DEFM specificeert een groep opeenvolgende bytes - sms-bericht, nummer tafel enz.

Als we in ons vorige voorbeeld een nummer van twee bytes wilden opslaan op de adressen 60016 en 60017, zou regel 80 als volgt moeten worden geschreven:

80 60016 DEFW 5C92H

90 60018

Stel dat u het woord "Spectrum" wilt opslaan vanaf adres 60135.

Code voor de letter "S" Code voor de letter "p" "e" "c" "t" "r"

"u" "m"

60135

60136

60137

60138

60139

60140

60141

60142

53H 7 0H 65H 63H 7 4H 72H 75H 6DH

DEFB DEFB DEFB DEFB DEFB DEFB DEFB DEFB

je kunt het specificeren in paren van bytes:

Maar het is eenvoudiger en correcter om het als bericht in te stellen:

60135 DEFM 5370656374 ; "Spect"

60140 DEFM 72756D; "rum"

Eten speciaal geval bij het programmeren in ASSEMBLY, waarbij de programmatekst ook via DEFB of DEFM moet worden ingevoerd. Dit is het geval wanneer u een programma schrijft voor een ingebouwde rekenmachine. Een assemblageprogramma kan immers ASSEMBLY-ezelsbruggetjes in machinecode vertalen, maar het weet niets van de rekenmachinecodes en kent de geheugensteuntjes ervan niet. De rekenmachinecode is een interne "Sinclair"-kwestie, de interpretatie ervan

De programma's in het ROM worden verwerkt en de rekenmachinecode heeft niets te maken met de processor en zijn opdrachten. Daarom kunt u rekenmachineopdrachten alleen in een assemblageprogramma invoeren als een reeks onafhankelijke bytes, dat wil zeggen via DEFB of DEFM.

In het eerste deel van het boek gebruikten we geheugensteuntjes voor rekenmachinecommando's, zoals add, stk_data s_lt, enz., en schreven we deze met een kleine letter, in tegenstelling tot processorcommando's. Maar we hebben dit al eerder gedaan en zullen dit alleen blijven doen ter wille van het begrip en het gemak van de opname. Het ASSEMBLY-programma kent dergelijke geheugensteuntjes niet; ze staan ​​niet in het woordenboek.

Dus met behulp van DEFB, DEFW en DEFM stellen ze de beginwaarden van programmavariabelen in, voeren ze tabellen, berichten en andere gegevensreeksen in het programma in, zelfs

afbeeldingen, evenals codereeksen die het assemblageprogramma niet begrijpt als ASSEMBLY-opdrachten.

3.5. Richtlijnen ORG, END.

We hoeven alleen maar rekening te houden met de twee meest triviale richtlijnen. De ORG-richtlijn geeft het adres aan van waaruit het programma zal worden samengesteld. Het zou de eerste richtlijn moeten zijn brontekst, hoewel er in principe opmerkingen aan vooraf kunnen gaan.

Je hebt gemerkt dat we in de bovenstaande voorbeelden aan de linkerkant een kolom met adressen hebben geschreven waarin bepaalde commando's worden geplaatst. Dit is dus niet nodig bij het programmeren in ASSEMBLY. Het is voldoende om vanaf het allereerste begin een richtlijn te geven

10ORG 63000

en dan zal het assemblageprogramma zelf berekenen in welke geheugencel deze of gene instructie zal worden geplaatst. Dit vereenvoudigt het programmeerproces aanzienlijk. En als u wijzigingen aanbrengt in de voltooide tekst, corrigeert de ASSEMBLER zelf alle adressen.

De END-richtlijn markeert het einde van een programma. Als er iets anders achter zit, zal de ASSEMBLY dit tijdens het compileren negeren.

Dat is waarschijnlijk alles wat de moeite waard is om te weten over ASSEMBLY-richtlijnen om mee te beginnen. Dit zijn niet alle richtlijnen die u in het leven kunt tegenkomen, en de regels voor het gebruik ervan zijn verschillend voor verschillende ASSEMBLERS, maar over het algemeen zal dit minimum in 90 procent van uw informatiebehoeften voorzien, en de rest moet u halen uit de instructies voor de ASSEMBLEER waarmee u werkt.

Laten we niet vergeten dat richtlijnen (pseudo-operators) instructies zijn voor de assembler; ze worden alleen verwerkt wanneer het programma wordt samengesteld (vertaald). Hier zijn enkele van de meest gebruikte richtlijnen.

Identificatie Definitie Richtlijnen

Wijs een ID met een bepaalde naam toe aan een tekst of numerieke waarde (expressie). Richtlijnformaat:

naam EQU tekst

naam = numerieke waarde (uitdrukking)

Verschil tussen pseudo-operatoren EQU en =:

l EQU - wijst permanent een waarde toe (kan niet worden gewijzigd), de tekst kan een symbolische, numerieke of gemengde uitdrukking zijn die een constante, adres, een andere symbolische naam, label, enz. definieert;

l = - voert de huidige toewijzing uit (de waarde kan opnieuw worden toegewezen, maar uiteraard alleen tijdens de vertaling); wijst alleen een numerieke uitdrukking toe die eenvoudige wiskundige transformaties bevat, die tijdens de vertaling worden uitgevoerd (bijvoorbeeld: const + 1, 15H*4, 3*12/4, enz.).

Richtlijnen voor gegevensdefinitie

Wordt gebruikt om variabelen en geheugenvelden te identificeren. Richtlijnformaat

[naam] D* expressie [,expressie] [,...].

D*-zoekwoorden kunnen zijn:

l DB - definieer byte (1 byte);

l DW - definieer een woord (2 bytes);

l DD - definieer een dubbel woord (4 bytes);

l DQ - definieer 8 bytes;

lDT - definieer 10 bytes.

De betreffende richtlijnen declareren een variabele (naam) of wijzen initiële waarden toe aan geheugenvelden (cellen); reserveer in het geheugen (met een latere toewijzing van waarde) een of meer bytes - DB, woorden - DW, dubbele woorden - DD, enz.

De uitdrukking laat zien hoeveel geheugenelementen moeten worden toegewezen en welke gegevens daarin moeten worden opgeslagen. De uitdrukking zou kunnen zijn:

ik constante:
const DB 56; bouw DW 1936; const DD 3FFH.
Zorg ervoor dat u rekening houdt met het bereik en de capaciteit van een byte, woord, enz.; dus voor DB kan de constante niet groter zijn dan 255, voor DW - 65.535, voor DD -



l 65 535 2 – 1 = 4 294 967 295;

l vector of tabel:
tabel1 DB 30, 4, –15, 0, 0, 0, 56; tafel2 DW 1936, 3004, 56, 15.
In één pseudo-operator kunt u een string van maximaal 132 posities plaatsen, en in plaats van dezelfde waarde meerdere keren te herhalen (0 in tabel1), kunt u de DUP (duplicate) pseudo-operator gebruiken:
tabel1 DB 30, 4, –15, 3 dup(0), 56);

l een reeks tekens:
str1 DB "Je hebt te veel ingevoerd groot aantal";
str2 DB "Slechte opdracht";
in de DB-pseudo-operator kan de regel 255 tekens bevatten, in alle andere (DW, DD, DQ, DT) - slechts 2 tekens.

l leeg veld:
pool1 DB ?; paal2 DW 12 dup(?),
tegelijkertijd wordt er niets naar de gereserveerde geheugenelementen geschreven wanneer het programma wordt geladen (er wordt niet 0 geschreven, zoals bijvoorbeeld in de pole3 DW 5 dup(0) richtlijn, maar geheugencellen worden eenvoudigweg gereserveerd);

l symbolische variabelenaam:
var1 DW disp; var2 DD-vector
(de ene variabele wordt gedefinieerd door het adres van een andere; het is niet nodig om offset in richtlijnen te specificeren, aangezien de naam van de variabele wordt gezien als zijn adres). Deze optie is bijvoorbeeld geschikt voor het opslaan van adressen van geheugencellen, labels waarnaar kan worden verwezen in een programma (var1 DW disp), en als de variabele zich in hetzelfde segment bevindt als het verwijzende commando, dan is het voldoende om alleen te specificeren de offset als adres (2 bytes), dat wil zeggen dat je kunt rondkomen met DW; als de variabele zich in een ander segment bevindt, moet u zowel het segment als de offset opgeven (4 bytes in totaal), dat wil zeggen dat u DD (var2 DD-vector) moet gebruiken;

l met een eenvoudige uitdrukking:
fn1 DB 80*3; fn2 DW (disp) + 256, uiteraard alleen berekend als het programma vertaald is.

Richtlijnen voor het definiëren van segmenten en procedures

Een segment wordt gedefinieerd door pseudo-operatoren:

segment_naam segment

segmentnaam eindigt

In een programma kunt u 4 segmenten gebruiken (afhankelijk van het aantal segmentregisters) en voor elk segment het overeenkomstige segmentregister specificeren met behulp van de pseudo-operator ASSUME (aannemen - toewijzen), bijvoorbeeld:

neem aan dat CS:codeseg, DS:dataseg, SS:stackseg

De ASSUME-richtlijn register_seg:seg_name [,..], in het bijzonder ASSUME cs:codeseg, specificeert dat het register dat is geselecteerd voor het segment seg_name (codeseg) CS is.

Na de ASSUME-richtlijn moet u expliciet het adres van het begin van het datasegment in het DS-register laden:

De procedure wordt gedefinieerd door pseudo-operatoren:

procedurenaam proc ...

procedurenaam endp

Bij het definiëren van een procedure na trefwoord proc moet het afstandsattribuut dichtbij of ver specificeren; als dit attribuut niet aanwezig is, is de standaard nabij. Normaal gesproken moet de procedure eindigen met een ret-opdracht (return). Als een procedure als dichtbij wordt verklaard, moet de oproep vanuit hetzelfde segment worden gedaan; indien procfar, dan vanuit elk segment (in dit geval zal het ret-commando twee woorden uit de stapel halen bij het retourneren: voor IP en voor CS).

Richtlijnen voor uitzendcontrole

Er zijn er verschillende, de meest gebruikte is END. De END-richtlijn markeert het einde van het programma en vertelt de assembler waar de vertaling moet eindigen. Formaat: END [programmanaam].

Programmeerprocedures voor het werken met invoer-/uitvoerapparaten

I/O-procedures op een pc worden meestal uitgevoerd met behulp van interrupts. De samenstelling en het gebruik van de belangrijkste soorten interrupts en servicefuncties van de DOS-interrupt 21H worden in de werken besproken. Hieronder bespreken we kort de kwesties van het programmeren van alleen I/O-interrupts voor het weergeven van informatie op het display en toetsenbordinvoer. Kwesties van het uitvoeren van informatie naar een printer en het werken met bestanden worden in de werken besproken.

Programmering weergeven

Tijdens onderbrekingen kunnen bedrijfsmodi worden ingesteld en gegevens met het display worden uitgewisseld BIOS-type 10H, en gegevensuitvoer naar het display en tijdens DOS-interrupts van het type 21H.

Videobewerkingen met 21H DOS-onderbreking

l Uitvoer van symbolen om scherm weer te geven: AH = 2 of AH = 6 en DL<>0FFh. Het DL-register moet de ASCII-code van het teken bevatten. Voorbeeldprogrammafragment (uitvoer van het symbool “C”):

mov DL, 43H; 43H is de ASCII-code voor teken C

l Een reeks tekens uitvoeren: AH = 9 (meest gebruikte functie). De DS:DX-registers moeten het startadres van de tekenreeks bevatten, die moet eindigen met het teken $. Een voorbeeld van een programmafragment (waarin de tekst wordt weergegeven "een reeks tekens uitvoeren $"):

Tekst db "uitvoertekenreeks $"

mov DX, offsettekst; dit is het adres van de uitvoerregel

l I/O uit bestand via logisch nummer. Standaard logische bestandsnummers identificeren het type en apparaat van de I/O:

l 0 - toetsenbordinvoer;

l 1 - uitvoer naar het weergavescherm;

l 2- geef een foutmelding weer;

l 3- I/O aan extern apparaat;

l 4- afdruk.

De functie AH = 3Fh van interrupt 21H wordt gebruikt voor invoer, de functie AH = 40h van interrupt 21H wordt gebruikt voor uitvoer. Het CX-register is vooraf ingesteld met het aantal bytes dat wordt ingevoerd/uitgevoerd, en het DX-register is vooraf ingesteld met het startadres van het geheugenveld voor I/O. Als de I/O-procedure met succes is voltooid, wordt de carry-vlag CF gewist en wordt het aantal daadwerkelijk overgedragen bytes teruggestuurd naar het AX-register. Bij mislukte operatie de CF-vlag wordt ingesteld op 1 en de foutcode wordt naar het AX-register geschreven.

Het onderstaande voorbeeld bevat een programmafragment dat op het scherm moet worden weergegeven tekstbestand Tekst van 50 bytes.

tekst db 50 dup(" ")

mov BX, 1; het uitvoerapparaat opgeven

mov CX, 50 ;geeft het aantal uit te voeren bytes aan

mov DX, offsettekst; met vermelding van het startadres

; geheugenveld met tekst

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 met 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 het mogelijk programma-instructies te monitoren 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.

Het 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.