HANDLEIDING VOOR GEBRUIK INTEL'S ONTWIKKELSYSTEEM IN 8086 MODE. J.W. de Ree WPB. 0 105. juni 1984.



Vergelijkbare documenten
Handleiding voor gebruik intel's ontwikkelingsysteem in 8086 mode Ree, de, J.W.

Linux Assembly Uitwerkingen van de vragen en opdrachten

Deel 1: Arduino kennismaking. Wat is een microcontroller, structuur van een programma, syntax,

Computerarchitectuur en netwerken. Memory management Assembler programmering

De CPU in detail Hoe worden instruc4es uitgevoerd? Processoren 28 februari 2012

Proeftentamen in1211 Computersystemen I (NB de onderstreepte opgaven zijn geschikt voor de tussentoets)

Proeftentamen in1211 Computersystemen I (Opm: de onderstreepte opgaven zijn geschikt voor de tussentoets)

Assembly en Assemblers. Processoren 5 januari 2015

Memory Management. Virtual Memory. Eisen Memory Management. Verdelen geheugen over meerdere processen

Geheugenbeheer. ICT Infrastructuren 2 december 2013

Syntax- (compile), runtime- en logische fouten Binaire operatoren

Een korte samenvatting van enkele FORTRAN opdrachten

Indirecte adressering

Constanten. Variabelen. Expressies. Variabelen. Constanten. Voorbeeld : varid.py. een symbolische naam voor een object.

Digitale technieken Microprocessoren

Tentamen Computersystemen

scc = b) CD AB

Getalformaten, timers en tellers

Computerarchitectuur en netwerken. Memory management Assembler programmering

Hoofdstuk 7. Computerarchitectuur

Bouwstenen voor PSE. Datatypes en Datastructuren

n o F o r t h voor MSP430 Launchpad 1. Memory map Er zijn twee ROM gebieden (alle getallen zijn hex): , verdeeld in vier blokken van 40

Hoe werkt een computer precies?

Van Poort tot Pipeline. Ben Bruidegom & Wouter Koolen-Wijkstra AMSTEL Instituut Universiteit van Amsterdam

Tentamen Computersystemen

Programmeren met Arduino-software

Microcontrollers Week 4 Introductie microcontroller Jesse op den Brouw (met dank aan Ben Kuiper) INLMIC/

Lab Webdesign: Javascript 3 maart 2008

Python. Vraag 1: Expressies en types. Vraag 1 b: Types -Ingebouwde functies- Vraag 1 a 3/10/14

VBA voor Doe het Zelvers deel 20

Interne voorstelling. types en conversies. Binaire en andere talstelsels. Voorstelling van gegevens: bits en bytes

Computerarchitectuur. H&P Appendix A: Instruction Set Principles

Computertechniek vorige examens

FAT32 disk structuur 2007 stam.blogs.com

Geheugen en Adressering. Binding. Binding (2) Logische en Fysieke adresruimten. relocatie register. Dynamic loading

Niet-numerieke data-types

11011 Processor MMI Intro. Binaire representatie. Computer: Logische opbouw (Von Neumann) 3-input 1-hot detector.

Beter, Sneller, Mooier. Processoren 12 januari 2015

von-neumann-architectuur Opbouw van een CPU Processoren 1 december 2014

ROM en RAM in een ROMforth

Hoe werkt een rekenmachine?

Een topprogrammeur in het OO programmeren is Graig Larman. Hij bedacht de volgende zin:

Computerarchitectuur. H&P Appendix A: Instruction Set Principles

Vakgroep CW KAHO Sint-Lieven

Zelftest Inleiding Programmeren

Java. Basissyllabus. Egon Pas

Talstelsels en getalnotaties (oplmodel)

Muziek. Muziek. Analoog rekenen. Hoofdstuk 1: Van analoog naar digitaal. Analoog. Digitaal. Analoog. Gebruik makend van fysische grootheden Cf Babbage

Computerarchitectuur en netwerken Toets 1 4 okt

HOOFDSTUK 3. Imperatief programmeren. 3.1 Stapsgewijs programmeren. 3.2 If Then Else. Module 4 Programmeren

Hoofdstuk 3: Processen: Beschrijving en Besturing. Wat is een proces? Waarom processen? Wat moet het OS ervoor doen? Is het OS zelf een proces?

PYTHON REEKS 1: BASICS. Mathias Polfliet

17 Operaties op bits Bitoperatoren en bitexpressies

De Arduino-microcontroller in de motorvoertuigentechniek (2)

Query SQL Boekje. Fredrik Hamer

2 Algemene opbouw van een computersysteem

Vraag 1 (2 punten) (iii) Een lees-opdracht van virtueel adres 2148 seg 0, offset idem

De AT90CAN microprocessor van ATMEL in de motorvoertuigentechniek (2)

ALGORITMIEK: answers exercise class 7

