home *** CD-ROM | disk | FTP | other *** search
- 0660000020266
- 1
- 2Seite #
- 9[....................................................]
- üDerAssemblerÇ
-
- DerimvolksFORTH-83fürdenAtari520STenthaltene68000-
- AssemblerentsprichtimWesentlichendemvonMichaelPerryfürdas
- F83entwickelten.DaherbringenwirhiereineÜbersetzungeines
- Artikelsaus'Dr.DobbsJournal',Nr.83vomSeptember1983,indem
- MichaelPerryseinenAssemblerbeschriebenhat.Abweichungendes
- volksFORTH-Assemblerswerdenbesonderserwähnt.ImAnschlußandie
- ÜbersetzungwerdendiezusätzlichenFunktionendesvolksFORTH-
- Assemblersbeschrieben.
-
- ü
- Ein68000ForthAssembler
- Ç
- IndiesemArtikelwerdeichdieEigenarteneinesAssemblersin
- FORTH,seinenGebrauchunddieImplementationeinesBeispiels
- beschreiben:EinFORTHAssemblerfürden68000.Ichhoffe,die
- LeistungsfähigkeiteinessolchenAssemblersdarlegenzukönnen,
- einigederdamitverbundenenEigenarten,und,warumersound
- nichtandersprogrammiertwurde.UmdenLesernichtzuverwirren,
- verzichteichaufVerallgemeinerungen.Ichwerdegelegentlich
- Dingedarstellen,diesichspeziellaufmeinSystembeziehenund
- aufanderenSystemenleichtabweichenkönnen.
-
- KurzgesagtisteinFORTH-Systemeineinteraktive
- Programmierumgebung,indereinzelneModule,'Worte'genannt,in
- einerDatenstrukturnamensDictionaryabgelegtwerden.Der
- ProgrammiererkannneueWortehinzufügen,dieentwederaus
- vorhandenenFORTH-WortenoderausMaschinencodedefinitionen
- bestehen.EinAssemblerineinemFORTH-SystemisteinWerkzeug,um
- Coderoutinenzudefinieren.Eristnichtdazuvorgesehen,
- eigenständigeApplikationeninMaschinensprachezuschreiben.Ein
- FORTHCross-Assembleristganzähnlichaufgebaut.Mitihmkannman
- Codeerzeugen,deraufeinemanderenSystemläuft,eventuellsogar
- aufeinemanderenProzessor.DieserArtikelbeziehtsichnurauf
- 'normale'FORTH-Assembler.FORTH-Assemblersindkurz,dasieauf
- vorhandeneFORTH-Wortezurückgreifenkönnen;dieserAssemblerz.B.
- benötigtnurca.3kByte,dazukommtdasSystemmit12kByte.Zum
- Vergleich:DerAssembler,derzumCPM68kgehört,benötigt44
- kByte,zusätzlichetwa6kBytefürdieSymboltabelle.
-
- WennmanApplikationeninFORTHschreibt,wirdderAssembler
- selteneingesetzt,bevordieeinzelnenProgrammteilenichtin
- High-Levelgeschriebenundausgetestetsind.IndenAnfangsstadien
- einerEntwicklungistdieZeit,diederProgrammiererbraucht,
- wesentlichwertvolleralsdiederMaschine.WenneineApplikation
- lauffähigist,magessichherausstellen,daßsieinHigh-Levelzu
- langsamist.IndiesemFallemußmanherausfinden,welcheRoutinen
- zeitkritischsindunddannnurdieseinCodeneuschreiben.Diesen
- Vorgangwiederholtmansolange,bisdasProgrammschnellgenug
- ist.VermeidenSiemehrCoderoutinenalserforderlich,dadiese
- dieÜbertragbarkeitIhresProgrammsstarkeinschränken.In
- seltenenFällen,wennmaneinesehrzeitkritischeAnwendungvor
- sichhat,wirdmanletztlichfastallesinCodeschreiben.
-
- SogarinsolchenFällenwirddieEntwicklunginderoben
- beschriebenenReihenfolgeamschnellstenzuResultatenundzur
- fertigenAnwendungführen.SeienSieimmerbereit,frühere
- EntwürfeüberdenHaufenzuwerfenundvonvornzubeginnen.Der
- SchlüsselzumErfolgistschrittweiseAnnäherung:Schreiben,
- Testen,Überarbeiten,bisSieendgültigzufriedensind.Dasist
- derGrund,warumessowichtigist,zunächsteineeinfacheVersion
- zuentwickeln,umzusehen,obdieGrundideerichtigund
- durchführbarist.
-
- DerNameeinesFORTH-Worteskannausbiszu31Ascii-Zeichen
- bestehen,ausgenommensindLeerzeichen.WorteimDictionarysind
- inGruppenzusammengefaßt,diemanVocabularysnennt.Der
- AssembleristeinsolchesVocabularynamensASSEMBLER.Diemeisten
- WorteimAssemblerhabendieNamenderüblichenMnemonicsdes
- Prozessors,inunseremFalledes68000.WennsoeinWort
- ausgeführtwird,legtesdiezugehörigeBytefolgeimDictionary
- ab.AndereWorteimAssemblerbehandlendieAdressierungsart,
- Kontrollstrukturen,Makrosundmöglicherweiseandere
- Erweiterungen.HältmansichaneineFORTH-üblicheSyntax,istes
- mitwenigAufwandmöglich,einensehrleistungsfähigenAssembler
- zuimplementieren.
-
- DiezweiwichtigstenEinschränkungensinddieSyntaxundder
- VerzichtaufVorwärtsreferenzen.WieinFORTHüblichsind
- Vorwärtsreferenzennichterlaubt.Dasheißt,einWortmußêvorÇ
- seinemerstenAufrufdefiniertsein.IchbinderÜberzeugung,dies
- isteineguteSache,aberdieseMeinungbeschwörtendloseDebatten
- herauf,undichwerdesiehiernichtbeeendenkönnen.Esistsehr
- vieleinfacher(unddamitaucherheblichschneller),wennmaneine
- Syntaxverwendet,beiderderOperatorhintensteht.Dasbedeutet,
- dieBefehlewerdeninfolgenderFormgeschrieben:
- üSourceDestinationOperationÇ
-
- WennauchungewöhnlichistdiesesFormatsehrflexibelundeinfach
- zuverwenden.EinPre-Prozessor,derdieüblicheSchreibweise
- verarbeitenkann,könnterelativleichteingebautwerden,wennman
- dieGeschwindigkeitsnachteileinKaufnimmt.
-
- DasDictionarywächstinRichtungsteigenderAdressen,wennneue
- Wortehinzugefügtwerden.DiemeistenDatenstrukturenwerden
- ebenfallsimDictionaryabgelegt.DieSystemvariableDPzeigtauf
- dienächstefreieAdresse.DasWortHEREübergibtdenWertvonDP
- aufdemStack.DasWort,(comma)trägteinen16-Bit-Wertins
- Dictionaryein,dasWortc,(c-comma)einen8-Bit-Wert(einByte).
- DerAssmbleristnuraufcommaundc-commaaufgebaut.
-
-
- üFehlerbehandlung
- Ç
- WennicheinenAssemblerbenutze,erwarteichvonihmeinige
- wichtigeLeistungsmerkmale.AnersterStellestehtnatürlichdie
- richtigeÜbersetzung:RichtigeEingabenmüssenzurichtigen
- Ausgabenführen.DaszweiteistdieGeschwindigkeit.Ichmöchte,
- daßderAssemblerseineArbeitsoschnellwiemöglicherledigt.
- DasdritteistdieGenauigkeitderÜbersetzung:Wennich
- Assemblercodeschreibe,möchteichihnselbstoptimieren.Ich
- möchtekeinenoptimierendenAssemblerbenutzen-ichhasse
- Überraschungen.Schließlichverwendeichungernallzu'schlaue'
- Operatoren,d.h.solche,diemireingewissesMaßanDenkfaulheit
- erlauben,wennz.B.ADDmanchmalADDI,manchmalauchADDQ,ADDA
- odersonstetwasassembliert.SolcheOperatorensindlangsamerund
- ihrVerhaltenwenigerdurchsichtig.DaFORTH-Assemblererweiterbar
- sind,kannjederBenutzereigene'schlaue'Operatorenhinzufügen,
- wennermöchte.
-
- ♪≈BeiderFehlerbehandlungkannimAssemblerbeliebigerAufwand
- getriebenwerden.ImIdealfallsollteeinAssemblernurkorrekte
- Eingabenakzeptieren.EskannallerdingsvoralleminBezugauf
- dieGeschwindigkeitteuerwerden,wennmanübertriebene
- Fehlerkontrolleeinbaut.ZumGlückkönnenvieleFehlersehrleicht
- entdecktwerden.Esisteinfachzuprüfen,obsichdieStacktiefe
- währendeinerDefinitionverändert(keinWertbleibt
- unzulässigerweiseübrigbzw.wirdverbraucht),obdie
- Kontrollstrukturenausgeglichensindusw.
-
- DienächsteStufederFehlererkennungistdiePrüfungauferlaubte
- AdressierungsartenbeijedemBefehl.Beieinersehrgeradlinigen
- Prozessorarchitekturistdassehreinfach.Unglücklicherweiseist
- der68000nichtganzdazugeeignet,auchwennoftdasGegenteil
- behauptetwird.TrotzdemkönnenvieleBefehleeinfachüberprüft
- werden.Obwohlichsoetwasgewöhnlichnichtbenutze,habeich
- einigeWorteeingebaut,dienachprüfen,obdenBefehlengültige
- Adressierungsartenzugeordnetsind.??DNbrichtab,wennkeine
- direkteAdressirungeinesDatenregistersvorliegt.??ANführtdas
- gleichefüreinAdreßregisterdurch.??JMPbrichtab,wennbeim
- JMP-BefehleineungültigeAdressierungbenutztwurde.
-
- FürweitergehendeFehlererkennungmußzunehmenderAufwandbei
- abnehmenderWirkunggetriebenwerden.
-
-
- üGebrauchsanleitungfürdenAssembler
- Ç
- EinedetaillierteundziemlichgenaueBeschreibungdesMotorola
- MC68000findetmanimUser'sManual.AlsBeispielfürdie
- BenutzungdesAssemblersnehmenSiebittedieDefinitiondes
- WortesFILL,daseinenSpeicherbereichmiteinemvorgegebenenByte
- füllt.Eswirdfolgendermaßenbenutzt:
- adresselängebyteFILL
- BeachtenSie,daßFILLdreiParametervomStackbenötigtund
- nichtsübrigläßt.
- (DasfolgendeBeispielwurdesoabgeändert,daßesdemvolksFORTH-
- 83entspricht.NähereszudenMacross.u.-Anm.d.Übers.)
-
- Codefill(adrlenval--)
- SP)+D0move\WertnachD0
- SP)+D1move\LängenachD1
- SP)+D6move\AdressenachD6,
- D6reg)A0lea \reg)isteinMacro,dasausder16-Bit-
- \Systemadresseeineabsolute32-Bit-
- \Adresseberechnet.
- D1tst0<>IF\WennLängevon0verschieden
- 1D1subq\decrementD1;dbraläuftbis-1,nicht0
- D1DO.bD0A0)+moveLOOP
- \SchleifebisD1=-1;jedesmalwirdeinByteindie
- \Adresse,dieinA0steht,geschriebenundA0incrementiert.
- THEN\
- Next \einMacro,daszumnächstenWortspringt.
- end-code\beendetdieDefinition
-
- ♪⌠DasWortCODEisteindefiningword.EsbauteinenKopffürdas
- neueWortFILLundsetztdessenCodefeldaufdasParameterfeld.
- DasSystembleibtiminterpretierendenModus.DerAssembler
- benutztdenFORTH-CompilerênichtÇ,wiehäufigfälschlichangenommen
- wird.DerKopfistsoetwaswieeinEintragineineSymboltabelle.
- DasCodefeldeinesjedenWorteszeigtaufdenCode,dendieses
- Wortausgeführensoll.NormalerweisezeigenalleWorte,diemit
- denselbendefiningwordserzeugtwordensind,aufdengleichen
- Code.Worte,diemitCODEerzeugtwerden,bestehenauseinem
- einzigartigenCode-Segment,dasimmeraufdasParameterfeldeben
- diesesWorteszeigt.DieübrigenWortederCodedefinitionerzeugen
- eineBytefolgeimParameterfelddesWortes.
-
- Assembler-Opcode-WortewieMOVEbenutzendasWortcomma,umder
- ReihenachBytesinsParameterfeldeinzutragen.WenndasneueWort
- nachseinerAusführungindenFORTH-Interpreterzurückkehrensoll,
- mußdieletzteAnweisungNEXTsein.NextisteinMakro,daseinen
- SprungindenFORTH-Interpreterassembliert.SeineDefinition
- lautet(imvolksFORTH-83):
-
- :NextIP)+D7move\D7enthältcfa
- D7reg)D6move\D6enthältcfa@
- D6reg)jmp \Sprungaufcfa@
- ;
-
- (DasMacroreg)wirdweiteruntenbeschrieben.Anm.d.Übers.)
- JMPbenutztcomma,umdenrichtigenOpcodeunddieAdresse
- einzutragen.END-CODEmarkiertdasEnde,prüftaufFehlerund
- räumteinbißchenauf.
-
- SPistderNamedesStackpointersdervirtuellenFORTH-Maschine.
- DasWortSPhinterläßteinenWertaufdemStack,derden'direct-
- adressing'ModusmitRegisterA6(volksFORTH-83)darstellt.Das
- WortA6hatgenaudiegleicheWirkung;beidessindeinfache
- Konstanten.DasWort)+modifiziertdenWertaufdemStack,denSP
- hinterlassenhat,umdie'indirectmitauto-increment'
- Adressierunganzuzeigen.Wiedasfunktioniert,wirdspäter
- erklärt.DasWortD0stelltDatenregister0dar.
-
- DasWortMOVEassemblierteinen68000move-Befehl.Esbenötigt
- zweiWerte,diejeweilseineAdressierungsartbeinhalten.In
- unseremBeispielwirdderassemblierteCode16Bitausder
- Adresse,aufdieSPzeigt,nachD0transportierenunddabeiSPum
- zweierhöhen.DieLängederOperationwirdfestgelegtvonder
- VariablenSIZE,dieauf16-Bitvoreingestelltist.SIZEwirddurch
- .B(Byte),.W(Word)und.L(Long)gesetzt.
-
- DasWortCODEschaltetdasAssembler-Vocabularyein,damitbei
- gleichenWortenimAssemblerundimübrigenSystem(z.B.SWAP)das
- richtigegefundenwird.DasWortLMOVEwurdezusätzlichdefiniert
- alsSpezialfallvonMOVEfürdieobenangesprochene
- Registerverschiebung.LMOVEassembliertimmereinenLongmove,
- ohnedabeiSIZEzuverändern.BeachtenSiedenGebrauchvonDOund
- LOOPimAssembler.DOerhälteinDatenregisterzugeordnet,dasden
- SchleifenzählerfürdieAusführungsphaseenthält.DOübergibtHERE
- unddasRegisteranLOOP,welcheseinendbrazurückaufDO
- assembliert,beidemdasangegebeneDatenregisterbenutztwird.
- (InähnlicherWeiseassembliert 0<>IF einenbeq(!),dessen
- OffsetbeimfolgendenTHENberechnetwird.BeachtenSiebitte,daß
- dieSprungbedingungenvorIFimmergeradeentgegengesetztden
- Sprungbefehlensind,alsobeqbei0<>oderbnebei0=.Anm.d.
- Übers.)
-
- üImplementation
- Ç
- Esgibtvielemöglicheunddarunterzweihäufigerbeschrittene
- Wege,umeinenAssemblerinFORTHzuschreiben.EineMethodeist,
- vieleVariablemitStatus-Informationenzubenutzen,die
- ihrerseitsvondenMnemonic-Wortenverwendetwerden,umden
- Assembliervorgangzusteuern.NachjederInstruktionwerdensie
- gelöscht,umvondernächstenInstruktionwiederverwendetwerden
- zukönnen.BeidiesemAssembleristeineweiterverbreiteteund
- auchwünschenswertereMethodegewähltworden.Fastsämtliche
- InformationenwerdenaufdemStackübergeben,derauchnicht
- initialisiertwerdenmuß.
-
- EbensogibteszweiverbreiteteArten,dieAdressierungsartandas
- assemblierendeWortzuübergeben.EineMöglichkeitbestehtin
- einerArtgeschachtelterIF...ELSEStrukturen,dieauseinerFolge
- vonMöglichkeitendierichtigeherauszusucht.DerandereWeg,hier
- eingesetzt,bestehtdarin,daßdieWorte,diedieAdressierungsart
- bestimmen,dieWerte,dieihnenübergebenwurden,inirgendeiner
- Formverändern.DiesgeschiehtdurchAusmaskierenmitANDund
- SetzeneinzelnerBitsmitOR.SolcheLogikoperationenarbeiten
- bekanntlichvielschnelleralsVerzweigungen,sodaßderAssembler
- insgesamtmitsolchenOperationenschnellerwird.
-
- WennSiediefolgendenBeschreibungenlesen,solltenSiesichden
- QuelltextdesAssemblerszurHandnehmen.Erbefindetsichauf
- IhrerDisketteimFileASSEMBLE.SCR.
-
- DieGrundidee,diehinterdiesemAssemblersteckt,istdie
- BetrachtungeinerMaschinencodeinstruktionalsReihevonBit-
- Feldern.DieseBit-FeldersindimManualderCPUbeschrieben.
- EinigesindfürvieleInstruktionengültigwiesourceund
- destination,modeundregisterFelder.
-
- |op-code|destreg|destmode|sourcemode|sourcereg|
- |1512|119|86|53|20|
-
- Wiebereitserwähnt,benutzenInstruktionen,diedieDatenlänge
- kennenmüssen,dieVariableSIZE.DiePositiondesBit-Felds,das
- dieDatenlängebestimmt,wechseltvonBefehlzuBefehlmehrals
- alleanderen.FastimmerwerdendiebenutztenWerteindie
- VariableSIZEübergeben,undzwardurch.B,.Woder.L.Beachten
- Sie,daßichandiesemPunktBASEaufOCTALumgeschaltethabe.Die
- 68000-Befehleenthaltenviele3-Bit-Felderundkönnendaher
- besondersübersichtlichalsOktalzahlendargestelltwerden.Ich
- wargezwungen,meineVorliebefürHexzahlenzeitweilig
- zurückzustellen.
-
- BeiderDefinitionderWorte,dieRegisterundAdressierungsarten
- festlegen,habeichzueinemkleinenTrickgegriffen.Ichbenutzte
- ein'Multi-definingword'REGS,dasineinerSchleifeCONSTANT
- ausführt,umähnlicheKonstantenzuerzeugen.REGSwirdnur
- zweimalbenutzt.EinmalfürDatenregisterundeinmalfür
- Adreßregister,dieModus0bzw.1darstellen.
-
- Modus0ist'dataregisterdirect',daheristD5eine
- KonstantemitdemWert5005.
-
- Modus1ist'adressregisterdirect',daheristA3eine
- KonstantemitdemWert3113.
-
- ♪√Worte,diemitMODEdefiniertwurden,werdennacheinem
- AdreßregisterbenutztundersetzendiezweiModusziffern(in
- unseremFall1)mitdenneuenModus-Werten.Diesgeschiehtdurch
- AusmaskierenderaltenWertemitANDundSetzenderneuenmitOR.
- AlleMODE-Wortesind'adressregisterindirect'mitZusätzen.
-
- Modus2ist'adressregisterindirect',
- daherergibtA6) 6226.
-
- Modus3istdasselbemit'post-increment',
- daherergibtA7)+ 7337.
-
- Modus4istdasselbemit'pre-decrement',
- daherergibtA7-) 7447.
-
- Modus5istdasselbemit'displacement',
- daherergibt123A1D) 1551
- mitdem'displacement'Wertvon123,derzunächstunterdem
- Register/ModusWertaufdemStackliegt.
-
- Modus6istdasselbemitindexunddisplacement,
- daherergibt123D4A1DI) 1661.
- AufdemStackliegendarunter4004und123.
-
- Modus7wirdfüralleübrigenAdressierungsartenverwendet,die
- sichdurchihreRegisterfelderunterscheiden.DieseModisindals
- Konstantendefiniert.
-
- #)ist0770undstelltdieabsolute(16-Bit)Adressierung
- dar.DerNamebedeutet'immediateindirect'.(DenkenSie
- darübernach!)
-
- L#)ist1771undstelltdieabsolute(32-Bit)Adressierung
- dar.
-
- PCD)ist2772undstelltden'programcounterrelativemit
- displacement'Modusdar.123PCD)ergibt2772unddarunter
- liegt123aufdemStack.
-
- PCDI)ist3773undstelltden'programcounterrelative
- displaced,indexed'Modusdar.123D4PCDI)ergibt3773und
- darunter4004und123aufdemStack.
-
- #ist4774undstelltden'immediatedata'Modusfür16oder
- 32Bitdar.456#ist4774,darunterliegt456.
-
- (Anmerkungd.Übers.:ZusätzlichhabenwirinsvolksFORTH-83
- einigeweitereAdressierungsartenaufgenommen.Mehrdazuweiter
- unten.)
-
- BeachtenSie,daßimmer1bis316-Bit-WerteaufdemStack
- hinterlassenwerdenm,diedieAdressierungsartkennzeichnen.Der
- obersteWertwirdnormalerweiseTeilderersten16Biteines
- BefehlszusammenmitdemOpcode.FallszusätzlicheWertevorhanden
- sind,werdensieimAnschlußandenOpcodeassembliert.
-
- ♪⌠Manche3-Bit-Felderwerdenhäufiger(durchAusmaskierung)
- selektiertalsandere.DasWortFIELDerzeugtWorte,mitdenenman
- solcheFelderselektierenkann.RSundRDwählendiesourceund
- destinationregisterFelder(s.Bildoben)aus.MSselektiertdas
- sourcemodeFeld.DererzeugendeAusdruckfüreinevollständig
- festgelegtAdressierungsartisteineeffektiveAdresse(EA).Das
- WortEASwähltdie'sourceeffectiveadress',dieausdensource
- modeundregisterFeldernbesteht.LOWselektiertdieunteren8
- Bits.DasOpcode-WortenthältofteinEASFeld.DasWortSRCführt
- OVEREASOR
- aus,womitesdiesesFeldinsOpcode-Wortüberträgt.DasWortDST
- bautdasdestinationregisterFeldein.
-
- DievirtuelleFORTH-MaschineenthältfünfRegister.Diesesind
- einzelnen68000Registernzugeordnet.EsistimAssemblermöglich,
- sowohldie68000Register-NamenalsauchdieNamenderRegister
- dervirtuellenMaschinezubenutzen.(Bemerkungd.Übers.:Sie
- solltendie68000Registernamennurdannbenutzen,wennsiekeine
- FORTH-Registermeinen.Sievermeidensounerklärliche
- Systemabstürze,fallsdieRegisterzuordnungsichändert.)
-
- Adressierungsarten,dienachdemOpcodeweitereWerte
- assemblieren,nenntman'extendedadressing'.Solche
- AdressierungsartenwerdenmitsechsWortenundeinemBuffer
- abgehandelt.DOUBLE?hinterläßteinFlag,daswahrist,fallsder
- Modus,derobenaufdemStackliegt,zusätzliche32Bitverlangt.
- INDEX?suchtnacheinerAdressierungsartundverändertseine
- zusätzlichenWerteindaspassendeFormat,fallsessichum
- 'indexed'Adressierunghandelt.MORE?hinterläßteinTrue-Flag,
- wenndieAdressierungsartweitereWertebenötigt.MOREträgtalle
- zusätzlichenWertehinterdemOpcode-WortinsDictionaryein.
-
- EinigeInstruktionenbrauchenzweiAdressierungsarten,einefür
- sourceundeinefürdestination.DersourceModuswirdzuerst
- festgelegt,sodaßerunterdemdestinationModusaufdemStack
- liegt.JedeAdressierungsartbestehtauseinbisdreiWerten,die
- aufdemStackliegen.DersourceModuswirdvordemdestination
- Modusverarbeitet,dahermüssendieWertefürdendestination
- ModussolangeineinemBufferabgelegtwerden.EXTRA?rettetalle
- zusätzlichenWerteineinenBuffernamensEXTRAundhinterläßtnur
- denWertfürdieAdressierungsart.,EXTRAnimmtdiezusätzlichen
- WerteausdemBufferundträgtsieinsDictionaryein.
-
- FastderganzeRestdesAssemblersbestehtausDefinitionenund
- derAnwendungvondefiningwords,dieGruppenvonMnemonics
- erstellen.ZweiBeispielewerdengenügen.WennSiemitdem
- Genrauchvondefiningwordsnichtvertrautsind-Siesolltenes
- sein;siesinddieleistungsfähigsteStrukturinFORTH.
-
- DasWortIMMerzeugtWorte,die'immediate'Befehleassemblieren.
- IchwerdedieDefinitionhierwiederholenundgenauerläutern.
- :IMMCONSTANT
- DOES>@>REXTRA?EASR>OR
- SZ3,LONG??,,EXTRA;
-
- GebrauchbeiderDefinition:3000IMMADDI
- GebrauchimAssembler:neaADDI
- Beispiel:123A5)ADDI
-
- ♪√JedesMal,wennmitIMMeinMnemonic-Wortdefiniertwird,
- speicherteseinenkonstantenWertinderDefinitiondiesesWortes
- ab,deresvonanderen'immediate'Wortenunterscheidet.Dieser
- WertistderOpcodedesBefehls.ImmediateBefehlebeinhalten
- folgendeBit-Felder.
-
- |op-code|size|mode|reg|
- |158|76|53|20|
-
- Diesenfolgen16oder32BitDaten.WenndasBefehlswort
- ausgeführtwird,führtesdenCodenachDOES>inIMMausmitder
- AdresseseineseigenenParameterfeldesaufdemStack.Andieser
- AdresseistdieKonstante(derOpcode)kompiliert.DasWort@
- liestdiesenWertundrettetihnmit>RaufdenReturnstack.ADDI
- erhältdie'immediate'DatenaufdemStackunterhalbderWertefür
- dieAdressierungsart.EXTRA?rettetallezusätzlichenWerte,EAS
- selektiertdiemodeundregisterFelder,diebenutztwerden
- sollen.DannwirdderOpcodevomReturnstackmitR>geholtund
- durchORmitEASverknüpft.SZ3setztdiezugehörigenLängenbits
- ausSIZE,unddasWortcommaträgtdasOpcode-WortinsDictionary
- ein.JetztliegennurnochdieDatenaufdemStack,undLONG?
- entscheidet,ob?,16oder32Bitanhängensoll.ZumSchlußholt
- ,EXTRAdiegerettetenzusätzlichenWerte,fallsvorhanden,zurück
- undhängtsieebenfallsan.
-
- Zahlreicheandereähnlichaufgebautedefiningwordswerden
- benutzt,umdiemeistenübrigenBefehlezudefinieren.Viele
- dieserWortbildenfürsicheineGruppeundsinddeswegenmitdem
- Wort:definiert,geradesowieMakros.DieconditionalBefehle
- sindsoregelmäßig,daßichnochein'trickdefiningword'
- benutze.SETCLASSverwendetwiederholteinvorhandenesdefining
- word,jedesmalmiteinemanderenArgument,ummehrereMnemonic-
- Worteaufeinmalzudefinieren.Alle46conditionalBefehlewerden
- definiert,indemjedesderdreidefiningwords16malaufgerufen
- wird.DabeientstehtauchzweiungültigeMnemonics,dienicht
- weiterbenutztwerden.VielleichtwäreesindiesemFallebesser
- gewesen,alle46Befehleeinzelnzudefinieren,aberichwollte
- zeigen,wasallesmachbarist.
-
- ZumSchlußkommenwirzudenstructuredconditionals.Betrachten
- SiefolgendesBeispiel:
-
- A3)+D1CMP0<
- IFD0A7)MOVE
- ELSEA7)D0MOVE
- THEN
-
-
- BEGINA3D2CMP0=
- WHILEA0)+D0MOVE
- REPEAT
-
- ImerstenBeispielbeeinflußtdasErgebnisdesVergleichs
- bestimmteFlagsimStatus-Register.IFassemblierteinenbedingten
- Sprung,dessenOpcode(mitBedingung)durch0<festgelegtist.
- DieserassembliertalsodenWertfüreinenBGE(Branchgreateror
- equal).ELSEberechnetdenSprungoffsetfürIFundassembliert
- einenunbedingtenSprung;THENberechnetdessenOffset.
-
- EbensoberechnetWHILEeinenbedingtenSprunghinterREPEAT,
- welcheswiederumeinenunbedingtenSprungzurückaufBEGIN
- assembliert.
-
- BeachtenSie,daßkeineLabelsnötigsind.DermeisteWirrwarrin
- normalenAssemblerQuelltextenentstehtdurchdieriesigeAnzahl
- anbedeutungslosenLabelnamenfürSprungziele.BeachtenSieauch,
- daßdiestructuredconditionals,diewirhierdefinierthaben,nur
- 1-ByteOffsetsbenutzen.DaderAssemblernureinenPass
- durchläuft,mußderPlatzfürdenSprungoffsetfreigehalten
- werden,bevorseineGrößebekanntist.DaCoderoutineninFORTH
- immersehrkurzsind,genügteinBytefürdenOffset.Solltedas
- nichtausreichen,ersetzeicheinfachdieseDefinitionendurch
- sehrähnliche,dieeinen16-BitOffsetbenutzen.
-
- Scließlichsolltebemerktwerden,daßeskeineWortefürdie
- EinrichtungvonDatenstrukturenindiesemAssemblergebenbraucht.
- EinFORTH-AssembleristTeileinerFORTH-Umgebung;undaufalle
- Datenstrukturen,diemitnormalenFORTH-Wortenerzeugtwurden,
- kannderAssemblerzugreifen.
- EinBeispiel:
-
- VARABLEFOO
- CODEBARFOOR#)NEGNEXTEND-CODE
-
- BARnegiertdenInhaltderVariablenFOO.
-
- üvolksFORTH-83AssemblerÇ
-
- Wiebereitsgesagt,beruhtderAssemblerimvolksFORTH-83im
- WesentlichenaufdemvonMichaelPerry.DieRegisterbelegungist
- jedochetwasanders,undeswurdeneinigeneueBefehle
- implementiert,diediebesondereStukturvonvolksFORTH-83,z.B.
- denHeap,ausnutzen,odersichaufgrundderrelokatiblenStruktur
- alsnotwendigherausgestellthaben.
-
-
- üStrukturdesrelokatiblenvolksFORTH-83Ç
-
- volksFORTH-83istein16-Bit-System,d.h.eslassensich64kByte
- Speicheradressieren.Bisherlagendiese64kByteineiner
- Speicherbank(ab$50000),sodaßdie16-Bit-AdressenimFORTH-
- SystemmitHilfeeinerKonstantennamensmempage(=0005)auf32-
- Bit-Adressenerweitertwerdenkonnten.DieseStrukturhatsich
- jedochalssehrunflexibelerwiesen,sowaresz.B.nichtmöglich,
- RAM-Diskszubenutzen.Wennmanstand-alone-Applikationenerzeugen
- wollte,mußtemandazueigenseinLadeprogrammschreiben,dessen
- einzigerSinndarinbestand,daseigentlicheProgrammnach$50000
- zuladenunddortzustarten.
-
- DieneueStrukturgehtdavonaus,daßdasSystemanbeliebiger
- StelleimSpeicherlauffähigseinsoll(relokatibel).
- Dementsprechenddürfenkeineabsoluten32-Bit-AdressenimSystem
- mehrvorkommen,weilsonstzusätzlicheRelokationsinformationen
- mitabgespeichertwerdenmüßten,waseinSAVESYSTEMnahezu
- unmöglichmachenwürde.Glücklicherweisebietetder68000-
- ProzessoreinerechtleistungsfähigeAdressierungsart,nämlichdie
- 'indirekteAdressierungmitIndexundDisplacement'.Grundlageist
- dabeieinAdreßregister,daßaufByte0desFORTH-Systemszeigt
- undForthpointer(FP)heißt.AlleSpeicheroperationenmüssennun
- relativzudiesemZeigererfolgen.
-
- Die16-Bit-AdressenimFORTH-SystemwerdennunalsOffsetzumByte
- 0desSystemsaufgefaßtundalsIndexineinemDatenregister
- benutzt.UnglücklicherweisewerdenDatenregister,diealsIndex
- verwendetwerden,auf32Bitvorzeichenerweitert,wennsienur
- wortweiseadressiertwerden.DerAssemblermußtedaherso
- abgeändertwerden,daßbeidenAdressierungsartenDI)undPCDI)
- dieLängederOperationunabhängigvonderLängedes
- Indexregistersangegebenwerdenkann.EinBeispiel:Die
- Befehlsfolge
-
- .l0D6FPDI).wD0move
-
- addiertzuFPdenWertdesDatenregistersD6lang,alsoohne
- Vorzeichenerweiterung,geMOVEdwerdenabernur16Bit.Stehtalso
- inD6die16-Bit-AdresseeinerFORTH-Variablen,z.B.$9000und
- zeigtFPauf$12300,würdedieseBefehlsfolgeden16-Bit-Inhalt
- derVariablen,dieabsolutbei$1B300liegt,insRegisterD0
- bringen.
-
-
- üZusätzlicheAdressierungsartenÇ
-
- UmdasProgrammiereninAssemblernunnichtnochschwierigerzu
- machenalsesohnediesschonist,habenwireinigeMacros
- entwickelt,diedenCharaktervonAdressierungsartenhaben.
-
- ♪≤:reg)sizepush.l0swapFPDI);
-
- DieseAdressierungsartkönnte'Datenregisterindirect'benannt
- werden.EinBeispiel:
-
- Code@(addr--16b)
- SP)+D6moveD6reg)SP-)moveNext
-
- assembliertgenaudasselbewie
-
- Code@(addr-16b)
- SP)+D6move.l0D6FPDI).wSP-)moveNext
-
- DieAdresseaufdemStackwirdinD6geladen;D6wirdlangzum
- ForthpointeraddiertundderInhaltdieserSpeicherstellewieder
- aufdenStackgebracht.(Anmerkung:@imSystemistetwas
- komplizierterdefiniert,daauchderZugriffaufungeradeAdressen
- gestattetist,wasbeiderobigenDefinitioneinenAdreßerror
- auslösenwürde.)
-
- ZumZugriffaufDatenstrukturen,vorallemaufVariablen,dient
- dasMacro
-
- :R#)(addr--)sizepush.w
- dup0<IF#D6moveD6reg)exitTHEN
- FPD);
-
- DiesesMacrogabesauchschonim'alten'System,derEffektist
- auchdergleiche,sodaßvorhandeneAssemblerquelltextenicht
- umgeschriebenwerdenmüssen.DieWirkungsweisehatsichjedoch
- geändert:Istaddrnegativ-alsogrößerals$7FFF-wirddie
- AdressedirektnachD6geladenunddannwiebereitsbeschrieben
- mitD6indiziert.Liegtaddrjedochindenunteren32kBytedes
- FORTH-Systems,erfolgtderZugriffmitaddralsDisplacementohne
- Indexregister,waserheblicheGeschwindigkeitsvorteilebringt.Vor
- allemdieFORTH-SystemvariablenlassensichaufdieseArtund
- Weiseschnellerreichen.EinweiteresBeispiel:
-
- Variabletest
- Codetest@(--16b)
- testR#)SP-)moveNext
-
- TEST@legtdenInhaltderVariablenTESTaufdenDatenstack.
-
- SchließlichgibtesnochdasMacroPCREL),dessengenauere
- DefinitionimAssemblerquelltextASSEMBLE.SCRnachzulesenist.Es
- arbeitetähnlichwieR#),istaberschnellerundkürzer.Nachteil
- ist,daßder68000dieAdressierungsartPC-relativnichtbei
- allenOperatorenzuläßt,unddaßnichtdergesamte64kByte
- Adreßraumerreichbarist.PCREL)istmitFehlermeldungengegen
- falscheAdreßdistanzenabgesichert.
-
-
- üRegisterdervirtuellenFORTH-Maschine
- Ç
- FolgendeRegisterwerdenvomvolksFORTH-83benutzt:
-
- A3Forthpointer(FP).DiesesRegisterenthältdie
- StartadressedesSystemsundgibtdamitdieBasisfür
- allerelativenAdreßzugriffeinsSystem.Grundsätzlich
- gilt:Dieabsolute32-Bit-Adresseerhältmandurch
- Additionder16-Bit-Forth-AdresseundFP.Die16-Bit-
- Forth-AdressenlassensichalsoalsOffsetzum
- Systemanfangauffassen.
-
- A4Instructionpointer(IP).DiesesRegisterenthältdie
- (absolute)32-Bit-CFAdesnächstenauszuführenden
- Wortes.
-
- A5Returnstackpointer(RP).DiesesRegisterenthältden
- 'Systemstackpointer'dervirtuellenFORTH-Maschine.Hier
- werden'Rücksprungadressen'inaufrufendeWorteusw.
- abgelegt.
-
- A6Datenstackpointer(SP).DiesesRegisterenthältden
- DatenstackpointerdervirtuellenFORTH-Maschine.Über
- diesenStackwerdenbekanntlichnahezusämtlicheWerte
- zwischeneinzelnenFunktionenübergeben.
-
- NebendiesenvierAdreßregisternwerdennochzweiDatenregister
- benutzt:
-
- D7Work-Register(W)dervirtuellenFORTH-Maschine;der16-
- Bit-WertindiesemRegisterzeigtaufdieCFAdes
- Wortes,dasgeradeausgeführtwird.
-
- D6EinHilfsregister,daszurUmrechnungvonrelativen16-
- Bit-Adresseninabsolute32-Bit-Adressenbenutztwird.
-
- DemProgrammiererstehenalsodieDatenregisterD0-D5sowiedie
- AdreßregisterA0-A2zurfreienVerfügung.D6undD7dürfen
- verändertwerden,êjedochmüssendieoberen16Bitimmerauf0
- stehenÇ.SollenweitereRegisterverwendetwerden,müssensie
- vorhergerettetundanschließendrestauriertwerden.
-
-
- üZusätzlicheBefehleÇ
-
- ;c:SchaltetdenAssemblerabunddenFORTH-Compileran.Damit
- istesmöglich,vonMaschinencodeinFORTHüberzuwechseln.
- EinGegenstückistnichtvorhanden.
-
- EinBeispielfürdieVerwendungvon;c:ist:
-
- ....0<IF;c:."Fehler";AssemblerTHEN
-
- IstirgendwaskleineralsNull,sowird'Fehler'ausgedrucktund
- dieAusführungdesWortesabgebrochen,sonstgehtesweiterim
- Code.
-
- ScließlichgibtesnochdieWorte>LABELundLABEL.>LABELerzeugt
- eineKonstanteaufdemHeap,wobeiesdenWertdesLabelsvom
- Stacknimmt.LABELerzeugteineKonstantemitdemWertvonHERE.
- Beispiel:
-
- LABELSCHLEIFE1D0subqSCHLEIFEBNE
-
- SCHLEIFEverbrauchtkeinenDictionaryspeicher,weilesvollständig
- -mitHeaderundWert-aufdemHeapliegt.Essindalsoechte
- Assemblerlabelsmöglich.VonderVerwendungsolcherLabelskann
- allerdingsnurabgeratenwerden,wennwieimobigenBeispiel
- ebensogutstrukturiertprogrammiertwerdenkönnte.
-
- Übrigensist>LABELstatesmart,d.hesverhältsichverschieden,
- jenachdem,obdasSystemkompiliertodernicht.Währendder
- KompilationwerdenLabelsalsLiteralskompiliert.Damitkönnen
- LabelsauchinColon-Definitionenverwendetwerden.EinBeispiel
- dazufindenSieimFileGEMDEFS.SCR.AlleWorteindiesemFile
- werdenalsLabels(KonstantenaufdemHeap)definiert.Währendder
- KompilationkompilierensiedieentsprechendenZahlen.Nachder
- Kompilationwerdensiegelöschtundverbrauchenkeinen
- Speicherplatz.Solchermaßen'mißbrauchte'Labelsmacheneinen
- Quelltextlesbarer,weilanStellevonnichtssagendenZahlen
- sinnvolleNameneingesetztwerdenkönnen.
-
-
- üDerDisassemblerÇ
-
- DerDisassemblerwirdgeladenmit
-
- includedisass.scr
-
- MitDISW<word>kannmaninCodegeschriebeneWorte
- disassemblieren.DasfunktioniertnatürlichmitSystemworten
- ebensogutwiemiteigenenDefinitionen.DieAusgabestoppt
- automatisch,wenneinNEXTerkanntwurde,undkanndannmit
- einerbeliebigenTastefortgesetztodermitEscapeabgebrochen
- werden.AuchwährendderAusgabekannmiteinerbeliebigenTaste
- unterbrochenodermitEscapeabgebrochenwerden.
-
- DerDisassemblerdisassembliertdieBefehleinderüblichen
- Motorola-Syntax,nichtinderSchreibweisedesFORTH-Assemblers.
- WerhäufigermitAssembler-Quelltextenzutunhat,wirddaszu
- schätzenwissen....
-
- WeitereBenutzer-WortedesDisassemblerssind
-
- dis(addr--)
-
- und
-
- ldis(laddr--)
-
- BeidedisassemblierenvoneinervorgegebenenFORTHbzw.
- Langadresseab.MitLDISlassensichauchRoutinenaußerhalbvon
- FORTHdisassemblieren,z.B.imTOSoderGEM.DieAusgabewird
- genausogesteuertwiebeidisw.
-
-
- üSonstiges
-
- ÇWieimArtikelvonMichaelPerrybereitszulesenwar,verzichtet
- derAssemblerauf'übertriebenesErrorchecking'.ImKlartextheißt
- das,daßmansichschonrechtgutmitdem68000-Befehlsumfang
- auskennensollte,insbesonderemitdenerlaubten
- AdressierungsartenundOperandenlängenbeideneinzelnenBefehlen.
- Anfängern-undnichtnursolchen(!)-seidringendempfohlen,
- grundsätzlichdenerzeugtenMaschinencodemitdemDisassemblerzu
- überprüfen.ManreduziertdamitdieAnzahldersonst
- unvermeidlichenSystemabstürzeerheblich,wieichauseigener
- Erfahrungweiß.
-
- DerFORTH-Assembleristetwasgewöhnungsbedürftig.Beispielefür
- verschiedenartigeAnwendungensindvorallemimFileFORTH_83.SCR
- zufinden.DieseBeispielesolltemanstudieren,bevormansichan
- eigeneExperimenteheranwagt.Manmußjanichtgleichmit(WORD
- beginnen....
-
-