handleiding voor gebruik intel's ontwikkelingsysteem in ... · handleiding voor gebruik...

76
Handleiding voor gebruik intel's ontwikkelingsysteem in 8086 mode Ree, de, J.W. Gepubliceerd: 01/01/1984 Document Version Uitgevers PDF, ook bekend als Version of Record Please check the document version of this publication: • A submitted manuscript is the author's version of the article upon submission and before peer-review. There can be important differences between the submitted version and the official published version of record. People interested in the research are advised to contact the author for the final version of the publication, or visit the DOI to the publisher's website. • The final author version and the galley proof are versions of the publication after peer review. • The final published version features the final layout of the paper including the volume, issue and page numbers. Link to publication Citation for published version (APA): Ree, de, J. W. (1984). Handleiding voor gebruik intel's ontwikkelingsysteem in 8086 mode. (TH Eindhoven. Afd. Werktuigbouwkunde, Vakgroep Produktietechnologie : WPB; Vol. WPB0105). Eindhoven: Technische Hogeschool Eindhoven. General rights Copyright and moral rights for the publications made accessible in the public portal are retained by the authors and/or other copyright owners and it is a condition of accessing publications that users recognise and abide by the legal requirements associated with these rights. • Users may download and print one copy of any publication from the public portal for the purpose of private study or research. • You may not further distribute the material or use it for any profit-making activity or commercial gain • You may freely distribute the URL identifying the publication in the public portal ? Take down policy If you believe that this document breaches copyright please contact us providing details, and we will remove access to the work immediately and investigate your claim. Download date: 31. May. 2018

Upload: truongmien

Post on 09-Apr-2018

226 views

Category:

Documents


6 download

TRANSCRIPT

Handleiding voor gebruik intel's ontwikkelingsysteem in8086 modeRee, de, J.W.

Gepubliceerd: 01/01/1984

Document VersionUitgevers PDF, ook bekend als Version of Record

Please check the document version of this publication:

• A submitted manuscript is the author's version of the article upon submission and before peer-review. There can be important differencesbetween the submitted version and the official published version of record. People interested in the research are advised to contact theauthor for the final version of the publication, or visit the DOI to the publisher's website.• The final author version and the galley proof are versions of the publication after peer review.• The final published version features the final layout of the paper including the volume, issue and page numbers.

Link to publication

Citation for published version (APA):Ree, de, J. W. (1984). Handleiding voor gebruik intel's ontwikkelingsysteem in 8086 mode. (TH Eindhoven. Afd.Werktuigbouwkunde, Vakgroep Produktietechnologie : WPB; Vol. WPB0105). Eindhoven: TechnischeHogeschool Eindhoven.

General rightsCopyright and moral rights for the publications made accessible in the public portal are retained by the authors and/or other copyright ownersand it is a condition of accessing publications that users recognise and abide by the legal requirements associated with these rights.

• Users may download and print one copy of any publication from the public portal for the purpose of private study or research. • You may not further distribute the material or use it for any profit-making activity or commercial gain • You may freely distribute the URL identifying the publication in the public portal ?

Take down policyIf you believe that this document breaches copyright please contact us providing details, and we will remove access to the work immediatelyand investigate your claim.

Download date: 31. May. 2018

HANDLEIDING VOOR GEBRUIK INTEL'S ONTWIKKELSYSTEEM IN 8086 MODE.

J.W. de Ree

WPB . 0 105

juni 1984.

InhQudsopgave

Hoofdstuk 1: Inleiding

Hoofdstuk 2: De 16-bits microprocessoren 2.1 Inleiding 2.2 De 8086/8088 microprocessor en 2.3 De register set 2.4 Segmentatie 2.5 Coprocessing en multiprocessing

Hoofdstuk 3: ASM86 Language reference manual 3.1 Inleiding 3.2 Segmentatie

SEGMENT/ENDS directive ASSUME directive GROUP directive

3.3 Definitie en initialisatie van data LABEL directive PROC directive Variabelen DB,DW,DD,DQ,DT directives Records RECORD directive Structures STRUC directive ORG directive EVEN directive PURGE directive

3.4 Bewerken van data 8086/87/88 instruction statements De verschillende operands Segment register defaults Overzicht van expressies Arithmetic operators Relational operators Logical operators Attribute overriding operators PTR operator SHORT operator THIS operator SEG operator OFFSET operator TYPE operator LENGTH operator SIZE operator Record specific operators EQU directive

3.5 Directives voor linken programma's PUBLIC directive EXTRN directive END directive

pag 1.1

pag 2.1 pag 2.1 pag 2.1 pag 2.2 pag 2.3 pag 2.4

pag 3.1 pag 3.1 pag 3.2 pag 3.2 pag 3.4 pag 3.5 pag 3.6 pag 3.6 pag 3.7 pag 3.9 pag 3.9 pag 3.10 pag 3.11 pag 3.12 pag 3.13 pag 3.15 pag 3.15 pag 3.15 pag 3.16 pag 3.16 pag 3.16 pag 3.18 pag 3.19 pag 3.20 pag 3.21 pag 3.21 pag 3.21 pag 3.22 pag 3.22 pag 3.23 pag 3.23 pag 3.24 pag 3.24 pag 3.24 pag 3.25 pag 3.25 pag 3.26 pag 3.26 pag 3.27 pag 3.27 pag 3.27

Inhoudsopgave

NAME directive 3.6 De 8086/87/88 instructie set

Data transfer Arithmetic Logic Control transfers Processor control

3.7De Macro Processing Language (MPL)

Hoofdstuk 4: ASM86 Macro Assembler Operation 4.1 Inleiding 4.2 De invocation line 4.3 De controls 4.4 Listing file en errorprint file

Hoofdstuk 5: ASM86 hulpprogramma's 5.1 Inleiding

External en public symbols 5.2 LINK86 5.3 CREF86 5.4 LIB86 5.5 LOC86 5.6 OH86

Hoofdstuk 6: CONV86 6.1 Inleiding 6.2 Het gebruik van de convertor

pag 3.29 pag 3.29 pag 3.31 pag 3.32' pag 3.33 pag 3.33 pag 3.33 pag 3.34

Instructions pag 4.1 pag 4.1 pag 4.1 pag 4.2 pag 4.3

pag 5. 1 pag 5.1 pag 5.2 pag 5.3 pag 5.5 pag 5.6 pag 5.7 pag 5.9

pag 6.1 pag 6. 1 pag 6.2

Hoofdstuk 7: De iSBC 86/12 Single Board Computer 7.1 Inleiding

pag pag

7 . 1 7 . 1

7.2 Het verzenden van programma's SBC861

7.3 Monitor kommando's

Hoofdstuk 8: Een voorbeeld 8.1 Inleiding 8.2 Het programma 8.3 Module INIT86 8.4 Module TEXT 8.5 Module CO 8.6 Het assembleren 8.7 Het linken 8.8 Het locaten 8.9 Omzetten in HEX formaat 8.10 Verzenden en draaien

Hoofdstuk~. Woordenlijst

pag 7. 1 pag 7 . 1 pag 7.2

pag 8. 1 pag 8.1 pag 8. 1 pag 8.2 pag 8.) pag 8.4 pag 8.4 pag 8.7 pag 8.8 pag 8.9 pag 8.10

pag 9.1

Inleiding pag.1. 1

Hoofdstuk 1: Inleiding

Deze handleiding is geschreven voor die gebruikers van het ontwikkelsysteem die reeds bekend zijn met het werken met het Intel MDS systeem. Het gebruik van ISIS-II, Credit enz. wordt hier dan ook bekend verondersteld. Lezers welke niet bekend zijn met het werken op het ontwikkelsysteem verwijs ik naar: "Handleiding voor gebruik bij het ISIS-II operating system en het Intel MDS 236 ontwikkelsysteem", geschreven door M. van Liempt.

Deze handleiding bevat alleen gegevens betreffende het ontwikkelen van programma's voor de 8086/8088 proceesoren, due alleen gegevens voor het werken met het 8086 deel van het ont­wikkelsysteem.

In hoofdstuk 2 worden deze processoren in het kort besproken. Hoofdstuk 3 vertelt hoe men programma's in de ASM86 assembler taal moet schrijven, terwijl hoofdstuk 4 aangeeft hoe men de programma's geschreven in assembler taal kan vertalen in machine code. Hoofdstuk 5 geeft enkele hulpprogramma's waarmee men verschillende modules tot een programma kan samenvoegen en een absoluut adres kan geven. In hoofdstuk 6 wordt besproken hoe men oude 8080/8085 modules om kan zetten in 8086 modules. In hoofdstuk 7 wordt de iSBC 86/12 Single Board Computer be­sproken en wordt ook verteld hoe men een programma van het ont­wikkelsysteem moet overzenden naar de iSBC 86/12. Hoofdstuk 8 geeft een voorbeeld, nl. een interrupt programma. Met behulp van dit programma wordt stap voor stap de hele werkwijze uitgelegd, achtereenvolgens schrijven, assembleren, linken, locaten enz. Hoofstuk 9 geeft de notitie afspraken en in hoofdstuk 10 vindt men een verklarende woordenlijst.

De gegevens voor deze handleiding zijn gehaald uit de volgende boeken en manuals:

iAPX 86,88 Family Utilities User's Guide, nr.121616-003. ASM86 Language Reference Manual, nr.121703-002. ASM86 Macro Assembler Operating Instructions, nr. 121628-003. MCS-86 Assembly Language Convertor Operating Instructions for ISIS-II Users, nr.9800642-02. An Introduction to ASM86, nr.121689. 8086/8088 16-bit Microprocessor Primer door C.L.Morgan en M.Waite. iSBC 86/12 Single board computer hardware reference manual, nr.9800645A. iSBC957 Intellec-iSBC 86/12 interface and execution package user's guide, nr.9800743A.

Inleiding pag.1. 2

In dit verslag wordt gebruik gemaakt van de volgende notatie afspraken:

Hoofdletters

directory-name

filename

pathname

[ ]

{ }

[, ... ]

<cr>

karakters geschreven in hoofdletters moeten ingetikt worden in de volgorde zoals die vermeld wordt.

dat deel van een pathname dat dient om de device aan te wijzen welke de file bevat.

is een geldende naam voor dat deel van de filename dat de file aanwijst.

is een geldil]e bestemming voor een file, bestaat uit directory-name en filename.

dat wat tussen [ ] staat is een optie.

van aIle mogelijkheden tussen { } mag men er slechts een kiezen.

het voorgaande item kan herhaald worden, maar elke herhaling vooraf laten gaan door een I.

geeft een carriage return aan.

8086-8088 paq.2. 1

Hoofdstuk 2: De 16-bits microprocessoren

2.1; Inleiding

In dit hoofdstuk worden enkele basis concepten van de 8086/8088 microprocessoren besproken. Dit is noodzakelijk om­dat de opbouw van een 16-bits microprocessor anders is dan de opbouw van een 8-bits processor zoals de 8080/8085. Een 16-bits microprocessor heeft vele voordelen t.O.V. een 8-bits microprocessor, zoals:

1) de 16-bits processor is veel nauwkeuriger omdat hij data van 16 bits breedte verwerkt i.p.v. data van 8-bits breed­teo 2) de instructie-set van een 16-bits processor is veel uit­gebreider en krachtiger dan die van een 8-bits processor, bv. on-chip delen en vermenigvuldigen. 3) de 16-bits processor kan een veel groter geheugen ge­bruiken, 1 Mbyte t.o.v. 64 Kbyte bij een 8-bits processor. 4) de 16-bits processoren kunnen door hun speciale struc­tuur gebruik maken van gespecialiceerde co-processoren die bepaalde taken overnemen zodat de microprocessor iets anders kan doen. Zo zijn er bv. een speciale rekenpro­cessor (de 8087) en een speciale I/O-processor (de 8089). Deze speciale co-processoren hebben een eigen instructie set.

2.2 De 8086/8088 microprocessoren

De 8086 en 8088 zijn beide 16 bits microprocessoren met een identieke interne opbouw en instructie set. Het verschil is dat de 8086 ontworpen is om met een 16 bits data bus te wer­ken terwijl de 8088 een 8 bits data bus nodig heeft. Dit laat­ste heeft als voordeel dat men eenvoudig de huidige, goedkope 8-bits geheugen chips kan toepassen.

Zowel de 8086 als de 8088 passen de techniek van uin­struction queuing" toe om de snelheid van de processor te ver­groten. Een gebied binnen in de chip, de "instruction queue U

,

bevat enkele bytes instructie. Als de processor klaar is voor de volgende instructie, dan hoeft hij geen bytes uit het ge­heugen te halen omdat de gehele instructie zich al in de "in­struction queue" bevindt. Hierdoor wordt de belasting van de data- en adres-bussen verlaagd waardoor de computer sneller en efficienter kan werken.

De 8086/8088 kan 1 Mbyte geheugen aanschrijven. Hiervoor

8086-8088 pag.2. 2

gebruikt men een techniek genaamd segmentatie, zie pag.2.3.

Om het aantal pin-aansluitingen van het IC te beperken tot 40 pinnen past men de technieken van time multiplexing en enco­ding toe voor de verschillende signalen. Voor data- en adres-signalen gebruikt men time multiplexing, voor de ver­schillende controle signalen gebruikt men encoding. Deze tech­nieken hebben weI als gevolg dat men systemen moet ontwerpen om de oorspronkelijke signalen terug te krijgen. Hiervoor heeft men echter speciale IC's ontworpen.

De 8086/8088 heeft een zeer krachtige interrupt struktuur, zie ook hoofdstuk 8. In de 8086 zijn er zo"n 1000 bytes die tot 256 vector pointers kunnen bevatten. De 8086/8088 doet I/O operaties in een apart deel van het geheugen, genaamd de I/O space. De I/O space is tot 64 Kbyte lang.

2.3 De register set

De 8086 en de 8088 hebben een identieke register set van veertien 16-bits interne registers, zie onderstaande figuur:

•• IX

C.

U

A •

1M

eM

OM

lL ,

)

IL ~tI L

CL ~ll: OL

rm" l!,"

or

[ un

CS

L-os

15

IS

11010 UG,ST£H S.AOIO)

ACCUMUUTOR

'An COUMT

OATl

STACK 'OlNT(R

IAU PO'MTn