6.2 VBA Syntax. Inleiding Visual Basic

DE INTERACTIEVE SHELL

Let op dat de scoping regels gerespecteerd blijven; het volgende voorbeeld mag geen fout melden.

Debugging in embedded en native systemen met GDB

Herman Post MSX Computer & Club Magazine nummer 71 - november Scanned, ocr ed and converted to PDF by HansO, 2001

Hoofdstuk 9. Hashing

Java virtuele machine JVM

Gegevensopslag in databouwstenen

In deze aflevering van deze serie zal ik proberen een groot gebrek van Turbo Pascal weg te nemen, namelijk het gemis aan Random Access Files.

scc =!F3.!F2 b) CD AB

VAN HET PROGRAMMEREN. Inleiding

6,1. Samenvatting door een scholier 1809 woorden 28 oktober keer beoordeeld. Informatica

ES1 Project 1: Microcontrollers

int main() { int m; m = power(2,3) /* berekent 2^3 en geeft de resultaat naar m terug */ }

SQL datadefinitietaal

Als een PSD selecties bevat, deelt de lijn van het programma zich op met de verschillende antwoorden op het vraagstuk.

Week 2 : Hoofdstukken 2 en 6; extra stof: inleiding pointers

Small Basic Programmeren Text Console 2

Module 4 Hoofdstuk 1. Programmeertalen

slides12.pdf December 14,

Tentamen 17 augustus 2000 Opgaven Computerarchitectuur

QR-code op aanvoerbrief 2.xx.0: Specificaties

Uitwerking Aanvullend tentamen Imperatief programmeren Woensdag 24 december 2014, uur

Turbo Pascal deel 3 MSX CLUB MAGAZINE 36. Erik van Bilsen. Scanned, ocr ed and converted to PDF by HansO, 2001

Een gelinkte lijst in C#

Geheugen onder DOS2 MSX turbor

NCTS - INFORMATIE INZAKE NIEUWIGHEDEN VOOR 2010

Tentamen Computerorganisatie 28 augustus 1998, uur. N.B.: Dit tentamen bestaat uit 30 opgaven Totaal aantal bladzijden: 11

Stacks and queues. Hoofdstuk 6

De computer als processor

Objective-C Basis. 23 april 2005, Eindhoven Patrick Machielse

4,7. Praktische-opdracht door een scholier 1959 woorden 1 juni keer beoordeeld

Talstelsels, getalnotaties en Ascii code

De Arduino-microcontroller in de motorvoertuigentechniek (8)

Antwoorden zijn afgedrukt!!!!!!!

6.3 VBA Syntax Instructie. Wij gaan de Visual Basic Editor opnieuw openen, om de instructie die wij zojuist getypt hebben, nader te bekijken.

Stapelgeheugen. Processoren 6 maart 2012

VAN HET PROGRAMMEREN. Inleiding. Het spiraalmodel. De programmeertaal. vervolgens de berekening van het totale bedrag, incl. BTW:

Zelftest Programmeren in COBOL - deel I

De Deskline configurator Advanced handleiding

Programmeren. Cursus Python

Transcriptie:

