home *** CD-ROM | disk | FTP | other *** search
/ Whiteline: Alpha / Whiteline Alpha.iso / progtool / forth / doc / f_assem.doc < prev    next >
Encoding:
Text File  |  1994-09-22  |  36.6 KB  |  755 lines

  1. 0660000020266
  2. 1
  3. 2Seite #
  4. 9[....................................................]
  5. üDerAssemblerÇ
  6.  
  7. DerimvolksFORTH-83fürdenAtari520STenthaltene68000-
  8. AssemblerentsprichtimWesentlichendemvonMichaelPerryfürdas
  9. F83entwickelten.DaherbringenwirhiereineÜbersetzungeines
  10. Artikelsaus'Dr.DobbsJournal',Nr.83vomSeptember1983,indem
  11. MichaelPerryseinenAssemblerbeschriebenhat.Abweichungendes
  12. volksFORTH-Assemblerswerdenbesonderserwähnt.ImAnschlußandie
  13. ÜbersetzungwerdendiezusätzlichenFunktionendesvolksFORTH-
  14. Assemblersbeschrieben.
  15.  
  16. ü
  17. Ein68000ForthAssembler
  18. Ç
  19. IndiesemArtikelwerdeichdieEigenarteneinesAssemblersin
  20. FORTH,seinenGebrauchunddieImplementationeinesBeispiels
  21. beschreiben:EinFORTHAssemblerfürden68000.Ichhoffe,die
  22. LeistungsfähigkeiteinessolchenAssemblersdarlegenzukönnen,
  23. einigederdamitverbundenenEigenarten,und,warumersound
  24. nichtandersprogrammiertwurde.UmdenLesernichtzuverwirren,
  25. verzichteichaufVerallgemeinerungen.Ichwerdegelegentlich
  26. Dingedarstellen,diesichspeziellaufmeinSystembeziehenund
  27. aufanderenSystemenleichtabweichenkönnen.
  28.  
  29. KurzgesagtisteinFORTH-Systemeineinteraktive
  30. Programmierumgebung,indereinzelneModule,'Worte'genannt,in
  31. einerDatenstrukturnamensDictionaryabgelegtwerden.Der
  32. ProgrammiererkannneueWortehinzufügen,dieentwederaus
  33. vorhandenenFORTH-WortenoderausMaschinencodedefinitionen
  34. bestehen.EinAssemblerineinemFORTH-SystemisteinWerkzeug,um
  35. Coderoutinenzudefinieren.Eristnichtdazuvorgesehen,
  36. eigenständigeApplikationeninMaschinensprachezuschreiben.Ein
  37. FORTHCross-Assembleristganzähnlichaufgebaut.Mitihmkannman
  38. Codeerzeugen,deraufeinemanderenSystemläuft,eventuellsogar
  39. aufeinemanderenProzessor.DieserArtikelbeziehtsichnurauf
  40. 'normale'FORTH-Assembler.FORTH-Assemblersindkurz,dasieauf
  41. vorhandeneFORTH-Wortezurückgreifenkönnen;dieserAssemblerz.B.
  42. benötigtnurca.3kByte,dazukommtdasSystemmit12kByte.Zum
  43. Vergleich:DerAssembler,derzumCPM68kgehört,benötigt44
  44. kByte,zusätzlichetwa6kBytefürdieSymboltabelle.
  45.  
  46. WennmanApplikationeninFORTHschreibt,wirdderAssembler
  47. selteneingesetzt,bevordieeinzelnenProgrammteilenichtin
  48. High-Levelgeschriebenundausgetestetsind.IndenAnfangsstadien
  49. einerEntwicklungistdieZeit,diederProgrammiererbraucht,
  50. wesentlichwertvolleralsdiederMaschine.WenneineApplikation
  51. lauffähigist,magessichherausstellen,daßsieinHigh-Levelzu
  52. langsamist.IndiesemFallemußmanherausfinden,welcheRoutinen
  53. zeitkritischsindunddannnurdieseinCodeneuschreiben.Diesen
  54. Vorgangwiederholtmansolange,bisdasProgrammschnellgenug
  55. ist.VermeidenSiemehrCoderoutinenalserforderlich,dadiese
  56. dieÜbertragbarkeitIhresProgrammsstarkeinschränken.In
  57. seltenenFällen,wennmaneinesehrzeitkritischeAnwendungvor
  58. sichhat,wirdmanletztlichfastallesinCodeschreiben.
  59.  
  60. SogarinsolchenFällenwirddieEntwicklunginderoben
  61. beschriebenenReihenfolgeamschnellstenzuResultatenundzur
  62. fertigenAnwendungführen.SeienSieimmerbereit,frühere
  63. EntwürfeüberdenHaufenzuwerfenundvonvornzubeginnen.Der
  64. SchlüsselzumErfolgistschrittweiseAnnäherung:Schreiben,
  65. Testen,Überarbeiten,bisSieendgültigzufriedensind.Dasist
  66. derGrund,warumessowichtigist,zunächsteineeinfacheVersion
  67. zuentwickeln,umzusehen,obdieGrundideerichtigund
  68. durchführbarist.
  69.  
  70. DerNameeinesFORTH-Worteskannausbiszu31Ascii-Zeichen
  71. bestehen,ausgenommensindLeerzeichen.WorteimDictionarysind
  72. inGruppenzusammengefaßt,diemanVocabularysnennt.Der
  73. AssembleristeinsolchesVocabularynamensASSEMBLER.Diemeisten
  74. WorteimAssemblerhabendieNamenderüblichenMnemonicsdes
  75. Prozessors,inunseremFalledes68000.WennsoeinWort
  76. ausgeführtwird,legtesdiezugehörigeBytefolgeimDictionary
  77. ab.AndereWorteimAssemblerbehandlendieAdressierungsart,
  78. Kontrollstrukturen,Makrosundmöglicherweiseandere
  79. Erweiterungen.HältmansichaneineFORTH-üblicheSyntax,istes
  80. mitwenigAufwandmöglich,einensehrleistungsfähigenAssembler
  81. zuimplementieren.
  82.  
  83. DiezweiwichtigstenEinschränkungensinddieSyntaxundder
  84. VerzichtaufVorwärtsreferenzen.WieinFORTHüblichsind
  85. Vorwärtsreferenzennichterlaubt.Dasheißt,einWortmußêvorÇ
  86. seinemerstenAufrufdefiniertsein.IchbinderÜberzeugung,dies
  87. isteineguteSache,aberdieseMeinungbeschwörtendloseDebatten
  88. herauf,undichwerdesiehiernichtbeeendenkönnen.Esistsehr
  89. vieleinfacher(unddamitaucherheblichschneller),wennmaneine
  90. Syntaxverwendet,beiderderOperatorhintensteht.Dasbedeutet,
  91. dieBefehlewerdeninfolgenderFormgeschrieben:
  92.      üSourceDestinationOperationÇ
  93.  
  94. WennauchungewöhnlichistdiesesFormatsehrflexibelundeinfach
  95. zuverwenden.EinPre-Prozessor,derdieüblicheSchreibweise
  96. verarbeitenkann,könnterelativleichteingebautwerden,wennman
  97. dieGeschwindigkeitsnachteileinKaufnimmt.
  98.  
  99. DasDictionarywächstinRichtungsteigenderAdressen,wennneue
  100. Wortehinzugefügtwerden.DiemeistenDatenstrukturenwerden
  101. ebenfallsimDictionaryabgelegt.DieSystemvariableDPzeigtauf
  102. dienächstefreieAdresse.DasWortHEREübergibtdenWertvonDP
  103. aufdemStack.DasWort,(comma)trägteinen16-Bit-Wertins
  104. Dictionaryein,dasWortc,(c-comma)einen8-Bit-Wert(einByte).
  105. DerAssmbleristnuraufcommaundc-commaaufgebaut.
  106.  
  107.  
  108. üFehlerbehandlung
  109. Ç
  110. WennicheinenAssemblerbenutze,erwarteichvonihmeinige
  111. wichtigeLeistungsmerkmale.AnersterStellestehtnatürlichdie
  112. richtigeÜbersetzung:RichtigeEingabenmüssenzurichtigen
  113. Ausgabenführen.DaszweiteistdieGeschwindigkeit.Ichmöchte,
  114. daßderAssemblerseineArbeitsoschnellwiemöglicherledigt.
  115. DasdritteistdieGenauigkeitderÜbersetzung:Wennich
  116. Assemblercodeschreibe,möchteichihnselbstoptimieren.Ich
  117. möchtekeinenoptimierendenAssemblerbenutzen-ichhasse
  118. Überraschungen.Schließlichverwendeichungernallzu'schlaue'
  119. Operatoren,d.h.solche,diemireingewissesMaßanDenkfaulheit
  120. erlauben,wennz.B.ADDmanchmalADDI,manchmalauchADDQ,ADDA
  121. odersonstetwasassembliert.SolcheOperatorensindlangsamerund
  122. ihrVerhaltenwenigerdurchsichtig.DaFORTH-Assemblererweiterbar
  123. sind,kannjederBenutzereigene'schlaue'Operatorenhinzufügen,
  124. wennermöchte.
  125.  
  126. ♪≈BeiderFehlerbehandlungkannimAssemblerbeliebigerAufwand
  127. getriebenwerden.ImIdealfallsollteeinAssemblernurkorrekte
  128. Eingabenakzeptieren.EskannallerdingsvoralleminBezugauf
  129. dieGeschwindigkeitteuerwerden,wennmanübertriebene
  130. Fehlerkontrolleeinbaut.ZumGlückkönnenvieleFehlersehrleicht
  131. entdecktwerden.Esisteinfachzuprüfen,obsichdieStacktiefe
  132. währendeinerDefinitionverändert(keinWertbleibt
  133. unzulässigerweiseübrigbzw.wirdverbraucht),obdie
  134. Kontrollstrukturenausgeglichensindusw.
  135.  
  136. DienächsteStufederFehlererkennungistdiePrüfungauferlaubte
  137. AdressierungsartenbeijedemBefehl.Beieinersehrgeradlinigen
  138. Prozessorarchitekturistdassehreinfach.Unglücklicherweiseist
  139. der68000nichtganzdazugeeignet,auchwennoftdasGegenteil
  140. behauptetwird.TrotzdemkönnenvieleBefehleeinfachüberprüft
  141. werden.Obwohlichsoetwasgewöhnlichnichtbenutze,habeich
  142. einigeWorteeingebaut,dienachprüfen,obdenBefehlengültige
  143. Adressierungsartenzugeordnetsind.??DNbrichtab,wennkeine
  144. direkteAdressirungeinesDatenregistersvorliegt.??ANführtdas
  145. gleichefüreinAdreßregisterdurch.??JMPbrichtab,wennbeim
  146. JMP-BefehleineungültigeAdressierungbenutztwurde.
  147.  
  148. FürweitergehendeFehlererkennungmußzunehmenderAufwandbei
  149. abnehmenderWirkunggetriebenwerden.
  150.  
  151.  
  152. üGebrauchsanleitungfürdenAssembler
  153. Ç
  154. EinedetaillierteundziemlichgenaueBeschreibungdesMotorola
  155. MC68000findetmanimUser'sManual.AlsBeispielfürdie
  156. BenutzungdesAssemblersnehmenSiebittedieDefinitiondes
  157. WortesFILL,daseinenSpeicherbereichmiteinemvorgegebenenByte
  158. füllt.Eswirdfolgendermaßenbenutzt:
  159.      adresselängebyteFILL
  160. BeachtenSie,daßFILLdreiParametervomStackbenötigtund
  161. nichtsübrigläßt.
  162. (DasfolgendeBeispielwurdesoabgeändert,daßesdemvolksFORTH-
  163. 83entspricht.NähereszudenMacross.u.-Anm.d.Übers.)
  164.  
  165. Codefill(adrlenval--)
  166. SP)+D0move\WertnachD0
  167. SP)+D1move\LängenachD1
  168. SP)+D6move\AdressenachD6,
  169.  D6reg)A0lea       \reg)isteinMacro,dasausder16-Bit-
  170. \Systemadresseeineabsolute32-Bit-
  171. \Adresseberechnet.
  172. D1tst0<>IF\WennLängevon0verschieden
  173. 1D1subq\decrementD1;dbraläuftbis-1,nicht0
  174. D1DO.bD0A0)+moveLOOP
  175. \SchleifebisD1=-1;jedesmalwirdeinByteindie
  176. \Adresse,dieinA0steht,geschriebenundA0incrementiert.
  177. THEN\
  178. Next                  \einMacro,daszumnächstenWortspringt.
  179. end-code\beendetdieDefinition
  180.  
  181. ♪⌠DasWortCODEisteindefiningword.EsbauteinenKopffürdas
  182. neueWortFILLundsetztdessenCodefeldaufdasParameterfeld.
  183. DasSystembleibtiminterpretierendenModus.DerAssembler
  184. benutztdenFORTH-CompilerênichtÇ,wiehäufigfälschlichangenommen
  185. wird.DerKopfistsoetwaswieeinEintragineineSymboltabelle.
  186. DasCodefeldeinesjedenWorteszeigtaufdenCode,dendieses
  187. Wortausgeführensoll.NormalerweisezeigenalleWorte,diemit
  188. denselbendefiningwordserzeugtwordensind,aufdengleichen
  189. Code.Worte,diemitCODEerzeugtwerden,bestehenauseinem
  190. einzigartigenCode-Segment,dasimmeraufdasParameterfeldeben
  191. diesesWorteszeigt.DieübrigenWortederCodedefinitionerzeugen
  192. eineBytefolgeimParameterfelddesWortes.
  193.  
  194. Assembler-Opcode-WortewieMOVEbenutzendasWortcomma,umder
  195. ReihenachBytesinsParameterfeldeinzutragen.WenndasneueWort
  196. nachseinerAusführungindenFORTH-Interpreterzurückkehrensoll,
  197. mußdieletzteAnweisungNEXTsein.NextisteinMakro,daseinen
  198. SprungindenFORTH-Interpreterassembliert.SeineDefinition
  199. lautet(imvolksFORTH-83):
  200.  
  201.      :NextIP)+D7move\D7enthältcfa
  202.                D7reg)D6move\D6enthältcfa@
  203.                D6reg)jmp       \Sprungaufcfa@
  204. ;
  205.  
  206. (DasMacroreg)wirdweiteruntenbeschrieben.Anm.d.Übers.)
  207. JMPbenutztcomma,umdenrichtigenOpcodeunddieAdresse
  208. einzutragen.END-CODEmarkiertdasEnde,prüftaufFehlerund
  209. räumteinbißchenauf.
  210.  
  211. SPistderNamedesStackpointersdervirtuellenFORTH-Maschine.
  212. DasWortSPhinterläßteinenWertaufdemStack,derden'direct-
  213. adressing'ModusmitRegisterA6(volksFORTH-83)darstellt.Das
  214. WortA6hatgenaudiegleicheWirkung;beidessindeinfache
  215. Konstanten.DasWort)+modifiziertdenWertaufdemStack,denSP
  216. hinterlassenhat,umdie'indirectmitauto-increment'
  217. Adressierunganzuzeigen.Wiedasfunktioniert,wirdspäter
  218. erklärt.DasWortD0stelltDatenregister0dar.
  219.  
  220. DasWortMOVEassemblierteinen68000move-Befehl.Esbenötigt
  221. zweiWerte,diejeweilseineAdressierungsartbeinhalten.In
  222. unseremBeispielwirdderassemblierteCode16Bitausder
  223. Adresse,aufdieSPzeigt,nachD0transportierenunddabeiSPum
  224. zweierhöhen.DieLängederOperationwirdfestgelegtvonder
  225. VariablenSIZE,dieauf16-Bitvoreingestelltist.SIZEwirddurch
  226. .B(Byte),.W(Word)und.L(Long)gesetzt.
  227.  
  228. DasWortCODEschaltetdasAssembler-Vocabularyein,damitbei
  229. gleichenWortenimAssemblerundimübrigenSystem(z.B.SWAP)das
  230. richtigegefundenwird.DasWortLMOVEwurdezusätzlichdefiniert
  231. alsSpezialfallvonMOVEfürdieobenangesprochene
  232. Registerverschiebung.LMOVEassembliertimmereinenLongmove,
  233. ohnedabeiSIZEzuverändern.BeachtenSiedenGebrauchvonDOund
  234. LOOPimAssembler.DOerhälteinDatenregisterzugeordnet,dasden
  235. SchleifenzählerfürdieAusführungsphaseenthält.DOübergibtHERE
  236. unddasRegisteranLOOP,welcheseinendbrazurückaufDO
  237. assembliert,beidemdasangegebeneDatenregisterbenutztwird.
  238. (InähnlicherWeiseassembliert 0<>IF einenbeq(!),dessen
  239. OffsetbeimfolgendenTHENberechnetwird.BeachtenSiebitte,daß
  240. dieSprungbedingungenvorIFimmergeradeentgegengesetztden
  241. Sprungbefehlensind,alsobeqbei0<>oderbnebei0=.Anm.d.
  242. Übers.)
  243.  
  244. üImplementation
  245. Ç
  246. Esgibtvielemöglicheunddarunterzweihäufigerbeschrittene
  247. Wege,umeinenAssemblerinFORTHzuschreiben.EineMethodeist,
  248. vieleVariablemitStatus-Informationenzubenutzen,die
  249. ihrerseitsvondenMnemonic-Wortenverwendetwerden,umden
  250. Assembliervorgangzusteuern.NachjederInstruktionwerdensie
  251. gelöscht,umvondernächstenInstruktionwiederverwendetwerden
  252. zukönnen.BeidiesemAssembleristeineweiterverbreiteteund
  253. auchwünschenswertereMethodegewähltworden.Fastsämtliche
  254. InformationenwerdenaufdemStackübergeben,derauchnicht
  255. initialisiertwerdenmuß.
  256.  
  257. EbensogibteszweiverbreiteteArten,dieAdressierungsartandas
  258. assemblierendeWortzuübergeben.EineMöglichkeitbestehtin
  259. einerArtgeschachtelterIF...ELSEStrukturen,dieauseinerFolge
  260. vonMöglichkeitendierichtigeherauszusucht.DerandereWeg,hier
  261. eingesetzt,bestehtdarin,daßdieWorte,diedieAdressierungsart
  262. bestimmen,dieWerte,dieihnenübergebenwurden,inirgendeiner
  263. Formverändern.DiesgeschiehtdurchAusmaskierenmitANDund
  264. SetzeneinzelnerBitsmitOR.SolcheLogikoperationenarbeiten
  265. bekanntlichvielschnelleralsVerzweigungen,sodaßderAssembler
  266. insgesamtmitsolchenOperationenschnellerwird.
  267.  
  268. WennSiediefolgendenBeschreibungenlesen,solltenSiesichden
  269. QuelltextdesAssemblerszurHandnehmen.Erbefindetsichauf
  270. IhrerDisketteimFileASSEMBLE.SCR.
  271.  
  272. DieGrundidee,diehinterdiesemAssemblersteckt,istdie
  273. BetrachtungeinerMaschinencodeinstruktionalsReihevonBit-
  274. Feldern.DieseBit-FeldersindimManualderCPUbeschrieben.
  275. EinigesindfürvieleInstruktionengültigwiesourceund
  276. destination,modeundregisterFelder.
  277.  
  278.      |op-code|destreg|destmode|sourcemode|sourcereg|
  279. |1512|119|86|53|20|
  280.  
  281. Wiebereitserwähnt,benutzenInstruktionen,diedieDatenlänge
  282. kennenmüssen,dieVariableSIZE.DiePositiondesBit-Felds,das
  283. dieDatenlängebestimmt,wechseltvonBefehlzuBefehlmehrals
  284. alleanderen.FastimmerwerdendiebenutztenWerteindie
  285. VariableSIZEübergeben,undzwardurch.B,.Woder.L.Beachten
  286. Sie,daßichandiesemPunktBASEaufOCTALumgeschaltethabe.Die
  287. 68000-Befehleenthaltenviele3-Bit-Felderundkönnendaher
  288. besondersübersichtlichalsOktalzahlendargestelltwerden.Ich
  289. wargezwungen,meineVorliebefürHexzahlenzeitweilig
  290. zurückzustellen.
  291.  
  292. BeiderDefinitionderWorte,dieRegisterundAdressierungsarten
  293. festlegen,habeichzueinemkleinenTrickgegriffen.Ichbenutzte
  294. ein'Multi-definingword'REGS,dasineinerSchleifeCONSTANT
  295. ausführt,umähnlicheKonstantenzuerzeugen.REGSwirdnur
  296. zweimalbenutzt.EinmalfürDatenregisterundeinmalfür
  297. Adreßregister,dieModus0bzw.1darstellen.
  298.  
  299. Modus0ist'dataregisterdirect',daheristD5eine
  300. KonstantemitdemWert5005.
  301.  
  302. Modus1ist'adressregisterdirect',daheristA3eine
  303. KonstantemitdemWert3113.
  304.  
  305. ♪√Worte,diemitMODEdefiniertwurden,werdennacheinem
  306. AdreßregisterbenutztundersetzendiezweiModusziffern(in
  307. unseremFall1)mitdenneuenModus-Werten.Diesgeschiehtdurch
  308. AusmaskierenderaltenWertemitANDundSetzenderneuenmitOR.
  309. AlleMODE-Wortesind'adressregisterindirect'mitZusätzen.
  310.  
  311. Modus2ist'adressregisterindirect',
  312. daherergibtA6)   6226.
  313.  
  314. Modus3istdasselbemit'post-increment',
  315. daherergibtA7)+  7337.
  316.  
  317. Modus4istdasselbemit'pre-decrement',
  318. daherergibtA7-)  7447.
  319.  
  320. Modus5istdasselbemit'displacement',
  321. daherergibt123A1D)  1551
  322. mitdem'displacement'Wertvon123,derzunächstunterdem
  323. Register/ModusWertaufdemStackliegt.
  324.  
  325. Modus6istdasselbemitindexunddisplacement,
  326. daherergibt123D4A1DI)    1661.
  327. AufdemStackliegendarunter4004und123.
  328.  
  329. Modus7wirdfüralleübrigenAdressierungsartenverwendet,die
  330. sichdurchihreRegisterfelderunterscheiden.DieseModisindals
  331. Konstantendefiniert.
  332.  
  333. #)ist0770undstelltdieabsolute(16-Bit)Adressierung
  334. dar.DerNamebedeutet'immediateindirect'.(DenkenSie
  335. darübernach!)
  336.  
  337. L#)ist1771undstelltdieabsolute(32-Bit)Adressierung
  338. dar.
  339.  
  340. PCD)ist2772undstelltden'programcounterrelativemit
  341. displacement'Modusdar.123PCD)ergibt2772unddarunter
  342. liegt123aufdemStack.
  343.  
  344. PCDI)ist3773undstelltden'programcounterrelative
  345. displaced,indexed'Modusdar.123D4PCDI)ergibt3773und
  346. darunter4004und123aufdemStack.
  347.  
  348. #ist4774undstelltden'immediatedata'Modusfür16oder
  349. 32Bitdar.456#ist4774,darunterliegt456.
  350.  
  351. (Anmerkungd.Übers.:ZusätzlichhabenwirinsvolksFORTH-83
  352. einigeweitereAdressierungsartenaufgenommen.Mehrdazuweiter
  353. unten.)
  354.  
  355. BeachtenSie,daßimmer1bis316-Bit-WerteaufdemStack
  356. hinterlassenwerdenm,diedieAdressierungsartkennzeichnen.Der
  357. obersteWertwirdnormalerweiseTeilderersten16Biteines
  358. BefehlszusammenmitdemOpcode.FallszusätzlicheWertevorhanden
  359. sind,werdensieimAnschlußandenOpcodeassembliert.
  360.  
  361. ♪⌠Manche3-Bit-Felderwerdenhäufiger(durchAusmaskierung)
  362. selektiertalsandere.DasWortFIELDerzeugtWorte,mitdenenman
  363. solcheFelderselektierenkann.RSundRDwählendiesourceund
  364. destinationregisterFelder(s.Bildoben)aus.MSselektiertdas
  365. sourcemodeFeld.DererzeugendeAusdruckfüreinevollständig
  366. festgelegtAdressierungsartisteineeffektiveAdresse(EA).Das
  367. WortEASwähltdie'sourceeffectiveadress',dieausdensource
  368. modeundregisterFeldernbesteht.LOWselektiertdieunteren8
  369. Bits.DasOpcode-WortenthältofteinEASFeld.DasWortSRCführt
  370. OVEREASOR
  371. aus,womitesdiesesFeldinsOpcode-Wortüberträgt.DasWortDST
  372. bautdasdestinationregisterFeldein.
  373.  
  374. DievirtuelleFORTH-MaschineenthältfünfRegister.Diesesind
  375. einzelnen68000Registernzugeordnet.EsistimAssemblermöglich,
  376. sowohldie68000Register-NamenalsauchdieNamenderRegister
  377. dervirtuellenMaschinezubenutzen.(Bemerkungd.Übers.:Sie
  378. solltendie68000Registernamennurdannbenutzen,wennsiekeine
  379. FORTH-Registermeinen.Sievermeidensounerklärliche
  380. Systemabstürze,fallsdieRegisterzuordnungsichändert.)
  381.  
  382. Adressierungsarten,dienachdemOpcodeweitereWerte
  383. assemblieren,nenntman'extendedadressing'.Solche
  384. AdressierungsartenwerdenmitsechsWortenundeinemBuffer
  385. abgehandelt.DOUBLE?hinterläßteinFlag,daswahrist,fallsder
  386. Modus,derobenaufdemStackliegt,zusätzliche32Bitverlangt.
  387. INDEX?suchtnacheinerAdressierungsartundverändertseine
  388. zusätzlichenWerteindaspassendeFormat,fallsessichum
  389. 'indexed'Adressierunghandelt.MORE?hinterläßteinTrue-Flag,
  390. wenndieAdressierungsartweitereWertebenötigt.MOREträgtalle
  391. zusätzlichenWertehinterdemOpcode-WortinsDictionaryein.
  392.  
  393. EinigeInstruktionenbrauchenzweiAdressierungsarten,einefür
  394. sourceundeinefürdestination.DersourceModuswirdzuerst
  395. festgelegt,sodaßerunterdemdestinationModusaufdemStack
  396. liegt.JedeAdressierungsartbestehtauseinbisdreiWerten,die
  397. aufdemStackliegen.DersourceModuswirdvordemdestination
  398. Modusverarbeitet,dahermüssendieWertefürdendestination
  399. ModussolangeineinemBufferabgelegtwerden.EXTRA?rettetalle
  400. zusätzlichenWerteineinenBuffernamensEXTRAundhinterläßtnur
  401. denWertfürdieAdressierungsart.,EXTRAnimmtdiezusätzlichen
  402. WerteausdemBufferundträgtsieinsDictionaryein.
  403.  
  404. FastderganzeRestdesAssemblersbestehtausDefinitionenund
  405. derAnwendungvondefiningwords,dieGruppenvonMnemonics
  406. erstellen.ZweiBeispielewerdengenügen.WennSiemitdem
  407. Genrauchvondefiningwordsnichtvertrautsind-Siesolltenes
  408. sein;siesinddieleistungsfähigsteStrukturinFORTH.
  409.  
  410. DasWortIMMerzeugtWorte,die'immediate'Befehleassemblieren.
  411. IchwerdedieDefinitionhierwiederholenundgenauerläutern.
  412. :IMMCONSTANT
  413.           DOES>@>REXTRA?EASR>OR
  414. SZ3,LONG??,,EXTRA;
  415.  
  416. GebrauchbeiderDefinition:3000IMMADDI
  417. GebrauchimAssembler:neaADDI
  418. Beispiel:123A5)ADDI
  419.  
  420. ♪√JedesMal,wennmitIMMeinMnemonic-Wortdefiniertwird,
  421. speicherteseinenkonstantenWertinderDefinitiondiesesWortes
  422. ab,deresvonanderen'immediate'Wortenunterscheidet.Dieser
  423. WertistderOpcodedesBefehls.ImmediateBefehlebeinhalten
  424. folgendeBit-Felder.
  425.  
  426.      |op-code|size|mode|reg|
  427. |158|76|53|20|
  428.  
  429. Diesenfolgen16oder32BitDaten.WenndasBefehlswort
  430. ausgeführtwird,führtesdenCodenachDOES>inIMMausmitder
  431. AdresseseineseigenenParameterfeldesaufdemStack.Andieser
  432. AdresseistdieKonstante(derOpcode)kompiliert.DasWort@
  433. liestdiesenWertundrettetihnmit>RaufdenReturnstack.ADDI
  434. erhältdie'immediate'DatenaufdemStackunterhalbderWertefür
  435. dieAdressierungsart.EXTRA?rettetallezusätzlichenWerte,EAS
  436. selektiertdiemodeundregisterFelder,diebenutztwerden
  437. sollen.DannwirdderOpcodevomReturnstackmitR>geholtund
  438. durchORmitEASverknüpft.SZ3setztdiezugehörigenLängenbits
  439. ausSIZE,unddasWortcommaträgtdasOpcode-WortinsDictionary
  440. ein.JetztliegennurnochdieDatenaufdemStack,undLONG?
  441. entscheidet,ob?,16oder32Bitanhängensoll.ZumSchlußholt
  442. ,EXTRAdiegerettetenzusätzlichenWerte,fallsvorhanden,zurück
  443. undhängtsieebenfallsan.
  444.  
  445. Zahlreicheandereähnlichaufgebautedefiningwordswerden
  446. benutzt,umdiemeistenübrigenBefehlezudefinieren.Viele
  447. dieserWortbildenfürsicheineGruppeundsinddeswegenmitdem
  448. Wort:definiert,geradesowieMakros.DieconditionalBefehle
  449. sindsoregelmäßig,daßichnochein'trickdefiningword'
  450. benutze.SETCLASSverwendetwiederholteinvorhandenesdefining
  451. word,jedesmalmiteinemanderenArgument,ummehrereMnemonic-
  452. Worteaufeinmalzudefinieren.Alle46conditionalBefehlewerden
  453. definiert,indemjedesderdreidefiningwords16malaufgerufen
  454. wird.DabeientstehtauchzweiungültigeMnemonics,dienicht
  455. weiterbenutztwerden.VielleichtwäreesindiesemFallebesser
  456. gewesen,alle46Befehleeinzelnzudefinieren,aberichwollte
  457. zeigen,wasallesmachbarist.
  458.  
  459. ZumSchlußkommenwirzudenstructuredconditionals.Betrachten
  460. SiefolgendesBeispiel:
  461.  
  462.           A3)+D1CMP0<
  463.      IFD0A7)MOVE
  464.      ELSEA7)D0MOVE
  465.      THEN
  466.  
  467.  
  468.      BEGINA3D2CMP0=
  469.      WHILEA0)+D0MOVE
  470.      REPEAT
  471.  
  472. ImerstenBeispielbeeinflußtdasErgebnisdesVergleichs
  473. bestimmteFlagsimStatus-Register.IFassemblierteinenbedingten
  474. Sprung,dessenOpcode(mitBedingung)durch0<festgelegtist.
  475. DieserassembliertalsodenWertfüreinenBGE(Branchgreateror
  476. equal).ELSEberechnetdenSprungoffsetfürIFundassembliert
  477. einenunbedingtenSprung;THENberechnetdessenOffset.
  478.  
  479. EbensoberechnetWHILEeinenbedingtenSprunghinterREPEAT,
  480. welcheswiederumeinenunbedingtenSprungzurückaufBEGIN
  481. assembliert.
  482.  
  483. BeachtenSie,daßkeineLabelsnötigsind.DermeisteWirrwarrin
  484. normalenAssemblerQuelltextenentstehtdurchdieriesigeAnzahl
  485. anbedeutungslosenLabelnamenfürSprungziele.BeachtenSieauch,
  486. daßdiestructuredconditionals,diewirhierdefinierthaben,nur
  487. 1-ByteOffsetsbenutzen.DaderAssemblernureinenPass
  488. durchläuft,mußderPlatzfürdenSprungoffsetfreigehalten
  489. werden,bevorseineGrößebekanntist.DaCoderoutineninFORTH
  490. immersehrkurzsind,genügteinBytefürdenOffset.Solltedas
  491. nichtausreichen,ersetzeicheinfachdieseDefinitionendurch
  492. sehrähnliche,dieeinen16-BitOffsetbenutzen.
  493.  
  494. Scließlichsolltebemerktwerden,daßeskeineWortefürdie
  495. EinrichtungvonDatenstrukturenindiesemAssemblergebenbraucht.
  496. EinFORTH-AssembleristTeileinerFORTH-Umgebung;undaufalle
  497. Datenstrukturen,diemitnormalenFORTH-Wortenerzeugtwurden,
  498. kannderAssemblerzugreifen.
  499. EinBeispiel:
  500.  
  501.      VARABLEFOO
  502.      CODEBARFOOR#)NEGNEXTEND-CODE
  503.  
  504. BARnegiertdenInhaltderVariablenFOO.
  505.  
  506. üvolksFORTH-83AssemblerÇ
  507.  
  508. Wiebereitsgesagt,beruhtderAssemblerimvolksFORTH-83im
  509. WesentlichenaufdemvonMichaelPerry.DieRegisterbelegungist
  510. jedochetwasanders,undeswurdeneinigeneueBefehle
  511. implementiert,diediebesondereStukturvonvolksFORTH-83,z.B.
  512. denHeap,ausnutzen,odersichaufgrundderrelokatiblenStruktur
  513. alsnotwendigherausgestellthaben.
  514.  
  515.  
  516. üStrukturdesrelokatiblenvolksFORTH-83Ç
  517.  
  518. volksFORTH-83istein16-Bit-System,d.h.eslassensich64kByte
  519. Speicheradressieren.Bisherlagendiese64kByteineiner
  520. Speicherbank(ab$50000),sodaßdie16-Bit-AdressenimFORTH-
  521. SystemmitHilfeeinerKonstantennamensmempage(=0005)auf32-
  522. Bit-Adressenerweitertwerdenkonnten.DieseStrukturhatsich
  523. jedochalssehrunflexibelerwiesen,sowaresz.B.nichtmöglich,
  524. RAM-Diskszubenutzen.Wennmanstand-alone-Applikationenerzeugen
  525. wollte,mußtemandazueigenseinLadeprogrammschreiben,dessen
  526. einzigerSinndarinbestand,daseigentlicheProgrammnach$50000
  527. zuladenunddortzustarten.
  528.  
  529. DieneueStrukturgehtdavonaus,daßdasSystemanbeliebiger
  530. StelleimSpeicherlauffähigseinsoll(relokatibel).
  531. Dementsprechenddürfenkeineabsoluten32-Bit-AdressenimSystem
  532. mehrvorkommen,weilsonstzusätzlicheRelokationsinformationen
  533. mitabgespeichertwerdenmüßten,waseinSAVESYSTEMnahezu
  534. unmöglichmachenwürde.Glücklicherweisebietetder68000-
  535. ProzessoreinerechtleistungsfähigeAdressierungsart,nämlichdie
  536. 'indirekteAdressierungmitIndexundDisplacement'.Grundlageist
  537. dabeieinAdreßregister,daßaufByte0desFORTH-Systemszeigt
  538. undForthpointer(FP)heißt.AlleSpeicheroperationenmüssennun
  539. relativzudiesemZeigererfolgen.
  540.  
  541. Die16-Bit-AdressenimFORTH-SystemwerdennunalsOffsetzumByte
  542. 0desSystemsaufgefaßtundalsIndexineinemDatenregister
  543. benutzt.UnglücklicherweisewerdenDatenregister,diealsIndex
  544. verwendetwerden,auf32Bitvorzeichenerweitert,wennsienur
  545. wortweiseadressiertwerden.DerAssemblermußtedaherso
  546. abgeändertwerden,daßbeidenAdressierungsartenDI)undPCDI)
  547. dieLängederOperationunabhängigvonderLängedes
  548. Indexregistersangegebenwerdenkann.EinBeispiel:Die
  549. Befehlsfolge
  550.  
  551.           .l0D6FPDI).wD0move
  552.  
  553. addiertzuFPdenWertdesDatenregistersD6lang,alsoohne
  554. Vorzeichenerweiterung,geMOVEdwerdenabernur16Bit.Stehtalso
  555. inD6die16-Bit-AdresseeinerFORTH-Variablen,z.B.$9000und
  556. zeigtFPauf$12300,würdedieseBefehlsfolgeden16-Bit-Inhalt
  557. derVariablen,dieabsolutbei$1B300liegt,insRegisterD0
  558. bringen.
  559.  
  560.  
  561. üZusätzlicheAdressierungsartenÇ         
  562.  
  563. UmdasProgrammiereninAssemblernunnichtnochschwierigerzu
  564. machenalsesohnediesschonist,habenwireinigeMacros
  565. entwickelt,diedenCharaktervonAdressierungsartenhaben.
  566.  
  567. ♪≤:reg)sizepush.l0swapFPDI);
  568.  
  569. DieseAdressierungsartkönnte'Datenregisterindirect'benannt
  570. werden.EinBeispiel:
  571.  
  572. Code@(addr--16b)
  573.      SP)+D6moveD6reg)SP-)moveNext
  574.  
  575. assembliertgenaudasselbewie
  576.  
  577.      Code@(addr-16b)
  578.      SP)+D6move.l0D6FPDI).wSP-)moveNext
  579.  
  580. DieAdresseaufdemStackwirdinD6geladen;D6wirdlangzum
  581. ForthpointeraddiertundderInhaltdieserSpeicherstellewieder
  582. aufdenStackgebracht.(Anmerkung:@imSystemistetwas
  583. komplizierterdefiniert,daauchderZugriffaufungeradeAdressen
  584. gestattetist,wasbeiderobigenDefinitioneinenAdreßerror
  585. auslösenwürde.)
  586.  
  587. ZumZugriffaufDatenstrukturen,vorallemaufVariablen,dient
  588. dasMacro
  589.  
  590. :R#)(addr--)sizepush.w
  591. dup0<IF#D6moveD6reg)exitTHEN
  592. FPD);
  593.  
  594. DiesesMacrogabesauchschonim'alten'System,derEffektist
  595. auchdergleiche,sodaßvorhandeneAssemblerquelltextenicht
  596. umgeschriebenwerdenmüssen.DieWirkungsweisehatsichjedoch
  597. geändert:Istaddrnegativ-alsogrößerals$7FFF-wirddie
  598. AdressedirektnachD6geladenunddannwiebereitsbeschrieben
  599. mitD6indiziert.Liegtaddrjedochindenunteren32kBytedes
  600. FORTH-Systems,erfolgtderZugriffmitaddralsDisplacementohne
  601. Indexregister,waserheblicheGeschwindigkeitsvorteilebringt.Vor
  602. allemdieFORTH-SystemvariablenlassensichaufdieseArtund
  603. Weiseschnellerreichen.EinweiteresBeispiel:
  604.  
  605. Variabletest
  606. Codetest@(--16b)
  607. testR#)SP-)moveNext
  608.  
  609. TEST@legtdenInhaltderVariablenTESTaufdenDatenstack.
  610.  
  611. SchließlichgibtesnochdasMacroPCREL),dessengenauere
  612. DefinitionimAssemblerquelltextASSEMBLE.SCRnachzulesenist.Es
  613. arbeitetähnlichwieR#),istaberschnellerundkürzer.Nachteil
  614. ist,daßder68000dieAdressierungsartPC-relativnichtbei
  615. allenOperatorenzuläßt,unddaßnichtdergesamte64kByte
  616. Adreßraumerreichbarist.PCREL)istmitFehlermeldungengegen
  617. falscheAdreßdistanzenabgesichert.
  618.  
  619.  
  620. üRegisterdervirtuellenFORTH-Maschine
  621. Ç
  622. FolgendeRegisterwerdenvomvolksFORTH-83benutzt:
  623.  
  624. A3Forthpointer(FP).DiesesRegisterenthältdie
  625. StartadressedesSystemsundgibtdamitdieBasisfür
  626. allerelativenAdreßzugriffeinsSystem.Grundsätzlich
  627. gilt:Dieabsolute32-Bit-Adresseerhältmandurch
  628. Additionder16-Bit-Forth-AdresseundFP.Die16-Bit-
  629. Forth-AdressenlassensichalsoalsOffsetzum
  630. Systemanfangauffassen.
  631.  
  632. A4Instructionpointer(IP).DiesesRegisterenthältdie
  633. (absolute)32-Bit-CFAdesnächstenauszuführenden
  634. Wortes.
  635.  
  636. A5Returnstackpointer(RP).DiesesRegisterenthältden
  637. 'Systemstackpointer'dervirtuellenFORTH-Maschine.Hier
  638. werden'Rücksprungadressen'inaufrufendeWorteusw.
  639. abgelegt.
  640.  
  641. A6Datenstackpointer(SP).DiesesRegisterenthältden
  642. DatenstackpointerdervirtuellenFORTH-Maschine.Über
  643. diesenStackwerdenbekanntlichnahezusämtlicheWerte
  644. zwischeneinzelnenFunktionenübergeben.
  645.  
  646. NebendiesenvierAdreßregisternwerdennochzweiDatenregister
  647. benutzt:
  648.  
  649. D7Work-Register(W)dervirtuellenFORTH-Maschine;der16-
  650. Bit-WertindiesemRegisterzeigtaufdieCFAdes
  651. Wortes,dasgeradeausgeführtwird.
  652.  
  653. D6EinHilfsregister,daszurUmrechnungvonrelativen16-
  654. Bit-Adresseninabsolute32-Bit-Adressenbenutztwird.
  655.  
  656. DemProgrammiererstehenalsodieDatenregisterD0-D5sowiedie
  657. AdreßregisterA0-A2zurfreienVerfügung.D6undD7dürfen
  658. verändertwerden,êjedochmüssendieoberen16Bitimmerauf0
  659. stehenÇ.SollenweitereRegisterverwendetwerden,müssensie
  660. vorhergerettetundanschließendrestauriertwerden.
  661.  
  662.  
  663. üZusätzlicheBefehleÇ
  664.  
  665. ;c:SchaltetdenAssemblerabunddenFORTH-Compileran.Damit
  666. istesmöglich,vonMaschinencodeinFORTHüberzuwechseln.
  667. EinGegenstückistnichtvorhanden.
  668.  
  669. EinBeispielfürdieVerwendungvon;c:ist:
  670.  
  671. ....0<IF;c:."Fehler";AssemblerTHEN
  672.  
  673. IstirgendwaskleineralsNull,sowird'Fehler'ausgedrucktund
  674. dieAusführungdesWortesabgebrochen,sonstgehtesweiterim
  675. Code.
  676.  
  677. ScließlichgibtesnochdieWorte>LABELundLABEL.>LABELerzeugt
  678. eineKonstanteaufdemHeap,wobeiesdenWertdesLabelsvom
  679. Stacknimmt.LABELerzeugteineKonstantemitdemWertvonHERE.
  680. Beispiel:
  681.  
  682. LABELSCHLEIFE1D0subqSCHLEIFEBNE
  683.  
  684. SCHLEIFEverbrauchtkeinenDictionaryspeicher,weilesvollständig
  685. -mitHeaderundWert-aufdemHeapliegt.Essindalsoechte
  686. Assemblerlabelsmöglich.VonderVerwendungsolcherLabelskann
  687. allerdingsnurabgeratenwerden,wennwieimobigenBeispiel
  688. ebensogutstrukturiertprogrammiertwerdenkönnte.
  689.  
  690. Übrigensist>LABELstatesmart,d.hesverhältsichverschieden,
  691. jenachdem,obdasSystemkompiliertodernicht.Währendder
  692. KompilationwerdenLabelsalsLiteralskompiliert.Damitkönnen
  693. LabelsauchinColon-Definitionenverwendetwerden.EinBeispiel
  694. dazufindenSieimFileGEMDEFS.SCR.AlleWorteindiesemFile
  695. werdenalsLabels(KonstantenaufdemHeap)definiert.Währendder
  696. KompilationkompilierensiedieentsprechendenZahlen.Nachder
  697. Kompilationwerdensiegelöschtundverbrauchenkeinen
  698. Speicherplatz.Solchermaßen'mißbrauchte'Labelsmacheneinen
  699. Quelltextlesbarer,weilanStellevonnichtssagendenZahlen
  700. sinnvolleNameneingesetztwerdenkönnen.
  701.  
  702.  
  703. üDerDisassemblerÇ
  704.  
  705. DerDisassemblerwirdgeladenmit
  706.  
  707. includedisass.scr
  708.  
  709. MitDISW<word>kannmaninCodegeschriebeneWorte
  710. disassemblieren.DasfunktioniertnatürlichmitSystemworten
  711. ebensogutwiemiteigenenDefinitionen.DieAusgabestoppt
  712. automatisch,wenneinNEXTerkanntwurde,undkanndannmit
  713. einerbeliebigenTastefortgesetztodermitEscapeabgebrochen
  714. werden.AuchwährendderAusgabekannmiteinerbeliebigenTaste
  715. unterbrochenodermitEscapeabgebrochenwerden.
  716.  
  717. DerDisassemblerdisassembliertdieBefehleinderüblichen
  718. Motorola-Syntax,nichtinderSchreibweisedesFORTH-Assemblers.
  719. WerhäufigermitAssembler-Quelltextenzutunhat,wirddaszu
  720. schätzenwissen....
  721.  
  722. WeitereBenutzer-WortedesDisassemblerssind
  723.  
  724. dis(addr--)
  725.  
  726. und
  727.  
  728. ldis(laddr--)
  729.  
  730. BeidedisassemblierenvoneinervorgegebenenFORTHbzw.
  731. Langadresseab.MitLDISlassensichauchRoutinenaußerhalbvon
  732. FORTHdisassemblieren,z.B.imTOSoderGEM.DieAusgabewird
  733. genausogesteuertwiebeidisw.
  734.  
  735.  
  736. üSonstiges
  737.  
  738. ÇWieimArtikelvonMichaelPerrybereitszulesenwar,verzichtet
  739. derAssemblerauf'übertriebenesErrorchecking'.ImKlartextheißt
  740. das,daßmansichschonrechtgutmitdem68000-Befehlsumfang
  741. auskennensollte,insbesonderemitdenerlaubten
  742. AdressierungsartenundOperandenlängenbeideneinzelnenBefehlen.
  743. Anfängern-undnichtnursolchen(!)-seidringendempfohlen,
  744. grundsätzlichdenerzeugtenMaschinencodemitdemDisassemblerzu
  745. überprüfen.ManreduziertdamitdieAnzahldersonst
  746. unvermeidlichenSystemabstürzeerheblich,wieichauseigener
  747. Erfahrungweiß.
  748.  
  749. DerFORTH-Assembleristetwasgewöhnungsbedürftig.Beispielefür
  750. verschiedenartigeAnwendungensindvorallemimFileFORTH_83.SCR
  751. zufinden.DieseBeispielesolltemanstudieren,bevormansichan
  752. eigeneExperimenteheranwagt.Manmußjanichtgleichmit(WORD
  753. beginnen....
  754.  
  755.