$CUlC! '''Oll

DUr'NAnOIi 'Norl

'"SToveno" 'Olllfll

STATU! 'LAGS

COOt Sl&.,£IIT

OAU S!G"IN'

sue. SUMt"T liT •• SEOMt.T

IV

) ""

8086-8088 paQ.2. 3

De registers van de 8086/8088 zijn als voIgt onderverdeeld:

- vier 16-bits general registers, AX, BX, CX en DX welke ook als 8-bits registers gebruikt kunnen worden. X staat voor 16-bits, H staat voor high, L staat voor low, A voor accumulator, B voor base, C voor counter en D voor data. - vier 16-bits pointer- en index-registers: SP (stack pointer), BP (base pointer), SI (source index) en DI (des­tination index). - een 16-bits flags register welke verschillende status bits van de processor bevat. Dit zijn, zie volgende fi­guur, de zero flag (ZF), sign flag (SF), parity flag (PF), carry flag (CF), auxiliary flag (AF), direction flag (DF), interrupt flag (IF), overflow flag (OF) en trap flag (TF).

15 o

- vier segment registers, CSt DS. SS en ES, resp. code, data, stack en extra segment register. - een instruction pointer IP.

2.4 Segmentatie

Segmentatie is een methode om geheugencellen te adresseren waarbij twee gegevens nodig zijn: nl. een offset en een seg­ment base. De segment base wijst naar een gebied in het geheu­gen (het segment) en de offset wijst naar het adres binnen dat gebied. Met behulp van deze methode kan men dus ook modulair ontwikkelen en men kan modules ontwikkelen welke volledig relocatable zijn (aIleen de base veranderen). Bij de 8086/8088 zijn de segmenten maximaal 64 Kbytes groot. De base van een segment wordt in een van de vier segment registers (SS, CSt ES, DS) opgeslagen. De base wordt ook weI segment paragraph ad­dress genoemd omdat een segment aIleen kan starten op een para­graph address ( deelbaar door 16H).

Om het werkelijke geheugen adres te berekenen wordt de base met 16H vermenigvuIdigd (een nul plaatsen achter base getal) en wordt de offset erbij opgeteld. Op deze wijze krijgt men een 20 bits breed adres zodat men 1 Mbyte kan adresseren. Bij het programmeren moet men begin en einde van het segment aangeven , zie hoofdstuk 3.

8086-8088 pag.2. 4

2.5 Coprocessing en multiprocessing

V~~r het krijgen van betere en krachtigere computers kan men in een computer meerdere processoren laten samenwerken. Dit samenwerken kan op twee manieren, nl. coprocessing en mul­tiprocessing:

Coprocessing: twee of meer processoren delen dezelfde in­structie stroom. Dit wil zeggen dat beide processoren hetzelf­de programma volgen maar dat ze om de beurt instructies uit­voeren omdat bepaalde instructies het best door een bepaalde processor uitgevoerd kunnen worden (bv. de 8087 rekenproces­sor).

Multiprocessing: twee of meer processoren delen dezelfde geheugen ruimte, maar opereren op verschillende instructie stromen. Elke processor heeft dus zijn eigen programma. Het is mogelijk dat een processor de leiding heeft en de andere processoren leidt d.m.v. berichten in het geheugen (bv. de 8089 IIO processor).

Het grote voordeel van coprocessing en multiprocessing is dat de centrale processor bepaalde taken niet zelf meer hoeft te doen maar deze kan laten doen door andere processoren. Hierdoor kan de centrale processor zich concentreren op de wer­king van het systeem als geheel. V~~r toepassing van deze technieken zijn speciale instructies aanwezig zodat de centrale processor weet dat hij deze instructie door een andere proces­sor moet laten uitvoeren. Verder zijn er speciale besturings­signalen en besturingsinstructies nodig v~~r synchronisatie van de verschillende processoren.

ASM86 Assembler pag.3. 1

Hoofdstuk 3: ASM86 Language reference manual

3.1 Inleiding

De assembler produceert object modules van programma's ge­schreven in ASM86 assembler taal. Deze object modules bevatten machine instructies en data.

Er zijn verschillende hulpprogramma's voor het modulair ontwikkelen van software voor de 8086/8088, zoals:

- CONVB6: zet 8080/8085 source files om in ASMB6 source files. - LINK86: combineert object modules tot load modules. - LOC86: kent aan load modules een absoluut geheugen adres toe. - LIB86: helpt om zelf library's te maken van object files. - OH86: zet 8086/8088 absolute object module om in Intel hex

formaat.

Het eerste hulpprogramma wordt besproken in hoofdstuk 6, de vier volgenden in hoofdstuk 5.

Als men een programma in assembler taal geschreven heeft, dan moet dit vertaald worden. Dit vertalen wordt gedaan door de ASM86 Macro Assembler. In hoofdstuk 4 wordt besproken hoe men de assembler moet oproepen en welke controls men kan geven.

Met de 8086 kan men zowel met data van 16 bits of van 8 bits lengte werken. De assembler controleert of de verschil­lende variabelen weI van hetzelfde type z~Jn. Dit voorkomt dat per vergissing een 16 bits variabele in een 8 bits bestemming geplaatst wordt.

De assembler heeft voor gelijksoortige instructies slechts een mnemonic, by. MOV voor aIle soorten data transport, of dit nu geheugen-geheugen of geheugen-register transport is.

De assembler laat forward references naar variabelen en labels toe, d.w.z. dat verwezen mag worden naar variabelen en labels welke pas later in het programma gedefinieerd worden. Bij forward references moet de assembler raden welk type de va­riabele of label zijn zal. Dit raden kan mislukken en tot foutmeldingen leiden. Daarom moet men forward references zo­veel mogelijk proberen te vermijden.

De assembler maakt geen onderscheid tussen upper- en lower-case letters.

ASM86 Assembler pag,3, 2

3.2 Segmentatie

In deze paragraaf worden enkele assembler directives be­sproken, nl. het SEGMENT/ENDS directive ( definieert een seg­ment ), het ASSUME directive ( geeft aan welk register de base bevat) en het GROUP directive ( gebruikt om verschillende 10-gische segmenten tot een fysisch segment te combineren ). Bij het beschrijven van de directives wordt steeds dezelfde werkwijze gebruikt: eerst de naam, dan de syntax, vervolgens een beschrijving en tot slot de Field Values (geven aan wat er precies op de velden van de syntax moet of mag staan).

Het SEGMENT/ENDS directive:

Syntax: name SEGMENT [align-type] [combine-type] [classname]

name ENDS

Het SEGMENT/ENDS directive wordt gebruikt om een logisch segment te definieren welke met anderen gecombineerd kan worden.

Field Values:

name: een unieke ASM86 identifier, de naam voor het seg­ment.

[align-type]: dit veld geeft aan op welke plaats in het geheugen het segment kan beginnen. Het veld kan de vo1-gende waarden aannemen:

1) niet gespecificeerd: default waarde van para­graph alignment, zie 2). 2) PARA paragraph alignment: het segment moet starten op een adres dee1baar door 16, dus begin­adres moet eindigen op OH. 3) BYTE byte alignment: het segment mag op elk wi11ekeurig adres beginnen. 4) WORD - word alignment: het segment moet op een even adres beginnen, dus laatste bit van beginadres moet 0 zijn. 5) PAGE - page alignment: segment moet een adres waarvan de twee laatste cijfers nul zijn, dus beginadres moet OOH.

starten op hexadecimale eindigen op

6) INPAGE inpage alignment: het gehele segment moet binnen 256 bytes passen, en het segment mag een

ASM86 Assembler pag.3. 3

page alignment grens niet overschrijden.

[combine type]: geeft aan hoe het segment gecombineerd wordt met segmenten van andere modules tot een fysisch seg­ment in het geheugen. Het veld kan de volgende waarden aannemen:

1) Niet gespecificeerd: combinable, het segment den.

default waarde van non­zal niet gecombineerd wor-

2) PUBLIC: aIle segmenten van gelijke naam gespe­cificeerd PUBLIC worden gecombineerd tijdens LINK86). Lengte van het fysisch segment is gelijk aan de som van de lengtes van de afzonderlijke seg-menten. 3) COMMON: aIle segmenten van gelijke naam gespe­cificeerd COMMON worden "overlapped" tot een fysisch segment. AIle gecombineerde segmenten beginnen op hetzelfde adres en de lengte van het fysisch segment is gelijk aan de Iengte van hetiangste segment dat gecombineerd wordt. 4) STACK: aIle segmenten van gelijke naam gespe­cificeerd STACK worden "overlapped" tot een fysisch segment. AIle segmenten eindigen op hetzelfde adres en groeien naar beneden. 5) MEMORY: aIle segmenten van gelijke naam gespe­cificeerd MEMORY worden gecombineerd tot een fysisch geheugen segment, beginnend bovenop de andere seg­menten. 6) AT expression: dit is een absoluut fysisch seg­ment dat op de door de expressie aangegeven plaats moet beginnen.

['ciassname']: geeft aan dat de segmenten door LOC86 bij elkaar in het geheugen geplaatst moeten worden in een bepaald deel van het fysisch geheugen, bv. in ROM.

Voorbeeld:

DATA SEGMENT PUBLIC

ABYTE AWORD ANOTHERBYTE ANOTHERWORD

DATA ENDS

DB 0 DW 0 DB 0 DW 0

In dit voorbeeid definieert men een segment DATA dat bestaat uit twee bytes en twee words, allen met waarde nul. Dit segment wordt gecombineerd met andere segmenten van dezeIfde

ASM86 Assembler pag.3. 4

naam gespecificeerd PUBLIC.

Binnen een module mag men een segment zo vaak openen en sluiten als men wil. De assembler behandelt aIle verschillende delen als een geheel. Bij het heropenen hoeft men de attributen niet meer te "setten"; het is echter niet toegestaan eerder gedefinieerde attributen te veranderen.

Het is ook mogelijk om segmenten te nesten, het geneste segment moet gesloten worden voordat men het omvattende segment kan sluiten.

Het default segment ??SEG: tijdens run-time moeten variabelen en instructies in een bepaald segment liggen. dit segment niet vermeld is, dan zal de assembler er zelf maken genaamd ??SEG waarin de data en code zullen liggen.

aIle Als een

Het ASSUME directive:

Syntax: ASSUME segreg:segpart[, ... J

of

ASSUME NOTHING

Het ASSUME directive geeft aan in welk register ( segreg ) de base staat van waaruit een segment ( segpart) geadres­seerd is. Het ASSUME directive wordt gebruikt om tijdens run-time te definieren wat de inhoud van de segment regis­ters zal Zl)n. Het ASSUME directive initialiseert de re­gisters echter niet.

Field Values:

segreg: een van de 8086/8088 segment registers: CS, OS, SS of ES.

segpart: dit veld definieert een paragraph number op een van de volgende manieren:

1) een segment name, zie voorbeeld. 2) een eerder gedefinieerde group name, zie volgend directive. 3) een expressie van de vorm: SEG variable-name, SEG label-name of SEG external-name, zie pag. 3.19. 4) het keyword NOTHING dat aangeeft dat in het aangegeven segment register niets gedefinieerd is. De vorm ASSUME NOTHING geeft aan dat in aIle vier de segment registers niets gedefinieerd is.

ASM86 Assembler pag.3. 5

vb. ASSUME DS:DATA, CS:CODE

In dit voorbeeld is het segment DATA adresseerbaar via register DS en het segment CODE via register CS.

Het is mogelijk forward references in een ASSUME directive toe te passen, mits gerefereerd wordt naar de naam van een segment. Als dit niet het geval is, dan geeft de assembler een foutmelding.

Het GROUP directive:

Syntax: name GROUPS segpart [1' .. J

Het GROUPS directive wordt gebruikt om een groep logische segmenten zodanig te combineren dat zij een fysisch segment vormen ( adresseerbaar vanaf dezelfde base) na LOC86. De lengte van de group is gelijk aan de som van de lengtes van de afzonderlijke groepen, maar moet binnen 64 Kbyte passen.

Field Values:

name: een unieke ASM86 identifier, de naam voor de groep.

segpart: dit veld definieert een paragraph number op een van de volgende manieren:

1) een segment-name. 2} een expressie van de vorm: SEG variable-name, SEG label-name of SEG external-name, zie pag. 3. 19.

vb. DATAGRP GROUP DATA1, DATA2

In dit voorbeeld worden de twee segmenten DATA1 en DATA2 gecombineerd tot de group DATAGRP.

ASM86 Assembler pag.3. 6

3.3 Definitie en initialisatie van data

Tot de meest gebruikte objecten in een programma behoren variabelen en labels. Variabelen refereren naar data items, gebieden in het geheugen waar waarden zijn opgeslagen. Labels zijn symbolische namen voor code secties waarheen gesprongen kan worden of welke gecalled kunnen worden.

Elke variabele heeft drie attributen: 1) segment: het segment waarbinnen de variabele gedefi­nieerd is. 2) offset: offset van de variabele t.O.V. de base. 3) type: de grootte van de data items uitgedrukt in bytes. De mogelijkheden zijn:

- BYTE: een 1 byte woard, 8086/8088 data type. - WORD: een 2 bytes waard, 8086/8088 data type. - DWORD: een 4 bytes woard, 8086/8087/8088 data type. - QWORD: een 8 bytes woord, 8087 data type. - TBYTE: een 10 bytes woord, 8087 data type.

structure: een multi-byte, "structured" 8086/8088 data type, zie pag 3.12. - record: een 8 of 16 bits "bit-gecadeerd" 8086/8088 data type, zie pag 3.10.

Een variabele kan op twee manieren gedefinieerd worden, nl. door een data definitie statement en door het LABEL direc­tive:

1)Definitie d.m.v. een data definitie statement: zie pag.3.9 2)Definitie d.m.v. het LABEL directive:

Het LABEL directive:

Syntax: name LABEL type

Met het LABEL directive kan men labels en variabelen definieren.

Field Values:

name: een unieke ASM86 identifier, de naam van het label of de variabele.

type: dit veld definieert het type dat aan de naam gegeven wordt. Voor een variabele kan dit zijn: EYTE, WORD, DWORD, QWORD, TBYTE, structure of record. Voor een label kan het type NEAR of FAR zijn.

ASM86 Ass~mbler pag.J. 7

Labels definieren adressen waar uitvoerbare instructies staan. Een label is een locatie waarnaar toe gesprongen kan worden, of welke gecalled kan worden. Een label heeft, net als een variabele, drie attributen, waarvan twee hetzelfde ais bij variabele:

1) segment: hetzelfde als bij variabele. 2) offset: hetzelfde als bij variabele. 3) type: dit specificeert het type sprong of CALL dat naar een locatie gemaakt moet worden. Er zijn twee types:

- NEAR: d.w.z. dat de locatie waarnaar verwe­zen wordt binnen het fys ch segment ligt ( van­af dezelfde base bereikbaar ). - FAR: d.w.z. dat de locatie waarnaar verwezen wordt buiten het fysisch segment ligt ( niet vanaf dezelfde base bereikbaar ).

Een label kan op drie manieren gedefinieerd worden: 1) door een naam gevolgd door "." en een instructie statement. Dit is de meest gebruikelijke methode:

vb.: NEARLAB: MOV AX,BX

2) door het LABEL directive, zie bij definitie van variabe­len 3) door het PROC directive:

Het PROC directive:

Syntax: name PROC [type]

name ENDP

Een PROC directive wordt gebruikt om een label te definieren. Tussen PROC en ENDP staat een reeks instructies die meestal als een subroutine behan­deld worden. Deze reeks instructies kan men dan in het hoofdprogramma oproepen door de labelnaam. Binnen het PROC/ENDP paar moet dan ook een return instructie staan zodat het programma weer naar het hoofdprogramma terug kan keren.

Field Values:

name: een unieke ASM86 identifier, de naam van het label.

type: dit veld specificeert het type van het

ASM86 Assembler

label. Het type kan zijn: 1} niet gespecificeerd: NEAR. 2) NEAR. 3)FAR.

pag.3. 8

als default waarde

Een ander soort data is de constante, dit is een echt ge­tal zonder attributen. Voor de verschillende soorten constan­ten zie de volgende tabel:

Constant Type Rules for Formation Examples

Binary A sequence of O's and 1's followed by the 11B (Base 2) letter 'B' 10001111B

Octal A sequence of digits 0 through 7 followed 77770 (BaseS) by either the letter '0' or the letter '0' 45670

n7n0

Decimal A sequence of digits 0 though 9, optlon- 3309 (Base 10) ally followed by the letter '0' 33090

Hexadecimal A sequence of digits 0 through 9 and lor 55H (Base 16) letters A through F followed by the letter 2EH

'H'. (Sequence must begin with 0-9) OBEACH OFEH

ASCII Any ASCII string enclosed In quotes 'A','BC' (More than 2 chars. valid for DB only.) 'UPDATE.EXT'

> Decimal Real A decimal fraction, optionally followed by 3.1415927 (Base 10) an exponent. The fraction is a sequence .OO2E7

of digits 0 through 9. A decimal point is 1E-32 required if no exponent Is present and is 1. optional otherwise. The exponent starts with an E, followed by an optional sign and digits from 0-9.

Hexadecimal A sequence of digits 0-9 andlor letters A 40490FDBR Real (Base 16) through F followed by the letter R. The OCOOOOOOOR

sequence must begin with 0-9. Total· number of digits must be (8, 16, 20) or (9, 17, 21). If odd numbered, the lirs! digit mustbeO.

ASM86 Assembler pag.3. 9

Definitie en initialisatie van variabelen.

DB, DW, DD, DQ, DT directives:

soort initialisatie: syntax:

1 byte initialisatie: [name] DB init [, .. ]

2 byte initialisatie: [name] DW init [, .. ]

4 byte initialisatie: [name] DD init [ , .. ]

8 byte initialisatie: [name] DQ init [, .. ]

10 byte initialisatie: [name] DT init [, .. ]

Deze directives worden gebruikt am variabelen te definieren en/of om geheugen te initialiseren. Als de directive met naam gebruikt wordt, dan definieert men de genaamde va­riabele en initialiseert men deze tevens met de gewenste waarde. Bet type van de variabele is afhankelijk van het gebruikte directive.

Field Values:

[name]; een unieke ASM86 identifier. Bet definieert een variabele waarvan de offset gelijk is aan de location coun­ter die dan geldt.

init: er zijn 5 verschillende manieren am een variabele te initialiseren:

1) door een constante expressie, waarvan de vorm afhankelijk is van het soort type.

vb. TEN DB 10

In dit voorbeeld definieert men een variabele TEN als een byte met waarde 10.

2) door het karakter "?" voor onbekende ini­tialisatie. Hiermee kan men een geheugenplaats re­serveren met onbekende inhoud, bv.

RESERVE DB ?

In dit voorbeeld reserveert men een geheugenplaats van 1 byte lengte met onbekende waarde.

3) initialisatie met een address-expression, aIleen OW of DD. Men kan een variabele initialiseren met

ASM86 Assembler pag.3. 10

de naam van een variabele t label, segment of group. Bij gebruik van een variabele- of labelnaam in een DW directive wordt geinitialiseerd met de offset van die variabele of label. Bij gebruik van een segment- of group-naam in een DW directive wordt geinitialiseerd met het paragraph number van dat segment of die group. Bij gebruik van het DO directive wordt bij vermel­den van de naam van een variabele of label de off­sethiervan in het lower order word en het para­graph number in het higher order word van DD ge­plaatst. 4) initialisatie van een DB met een string, waarbij de string tussen • • moet staan, bv.

ALFABET DB 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'

5) herhaalde initialisering: hiermee is het moge­lijk om een geheugen deel te initialiseren. Dit gebeurt met de DUP constructie.

vb. repeatval DUP (val [, ... ])

Hierin is repeatval een geheel getal dat aangeeft hoe vaak de initialisatie herhaald moet worden. Als waarde tussen ( ) kan gekozen worden uit een combinatie van de 4 voorgaande mogelijkheden, en ook een andere DUP. .

vb. TEN DB 7 DUP (10)

In dit voorbeeld definieert men 7 variabelen met naam TEN die allen de waarde 10 hebben.

Introductie van records

ASM86 heeft een speciaal data initialisatie statement waarmee men bit gecodeerde structuren I genaamd records, kan construeren. Een record mag 8 of 16 bits lang zijn. Elk re­cord heeft per definitie een aantal velden welke een bepaald aantal bits per veld bevatten. In deze velden kan men informa­tie opslaan en bewerken. Records zijn handig als men bepaalde bits in een structure wil bewerken, bv. flag bits. De opera­tors welke gebruikt worden om de velden te bewerken worden be­schreven in par. 3.4.(pag. 3.25).

Om records te gebruiken zijn twee stappen nodig. Tijdens de eerste stap definieert men de record en zijn velden. De tweede stap gebruiktde recordnaam in een data initialisatie

ASM86 Assembler pag.3. 1 1

statement om de opgeslagen data echt toe te wijzen.

Het RECORD directive:

Syntax: [name) RECORD field-name:exp[=initval] [, ... J

Met het RECORD directive kan men een record definieren en aangeven uit hoeveel velden het record be staat en uit hoeveel bits een veld bestaat.

Field Values:

name: cord.

een unieke ASM86 identifier, de naam voor het re-

field-name: een unieke ASM86 identifier, de naam voor een bit veld binnen een record.

exp: een constante of een expressie welke waarde van 1 tot 16. Deze waarde geeft aan bits het veld bestaat. De som van aIle exp's definitie mag niet groter zijn dan 16.

leidt tot een uit hoeveel

in een record

[=initvaIJ: dit is een constante of een expressie welke leidt tot een waarde welke gerepresenteerd kan worden door het aantal bits in het veld. Als geen initval gegeven wordt, dan is de default waarde nul.

vb. ERRORSFLAG RECORD A:6, B:6, C:4

In dit voorbeeld wordt een record genaamd ERRORS FLAG gedefinieerd. Dit record bestaat uit 3 velden A, B en C, resp. 6, 6 en 4 bits lang. De bits zijn niet geinitiali­seerd en hebben dus waarde nUl.

Partial records: dit is een record dat niet een heel "byte" of een heel "word" bezet. Het totaal aantal bits in het record is dan ongelijk aan 8 of 16. De assembler plaatst de gegeven bits in de least significant bits van het "byte" of "word". De ongebruikte most significant bits krijgen waarde nul.

ASM86 Assembler pag.3.

Rekord initialisering en toewiiziging

Syntax: [name] record-name <[exp] [, ... ]>

of

[name] record-name repeatval DUP «[exp] [, ... ]» ,

12

Met dit directive kan men de data bits van het record ini­tialiseren of de oude waarden overschrijven.

Field Values:

[name]: een unieke ASM86 identifier, de naam van het byte of word dat toegewezen wordt.

record-name: de naam van het eerder gedefiriieerde record.

[exp]: als optie kan men de default waarden overschrijven. De expressie moet leiden tot een getal dat past binnen het aantal bits waaruit het veld bestaat. Bij een record van n velden, moet elk veld tussen de < > vermeld worden, hetzij door de initwaarde t hetzij door een komma indien men de be­staande waarde niet wilt veranderen.

bv. <f1,f2, ... ,fn) en <././ .... /fn)

Bij het laatste voorbeeld wordt alleen de waarde van het laatste veld overschreven.

repeatval: een geheel getal dat aangeeft hoeveel records gevuld moeten worden.

vb. FLAGS ERRORFLAG <0,3,0)

In dit voorbeeld geeft record ERRORSFLAG resp.

Introductie van structures

men de velden A, B en evan het de waarden 0, 3 en O.

Men kan "structered" data blokken definieren die opgebouwd zijn uit de basis types van data initialisatie statements. Deze data blokken heten structures. Een structure is opgebouwd uit data initialisatie statements welke de velden binnen een blok definieren. Elk van deze velden kan afzonderlijk bewerkt worden. Structures worden gedefinieerd m.b.v. het STRue di­rective.

ASM86 Assembler paq.3. 13

Bet STRue directive:

Syntax: name STRue

[fieldname] data-init

name ENDS

Met het STRue directive kan men structures definieren en initialiseren. Een STRue/ENDS paar definieert een struc­ture met een bepaald aantal velden. Van elk van deze velden kan men het type aangeven (DB, DW, DD, DQ of DT) en de beginwaarde.

Field Values:

name: een unieke ASM86 identifier, de naam voor het struc­ture.

fieldname: een unieke ASM86 identifier, de naam voor een bepaald veld in het structure. Bet representeert de offset van het veld vanaf de base van de structure. Een fieldname heeft twee attributen l nl. de offset vanaf de base en het type zoals aangegeven in data-init.

data-init: dit mag elk toegestaan statement zijn zoals beschreven op pag.

vb. COMPLEX STRUe REALPART DQ 0 eOMPLEXPART DQ 0 COMPLEX ENDS

data 3.9.

initialisatie

In dit voorbeeld wordt een structure COMPLEX gedefinieerd met twee velden REALPART en eOMPLEXPART. Deze structure kan een complex getal bevatten waarvan de beide delen af­zonderlijk bewerkt kunnen worden.

Structure initialiserinq en toewijziqinq

Syntax: [name] structure-name <[exp] [I" .]>

of

[name] structure-name repeatval DUP «[exp] [, .. J»

Met dit directive kan men de velden een waarde geven of de

ASM86 Assembler pag.3. 14

oude waarde overschrijven.

Field Values:

[name]: een unieke ASM86 identifier. Deze naam definieert een variabele wiens segment part gelijk zal zijn aan het huidige segment en wiens offset gelijk is aan de geldende location counter.

structuie-name: structure.

de naam van een eerder gedefinieerde

repeatval: een geheel getal dat aangeeft hoeveel struc­tures gevuld moeten worden.

exp: dit veld bevat de waarde welke de definitie geinitialiseerde waarde overschrijft.

jdens Het

de kan

zijn een constante, een expressie, een string of een "?". De waarde kan aIleen gebruikt worden om een veld te overschrijven indien voor dat veld geldt:

1) Het veld mag geen lijst waarden bevatten en geen DUP constructie. 2) Een DB geinitialiseerd met een string kan aIleen door een string overschreven worden. Als de overschrijvende string korter is als de reeds bestaande string, dan blijven de overgebleven karakters staan. Ais de overschrijvende string langer is, dan wordt hij afge­kort. 3) De waarde moet passen binnen het veld dat men wil overschrijven.

Bij een structure met n velden , moet elk veld tussen de < > vermeld worden, hetzij door een komma indien men de be­staande waarde niet wil overschrijven, hetzij door de init­waarde.

bv. <f1,f2, ... ,fn) en <""" "fn>

In het laatste voorbeeld wordt aIleen het laatste veld overschreven met de waarde fn.

In de rest van deze paragraaf directives beschreven, nl. het rective en het PURGE directive.

worden nog enkele andere ORG directive, het EVEN di

ASM86 Assembler pag.3. 15

Ret ORG directive:

Syntax: ORG exp

Met het ORG directive kan men binnen het geldend segment zelf de location counter een gewenste waarde geven. Men moet er weI voor oppassen dat men dan niet eerder ge­definieerde data of code overschrijft. Het ORG directive wordt gebruikt om data of code op een bepaalde plaats in het segment te plaatsen.

Field Values:

exp: dit is een expressie die mag leiden tot een waarde van 65536 ( 64 Kbyte ). Men mag ook de geldende waarde van de location counter in de expressie gebruiken. De location counter wordt weergegeven door het $-teken.

vb. ORG OFFSET ( $ + 1000 )

In dit voorbeeld verhoogt men de geldende location counter met 1000.

Het EVEN directive:

Syntax: EVEN

Met het EVEN directive kan men er voor zorgen dat de data of de code volgend op het directive begint op een even adres ( adres eindigt op 0 binair ).

Het PURGE directive:

syntax: PURGE name [, ... J

Met het PURGE directive kan men de definitie van een be­paald symbool vernietigen, zodat men dat symbool opnieuw kan definieren. Bij aanroepen van dat symbool na PURGE en voor de herdefinitie wordt dit behandeld als een forward reference. De volgende symbolen kan men niet "purgen":

1) register namen. 2) het symbool ??SEG. 3) hands-off keywords zie appendix C van de ASM86 Language Reference Manual, nr.121703). 4) een symbool dat in een PUBLIC statement voorkomt.

ASM86 Assembler pag.3. 16

3.4 Bewerken van data

In deze paragraaf wordt besproken hoe men de data, die op­geslagen is in bv. een record of in een structure kan bewer­ken. Hiertoe wordt in deze paragraaf de syntax van een instructie statement beschreven, en worden de verschillende operaties besproken.

8086/87/88 Instruction Statements:

Syntax: [label:] [prefix] mnemonic [operand [,operand]]

De instructie statements zijn het programma in assembleer taal. Deze wat de processor doet.

belangrijkste van een statements definieren

Field Values:

[label:]: een unieke ASM86 identifier, gevolgd door een ":", wordt gebruikt om een label te definieren, zie ook pag.3.7.

[prefix]: een 8086/8088 prefix instructie, zie paragraaf 3.6.

mnemonic: een 8086/8088 of 8087 instructie, zie paragraaf 3.6.

operand: er zijn verschillende types van operands, zoals registers, constante waardes, variabelen en labels. Het type operand is afhankelijk van de opgegeven instructie. Alle mogelijke types van operands worden in het nu volgende besproken.

De verschillende operands:

Registers:

De 8086/8088 registers kunnen gebruikt worden als ope­rand in vele instructies. Bij twee operand-instructies kunnen registers zowel als bron of als bestemming fun­geren. Er is keuze uit de volgende registers:

Segment registers: General registers General registers Pointers en index

CS, DS, SST ES. (16 bits): AX,BX,CX,DX,SP,BP,SI,DI.

(8 bits): AL,AH,BL,BH,CL,CH,DL,DH. registers: BX,BP,SI,DI.

ASM86 Assembler pag.3. 17

Immediate operands:

Een immediate operand is een constante waarde (een num­mer). Een immediate operand kan ook een expressie z~Jn welke tot een constante waarde leidt. Immediate operands fungeren in 8086/8088 instructies als bron operands. Voorbeelden:

MOV AL, 5 ;AL = 5

ADD DX, (20 * 2) /10 ;add 4 to DX

Memory operands:

Een memory operand verwijst naar een specifieke locatie in het geheugen. Er zijn verschillende types van adres­sering mogelijk:

Direct address: de operand is nu een variabele- of een label-naam. Deze naam representeert de offset van de operand welke gebruikt wordt om het adres te bereke­nen,bv:

MOV AX, COUNT

In dit voorbeeld wordt de inhoud van de geheugenlocatie aangegeven door COUNT in AX geplaatst.

Register indirect address: in dit geval bevindt de offset van de geheugenlocatie zich in een van de pointer of index registers. Om een locatie te adresseren moet men eerst de offset in een register plaatsen en dan de register-naam gebruiken als operand, zie volgend voor­beeld:

MOV BX, OFFSET AVAR

MOV AX, [BX]

In dit voorbeeld wordt eerst de offset van geheugen­locatie AVAR in register BX geplaatst, zie ook pag.3.24. Bij de tweede MOV opdracht wordt deze offset gebruikt om de inhoud van geheugenlocatie AVAR in AX te plaatsen. Om aan te geven dat men van BX niet de inhoud moet gebruiken, maar de inhoud van de geheugenlocatie aangegeven door BX, moet men BX tussen [ J plaatsen.

Based address: dit lijkt veel op register indirect address, maar met als verschil dat nu een verplaatsing wordt toegevoegd aan de inhoud van het register.

ASM86 Assembler

Hiermee kan het register de base van een data aanwijzen, terwijl de verplaatsing gebruikt om een bepaald veld in dat data structure aan voorbeeld:

MOV BX, OFFSET AVAR

MOV AX, [BX + 5]

nag,3, 18

structure kan worden te wijzen,

Nu wordt niet de inhoud van de geheugenlocatie AVAR in AX ingelezen, maar de inhoud van de geheugenlocatie die 5 plaatsen boven AVAR ligt ( met andere woorden ,de vijfde byte van het data structure dat begint bij geheugenlocatie AVAR,

Indexed address; indexed addressering is gelijksoortig aan based addressing met als verschil dat de registers 51 of 01 worden gebruikt samen met een variabele-naam, De inhoud van de registers specificeren een bepaald aantal bytes verplaatsing vanaf de offset weergegeven door de variabele, De registers worden gebruikt als index voor de offset van de variabele,

Based indexed address: deze methode van adressering ge­bruikt de inhoud van een base register (BX,BP), de in­houd van een indexregister (SI,Dl) en naar vr1Je keuze een verplaatsing, Met deze methode kan het base register naar de base van een data structure W1Jzen terwijl het index register dient als index binnen het data structure.Vb,:

MOV MOV MOV

BX, OFFSET DATASTRUC 51 I 10 AX, [BX + 51]

load base address set index to 10 get element

In plaats van [BX + 51] kan men ook schrijven Indien men bij deze manier van adresseren steeds het index register met 1 verhoogt of dan kan men aIle elementen van het data verplaatsen of bewerken,

(BX][SI], in een Ius verlaagt, structure

Segment Register Defaults: de verwijzigingen naar variabelen zoals [BX], [BP] enz. noemt men anonymous references omdat er geen variabele-naam gegeven is. Segment registers voor anony­mous references worden vastgelegd door hardware defaults, ten­zij men expliciet zelf een segment opgeeft. De hardware de­faults zijn:

- [BX] heeft als default segment register DS.

ASM86 Assembler pag.3. 19

- [BPJ heeft als default segment register 55. - Als een index register wordt gebruikt zonder base regis-ter (zoals in [51 + 5J ), dan is het default segment regis­ter OS. - Als een index register wordt gebruikt met een base regis­ter (zoals in [BX][DI] )1 dan is het default segment regis­ter dat van het base register.

Er zijn twee uitzonderingen op deze defaults:

Operaties die impliciet verwijzen naar de stack (PUSH, POP, CALLI RET, INT en IRET) gebruiken altijd 55, en dit kan niet veranderd worden.

String instructies gebruiken altijd ES als segment register voor operands welke worden aangewezen door 01.

Oyerzicht van expressies;

Een expressie kan een waarde definieren welke data initiali­seert of wordt gebruikt als een operand in een instructie. Een expressie kan een numerieke waarde specificeren of een adres in het geheugen dat dan dient als een instructie operand. Er zijn verschillende soorten operaties welke gebruikt kunnen worden om expressies te maken, zoals rekenkundige en logische operaties. Deze worden verderop in dit verslag besproken. Eerst worden de mogelijke types van operands beschreven die in de expressies gebruikt mogen worden.

Types van expressie operands:

Numbers: een nummer of een constante kan worden gebruikt in de meeste expressies. Er zijn enkele beperkingen betreffende het gebruik van relocatable numbers (nummers waarvan de waarde tijdens het assembleren onbekend zijn). Deze beperkingen en de definitie van relocatable numbers zijn als volgt:

1) Segments en groups: deze waarde is relocatable voor aI­le segmenten en groups behalve voor een segment gedefi­nieerd met de "AT exp" vorm van het SEGMENT directive. Deze waardes worden toegekend door de locater of loader. 2) Variabele en labels: een variabele of label wordt niet beschouwd als relocatable als het gedefinieerd is in een "niet~relocatable segment". Dit is een segment dat een PARA of PAGE alignment type heeft terwijl het geen PUBLIC of STACK segment is, of een segment dat gedefinieerd is met de "AT exp" vorm. Gebruik van een variabele-naam in een

ASM86 Assembler pag.3. 20

expressie impliceert de waarde van zijn offset binnen het segment. Deze waarde is relocatable voor elke variabele of label dat gedefinieerd is in een "relocatable segment" of in een EXTRN directive. Deze waardes worden toegekend door de linker. 3) Numbers: een constante is relocatable als het gedefi­nieerd is in een EXTRN directive van type ABS. In dit ge­val geeft de term relocatable --aan dat de waarde van het nummer, gedefinieerd in een andere module, onbekend is tijdens het assembleren.

In het nu volgende deel worden de operaties beschreven die zijn toegestaan:

Arithmetic operators:

HIGH/LOW

Syntax: HIGH operand of LOW operand

HIGH en LOW accepteren zowel een numerieke expressie, een variabele of een label als operand. HIGH geeft het high­order byte en LOW geeft het low-order byte van de operand.

Multiplication en division

Syntax: multiplication: division: modulo:

operand * operand operand / operand operand MOD operand

Als operand mag men hier aIleen absolute numbers gebruiken, en het resultaat is ook altijd een absolute number. Elke operand mag een expressie zijn, zolang als deze expressie leidt tot een absolute number.

Shift operators

Syntax: shift right: shift left:

operand SHR count operand SHL count

De shift operators verschuiven een aantal bits van de ope­rand. Het aantal bits dat geschoven wordt, wordt aangege­ven door count. De bits binnen de operand die geschoven worden, krijgen waarde nul. De operand moet een numerieke expressie zijn welke leidt tot een absolute number.

ASM86 Assembler

Addition en substaction

Syntax: addition: substraction:

operand + operand operand - operand

pag.3. 21

De operands kunnen zowel relocatable als absolute operands zijn, maar de addition van twee relocatable operands is niet toegestaan. De operand is een expressie welke leidt tot een absolute number, of een variabele- of labelnaam.

Relational Operators:

Syntax: equal: not equal: less than: less than or equal: greater than: greater than or equal:

operand EQ operand operand NE operand operand LT operand operand LE operand operand GT operand operand GE operand

De operands mogen ofwel beide absolute numbers zijn, of variabele- of label-namen met hetzelfde type van .relo­catability. Het resultaat van een relational is altijd een absolute number.

Logical Operators:

Syntax: operand OR operand operand XOR operand operand AND operand NOT operand

De operands moeten absolute numbers zijn l het resultaat is ook altijd een absolute number.

Attribute overriding operators:

Segment override:

Syntax: CS:varlab DS:varlab SS:varlab ES:varlab segname:varlab groupname:varlab

ASM86 Assembler pag.3. 22

De segment override wordt gebruikt om de segment attribute van een variabele of label te veranderen. In de vermelde operators is varlab de naam van een variabele of label, of een adres-expressie.

vb.: MOV BL, ES:[BX]

In dit voorbeeld gebruikt het fysisch adres van een terwijl de default waarde override kan dus hetzelfde directive.

PTR operator:

Syntax: type PTR name

de 8086/8088 het ES geheugenlocatie te

het DS register is. effect hebben als

register om berekenen,

Een segment het ASSUME

De PTR operator wordt gebruikt om een memory reference te definieren van een bepaald type. Het type kan een van de volgende waarden aannemen: BYTE, WORD, DWORD, QWORD, TBYTE, NEAR of FAR. De naam kan zijn een variabele-naam, een label- naam, een adres- of register-expressie of een integer welke een offset representeert. De PTR operator kan gebruikt warden om het type van een operand aan te geven (vb.1) of om het type attribute van een variabele of label te veranderen (vb.2).

vb.1 INC DS:BYTE PTR 10

vb.2 MOV CL I BYTE PTR AWORD

increment byte at offset 10 from DS

get first byte AWORD

In het laatste voorbeeld heeft AWORD hiervan wordt aIleen het eerste byte in geplaatst.

als het

type word en CL register

SHORT Operator:

Syntax: SHORT label

De SHORT operator wordt gebruikt om te specificeren dat het genoemde label bij vermelden van een jump instructie binnen + 127 bytes van die instructie ligt. De operator wordt aI­leen gebruikt als het label een forward reference heeft. Het label moet weI adresseerbaar zijn via het CS register.

ASM86 Assembler pag,3. 23

Attribute Value Operators

Met de operators die in dit deel besproken worden kan men de numerieke waarden van de attributen van een variabele of label opvragen. De operators veranderen de attributen echter niet.

THIS Operator:

Syntax: THIS type

De THIS operator definieert een geheugen locatie op de dan geldende locatie van assembleren. Deze locatie kan een va­riabele of een label zijn. Het type wordt aangegeven door de operand in deze operator en kan een van de volgende waarden aannemen: BYTE, WORD, DWORD, QWORD, TBYTE, NEAR of FAR. Het gebruik van deze operator komt overeen met het gebruik van het LABEL directive. Deze operator wordt ofwel gebruikt samen met het EQU directive, zie voorbeeld, of weI als deel van een operand in een instructie.

vb. AWORD EQU THIS WORD

SEG Operator:

Syntax: SEG varlab

Deze operator geeft de segment waarde van een variabele of een label, een base relocatable grootheid. Deze operator kan twee gevolgen hebben, afhankelijk van het gebruik. Bij gebruik in een ASSUME directive geeft deze operator aan in welk segment een object is gedefinieerd. In het nu volgend voorbeeld geeft de operator aan dat CS het paragraph number bevat van het segment waarin COUNT zich bevindt.

ASSUME CS:SEC COUNT

De operator kan ook gebruikt worden om het paragraph number in een variabele op te slaan of om een segment register te initialiseren, zie voorbeelden.

SETSTART DW SEC COUNT

INIT: MOV AX, SEC COUNT MOV DS, AX

store paragraph number for the segment

init DS with count's segment

ASM86 Assembler pag.). 24

OFFSET Operator:

Syntax: OFFSET varlab

Deze operator geeft de offset van de variabele of label vanaf de base van het segment waarin het gedefinieerd is. Wordt hoofdzakelijk gebruikt om variabelen of registers te initialiseren bij indirect addressing. Zie pag.3.17

TYPE Operator:

Syntax: TYPE varlab

Deze operator geeft een waarde welke het type van de ope­rand weergeeft. Het geeft dus als resultaat een getal afhankelijk van het type van de operand en weI volgens volgende lijst:

1. Een byte geeft een 1. 2. Een word geeft een 2. 3. Een dword geeft een 4. 4. Een qword geeft een 8. 5. Een tbyte geeft een 10. 6. Een structure-naam geeft een getal dat gelijk is aan het aantal bytes w~lke in de structure gedeclareerd is. 7. Een near label geeft een 255. 8. Een far label geeft een 254.

LENGTH Operator:

Syntax: LENGTH variabele

De LENGTH operator geeft een getal dat aangeeft uit hoeveel data units (bytes, words of dwords) de variabele bestaat. De data unit is gelijk aan het type van de variabele.

voorbeeld:

AWORDARRAY DW 150 DUP (OJ

Hier wordt een array van 150 words gedefinieerd. Bij aanroepen van LENGTH AWORDARRAY neemt de processor hiervoor de waarde 150.

ASM86 Assembler paq.3. 25

SIZE Operator:

Syntax: SIZE variabele

Deze operator geeft aan uit hoeveel bytes een variabele bestaat, dus nu geldt voor het bovenstaande voorbeeld dat SIZE AWORDARRAY gelijk is aan 300 (150 words = 300 bytes).

Record Specific Operators

Bij gebruik van records kan men de volgende drie speciale ope­rators gebruiken. Met deze operators kan men elk veld binnen een record isoleren en bewerken. Omdat de velden in een record bits zijn kan het voorkomen dat deze bits gemaskeerd moeten worden en dan in de lower order bits van een byte geshift moeten worden/ zodat men ze afzonderlijk kan bewerken.

Shift Count:

Syntax: recfieldname

Gebruik van de naam van een recordveld specificeert het aantal bits dat geschoven moet worden om dat veld in de low order bits van een byte of word (afhankelijk van formaat veld) te krijgen.

MASK Operator:

Syntax: MASK record field

Gebruik van deze operator definieert een getal dat gebruikt kan worden om het betreffende record veld te maskeren, zodat aIleen het opgegeven record veld overblijft.

WIDTH Operator:

Syntax: WIDTH rec

De WIDTH operator geeft een waarde gelijk aan het aantal bits in een record of in een record veld.

ASM86 Assembler pag.3. 26

Het EQU directive

Syntax: equ-name EQU equ-value

Het EQU directive is een zeer krachtige manier om symbolen te definieren voor vele ASM86 constructies.

Field Values:

equ-name: een unieke ASM86 identifier

equ-value: dit veld kan een van de volgende waarden hebben:

1) Een variabele- of label-naam, bij voorbeeld:

ALABEL ALAB:

EQU MOV

ALAB AX, 0

2) Een 8086/8088 register-naam, bij voorbeeld:

COUNT EQU MOV

CX COUNT, 10 CX = 10

3) Een 8086/8087/8088 instructie, bij voorbeeld:

INCREMENT EQU INC

4) Een constante: PI EQU 3.14159

5) Een assembly-time expressie met getallen:

E EQU 2 + 3

6) Een register expressie:

AVAR EQU [BX + 3J

3.5 Directives voor het linken van programma's

In dit hoofdstuk worden de directives besproken die nodig Z1Jn bij het linken van de verschillende modules. Elk moduul kan variabelen of labels definieren welke door andere modules gebruikt mogen worden. De mechanismen in ASM86 welke zorgen voor de communicatie betreffende de symbolen tussen de verschillende modules Z1Jn de PUBLIC/EXTRN directives. Het PUBLIC directive definieert die symbolen welke door andere modules gebruikt mogen worden. Het EXTRN directive geeft voor een bepaalde module aan welke symbolen (elders gedefinieerd)

ASM86 Assembler paq.3. 27

gebruikt mogen worden. am iedere module een unieke naam te geven moet men het NAME directive gebruiken. Het END directive, dat in iedere module verplicht is, kan ook gebruikt worden om een main module aan te wijzen.

Het PUBLIC directive:

Syntax: PUBLIC name [, ... J

Ret PUBLIC directive geeft aan welk symbool in een module tijdens het linken voor een andere module beschikbaar is. Deze symbolen kunnen variabelen, labels of constanten zijn.

Het EXTRN directive:

Syntax: EXTRN name: type [, ... J

Het EXTRN directive geeft aan welke symbolen, gebruikt in het betreffende module, in een andere module als "public" gedeclareerd zijn. Het EXTRN directive specificeert de naam van het symbool en het type. Dit type kan zijn: BYTE, WORD, DWORD, QWORD, TBYTE, structure-name, record-name, NEAR, FAR of ABS (een constante). Bij een extern symbool van het type FAR, dan moet het EXTRN directive voor, dus buiten, het segment staan.

Ret END directive:

Syntax: END [regint [/ .. ]]

Het END directive is in aIle ASM86 modules verplicht. Meestal is het het laatste statement in een module, en het directive beeindigt het assembleren. Een ander gebruik van het END directive is om een module als main module te defi­nieren. Ret END directive kan ook gebruikt worden om de beginwagrden van DS en SS te definieren. Voorbeeld:

ASM86 Assembler paq.3. 28

ASSUME CS:CODE, DS:DATA 1 SS:STACK

DATA SEGMENT

DATA ENDS

STACK SEGMENT

STACK ENDS

CODE SEGMENT

CODE ENDS

END START, DS:DATA, SS:STACK

In dit voorbeeld zal executie van het programma beginnnen op het adres gespecificeerd als het start-adres in het END directive.

Field Values:

[regint]: dit veld definieert de inhoud voor een segment register (en ook de registers IP en SP). Om de segment re­gisters te initialiseren kan men uit een van de volgende mogelijkheden een keuze maken:

'segname' is of een segment- of een group-naam. Bet geeft een paragraph number welke in het segment regis­ter geladen moet worden.

'labelname' is de naam van een label gedefinieerd in het module. De offset ervan wordt gebruikt om IF te initialiseren.

'varname' is de naam van een variabele gedefinieerd in het module. De offset ervan wordt gebruikt om SF te initialiseren.

Om CS en IF te initialiseren hebben we de mogelijkheden:

volgende

labelname (het segment deel van het label gebruikt voor CS)

of

CS:labelname (hetzelfde als "labelname U)

of

ASM86 Assembler pag.3. 29

CS:segname:labelname (het segment deel of paragraph num­ber welk in CS geladen moet worden, wordt genomen van segname).

Om SS en SP te initialiseren hebben we de volgende mogelijkheden:

SS:segname:varname (initialisatie van SP met offset varname)

of

SS:segname (SP wordt geinitialiseerd zodat hij gelijk is aan de lengte van het segment).

DS kunnen we op de volgende manier initialiseren:

DS:segname

Het NAME directive:

Syntax: NAME modname

Het NAME directive moet gebruikt worden om een naam te de­finieren voor het object module. Eike module welke met an­dere modules gelinked moet worden, moet een unieke naam hebben.

3.6 De 8086/8087/8088 instructie set

In deze paragraaf wordt de instructie set van de 8086 pro­cessor besproken. Hier worden aIleen de algemeen geldende zaken besproken, de instructie set zelf staat in hoofdstuk 6 van Intel's manual 121703-002 of in de ASM86 macro assembler pocket reference.

Instruction Statement Formaten:

Het formaat voor de instruction statement is besproken in hoofdstuk 3.4 en is als voIgt:

[label:] [prefix] mnemonic [operand [,operand]]

Prefix: met behulp van de prefix instructions is het mogelijk om de default segment registers te vervangen door andere die

ASM86 Assembler pag,3. 30

men zelf kan kiezen.

Memory Operand:

Operands in een bepaalde geheugen locatie kunnen op de volgende manieren opgeroepen worden:

1). Direct door een 16-bits offset adres.

2). Indirect d.m.v. een base register, BX of BP, al dan niet met een 8- of 16-bits verplaatsing.

3). Indirect d.m,v. een index register, SI of DI, al dan niet met een 8- of 16-bits verplaatsing.

4). Indirect d.m.v. index register, al plaatsing.

Immediate Operands:

de som van een base register en een dan niet met een 8- of 16-bits ver-

AIle twee-operand operaties, behalve vermenigvuldigen, delen en de string operaties hebben de mogelijkheid dat een source ope­rand in de instructie als immediate data voorkomt. Deze data kan zijn een 16-bit getal met een extra high-order bit als teken. Bij gebruik van immediate operands moet men het volgende weten:

- immediate operands komen altijd na addressing mode displacement constants in de instructie. - het low-order byte van een 16-bit operand staat altijd voor het high-order byte.

Organisatie van de instructie set:

De instructies zijn verdeeld in zes functionele groepen:

1) Data transfer 2) Arithmetic 3) Logic 4) String manipulation 5) Control transfer 6) Processor control

Van enkele groepen worden nu de instructies in het kort be­handeld:

ASM86 Assembler pag.3. 31

Data transfer;

General purpose transfers:

MOV geeft een transfer aan van een byte of word van de source operand (de rechtse) naar de destination operand (linkse) . PUSH verminderdt het SP register met 2 en geeft dan een transfer van een n word" van de source operand naar het stack element dat nu door SP wordt geadresseerd. POP geeft een transfer van een "word n van het stack element geadresseerd door SP naar de destination operand en vermeerderdt dan het SP register met 2. XCHG verwisselt de byte of word source operand met de destination operand.

Accumulator-specific transfers:

IN geeft een transfer van een byte of word van een input poort naar het AL register of AX register (bij een "word") . OUT geeft een transfer van de accumulator naar een output poort.

Address-object transfers:

LEA (load effective address) geeft een transfer van het offset adres van de source operand naar de destination operand. LDS (load pointer into DS) geeft een transfer van een pointer-object (32-bit getal wat offset en segment adres­sen bevat) van de source operand naar een paar van de destination registers: segment adres gaat naar het DS register en offset adres gaat naar een register welke men zelf kan aanwijzen. LES (load pointer into ES) heeft zelfde functie als LDS met als verschil dat segment adres nu in het ES register geplaatst wordt.

Flag register transfers:

LAHF (load AH with flags) geeft een transfer van de flags naar specifieke bits van het AH register. SAHF (store AH into flags) geeft een transfer van speci­fieke bits van het AH register naar de flags. PUSHF (push flags) vermindert SP register met twee en plaatst dan aIle flags in specifieke bits van het stack element aangegeven door SP. POPF (pop flags) geeft een transfer van de specifieke bits van het stack element naar de flag registers en ver-

ASM86 Assembler pag.3. 32

meerdert SP met 2.

Arithmetic:

Flag register settings:

CF wordt geset a1s de operatie resu1teert in een carry out of in een borrow in het high-order bit van het resul­taat, anders wordt CF gec1eared. AF wordt geset als de operatie resu1teert in een carry out of een borrow in het low-order bit van het resu1taat, anders wordt AF gecleared. ZF wordt geset a1s het resu1taat van de operatie nul is, anders wordt ZF gecleared. SF wordt geset als het high-order bit van het resu1taat van de operatie is geset, anders wordt SF gec1eared. PF wordt geset a1s de modulo 2 som van de 8 low-order bits van het resultaat van de operatie nul is (even parity), anders wordt PF gecleared (odd parity). OF wordt geset als de operatie resulteert in een carry in het high-order bit van het resultaat maar niet in een carry uit het high-order bit of vice versa, anders wordt OF gec1eared.

Optelling:

ADD geeft een opte11ing van de source en destination ope­rands en plaatst het resultaat in de destination operand. ADC (add with carry) geeft een optelling van de source en destination operand, telt er 1 bij op als de CF flag ge­set is, en p1aatst het resultaat in de destination ope­rand. INC (increment) telt 1 op bij de source operand en plaatst het resu1taat In de source operand.

Aftrekken:

SUB geeft een aftrekken van source van destination ope­rand en plaatst het resultaant in de destination operand. SBB (sub with borrow) geeft een aftrekken van source van destination operand met aftrekken van 1 als CF flag geset is en plaatst het resultaat in de destination operand. DEC (decrement) trekt 1 af van de source operand en plaatst het resultaat in de source operand. NEG (negate) geeft een tekenwisseling van de operand. CMP (compare) geeft een aftrekken van source van destination operand zonder deze operanden te veranderen en passen de flags aan.

ASM86 Assembler paq.3. 33

Vermenigvuldigen:

MUL geeft een unsigned vermenigvuldiging van de accumu­lator en de source operand en plaats het resultaat van dubbele lengte in de accumulator. CF en OF worden geset als de bovenste helft van het resultaat niet-nul is. IMUL (integer multiply) is identiek aan MUL, maar nu signed.

Delen:

Logic:

DIV geeft een unsigned deling van de accumulator door de source operand en plaatst het resultaat in de accumu­lator. IDIV (integer division) is hetzelfde als DIV, maar nu signed.

NOT geeft de one's complement van de source operand en plaatst het resultaat in de source operand. Er zijn 4 verschillend shift operaties en vier ver­schillende rotatie operaties. AND geeft per bit de logische EN van source en destination operand en plaatst het resultaat in de destination operand. TEST doet hetzelfde als AND maar geeft nu het resultaat niet aan de destination operand maar verandert de flags. OR geeft per bit de logische OF van source en destination operand en plaatst het resultaat in de destination operand. XOR geeft per bit de exclusif-or van source en destination operand en plaatst het resultaat in de destination operand.

Control transfers:

CALL plaatst het offset adres van de volgende instructie in de stack en geeft dan de controle over aan de target operand. JMP geeft de controle over aan de target operand. RET geeft de controle terug aan het return adres welke door een voorafgaande CALL is gesaved. Er zijn ook verschillende conditional jumps die pas jumpen als bepaalde flags al dan niet geset zijn.

Processor control:

CLC de CF flag wordt gecleared CMC geeft het complement van de CF flag STC de CF flag wordt geset CLD de DF flag wordt gecleared

ASM86 Assembler pag.3. 34

STD de DF flag wordt geset eLI de IF flag wordt gecleared[ interrupts tegenhouden STI de IF flag wordt geset

J interrupts toegestaan

HLT zorgt ervoor dat de processor in zijn halt state komt. De halt state wordt beeindigd door een external interrupt of door RESET. WAIT zorgt ervoor dat de processor in zijn wait state komt.

3.7 De Macro Processing Language (MPL)

De macro processing language (MPL) van de 8086/8087/8088 macro assembler is een string replacement facility. Het stelt de gebruiker in staat om hele secties code een keer te schrijven en dan op verschillende plaatsen in het p,rogramma te herhalen. Dit geeft de mogelijkheid om een library van ver­schillende macro's op te bouwen welke door meerdere program­meurs geschreven zijn. In deze paragraaf wordt in het kort beschreven hoe men macro's kan definieren en aanroepen. A1s tijdens het assembleren de assembler een macro ontmoet[ dan wordt op die plaats de code geschreven welke eerder onder die bepaalde macro gedefinieerd is. De macro processor onderzoekt de source file naar een macro. Deze macro wordt vooraf gegaan door het%-teken. Zolang als de macro processor dit teken niet tegenkomt wordt de tekst van de source file gewoon aan de rest van de assembler doorgegeven.

De macro's worden gedefinieerd door de ingebouwde functie DEFINE:

%*DEFINE (call-pattern) (macro-body)

Hierin geeft het% -teken aan dat het om een macro handeId[ terwijl het *-teken aangeeft dat het een definitie is. De call-pattern is de macro-naam. Deze rnacro-naam moet beginnen met een letter, gevolgd door andere letters of getallen en mag slechts 31 karakters lang zijn. De macro-body is normaal gesproken de returnwaarde van de macro call, maar de macro-body zelf kan weer andere macro's aanroepen.

ASM86 Assembler

voorbeeld:

%*DEFINE (ASTRING) (PHANT)

%*DEFINE (JUMBO) (EL~STRING)

pag.3. 35

Als men nu de macro JUMBO aanroept, gewoon door invoeren van

%JUMBO krijgt men als resultaat ELEPHANT.

Het bovenstaande is de meest eenvoudige uitvoering van een macro, voor de meer uitgebreide macro's wordt verwezen naar hoofdstuk 7 van de manual: ASM86 Language Reference Manual.

ASM86 Macro Assembler pag.4. 1

Boofdstuk 4: ASM86 Macro Assembler operation instructions.

4.1 Inleiding

In dit hoofdstuk wordt beschreven hoe men een programma, geschreven in assembler taal, kan omzetten in een programma ge­schreven in machine taal. Bier wordt beschreven hoe men de ASM86 Macro Assembler moet gebruiken, in het bijzonder het op­starten en het gebruik van de controls. Afhankelijk van deze controls produceert de Macro Assembler een object file en/of een print file.

De ASM86 Macro Assembler bevindt zieh, zoals aIle andere files, op een diskette. De assembler produceert l afhankelijk van de controls, een object file, een listing file en een error print file. De object file bevat de machine code en heeft als naam de naam van de source file, maar met extension .OBJ.

4.2: De Invocation Line

Men kan de Macro Assembler op twee manieren aanroepen, afhankeli jk van de toestand waarin het syste'em zich bevindt. Als men vanuit ISIS de Assembler wil aanroepen, dan moet men de volgende invocation line gebruiken:

(:Fn:]RUN (:Fn:]ASM86 [:Fn:]source file (controls]

Als het systeem al in RUN toestand is , dan is de invocation line:

(:Fn:]ASM86 [:Fn:]source file [controls]

Bierin is

:Fn:

source file

controls

,~

het nummer van disk drive device waarin de file zich bevindt. Bet nummer 0 hoeft men niet te vermelden, dus men kan :FO: gewoon weglaten.

de naam van de file welke de ASM86' source module bevat.

is een willekeurige volgorde van controls.

ASM86 Macro Assembler pag.4. 2

Als men zoveel controls heeft dat men het niet meer op een regel kan schrijven, dan mag men op een volgende regel verder gaan. De invocation line mag eindigen met een commentaar door dit kommentaar vooraf te laten gaan door een semicolon (;).

Meteen nadat men de invocation line heeft ingevoerd meldt de assembler zich door middel van zijn sign-on message op het beeldscherm:

SERIES III 8086/87/88/186 MACRO ASSEMBLER, V2.0

Als de assembler het programma vertaald heeft, dan worden de sign-off message en de error vermelding op het beeldscherm geschreven:

ASSEMBLY COMPLETE, X ERRORS FOUND

Als er geen fouten zijn, dan staat in bovenstaande melding voor X NO, anders staat voor X het aantal gevonden fouten.

Als de assembler fatale fouten ontdekt, dan wordt het as­sembleren afgebroken en op het beeldscherm wordt een foutmel­ding gegeven. Voor een listing van fatale fouten en hun beeld­scherm meldingen zie appendix A van de manual 121628-003.

4.3 De controls

De controls kunnen gegeven worden in de invocation line, of ze worden in de source file opgegeven in de control lines ( dit zijn regels met het $ teken in de eerste kolom ).

Er zijn twee verschillende soorten controls, nl. en GENERAL controls:

PRIMARY

PRIMARY controls: dit zijn de controls welke worden geset bij het begin van het assembleren en die tijdens het assembleren niet veranderd kunnen worden. De primary controls worden opgegeven in de invocation line of in de primary control lines van de source file. Primary control lines zijn control lines welke in de source file voor de eerste niet-control line staan. De controls opgegeven in de invocation line hebben voorrang op de controls uit de source file.

GENERAL controls: deze controls worden opgegeven in de invocation line of in control lines overal in de source file. De general controls kunnen weI tijdens het assembleren veranderd worden.

ASM86 Macro Assembler

Voor een volledige lijst van de controls manual verwezen. Bier worden aIleen enkele controls vermeld.

ERRORPRINT(filename)

pag.4. 3

wordt naar de veel gebruikte

Met deze control geeft men aan dat een listing van aIle source lines met errors in een file met gegeven naam geschreven moet worden. Indien geen filename opgegeven is, dan wordt deze listing op het beeldscherm geschreven. Dit is een primary control.

PRINT(filename) Hiermee kan men zelf een naam geven voor de file waarin een source listing geschreven moet worden. Indien men zelf geen naam opgeeft, dan schrijft de assembler de source listing in een file met de naam van de source file, maar met extension .LST. Dit is een primary control. Men kan hiermee de listfile ergens anders he en schrijven dan naar de disk waarop de sourcefile staat (ruimtebesparing).

4.4 Listing file en errorprint file

De listing file, ook weI list file of print file genoemd, geeft informatie over het assembleren van het programma. De listing file is opgebouwd uit verschillende delen, zoals een header en een body. De header geeft informatie over de invocation line, over de file waarin de object module geplaatst is enz.

De body bestaat uit verschillende kolommen; kolommen staan de volgende namen:

LOC OBJ LINE SOURCE

boven deze

LOC: dit is de location counter. Deze hexadecimale nummers die de offset weergeven van het segment dat geassembleerd wordt.

kolom bestaat uit vanaf het begin

OBJ: deze kolom bevat de hexadecimale nummers die de object bytes weergeven welke door de assembler gemaakt worden, dus de machine code.

LINE: deze kolom bevat de decimale regel nummers die elke input line aangeven, beginnend met 1 en met 1 verhoogd bij elke nieuwe source line.

SOURCE: deze kolom bevat de source file zoals die is ingevoerd. Dit is dus het programma dat geassembleerd moet

ASM86 Macro Assembler pag.4. 4

worden.

Als er fouten in het programma gevonden zijn, dan meldt de assembler dit in de listing file volgend op de regel waar de fout gevonden is.

Volgend op de listing van de source en object code pro­duceert de assembler oak een symbol table. Dit is een tabel waarin van aIle gebruikte symbolen de naam, het type, de waarde en de attributen vermeld worden. Deze listing is op alfabeti­sche volgorde.

De errorprint file: als men de control ERRORPRINT opge­geven heeft, dan worden aIle source lines met fouten geschreven in een file welke men opgegeven heeft. Als men geen file naam gegeven heeft, dan wordt deze errorprint file op het beeld­scherm geschreven.

utilities pag.5. 1

Hoofdstuk 5: ASM86 huipprogrammma's

5.1 Inleiding

In dit hoofdstuk bespreek ik vijf hulpprogramma's die no­dig zijn voor het modulair ontwikkelen van software. Deze pro­gramma's zijn:

1) LINK86: combineert verschillende object modules tot een load module. 2) CREF86: onderzoekt de cross-reference tussen symbolen uit verschillende modulen. 3) LIB86: helpt om zelf library's te maken. 4) LOC86: kent aan load modules een absoluut adres toe. 5) OH86: zet 8086/80a8 absolute code om in Intel hex for­maat.

Van al deze programma's worden besproken: de invocation line, de controls en de listings. Niet aile controls worden besproken, voor een volledige lijst van de controls zie Intel's manual 121616-003, de iAPX 86,88 Family Utilities User's Guide.

Om van een source file te komen tot een absolute hex file, moet men het proces van het volgend schema doorlopen:

SOUIlCE FILES

r-------" , I

!-I r-: TlWaiLATQfI

I L ____ ••• tI

oeJECT MOOULES

",OBJ"

WIlHBIND

p--- ---, , I r-: • LINK.. I

• L.__ _ __ .I

I

r···---· I : LIB ..

LINKED OBJECT MODUl.E ",I.NII"

r------.... ... ________ -.' OPERATING:

I SYSTEM t I LOADER I

r--- .. -.• I ,

: LOCM I I • L _______ '"

f-------" I D!lUGGEIl: • Oil : MONITOR : ': __ .. _-_ • .1

ABSOLUTE OeJECT MODULE

L _______ ..

r-·-----, I I • IN·CIRCUIT • : EMUl.ATOIl: L _______ J

p-------, • I

: OHM : • I L___ _ __ "

ABSOLUTE Hl!XflLE ",HU"

,.--- _ .. -, I I I HEX I . ..~-----------------------~ :. ___ .. ___ J I LOADER I I • L _____ ..... ,j

Utilities pag.5. 2

Van de verschillende, zelf geschreven, source files worden door de verschillende vertalers 1 zoals ASM86 , Pascal 86 enz., object modules gemaakt, zie schema op voorgaande pagina. Ook LINK86 en LOC86 kunnen object modules produceren. LINK86 combineert deze verschillende object modules tot een enkele object module en probeert voor aIle external symbols de public symbol definities te vinden in de library files. De output van LINK86 is een relocatable object module, behalve als men door een control aangeeft een load-time-Iocatable object module te produceren. Deze relocatable object module dient als input voor LOC86, waardoor de relocatable module wordt omgezet in een absolute object module. Dit absolute object module wordt tenslotte door OH86 o~gezet in hex formaat.

External en public symbols: een symbool dat verwijst naar een locatie in een andere module noemt men een external symbol. Ze moeten tijdens het programmeren dan ook als external gede­clareerd worden, zodat het vertaalprogrammma weet dat de be­treffende locatie in een andere module ligt .. Een moduul dat external symbols bevat, noemt men een un­satisfied module. Om een satisfied module te krijgen moet men een module vinden met een public symbol dat overeenkomt met het external symbol. LINK86 en CREF86 behandelen library files op een speciale ma­nier. Als men een library file opgeeft als input v~~r LINK86 of CREF86 dan onderzoeken deze programma's de library file naar modules die public symbols bevatten voor external symbols uit al gelezen andere files welke nog niet "satisfied" zijn. Daarom moet men de library file als laatste input voor LINK86 of CREF86 opgeven. LINK86 en CREF86 gebruiken uit de library file aIleen die modules die external symbols bevredigen.

Bij het opstartten van een hulpprogramma, zoals LINK86, is het niet verplicht om in de invocation line een control te geven. De controls maken het echter mogelijk om de default waarden te veranderen. Hierdoor kan men andere output of adresseringen krijgen.

Voor de file formats wordt naar appendix A van verwezen. Hierin wordt beschreven hoe een Intel opgebouwd.

de manual file is

attentie: de programma's die in dit hoofdstuk worden besproken werken aIleen in de 8086 mode van het ontwikkelsysteem, men moet zich dus in RUN bevinden, zie hoofdstuk 8.

utj,lities pag.S. 3

5.2 LINK86

LINK86 combineert 8086 object modules en lost de re­ferenties op tussen onafhankelijk vertaalde modules. LINK86 heeft als input een lijst van files en controls en heeft als output twee files: een print file en een object file.

Het onderstaand schemaillustreerthetlinkageproces.De input files kunnen elk willekeurig object module zijn ( output van een vertaler, LINK86, LOC86 of een library file). De print file bevat diagnoses en de output object file is een gebonden load-time-Iocatable module of een relocatable module ( afhankelijk van de controls).

08JECT MODULE

INVOCATION LINE CONTAOlS

NSOLE CO ME SSAGES

80UND 08JECT MODULE

L--- PAINT FILE WITHSYMDOL TA8LE".MP1" r ~

81NO t---------.-NODiND----

CONSOLE MESSAGES

L- L LINKED OBJECT MOOULE ".lNK"

PAINT FILE

u.MP1f't

LINK86 Invocation line;

Syntax; [directory-name] LINK86 input list [TO output file] [controls]

De input list is een of meer mOQules welke met elkaar ver­bonden moeten worden:

pathname[(module name[, ... ])J[, .... ]

Indien geen module name opgegeven is, worden aIle modules van het opgegeven pathname meegenomen door LINK86. Als de pathname een library file is, dan worden aIle modules welke genaamd worden tussen haakjes meegenomen in de output file, ook als zij geen public symbols bevatten voor external symbols die ergens anders in de input list gedeclareerd worden. De volgorde van de segmenten in de output file is

Utilities pag.5. 4

afhankelijk van de volgorde in de input list.

TO output file geeft aan in welke file de linked object module komt te staan. Als de output file niet gegeven is, dan plaatst LINK86 de output file in een file met naam gelijk aan het eerste segment uit de input list, maar met extension .LNK. Als men de BIND control opgeeft, dan krijgt de default naam voor de output file geen extension, en de object module kan uitgevoerd worden zonder location (door BIND krijgt men een load-time-Iocatable object module ).

De controls kunnen een willekeurige verzameling zijn van de toegestane controls, voor een volledige lijst zie manual. Hier worden enkel de namen en functies vermeld van de meest gebruikte controls.

ASSIGN({variable-name(address)l[, .. J). Hiermee kan men voor bepaalde variabelen een absoluut adres definieren. '

BIND Met dit control kan men de input modules binden tot een load-tiMe-locatable module. Default waarde is NOBIND.

INITCODE Dit control zorgt ervoor dat LINK86 een nieuw segment maakt dat code bevat om de registers te initialiseren.

NAME Geeft de output file de gewenste naam, anders krijgt de output file de naam van het eerste module van de input list.

Print file: Deze file wordt altijd geproduceerd, tenzij men de control NOPRINT geeft. De print file kan bestaan uit vijf delen en heeft als naam die van de output object file met extension .MP1. De print file bevat informatie over de input files, de output file, gegevens over de segmenten,

Behalve de print file produceert LINK86 ook een lijst foutmeldingen als daar aanleiding voor is. Voor een verklaring van deze foutmeldingen zie appendix C van de nanual.

Utilities paq.5. 5

5.3 CREF86

CREF86 onderzoekt 8086 object modules om een cross-reference te vinden tussen external en public symbols. CREF86 neemt als input een lijst van files en controls en produceert als output een print file.

Het onderstaande schema illustreert het proces bij CREF86. De input modules mogen een of meer van de volgende 8086 object modules bevatten:

unlinked modules van vertalers. library files linked modules

De output file bevat informatie over files en modules, plus een alfabetische lijst van external en public symbols.

tRANSLATED OBJECT

MODULE(S)

LIBRARY MODUlE(S)

LINKED OBJECT

MODULE(S)

CREF86 Invocation line;

II I NVOCATtON NECONTROLS

r .... J .... -.. .J . I

CREF8a ;~--1Iot P~.'~~~!~E I

'"---r--" CONSOLE

MESSAGES

Syntax: [directory-name] CREF86 input list [controls]

De input list is een of meer modules welke onderzocht moeten worden naar cross references:

pathname[(module name[, .. ])][/ ... J

Indien er geen module name opgegeven is, dan worden aIle modules van het opgegeven pathname meegenomen door CREF86. Als de pathname een library file is, dan worden aIle modules welke genaamd zijn tussen de haakjes meegenomen in de output file, ook als zij geen public symbols bevatten voor external symbols die ergens anders in de input list gedeclareerd zijn.

De controls kunnen een willekeurige set van controls zijn, voor de volledige lijst

de toegestane zie manual. De

Utilities pag.5.

controls hebben aIleen invloed op de uitvoering van de output filet zoals naam, aantal regels per pagina en aantal karakters per regel.

Print file: de print file bevat voor ieder symbol de naam van het module waarin het symbol gedefinieerd wordt en de namen van de modulen die het symbol als external declareren. De output file heeft als extension .CRF. Verder bevat de print file eventuele foutmeldingen, voor een lijst van mogelijke foutmeldingen zie appendix E van de manual.

5.4 LIB86

Met LIB86 is het mogelijk om zelf libra files te maken, aan te passen en te onderzoeken.

LIB86 Invocation line:

Syntax: [directory-name] LIB86 [comment]

Als LIB86 is opgestart, dan displayed het een asterisk (*) en wacht het programma op commmando's. De mogelijke commando's zijn:

ADD {pathname1[Cmodule name[, .. ])]}(, .. J TO pathname2 voegt nieuwe -modules toe aan library.

CREATE pathname maakt een nieuwe library file met genoemde pathname.

DELETE pathname(module name[, .. J) verwijdert vermelde module uit library file.

EXIT beeindigt het LIB programma en geeft controle aan het operating system.

LIST {pathname1[(module name[, .. ])]l[, .. J TO pathname2 print de namen van modules naar de gespecificeerde pathname.

Utilities pag.5. 7

5.5 LOCB6

LOCB6 verandert een relocatable B086 object module in een absolute object module. Zoals uit onderstaand schema blijkt heeft LOCB6 een enkele 8086 object module als input en geeft als output een located object file en als optie ook een print file welke diagnoses bevat.

OBJECT MODULE

INVOCATION LINE CONTROLS

Lrl--- ,

I ABSOLUTE t---~I LOCSS i------t OBJECT

L -r -JLr------1MODULE

CONSOLE MESSAGES

PRINT FilE

··.MP2"

LOCB6 Invocation line:

Syntax: [directory-name] LOC86 input file [TO object file] [controls]

De input file is een file welke de welke men wil locaten. Het is noodzakelijk de output van LINK86.

object module meestal, maar

bevat niet

TO object file geeft de module naar toe moet. dan gaat de output naar de input file, maar dan

file aan waar de located object Ala geen bestemming vermeld wordt,

een file dat dezefde naam heeft als zonder extension.

De controls mag elke willekeurige set van de toegestane controls zijn, voor volledige lijst zie manual. Hier worden aIleen enkele veel gebruikte controls vermeld.

ADDRESSES({SEGMENTS({segment name(adres)}[, .. ])1 CLASSES({class name(adres)}[, .. ])1 GROUPS({group name(adres)}[, .. ])}[, .. ])

Met deze control kan men zelf begin adressen opgeven voor segmenten, classes of groepen. Met een ADDRESSES control kan men meerdere segmenten enz. van een begin adres voorzien.

INITCODE (adres) LOC86 maakt een segment dat de code bevat om de registers

Utilities pag.5. 8

te initialiseren. Indien men zelf geen adres voor dit segment opgeeft met INITCODE, dan laat LOC86 dit segments starten op geheugenplaats 200H.

NAME (module name) geeft mogelijkheid om output module een naam te geven.

RESERVE ({adres1 TO adres2} [, .. J) LOC gebruikt gebied tussen adres1 en adres2 niet.

START({public symbol \ paragraph, offset}) hiermee kan men startadres van programma opgeven. paragraph waarde in CS register en offset in IP.

BOOTSTRAP Hiermee wordt aangegeven dat de code voor een long jump naar het startadres van de module geplaatst moet worden in locatie OFFFFOH als men de module laadt. Op deze locatie bevindt zich de eerste instructie van de 8086 na een reset.

Print file: deze wordt altijd geproduceerd tenzij men het control NOPRINT geeft. De print file heeft dezelfde naam als de object file, maar met extension .MP2. De print file geeft een overzicht van de symbolen en hun startadressen ( base en offset ). Het fysisch adres voigt dan uit:

(base *10H) + offset = fysisch adres

De print file bevat ook de eventuele foutmeldingen, voor lijst van mogelijke foutmeldingen zie appendic F van de manual. Verder bevat de print file een overzicht van de segmenten en hun plaatsen in het geheugen.

LOC86 geeft de segmenten op de volgende manier hun adressen, mits er geen fouten gevonden zijn:

1) aile absolut~ segmenten worden uit de input module verwijderd, en hun geheugen ruimte wordt gereserveerd. 2) de overgebleven segmenten worden op een rij geordend. 3) de relocatable segmenten krijgen dan hun absolute adressen overeenkomstig hun afmetingen en alignments.

CONV86 pag.6. 1

Hoofdstuk 6: CONV86.

6.1 Inleiding

Dit hoofdstuk beschrijft hoe men 8080/8085 source files om kan zetten in 8086 assembly language source files, welke dan kunnen_~orden geassembleerd, gelinked en gelocated zodat men de oorspronkelijke 8080/8085 functie ook door de 8086 kan laten uitvoeren. V~~r meer informatie zie Intel's manual 9800642-02, MCS-86 Assembly language converter operating instructions for ISIS-II users. Met behulp van CONV86 is het dus mogelijk om de 8080/8085 programma's ook op de 8086 te laten draaien.

CONV86 neemt als input een foutloze 8080/8085 assembly-language source file en eventueel enkele controls (zie 6.2) en heeft als output PRINT en OUTPUT files. De OUTPUT file bevat de 8086 assembly-language source code welke door CONV86 gemaakt is. De PRINT file (optie) bevat een listing van de 8080/8085 assembly-language source code en een listing van de 8086 assembly-language source code met meldingen. Deze meldingen kunnen aangeven dat men zelf nog enkele dingen manueel in de OUTPUT file moet veranderen, m.b.v. de ISIS-II text-editor. Dit zelf veranderen betreft dan voornamelijk machine afhankelijke ding en zoals timing delays.

De 8080/8085 source code moet aan enkele voorwaarden voldoen:

1. De 8080/8085 source files moeten foutloos zijn. 2. Een source line mag niet langer zijn dan 129 karakters. 3. Als het programma langer is dan 600 symbolen, dan moet men het programma in kleinere stukken breken.

De 8080/8085 registers en flags worden op de volgende manier omgezet in 8086 registers en flags:

8 bit registers:

8010/8086 8088 l I

A AL I B CH 1

C CL 0 DH E DL H BH L BL

16 bit registers:

flags:

Flat Ham.

AUlI.lI:vy-carry

Carry

Zero

Sign

Parity

I

I I i

1080/I0Il

PaW B o H

SP

CONV86

8080 O··itn.tlon

AC

C

Z

S

P

AX CX ox ex SP

...... "*'~ ...... "-.---.-- -

pag.6. 2

IJOII O··itnallon

AF

CF

ZF

SF

PF I ..

De output files hebben de volgende namen: de OUTPUT file heeft dezelfde naam als de source file maar met extension .A86. De PRINT file heeft dezelfde naam als de source file maar nu met extension .LST.

6.2 Het gebruik van de converter

Indien de 8080/8085 source files voldoen aan de eisen zoals in de vorige paragraaf vermeld, dan kan men de converter startten door het volgende commando onder ISIS-II in te geven:

:Fn:CONV86 source controls

Hierin source de naam van de file welke omgezet moet worden en controls zijn de mogelijke opdrachten voor de converter. Voor een volledige lijst van de controls zie de Intel manual.

Nadat de invocation line gegeven is, dan antwoord CONV86 met de volgende melding op het beeldscherm:

ISIS-II ASM80 TO ASM86 CONVERTER Vx.y

Indien er niets fout is gegaan, dan beeindigt de converter met

CONV86

het bericht:

ASM80 TO ASM86 CONVERSION COMPLETE nnnnn CAUTIONS ISSUED

waarin nnnnnn het aantal meldingen is dat gegeven is.

pag.6. 3

CONV86 stopt met verwerking van de source file indien er I/O of andere fatale fouten gevonden Z1)n of als CONV86 verkeerd gestart wordt. De converter meldt zich dan met het volgende bericht

ASM80-TO-86 I/O ERROR­FILE: file-type NAME: file-name ERROR: error-message CONVERSION TERMINATED

V~~r een lijst van de foutmeldingen zie pag.2.6 van de manual.

iSBC86-12 pag.7. 1

Hoofdstuk 7: de iSBC 86/12 Single Board Computer.

7.1 Inleiding

In dit hoofdstuk wordt de iSBC 86/12 single board computer besproken, het verzenden van programma's tussen ontwikkelsysteem en iSBC 86/12 en de monitor kommando's waarmee men de programma's op de iSBC 86/12 kan controleren en veranderen.

De iSBC 86/12 is een single board computer welke werkt met een 8086 microprocessor. Het board wordt geproduceerd door Intel en is dan ook zeer geschikt om samen te werken met het ontwikkelsysteem. Voor de technische gegevens van de iSBC 86/12 verwijs ik naar Intel's manual: iSBC 86/12 Single Board Computer Hardware Reference Manual, nr.9800645A.

7.2 Het verzenden van programma's

Het zenden van programma's van het ontwikkelsysteem naar de iSBC 86/12 (of andersom) gebeurt onder invloed van een hulpprogramma genaamd SBC861 welke men op diskette moet hebben (bv. in drive :FO:). Het programma dat men wil overzenden moet weI het hexadecimale formaat hebben en is dus het resultaat van het hulpprogramma OH86 (zie pag.5.9). Het heeft dus als extension .HEX en we nemen aan dat dit programma op diskette in drive :F1: staat.

De werkwijze voor het overzenden is dan als voIgt: eerst SBC861 op drive :FO: oproepen vanuit ISIS-II d.m.v.:

:FO:SBC861 <cr>

Op de monitor verschijnt dan de mededeling:

ISIS-II iSBC 86/12 loader, V1.2

Vervolgens moet men dan op de reset knop van de iSBC 86/12 drukken, deze bevindt zich aan de voorkant van de iSBC 86/12 onder S. Vervolgens moet men tweemaal de U-knop op het toet­senbord indrukken. Men bevindt zich dan in de monitor van de iSBC 86/12 en op het scherm leest men dan de melding:

iSBC 86/05 MONITOR V1.0

Men kan dan d.m.v. monitor kommando's met de iSBC 86/12 gaan

iSBC86-12 paQ.7. 2

werken (zie volgende paragraaf). Zo kan men het gewenste pro­gramma vanuit het ontwikkelsysteem overzenden d.m.v. het moni­tor kommando LS, en weI als voIgt:

LS, :F1 :name.HEX <cr>

7.3 Monitor kommando's

In het nu volgende deel kommando's besproken. V~~r

iSBC 957 Intellec-iSBC 86/12 user's guide, nr.9800743A.

Load hexadecimal file L:

LS,<filename><cr>

wordt in het kort enkele monitor een uitgebreider overzicht zie de

interface and execution package

Met dit kommando kan men serieel programma's van ontwikkelsys­teem naar de iSBC 86/12 zenden.

Transfer hexadecimal file T:

TS,<start addr>,<end addr>,<filename><cr>

Met dit kommando kan men een blok geheugen van de iSBC 86/12 naar het ontwikkelsysteem zenden. Als startadres moet men de waarde van CS en IP geven, en weI volgens volgend formaat: (CS,IP). Voor het end adres is aIleen IP nodig.

Exit E:

E<cr>

Met dit kommando kan men de loader verlaten en komt men weer in ISIS-II.

Go G:

G[<start addr>][,<break 1 addr>][,<break 2 addr>]<cr)

Met dit kommando kan men het programma in de iSBC 86/12 laten lopeno Na invoeren van G laat de monitor de IP counter zien. Indien men de IP 60unter wil aanpassen dan moet men het startadres opgeven. Tevens kan men twee break adressen invoeren.

iSBC86-12 pag.7. 3

Examine/Modify register X:

X[<reg>][[<new contents>],]<cr>

Hiermee kan men de inhoud van de registers oproepen en even­tueel veranderen.

Display Memory D:

D[W]<start addr>[,<end addr>]<cr)

Hiermee kan men de inhoud van het geheugen oproepen. display byte en DW is display word.

substitute Memory S:

S[W]<addr>,[[<new contents>],]<cr)

D is

Hiermee kan men de inhoud van een bepaalde geheugencel onder­zoeken en eventueel veranderen. S is substitute byte en SW is substitute word.

Find F:

F[W]<start addr>,<end addr>,<data><cr>

Hiermee kan men in een blok geheugen tussen begin- en eind­adres een bepaalde byte of word zoeken, F is find byte en FW is find word.

Voorbeeld pag.8. 1

Hoofdstuk 8: Een yoorbeeld

8.1: Inleiding

In dit hoofdstuk wordt aan de hand van een voorbeeld stap voor stap beschreven hoe men een programma moet ontwikkellen dat moet draaien op de iSBC 86/12. In dit programma, dat werd geschreven door de heer Heuvelman, wordt gebruik gemaakt van een interrupt. Ik heb dit programma als voorbeeld genomen omdat de beschrijvingen in de verschillende handleidingen betreffende interrupts niet korrekt zijn. Het programma dat hier wordt beschreven werkt weI en kan dus als voorbeeld dienen als men in een programma een interrupt nodig heeft. Hoe het programma werkt wordt niet helemaal verklaard daar het in deze handleiding hoofdzakelijk gaat over het linken, locaten en andere werkzaamheden.

In dit voorbeeld maak ik gebruik van diskettes in beide drives. In drive :FO: bevindt zich een systeemdiskette met aIle programma's die nodig zijn en op de diskette in drive :F1: worden de programma's opgeslagen die men zelf schrijft en die het resultaat zijn van de hulpprogramma's. Op de diskette in drive :FO: heeft men de volgende programma's nodig:

CREDIT RUN ASM86 LINK86 LOC86 OR86 SBC861

8.2: Het programma

Als het programma normaal doorlopen wordt, dan stuurt de iSBC 86/12 kontinu "A-tjes" naar het beeldscherm. Er is echter een ingebouwde timer die elke seconde 1 interrupt van het type18 (=12H) genereerd. Type18 is level2 op de interrupt controller, maar in het programma op pag.8.2 is per ongeluk type2 in plaats van leve12 geschreven. Ais de processor deze interrupt krijgt dan springt hij van het gewone programma over naar zijn interrupt programma met als gevolg dat de iSBC 86/12 de volgende zin op het beeldscherm schrijft: "Dit is een interrupt".

Het programma bestaat uit drie losse modulen die elk een eigen taak hebben en die ook in andere programma's te gebruiken zijn. Deze modules zijn achtereen volgens de module INIT86

Voorbeeld paq.S. 2

(bevat initialisatie van interrupts, de timer en het hoofdprogramma), de module TEXT (schrijft een tekst naar het beeldscherm) en de module CO (schrijft een character naar het beeldscherm) .

8.3: Module INIT86.

Deze module wordt op de diskette in drive :F1: opgeslagen en weI onder de naam INIT86.ASM om aan te geven dat hij in assembler taal geschreven is. De module wordt geschreven m.b.v. CREDIT. Het aanroepen van CREDIT gaat op de volgende wijze

CREDIT :F1:INIT86.ASM <cr)

De module ziet er als voIgt uit:

NAME INIT86 I INTPTR SEGMENT

ORG 48H TYPE2 DO TIMINT ; tNTPTR ENDS I ASSUME CS:CCOOE. DS;DDATA , DDATA SEGMENT WORD PUBLIC J TEKST DB I DOATA ENOS ;

ODH,OAH. 'Oit io;; een interrLipt' ,OAH,ODH,O

CCODE SEGMENT WORD PUBLIC EXTRN CO:NEAR,TEXT.NEAR

INITI

I MAINI

UIT:

CCODE END

CLI I'1OV OUT I'1OV OUT I'IOV OUT MOV OUT I'IOV OUT I'IOV OUT MOV OUT 110V STI

MOV CALL .:IMP

TIMINT PUSH LOOP I'IOV MOV l.EA CALL MOV POP STI IRET TII'IINT ENOS

AL,17H QCOH,AL AL,10H OC2H,AL AL,1FH OC2H,AL AL,NOT(4) OC2H.AL AL,36H OD6H,AL AL,OCDH ODOH,AL AL.4H ODOH,AL eX,IOOOD

AI... ' A' CO MAIN

PROC AX UIT tH.DDATA 8S,BX BX,TEKST TEXT CX,1000D AX

ENDP

; DISABLE INTERRUPTS

;ICWl TO PIC J VEe. TOR BASE IS 4*10H ,ICW2 TO PIC

IICW4 TO PIC ;ALLOW INT2(2"2) ;Dew TO PIC, ALLOW tNT2

,INIT TIMER 0 FOR INS COUNT

ILSB TIME (12290 CYCLES" 1MS)

I MSB TIME ;COUNT FOR ISEC ;ALLOW INTERRUPTS

;CHARACTER TO CONSOLE ;MAIN IS MAINPROGRAMME TO BE INTERRUPTED

;SAVE REGISTER

I LOAD OS WITH ADDRESS DDATA !LOAD ex WITH EFFECTIVE ADDRESS OF TEKST ;wRITE TeXT ILOAD AGAIN

;BACI< TO MAIN

Voorbeeld pag.8. 3

De module begint met het NAME directive en eindigt met het END directive. Het module bevat drie segmenten, nl. INTPTR, CCODE en DDATA. Een segment wordt aangegeven door het SEGMENT/ENDS directive. Het segment INTPTR geeft aan dat de interruptpro­cedure voor een interrupt type2 TIMINT heet en dat de vector­pointer voor interrupt type2 op 48H ligt. Het segment DDATA bevat alleen een regel tekst. Het segment CCODE bevat een deel met naam INIT waar de interrupts geinitialiseerd worden en een .. deel MAIN met de procedure TIMINT. In de tweede regel van het segment CCODE wordt d.m.v. het EXTRN directive aangegeven dat dit segment gebruikt maakt van de twee andere modules TEXT en CO. Verder wordt door het ASSUME directive aangegeven dat de base voor CCODE in segment register CS ligt en de base voor DDATA in register DS.

8.4 Module TEXT

Deze module wordt ook met CREDIT geschreven en opgeslagen op drive :F1: onder de naam TEXT.ASM en ziet er als volgt uit:

NAME TEXT ; ;***************************************************************

TEXT IS EEN ROUTINE OM TEKST NAAR DE CONSOLE TE SCHRIJVEN. HET BEGINADRES VAN DE TEVST STRING DIENT IN BX TE STAAN. HET LAATSTE CHARACTER IS EEN O.

; ;********~******************************************************

ASSUME CS.CCODE

CCODE SEGMENT WORD PUBLIC EXTRN CO. NEAR PUBLIC TEXT TEXT pROC

; BEGIN.

MOV DI,O LOOpTX.

MOV AX.DI INDEX-ADRES VAN CHAR. NAAR AX XLATB CHAR. NAAR AL AND AL.OFFH NUL? JZ UIT CALL CO CHAR. NAAR CONSOLE INC 01 INDEX VERHOGEN JMp LOOpTX EN VOLGENDE CHAR.

UIT: RET TEXT ENOl"

CCODE ENOS END

De module bevat slechts een segment, CCODE met base in register CS en maakt gebruik van het module CO. Het segment bevat de procedure TEXT hetgeen wordt aangegeven door het PROC/ENDP di­rective. Deze procedure is PUBLIC wat wil zeggen dat deze pro-

Voorbeeld paq.8. 4

cedure ook door andere modules opgeroepen kan worden , zoals hier door INIT86.

8.5 Module CO

Deze module wordt geschreven onder de naam CO.ASM, ook op drive :F1:, en ziet er als volgt uit:

;NAME co ;******************************.******************************

co SCHRIJFT EEN CHARACTER OAT IN AL STAAT NAAR DE USART ; ;************************************************************* ; ASSUME CS:CCODE ; eeODE SEGMENT WORD PUBLIC

PUBLIC CO CO PROC NEAR

BEGIN: PUSH

STATUS: IN AND JZ POP OUT RET CO

ceo DE ENDS END

AX AL,ODAH AL,l STATUS AX OD8H,AL

ENDP

;STATUS OPHALEN ;TEST VOOR TX GEREEO

,ZEND CHARACTER WEG

Ook deze module bevat slechts een segment met de base in regis­ter CS.

8.6 Het assembleren

Nadat we de drie modules in assemblertaal geschreven heb­ben moeten we ze vertalen in machine code. Dit gebeurt d.m.v. het programma ASM86. Dit assembleren moet gebeuren in 8086 mode en dus hebben we ook het programma RUN nodig. Ik be­schrijf hier alleen de werkwijze voor de module INIT86 omdat de werkwijze voor de andere modules identiek is.

Het opstartten van de assembler gaat als volgt:

RUN ASM86 :F1:INIT86.ASM (cr)

Op het beeldscherm komt dan de volgende melding te staan:

SERIES-III 8086/87/88/186 MACRO ASSEMBLER, V2.0

Het modulewordt nu geassembleerd en indien er geen fouten ge­maakt zijn bij het schrijven, dan verschijnt de volgende mel­ding op het beeldscherm:

Voorbeeld pag.8. 5

ASSEMBLY COMPLETE, NO ERRORS FOUND.

Ditzelfde do en we ook met de modules TEXT.ASM en CO.ASM. Als we nu de inhoud van diskette :F1: onderzoeken m.b.v. DIR 1 dan zien we dat de assembler van elke module twee files gemaakt heeft, een met extension .OBJ en een met extension .LST. De files met extension .OBJ bevatten de machine code en de files met extension .LST zijn de listing files die verschillende mededelingen bevatten. De listing files zien er als volgt uit:

8086/87/88/186 MACRO ASSEMBLER INIT86

SERIES-III 8086187/88/186 MACRO ASSEMBLER V2.0 ASSEMBLY OF MODULE INIT86 OBJECT MODULE PLACED IN :Fl:INIT86.0BJ ASSEMBLER INVOKED BY: ASM86.86 :Fl:INIT86.ASM

LOC OBJ

0048 0048 2800----

0000 OD 0001 OA 0002 44697420697320

65656£20696E74 657272757074

0016 OA 0017 OD 0018 00

0000 0000 FA 0001 B017 ()003 E6CO 0005 BOlO 0007 £6C2 0009 BOIF 0008 E6C2 0000 BOFB OOOF E6C2 0011 B036 0013 £6D6 0015 BOCD 0017 E6DO 0019 B004 0019 E600 0010 89E803 0020 FB

0021

E

LINE

1 :2 3 4 5 6 7 8 9

10 11 12 13

SOURCE

NAME ; INTPTR

TYPE2 ; INTPTR ; ASSUME

ODATA

INIT86

SEGMENT ORG 48H DO TIMINT

ENDS

cs:ceOOE, DS:DOATA

SEGMENT WORD PUBLIC

TEKST DB ODH,OAH,'D1t is een interrupt',OAH,ODH.O

; DDATA ; CeOOE

INIT:

• MAIN:

ENDS

SEGMENT WORD PUBLIC EXTRN eO:NEAR.TEXT:NEAR

eLI MOV OUT MOV OUT MOV OUT MOV OUT MOV OUT MOV OUT MOV OUT MOV STI

AL,17H OCOH,AL AL,10H OC2H,AL AL,lFH OC2H,AL AL,NOT(4) OC2H.AL AL,36H OD6H.AL AL,OCDH ODOH,AL AL,4H ODOH,AL eX,looon

,DISABLE INTERRUPTS

;ICW1 TO PIC ;VECTOR BASE IS 4*10H ; ICW2 TO PIC

; ICW4 TO PIC ;ALLOW INT2(2"'2) ,OCW TO PIC, ALLOW INT2

IINIT TIMER 0 FOR IMS COUNT

ILSB TIME (12290 CYCLES- IMS)

;Mse TIME ;COUNT FOR ISEC JALLOW INTERRUPTS

;CHARACTER TO CONSOLE

19/03/8

0021 B041 0023 E80000 0026 EBF9

14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43

MOV CALL JMP

AL, ' A' CO MAIN JMAIN IS MAINPR09RAMME TO BE INTERRUPTED

0028 TIMINT PROC

Voorbeeld pag.S. 6

8086/87/88/t86 MACRO ASSEMBLER INITB6

LOC OBJ LINE SOURCE

0029 :SO 44 PUSH AX ;SAVE REGISTER 0029 E24)F 45 LOOP UIT 002B 98---- R 46 110V BX,DDATA • 002E SEDB 47 MOV DS,BX I LOAD Os WITH ADDRESS DDATA 0030 90 1 EOOoo R 0034 E80000 E

48 LEA 49 CALL

BX.TEKST TEXT

;LOAD BX WITH EFFECTIVE ADDRESS OF TEKST ;WRITE TEXT

0037 B9ES03 50 MOV CX,10000 ;LOAD AGAIN 003A :S8 51 UIT: POP AX 0038 F8 52 SrI 003C CF 53 IRET ;BACK TO MAIN

54 TIMINT ENDP 55 CCODE ENOS 56 END

ASSEMBLY COMPLETE, NO ERRORS FOUND

8086/87/88/186 MACRO ASSEMBLER TEXT

SERIES-Ill 8086187/88/186 MACRO ASSEMBLER V2.0 ASSEMBLY OF MODULE TEXT OBJECT MODULE PLACED IN :Fl:TEXT.OBJ ASSEMBLER INVO~:ED BY: ASM86.86 :FtITEXT.ASM

LOC OBJ LINE SOURCE

NAME TEXT :2 3 ;***************************************************************

0000

0000 0000 BFOOOO 0003 0003 BBC7 0005 07 0006 24FF 0008 7406 OOOA E90000 0000 47 OOOE E8F3 0010 0010 C3

E

4 5 6 7 8 9

10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34

ASSEMBLY COMPLETE. NO ERRORS FOUND

TEXT IS EEN ROUTINE OM TEKST NAAR DE CONSOLE TE SCHRIJVEN. HET BEGINADRES VAN DE TEKST STRING DIENT IN BX TE STAAN, HET LAATSTE CHARACTER IS EEN O.

; ;********************************************.******************

ASSUME CSICCODE ; CCODE SEGMENT WORD PUBLIC

EXTRN CO:NEAR PUBLIC TEXT TEXT PROC

; BEGIN.

MOV 01.0 LOOPTX:

MOV AX,DI INDEX-ADRES VAN CHAR. NAAR AX XLATB CHAR. NAAR AL AND AL,OFFH NUL? JZ UIT CALL CO CHAR. NAAR CONSOLE INC 01 INDEX VERHaGEN JMP LOQPTX EN VOLGENDE CHAR.

UIT: RET TEXT ENOP

CCODE ENOS END

1'Y/03/S,

Voorbeeld pag.8. 7

8086/87/88/186 MACRO ASSEMBLER CO

SERIES-III 8086187/88/186 MACRO ASSEMBLER V2.0 ASSEMBLY OF MODULE CO OBJECT MODULE PLACED IN rFl:CO.OBJ ASSEMBLER INVOKED BY: ASM86.86 :FlleO.ASH

LOC OBJ LINE SOURCE

0000 0000

1 :2 3 4 5 6 7 8 <;>

10 11 12

NAME CO ;*************************************************************

CO SCHRIJFT EEN CHARACTER OAT IN AL STAAT NAAR DE USART

;************************************************************* ; ASSUME CS:CCODE , CCODE SEGMENT WORD PUBLIC

PUBLIC CO CO PROC NEAR

BEGIN: 0000 50 OOCI E40A 00'-,3 2 A (')1 0005 74FA 0007 58 0008 E6D8 OOOA C3

13 14 1:5 16 17 18 19 20

STATUS~

PUSH IN AND JZ POP OUT RET

AX AL,ODAH AL,l STATUS AX OD8H,AL

,STATUS OPHALEN ;TEST VOOR TX GEREEO

;ZEND CHARACTER WEe

21 CO ENDP 22 ceODE ENDS 23 END

ASSEMBLY COMPLETE, NO ERRORS FOUND

Elke listing bevat een header met mededelingen zoals naam en invocation line en controls die gebruikt z~Jn. ELke listing bestaat verder uit 4 kolommen: een kolom LOC waarin de loca­ties van de codes staan, een kolom OBJ waarin de codes vermeld z~Jn, een kolom LINE met regelnummers en een kolom SOURCE waarin het uitgangsprogramma staat (dus bv. INIT86.ASM).

8.7 Het linken

We z~Jn nu zover dat we drie modules geschreven in machine code hebben en we willen die verbinden tot een module. Dit gebeurt d.m.v. het programma LINK86 , ook in 8086 mode. We moeten bij het linken aangeven welke modules we willen linken. De werkwijze is als volgt:

RUN LINK86 :F1:INIT86.0BJ, :F1:TEXT.OBJ, :F1:CO.OBJ <cr>

Op het beeldscherm verschijnt dan de mededeling:

SERIES-III 8086 LINKER, V2.0

19103184

Voorbeeld pag.8. 8

Als resultaat hebben we nu op de diskette twee nieuwe files er­bij gekregen, nl. INIT86.LNK en INIT86.MP1. De file INIT86.LNK bevat de code en INIT86.MP1 is de listing file. Deze ziet er als voigt uit:

SERIES-III 8086 LINKER, V2.0

INPUT FILES: :Fl: INITEl6.06J, :Fl:TEXT.OBJ, :Fl:CO.06J OUTPUT FILE: :Fl:INIT86.LNK CONTROLS SPECIFIED IN INVOCATION COMMAND: DATE: 19/03/94 TIME:

LINK MAP OF MODULE INIT86

LOGICAL SEGMENTS INCLUDED I LENGTH ADDRESS ALIGN SEGMENT

OOOOH ------ G 77SEG 004CH ------ 6 INTPTR 0056H ------ W CCODE 0019H ------ W ODATA

INPUT MODULES INCLUDED: :Fl:INITS6.0BJ(INIT86) :Fl:TEXT.OBJ(TEXT) :Fl:CO.OBJ(CO)

CLASS OVERLAY

Deze listing bevat weer een header en een overzicht van de ver­schillende modules en segmenten welke gelinked zijn.

8.8 Het locaten

Nadat we de modules gelinked hebben moeten we de resulte­rende module nog een absoluut adres geven. Dit gebeurt d.m.v. de locater. Bierbij moeten we de verschillende segmenten startadressen geven, m.a.w. we moeten de base van elk segment opgeven. Dit gebeurt door de controls ST en AD en wei als voigt: met ST kan men het startadres van het programma opgeven, zowel base als offset (hier resp.O en 1000H). Met AD(SM) kan men de verschillende segmenten een adres geven (offset). We willen dat segment INTPTR op adres 0 start (vector pointers), segment DDATA op 200B en segment CCODE op 1000B (startadres van programma). De werkwijze is dan als voigt: (het &-teken is gebruikt omdat bij het invoeren anders de regei te lang is).

RUN LOC86 :F1:INIT86.LNK ST(O,1000B) & <CR> AD(SM(INTPTR(O), DDATA(200B), CCODE(1000B») <cr>

Op het beeldscherm verschijnt dan het bericht:

SERIES'-III 8086 LOCATER, V2.0

De locater geeft als resuitaat twee files, nl. een zonder

yoorbeeld pag.8. 9

extension (INIT86) en een met extension .MP2 (INIT86.MP2). De eerste file bevat de absolute machine code en de tweede file bevat een listing. Deze listing ziet er ala voIgt uit:

SERIES-III 8086 LOCATER, V2.0

INPUT FILE: :Fl:INIT96.LNK OUTPUT FILE: :Fl:INIT86 CONTROLS SPECIFIED IN INVOCATION COMMAND:

ST(O,100OH) AD(SM(INTPTR(O),DDATA(200H),GCODE(lOOOH »)

DATE: 19/03/84 TIME:

SYMBOL TABLE OF MODULE INITB6

BASE OFFSET TYPE SYMBOL , BASE OFFSET TYPE SYMBOL

0100H OOSOH PUB Co 0100H 003EH PUB TEXT

MEMORY MAP OF MODULE INITB6

MODULE START ADDRESS PARAGRAPH" OOOOH OFFSET = 10')OH SEGMENT MAP

START STOP LENGTH ALIGN NAME CLASS

OOOOOH 0OO4BH 004GH a INTPTR 00200H 00218H OO19H W DDATA 00220H 00220H OOOOH a ??SES 01000H OlO5AH 005BH W GGODE

OVERLAY

De listing bevat weer een header en bevat verder informatie over het startadres van het module en de startadressen van de verschillende segmenten.

8.9 Omzetten in HEX formaat

Voordat we het programma naar de iSBC 86/12 kunnen zenden moeten we het eerst omzetten in Intel's hexadecimale formaat. Dit gebeurt m.b.v. het programma OH86 en de werkwijze is als volgt:

RUN OH86 :F1:INIT86 <cr>

Op het beeldscherm verschijnt dan de melding

SERIES-III 8086 OBJECT CODE TO HEX FILE CONVERTOR, V1.0

Nadat het programma in hex formaat omgezet is verschijnt de me­dedeling:

CONVERSION COMPLETE, NO ERRORS

Het resultaat van de conversie wordt opgeslagen op de file INIT86.HEX op drive :F1:.

Voorbeeld pag,8, 10

8,10 Overzenden en draaien

De laatste handelingen die men nu nog moet verrichten Z~jn het overzenden naar de iSBC 86/12 en het daar laten draaien van het programma. Dit gaat als voIgt:

SBC861 <cr>

Op het beeld verschijnt de melding:

ISIS-II iSBC 86/12 loader, Vl,2

Vervolgens resetknop op iSBC 86/12 indrukken en tweemaal U-knop op het toestenbord indrukken, Op het beeldscherm komt dan de volgende melding:

iSBC 86/05 MONITOR, Vl.2

Bet overzenden gaat nu als voIgt

LS,:Fl:INIT86,BEX <cr>

Bet programma is nu geladen en kan gestart worden met het moni­tor kommande GO:

G <cr>

Men kan het programma onderbreken door het indrukken van de resetknop en am dan weer in de monitor te komen tweemaal de U-knop, Om het programma dan weer te starten moet men eerst het startadres opgeven m.b.v. het kommando X:

XIP 1000 <cr> XCS 0 <cr>

Hiermee is het beginadres van segment CCODE aangegeven en nu kan met programma weer met G starten. Een andere manier om het programma te onderbreken is het indrukken van de interruptknop op de iSBC86/12. Om dan opnieuw te starten hoeft men slechts het monitorkommando G in te toetsen.

absolute object module: kelijke verwijzigingen uitgevoerd kan worden.

Woordenlijst paq. 9. 1

een object module dat aIle noodza­naar fysische adressen bevat, zodat het

assembler: programma dat source code, geschreven in assembler taal, vertaalt in object code.

attributen: een set specificaties welke een bepaald begrip na­der omschrijven.

base: dat deel van een fysisch adres dat het begin aangeeft van het segment waarin men werkt. Zit opgeslagen in een seg­ment register.

class: een verzameling logische segmenten met bepaalde gemeen­schappelijke karakteristieken die aangeroepen kan worden door enkel de class-name te vermelden.

compiler: een programma dat source code, geschreven in een ho­gere taal, vertaalt in object code.

control: een instructie voor een assembler, compiler, linker, locater of andere programma's welke programma's bewerken. Het wordt of weI gegeven in de invocation line voor de assembler enz. of in een control line in het source programma dat be­werkt wordt.

control line: een regel binnen de tekst van een source program dat controls bevat voor de assembler of compiler.

debugger: een programma waarmee men fouten in een eigen pro­gramma kan opsporen door het invoeren van breakpoints, single­stepping enz.

default ~alue: de input parameter of control value welke een programma neemt indien er geen waarde expliciet gegeven is.

delimiter: een speciaal karakter dat dient om het einde van een token aan te geven en dat ook een speciale betekenis heeftl zoals ",", "+" enz. Bij gebruik van delimiters z~Jn spaties overbodig, tenzij om de leesbaarheid te vergroten.

directive: een opdracht in assembler taal die de assembler een speciale taak laat uitoefenen, wordt niet omgezet in machine code.

external: zo noemt men een variabele, procedure, funktie of een andere source programma grootheid welke in een module wordt aangeroepen, en in een andere module gedefinieerd wordt.

Woordenlijst pag. 9. 2

file: een verzameling van informatie welke gelezen of geschre­ven wordt door assembler, compiler of een ander programma.

group: een verzameling van logische segmenten welke binnen een 64k-byte blok geplaatst moeten worden, dus binnen een segment.

hexadecimal format: een bit-georienteerd formaat, gebruikt voor data opslag en transport, bestaande uit ASCII karakters.

identifier: een symbolische naam om een bepaald deel van het programma aan te wijzen ( segment, variabele, constante enz.). Een identifier moet beginnen met een letter, een "?" een "@" of met een " It

instructie: een opdracht in assembler taal welke door de assembler vertaald wordt in machine code.

invocation line: een regel waarmee men een assembler, piler, linker enz. start.

com-

labels: definieren adressen waar uitvoerbare instructies staan. Een label is een locatie waarnaar toe gesprongen kan worden, of welke gecalled kan worden.

library: een file dat bestaat uit object modules en dat onder­houden wordt door een library programma zoals LIB86.

linker: een programma, zoals LINK86, welke verschillende ob­ject modules verbindt zodat ze voorbereid zijn voor locating en executing.

loader: een programma dat object modules in het geheugen laadt zodat ze uitgevoerd kunnen worden/ bv. de RUN loader.

load-time locatable (LTL) code: object code welke tijdens load time, op een Series III onder de RUN loader, In het geheugen geplaatst kan worden.

locater: een programma, zoals LOC86, modules bindt aan geheugen adressen zodat gevoerd kan worden.

dat de code in object het programma uit-

logisch segment: een dee 1 van een object module dat bewerkt wordt door programma's welke de object module linken en 10-eaten.

module: een afzonderlijk vertaald onderdeel van een programma.

object code: programma code welke bewerkt is door een as­sembler of een compiler en welke verder bewerkt kan worden door

Woordenlijst pag .• 9. 3

een linker of locater.

object modules: een deel object code output van een assembler , compiler, linker of locater.

offset: een 16 bit dee 1 van het adres dat de positie van een geheugen locatie aangeeft binnen het segment aangegeven door het base adres.

paragraph number: een adres dat deelbaar is door 16, dus moet eindigen op OH. Wordt opgeslagen in een segment register waarbij de laatste nul niet vermeld wordt.

public: zo noemt men een variabele, procedure, funktie of een andere source programma grootheid die sommige of aIle andere modules vrij mogen aanroepen.

relocatable object module: een object module dat geen ver­wijzigingen naar fysische adressen heeft. Kan omgezet worden in een absolute object module door een locater zoals LOC86.

segment: een gebied in het geheugen dat start op een begin adres aangegeven door het segment register (de base) en dat 64K-byte lang kan zijn.

seperator: karakter dat gebruikt wordt om twee opeen volgende tokens te onderscheiden zodat ze niet als een grotere token be­handeld worden. Meest gebruikte seperator is de spatie.

source code: code geschreven in assembler taal of in een ho­gere taal zoals pascal.

statement: specificatie voor de assembler welke handeling hij moet uitvoeren. Er zijn twee types, ni. instructies en directives. Een statement staat meestal op een regel, gevolgd door een terminator (cr), maar ASM86 biedt de mogelijkheid om een statement op de volgende regel voort te zetten d.m.v. het & teken in de eerste kolom van de nieuwe regel.

token: het kleinste deel van een programma dat een betekenis heeft.

variabele: een symbolische naam voor data items, gebieden In het geheugen waar waarden zijn opgeslagen.