HANDLEIDING VOOR GEBRUIK INTEL'S ONTWIKKELSYSTEEM IN 8086 MODE. WPB. 0 105 J.W. de Ree 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 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 pag 7. 1 pag 7. 1 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 Hoofdstuk~. Woordenlijst 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 ontwikkelsysteem. 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 besproken en wordt ook verteld hoe men een programma van het ontwikkelsysteem 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 men een verklarende woordenlijst. vindt 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 omdat 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 breedteo 2) de instructie-set van een 16-bits processor is veel uitgebreider 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 gebruiken, 1 Mbyte t.o.v. 64 Kbyte bij een 8-bits processor. 4) de 16-bits processoren kunnen door hun speciale structuur gebruik maken van gespecialiceerde co-processoren die bepaalde taken overnemen zodat de microprocessor iets anders kan doen. Zo zijn er bv. een speciale rekenprocessor (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 werken terwijl de 8088 een 8 bits data bus nodig heeft. Dit laatste 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 uinstruction queuing" toe om de snelheid van de processor te vergroten. 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 geheugen te halen omdat de gehele instructie zich al in de "instruction 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 encoding toe voor de verschillende signalen. Voor data- en adres-signalen gebruikt men time multiplexing, voor de verschillende controle signalen gebruikt men encoding. Deze technieken 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. A 1M em ll, ) IL ~ti L CL ~ll: U OM OL rm" l!," or ACCUMUUTOR 'An COUMT OATl STACK 'OlNT(R IAU PO'MTn $CUlC! '''Oll DUr'NAnOIi 'Norl IV [ un L- CS os 15 IS 11010 UG,ST H S.AOIO) '"SToveno" 'Olllfll STATU! 'LAGS COOt Sl&., IIT OAU S!G"IN' sue. SUMt"T lit SEOMt.T )""

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 (destination index). - een 16-bits flags register welke verschillende status bits van de processor bevat. Dit zijn, zie volgende figuur, 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 segment base. De segment base wijst naar een gebied in het geheugen (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 address genoemd omdat een segment aileen kan starten op een paragraph 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 multiprocessing: Coprocessing: twee of meer processoren delen dezelfde instructie stroom. Dit wil zeggen dat beide processoren hetzelfde programma volgen maar dat ze om de beurt instructies uitvoeren omdat bepaalde instructies het best door een bepaalde processor uitgevoerd kunnen worden (bv. de 8087 rekenprocessor). 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 werking 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 processor moet laten uitvoeren. Verder zijn er speciale besturingssignalen 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 geschreven 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 verschillende 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 variabele of label zijn zal. Dit raden kan mislukken en tot foutmeldingen leiden. Daarom moet men forward references zoveel 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 besproken, nl. het SEGMENT/ENDS directive ( definieert een segment ), 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 segment. [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 paragraph alignment, zie 2). 2) PARA paragraph alignment: het segment moet starten op een adres dee1baar door 16, dus beginadres 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 moet 0 zijn. 5) PAGE - page alignment: segment moet een adres waarvan de twee laatste beginnen, dus laatste bit van beginadres starten op hexadecimale eindigen op cijfers nul zijn, dus beginadres moet OOH. 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 segment in het geheugen. Het veld kan de volgende waarden aannemen: 1) Niet gespecificeerd: combinable, het segment den. default waarde van nonzal niet gecombineerd wor- 2) PUBLIC: aile segmenten van gelijke naam gespecificeerd PUBLIC worden gecombineerd tijdens LINK86). Lengte van het fysisch segment is gelijk aan de som van de lengtes van de afzonderlijke segmenten. 3) COMMON: aile segmenten van gelijke naam gespecificeerd 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 gespecificeerd STACK worden "overlapped" tot een fysisch segment. AIle segmenten eindigen op hetzelfde adres en groeien naar beneden. 5) MEMORY: aile segmenten van gelijke naam gespecificeerd MEMORY worden gecombineerd tot een fysisch geheugen segment, beginnend bovenop de andere segmenten. 6) AT expression: dit is een absoluut fysisch segment dat op de door de expressie aangegeven moet beginnen. plaats ['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 DB 0 DW 0 DB 0 DW 0 DATA ENDS 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) geadresseerd is. Het ASSUME directive wordt gebruikt om tijdens run-time te definieren wat de inhoud van de segment registers zal Zl)n. Het ASSUME directive initialiseert de registers 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: nieerd is. het segment waarbinnen de variabele gedefi 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: WORD: een 1 byte woard, 8086/8088 data type. een 2 bytes waard, 8086/8088 data type. - - DWORD: QWORD: een 4 bytes woard, 8086/8087/8088 data type. 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 directive: 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 verwezen wordt binnen het fys ch segment ligt ( vanaf 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 variabelen 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 behandeld 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: label. een unieke ASM86 identifier, de naam van het type: dit veld specificeert het type van het

ASM86 Assembler pag.3. 8 label. Het type kan zijn: 1} niet gespecificeerd: NEAR. 2) NEAR. 3)FAR. als default waarde Een ander soort data is de constante, dit is een echt getal zonder attributen. Voor de verschillende soorten constanten 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 variabele 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 counter 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 als een byte met waarde 10. variabele TEN 2) door het karakter "?" voor onbekende initialisatie. Hiermee kan men een geheugenplaats reserveren 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 vermelden van de naam van een variabele of label de offsethiervan in het lower order word en het paragraph number in het higher order word van DD geplaatst. 4) initialisatie van een DB met een string, waarbij de string tussen moet staan, bv. ALFABET DB 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 5) herhaalde initialisering: hiermee is het mogelijk 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 record heeft per definitie een aantal velden welke een bepaald aantal bits per veld bevatten. In deze velden kan men informatie opslaan en bewerken. Records zijn handig als men bepaalde bits in een structure wil bewerken, bv. flag bits. De operators welke gebruikt worden om de velden te bewerken worden beschreven 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 refield-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 geinitialiseerd 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. 12 Rekord initialisering en toewiiziging Syntax: [name] record-name <[exp] [,... ]> of [name] record-name repeatval DUP «[exp] [,... ]» ini Met dit directive kan men de data bits van het record 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 bestaande waarde niet wilt veranderen. bv. <f1,f2,...,fn) en <././... /fn) Bij het laatste voorbeeld laatste veld overschreven. wordt alleen de waarde van het repeatval: een geheel getal dat aangeeft hoeveel records gevuld moeten worden. vb. FLAGS ERRORFLAG <0,3,0) In dit voorbeeld geeft record ERRORSFLAG resp. men de velden A, B en evan het de waarden 0, 3 en O. Introductie van structures 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 directive.