erstellt am / farita je 1999-01-24
Kiel mem konstrui kompililon per la Esperanto-Programlingvo E
Antaŭrimarko: Mi origine planis fari tion kurson en la
"Forstwissenschaftliche Fakultät" en Freising kadre de la
unua Bavara studadsesio de la Akademio Internacia de San Marino
(AIS) en Oktobro 1988.
Pro familiaj kaŭzoj la kurso ne povis okazi. Tial mi nun
iom post iom publikigos la kurs-materialon en mia hejmpaĝo.
- La lingvo de la komputilo - la maŝina lingvo
- Programoj kaj datenoj
- La programlingvo inter la natura lingvo kaj la maŝina lingvo
- La kompililo - programo por traduki programlingvon al maŝina lingvo
- Kelkaj ekzemploj
- La kerno
- La biblioteko (vortaro)
Antaŭ ni komencas konstrui kompililon, ni devas deklari kelkajn fundamentajn aferojn: Kiel funkcias komputilo? Kio estas la maŝina lingvo?
La bildo eble respondas tiujn demandojn.
Simpla modelo de komputilo
Vi vidas simpligitan strukturon de komputilo konsistanta el procesilo kaj memoro. Por ke la komputilo povas labori ĝi bezonas programon en la memoro.
Programo konsistas el pluraj instrukcioj kiuj priskribas, kion la komputilo devas fari. Tiuj priskriboj ne estas en homa lingvo, sed estas skribitaj en
la tiel nomata maŝina lingvo ( do vico de nombroj inter 00000000 kaj
11111111 binare aŭ 0 kaj 255 decimale).
Sed tiun lingvon la maŝino (komputilo) "komprenas".
Kiam oni startas la komputilon, la procesilo metas startadreson en la
programmontrilon (en nia ekzemplo adreson 0000). La programmontrilo montras nun al la adreso 0000. La procesilo prenas
la enhavon de tio memorloko (00000000) kaj interpretas gin kiel instrukcio. 0000000 signifas en la masina lingvo "faru nenion".
La procesilo faras nenion kaj poste inkrementas la programmontrilon.
Ĝi montras nun al la adreso 0001 kaj la tuta afero ripetadas. Post kvar paŝoj la programmontrilo montras al la adreso 0100 (4).
Tie estas la instrukcio 10110000 (176). Tio instrukcio signifas :
"Prenu la sekvan bajton el la memoro kaj transportu gin al la A-registro".
La sekva bajto estas 01000101 (69). kaj estas transportata al la akuo.
Poste la programmontrilo montras sur la adreso 0110 (6). Tio estas la situacio, kion la bildo montras.
Ĉu vi rimarkis ke la bajto 01000101 (69) estas io alia ol la
instrukcio 10110000 (176)?
01000101 estis dateno kiun la instrukcio 10110000 prilaboris.
Do oni diferencas pri du fundamentaj tipoj de informoj: programoj kaj
datenoj
Kiam la procesiloj povas plenumi la instrukcioj de la programoj, la datenoj
aliflanke tute ne havas sencon por ĝi.
La sencon al la datenoj donas nur la homo kiam li difinas kodojn
ĉu la datenoj estas literoj, tekstoj, bildoj aŭ voĉoj ktp.
En nia ekzemplo la dateno 01000101 estas la ASCII-kodo por la litero "E".
La maŝina lingvo estas tre abstrakta por homoj - sed tamen ĝi estas la
sola lingvo kiun la komputilo komprenas!
Anstataŭ programi
00000000 00000000 0000000 00000000 10110000 01000101
estus pli bone se ni povus skribi:
Faru certan tempon nenion kaj poste transportu la literon E al la akuo!
La solvo de la problemo estas la programlingvo, kio estas
unuflanke sufiĉe proksime al la homa lingvo kaj kio estas
aliflanke formale, ke programo povas aŭtomate traduki tion lingvon en
maŝinan lingvon.
La programon kiu tradukas fontotekston de la formala programlingvo
al ma%#254;inan kodon oni nomas kompililo.
La formala programlingvo en tio kurso estas la lingvo E.
Unu el la fundamentaj konceptoj de tio lingvo estas ke oni povas
anstataŭi pecon da maŝina lingvo per vorto en natura lingvo.
Do la suba maŭina kodo povus esti skribita en E:
faru-nenion faru-nenion faru-nenion faru-nenion A= "E"
Vi vidas ke tio priskribo de la programada problemo estas nun sufiĉe
homeca - tamen ankoraŭ relative proksima al la maŝina lingvo!
En E estas 10 instrukcioj kiuj rilatas rekte al maŝina kodo:
A= A<- A-> A+ A- IRU IR0 IRT IRS kaj RE
Detalajn priskribojn vi trovas en la ĉapitro:
"La Esperanto-programlingvo E koncize"
Ĝis nun mi ne priskribis kiel komputilo komunikas kun la ekstera mondo.
Tion vi vidas en la sekva bildo.
Simpla modelo de PC, BIOS kaj mastruma sistemo
Komputilo konsistas kutime el la komputilo mem (procesilo + memoro),
la klavaro por enigi informojn kaj la ekrano por eligi informojn.
Krome ekzistas disketilo (au dura disko) por stori permanente informojn.
Ĉar preskaŭ ĉiuj programoj bezonas en- kaj elig-procedurojn oni havas en la
PC-komputilo la tielnomata BIOS (baza enigo - eligo sistemo), tio estas
aro de programoj, kiujn aliaj programoj povas uzi. La uzo de BIOS ŝparas tempon.
Ofte en komputiloj ekzistas krom la "BIOS" sistemo de programoj kiuj
superrigardas la aplikon de aliaj programoj, kaj permesas la kreadon,
en- eligadon, kopiadon kaj renomadon de dosierojn. Tion oni nomas
mastruma sistemo (angle: operating system).
E estas ankaŭ mastruma sistemo.
Por la komunikado kun la klavaro, ekrano kaj disketiloj E uzas
la ordonojn EN EL EN-D kaj EL-D.
Detalajn priskribojn pri la Esperanto-programlingvo E vi trovas en
la capitroj "Enkonduko" kaj "La Esperanto-Programlingvo E koncize".
- Kelkaj ekzemploj
Kiel vi tie lernis E konsistas el vortoj kiujn oni povas uzi en difinoj
de novaj vortoj ktp.
Tio preskaŭ devigas nin difini unue la bazajn vortojn kaj fini per la
lasta vorto.
En la ekzemplo en la "Enkonduko" ni do unue difinis
"eligu-E nova-linio 1E" kaj "4E" antaŭ ol ni difinis la ĉefprogramon
"granda-E".
Tio programstilo estas iomete kontraŭ la homa pensmaniero. Ni kutimas
vidi problemojn unue ĝenerale kaj poste ni okupiĝas pri la detaloj.
En E oni ankaŭ povas programi tiamaniere (de supre al malsupre - angle: top down).
Ni supozu ke ni volas programi iun ĝeneralan ideon kaj ni scias ke tio
konsistas el paŝo-A kaj paŝo-B. Sed pri detaloj pri paŝo-A kaj paŝo-B ni
ankoraŭ ne pensis. Tamen ni volas vidi ĉu programo ĝenerala_ideo funkcias.
Simple skribi
D ĝenerala_ideo paŝo-A paŝo-B RE .
ne funkcias, ĉar la kompililo nek konas paŝo-A nek paŝo-B.
Tial ni skribu
D paŝo-A A= 65 EL RE .
D paŝo-B A= 66 EL RE . ( 65 kaj 66 estas ASCII-Kodoj por A kaj B )
D ĝenerala_ideo paŝo-A paŝo-B RE .
Nun la programo funkcias kaj donas AB kiel rezulto.
Ni povas nun trankvile trakti la problemojn paŝo-A kaj paŝo-B ĝis
ni iras al la plej bazaj partoj de la programo.
Strukturo de E-kompililo
La bildo montras E-kompililon konsistante el la kerno, kaj la biblioteko
kun la vortoj D . kaj eligu-e .
La kerno enhavas diversajn subprogramojn, kiuj ebligas difini kaj apliki
la vortojn en la biblioteko.
Ĉiuj vortoj estas ligitaj per ligadresoj. La ligadreso de la vorto D estas
0000. Tio montras, ke ĝi estas la unua vorto. La aliaj ligadresoj montras
al la antaŭa vorto.
(En kazo de la vorto eligu-e tio adreso estas 177*256+203=45515.)
Tiamaniere ĉiuj vortoj estas ligitaj kun la aliaj.
Post la ligadreso sekvas la vortnomo finita per la ascii-kodo 13.
Tio desegnas la finon de la vortnomon. Post la vortnomo troviĝas la
adreso de la kompiliga kodo de la vorto.
Kiam oni uzas vorton en difino de nova vorto la kompililo saltas al la
kodo al kio montras tio adreso.
(En kazo de la vorto eligu-e tio adreso estas 164*256+172=42156.)
Poste sekvas la apliko-kodo. Tio kodo estas aplikata kiam oni tajpas
la vortnomon.
(En kazo de la vorto eligu-e tio kodo estas 176 69 180 14 205 16 203
kiel en la difino. )
La ĉefa banto de la kompililo
Leciono 1
Nun ni vidis kiel komputilo funkcias, kio programlingvo kaj kompilio estas
kaj kiel la interna strukturo de E-kompililo estas.
Nun ni povas fine skribi la kompililon mem.
Sed por skribi ĝin ni bezonas alian e-kompililon!
Se vi ankoraŭ ne havas tion, vi ricevos en la ĉapitro:
"La E-kompililo kaj la mastruma sistemo E 0.9"
Por konstrui kompililon ni iras de la ĝeneralo al la detaloj kiel antaŭe priskribita:
Ĝenerale la kompililo estas programo kun banto kio havas du subprogramojn:
skribu_tekston kaj prilaboru_tekston.
Ni skribu la kvar fontotekstojn kaj storu ilin sur la spuroj 10, 17, 18 kaj 19:
( 10 E-kompililo leciono 1 enigu per EN-D 48 10 0 0 INIT EIN )
EN-D 0 17 0 0 KOMPILU
EN-D 0 18 0 0 KOMPILU
EN-D 0 19 0 0 KOMPILU
AUS
FERMU
( 17 )
D skribu_tekston A= 83 EL RE . ( Eligas "S" por testi )
FERMU
( 18 )
D prilaboru_tekston A= 80 EL RE . ( Eligas "P" por testi )
FERMU
( 19 )
D e-kompililo LOKO 0 skribu_tekston prilaboru_tekston IRU ADR 0 .
FERMU
La tuton ni kompilu per:
EN-D 48 10 0 0 INIT EIN
La vorto e-kompililo donas nun senfine SPSPSPSPSPSPS .
Tio devas esti, ĉar la E-kompililo estas ja samtempe mastruma-sistemo,
kaj mastruman sistemon oni ne povas forlasi.
Sed por la konstruado de la kompililo ĝenas, ke ni ne povas fini la
programon.
Tial ni aldonu sekvan linion:
( 19 )
D e-kompililo LOKO 0 skribu_tekston prilaboru_tekston IRU ADR 0 .
D e-kompililo skribu_tekston prilaboru_tekston RE .
FERMU
Post rekompilado la nova vorto e-kompililo donas nur unufoje SP.
Tio estis la unua leciono
Se vi ne ŝatas tajpi mem la fontotekstojn vi povas alŝuti la
mem-malpakantan dosieron lec-001.exe (3K)
(Startu poste dosieron 1.bat !)
Skribu tekston
Ni skribu la kvin fontotekstojn kaj storu ilin sur la spuroj 10, 16, 17,
18 kaj 19. Poste ni kompilu la tuton per EN-D 48 10 0 0 INIT EIN .
( 10 E-kompililo leciono 2 enigu per EN-D 48 10 0 0 INIT EIN )
EN-D 0 16 0 0 KOMPILU
EN-D 0 17 0 0 KOMPILU
EN-D 0 18 0 0 KOMPILU
EN-D 0 19 0 0 KOMPILU
AUS
FERMU
( 16 )
D tk->at A= 32 EL A= 84 EL A= 65 EL RE . ( Eligas "TA" por testi )
D nova_linio A= 32 EL A= 78 EL A= 76 EL RE . ( Eligas "NL" por testi )
D en<-sig A= 32 EL A= 69 EL A= 83 EL RE . ( Eligas "ES" por testi )
D sig=13? A= 32 EL A= 63 EL A= 49 EL A= 51 EL LOKO 0 EN IR0 ADR 0 A- 13 RE .
D sig=8? A= 32 EL A= 63 EL A= 56 EL LOKO 0 EN IR0 ADR 0 A- 08 RE .
D sig->el A= 32 EL A= 83 EL A= 69 EL RE . ( Eligas "SE" por testi )
D a->at A= 32 EL A= 65 EL A= 65 EL RE . ( Eligas "AA" por testi )
D at+1 A= 32 EL A= 65 EL A= 43 EL RE . ( Eligas "A+" por testi )
D at-1 A= 32 EL A= 65 EL A= 45 EL RE . ( Eligas "A-" por testi )
FERMU
( 17 )
D skribu_tekston
tk->at
nova_linio
LOKO 0 en<-sig
sig=13? IR0 ADR 1
sig->el
a->at at+1
sig=8? IR0 ADR 2
IRU ADR 0
LOKO 2 at-1 at-1 IRU ADR 0
LOKO 1 A= 32 a->at at+1
A= 13 a->at at+1 RE .
FERMU
( 18 )
D prilaboru_tekston A= 80 EL RE .
FERMU
( 19 )
D E-KOMPILILO LOKO 0 skribu_tekston prilaboru_tekston IRU ADR 0 .
D E-KOMPILILO skribu_tekston prilaboru_tekston RE .
FERMU
Tio estis la dua leciono
Se vi ne ŝatas tajpi mem la fontotekstojn vi povas alŝuti la
mem-malpakantan dosieron lec-002.exe (3K)
(Startu poste dosieron 2.bat !)
Ni skribu la sep fontotekstojn kaj storu ilin sur la spuroj 10, 14, 15,
16, 17, 18 kaj 19. Poste ni kompilu la tuton per EN-D 48 10 0 0 INIT EIN .
( 10 E-kompililo leciono 3 enigu per EN-D 48 10 0 0 INIT EIN )
EN-D 0 14 0 0 KOMPILU
EN-D 0 15 0 0 KOMPILU
EN-D 0 16 0 0 KOMPILU
EN-D 0 17 0 0 KOMPILU
EN-D 0 18 0 0 KOMPILU
EN-D 0 19 0 0 KOMPILU
AUS
FERMU
( 14 )
D variabloj LOKO 127 EN RE 0 0 0 0 0 0 ( standarda enigo )
LOKO 126 EL RE 0 0 0 0 0 0 ( standarda eligo )
LOKO 125 0 0 0 0 0 ( sig = provizora storo por signo )
LOKO 124 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ( teksto-bufro )
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
LOKO 123 ADR 124 ( tk = komenco de la teksto-bufro )
.
FERMU
( 15 )
D a->at A-> LOKO 122 00 RE . ( at = aktuala pozicio en la teksto )
FERMU
( 16 )
D tk->at A<- MADR 123 A-> MADR 122
A<- AADR 123 A-> AADR 122 RE .
D nova_linio A= 13 IRS ADR 126 A= 10 IRS ADR 126 RE .
D en<-sig LOKO 0 IRS ADR 127 IR0 ADR 0 A-> ADR 125 RE .
D sig=13? A= 9 A- 0 A<- ADR 125 A- 13 RE .
D sig=8? A= 9 A- 0 A<- ADR 125 A- 8 RE .
D sig->el A<- ADR 125 IRS ADR 126 RE .
D at+1 A= 0 A+ 0 A<- MADR 122 A+ 1 A-> MADR 122
A<- AADR 122 A+ 0 A-> AADR 122 RE .
D at-1 A= 9 A- 0 A<- MADR 122 A- 1 A-> MADR 122
A<- AADR 122 A- 0 A-> AADR 122 RE .
FERMU
( 17 )
D skribu_tekston
tk->at
nova_linio
LOKO 0 en<-sig
sig=13? IR0 ADR 1
sig->el
a->at at+1
sig=8? IR0 ADR 2
IRU ADR 0
LOKO 2 at-1 at-1 IRU ADR 0
LOKO 1 A= 32 a->at at+1
A= 13 a->at at+1 RE .
FERMU
( 18 )
D prilaboru_tekston A= 80 EL RE .
FERMU
( 19 )
D E-KOMPILILO LOKO 0 skribu_tekston prilaboru_tekston IRU ADR 0 .
D E-KOMPILILO skribu_tekston prilaboru_tekston RE .
FERMU
Tio estis la tria leciono
Se vi ne ŝatas tajpi mem la fontotekstojn vi povas alŝuti la
mem-malpakantan dosieron lec-003.exe (3K)
(Startu poste dosieron 3.bat !)
Prilaboru tekston
Ni skribu la sep fontotekstojn kaj storu ilin sur la spuroj 10, 14, 15,
16, 17, 18 kaj 19. Poste ni kompilu la tuton per EN-D 48 10 0 0 INIT EIN .
( 10 E-kompililo leciono 4 enigu per EN-D 48 10 0 0 INIT EIN )
EN-D 0 14 0 0 KOMPILU
EN-D 0 15 0 0 KOMPILU
EN-D 0 16 0 0 KOMPILU
EN-D 0 17 0 0 KOMPILU
EN-D 0 18 0 0 KOMPILU
EN-D 0 19 0 0 KOMPILU
AUS
FERMU
( 14 )
D variabloj LOKO 127 EN RE 0 0 0 0 0 0 ( standarda enigo )
LOKO 126 EL RE 0 0 0 0 0 0 ( standarda eligo )
LOKO 125 0 0 0 0 0 ( sig = provizora storo por signo )
LOKO 124 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ( teksto-bufro )
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
LOKO 123 ADR 124 ( tk = komenco de la teksto-bufro )
.
FERMU
( 15 )
D a->at A-> LOKO 122 00 RE . ( at = aktuala pozicio en la teksto )
FERMU
( 16 )
D tk->at A<- MADR 123 A-> MADR 122
A<- AADR 123 A-> AADR 122 RE .
D nova_linio A= 13 IRS ADR 126 A= 10 IRS ADR 126 RE .
D en<-sig LOKO 0 IRS ADR 127 IR0 ADR 0 A-> ADR 125 RE .
D sig=13? A= 9 A- 0 A<- ADR 125 A- 13 RE .
D sig=8? A= 9 A- 0 A<- ADR 125 A- 8 RE .
D sig->el A<- ADR 125 IRS ADR 126 RE .
D at+1 A= 0 A+ 0 A<- MADR 122 A+ 1 A-> MADR 122
A<- AADR 122 A+ 0 A-> AADR 122 RE .
D at-1 A= 9 A- 0 A<- MADR 122 A- 1 A-> MADR 122
A<- AADR 122 A- 0 A-> AADR 122 RE .
FERMU
( 17 )
D skribu_tekston
tk->at
nova_linio
LOKO 0 en<-sig
sig=13? IR0 ADR 1
sig->el
a->at at+1
sig=8? IR0 ADR 2
IRU ADR 0
LOKO 2 at-1 at-1 IRU ADR 0
LOKO 1 A= 32 a->at at+1
A= 13 a->at at+1 RE .
( *********************** )
D serchu_unuan_vortkomencon A= 32 EL A= 83 EL RE .
D av=13? A= 32 EL A= 63 EL A= 65 EL LOKO 0 EN IR0 ADR 0 A- 13 RE .
D eraro? A= 32 EL A= 63 EL A= 69 EL LOKO 0 EN IR0 ADR 0 A- 69 RE .
D eraroprogramo A= 32 EL A= 69 EL RE .
D prilaboru_sekvan_vorton A= 32 EL A= 112 EL RE .
FERMU
( 18 )
D prilaboru_tekston
serchu_unuan_vortkomencon
LOKO 0 av=13? IR0 ADR 1
prilaboru_sekvan_vorton
eraro? IR0 ADR 0
eraroprogramo RE
LOKO 1 RE .
FERMU
( 19 )
D E-KOMPILILO LOKO 0 skribu_tekston prilaboru_tekston IRU ADR 0 .
D E-KOMPILILO skribu_tekston prilaboru_tekston RE .
FERMU
Tio estis la kvara leciono
Se vi ne ŝatas tajpi mem la fontotekstojn vi povas alŝuti la
mem-malpakantan dosieron lec-004.exe (3K)
(Startu poste dosieron 4.bat !)
Prilaboru sekvan vorton
Ni skribu la sep fontotekstojn kaj storu ilin sur la spuroj 10, 14, 15,
16, 17, 18 kaj 19. Poste ni kompilu la tuton per EN-D 48 10 0 0 INIT EIN .
( 10 E-kompililo leciono 5 enigu per EN-D 48 10 0 0 INIT EIN )
EN-D 0 14 0 0 KOMPILU
EN-D 0 15 0 0 KOMPILU
EN-D 0 16 0 0 KOMPILU
EN-D 0 17 0 0 KOMPILU
EN-D 0 18 0 0 KOMPILU
EN-D 0 19 0 0 KOMPILU
AUS
FERMU
( 14 )
D variabloj LOKO 127 EN RE 0 0 0 0 0 0 ( standarda enigo )
LOKO 126 EL RE 0 0 0 0 0 0 ( standarda eligo )
LOKO 125 0 0 0 0 0 ( sig = provizora storo por signo )
LOKO 124 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ( teksto-bufro )
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
LOKO 123 ADR 124 ( tk = komenco de la teksto-bufro )
LOKO 121 0 0 ( vk = komenco de la aktuala vorto )
LOKO 119 0 ( eraro? = numero de la eraro )
( 0 = neniu eraro )
.
FERMU
( 15 )
D a->at A-> LOKO 122 00 RE . ( at = aktuala pozicio en la teksto )
D a<-av A<- LOKO 120 00 RE . ( av = pozicio en la aktuala vorto )
FERMU
( 16 )
D tk->at A<- MADR 123 A-> MADR 122
A<- AADR 123 A-> AADR 122 RE .
D nova_linio A= 13 IRS ADR 126 A= 10 IRS ADR 126 RE .
D en<-sig LOKO 0 IRS ADR 127 IR0 ADR 0 A-> ADR 125 RE .
D sig=13? A= 9 A- 0 A<- ADR 125 A- 13 RE .
D sig=8? A= 9 A- 0 A<- ADR 125 A- 8 RE .
D sig->el A<- ADR 125 IRS ADR 126 RE .
D at+1 A= 0 A+ 0 A<- MADR 122 A+ 1 A-> MADR 122
A<- AADR 122 A+ 0 A-> AADR 122 RE .
D at-1 A= 9 A- 0 A<- MADR 122 A- 1 A-> MADR 122
A<- AADR 122 A- 0 A-> AADR 122 RE .
( ***************************************************** )
D tk->av A= 32 EL A= 84 EL RE .
D av=32? A= 32 EL A= 63 EL LOKO 0 EN IR0 ADR 0 A- 32 RE .
D av->vk A= 32 EL A= 75 EL RE .
D av+1 A= 32 EL A= 43 EL RE .
FERMU
( 17 )
D skribu_tekston
tk->at
nova_linio
LOKO 0 en<-sig
sig=13? IR0 ADR 1
sig->el
a->at at+1
sig=8? IR0 ADR 2
IRU ADR 0
LOKO 2 at-1 at-1 IRU ADR 0
LOKO 1 A= 32 a->at at+1
A= 13 a->at at+1 RE .
( *********************** )
D serchu_unuan_vortkomencon
tk->av
LOKO 0 av=32? IR0 ADR 1
av->vk RE
LOKO 1 av+1 IRU ADR 0 .
D av=13? A= 9 A- 0 a<-av A- 13 RE . ( Chu aktuala signo en vorto = 13? )
D eraro? A= 0 A+ 0 A<- ADR 119 A+ 0 RE . ( Chu okazis eraro ? )
D eraroprogramo A= 32 EL A= 33 EL RE . ( eligi !-signon kiam estas eraro )
D prilaboru_sekvan_vorton A= 32 EL A= 112 EL RE .
FERMU
( 18 )
D prilaboru_tekston
serchu_unuan_vortkomencon
LOKO 0 av=13? IR0 ADR 1
prilaboru_sekvan_vorton
eraro? IR0 ADR 0
eraroprogramo RE
LOKO 1 RE .
FERMU
( 19 )
D E-KOMPILILO LOKO 0 skribu_tekston prilaboru_tekston IRU ADR 0 .
D E-KOMPILILO skribu_tekston prilaboru_tekston RE .
D e=1 A= 1 A-> ADR 119 RE .
D e=0 A= 0 A-> ADR 119 RE .
FERMU
Tio estis la kvina leciono
Se vi ne ŝatas tajpi mem la fontotekstojn vi povas alŝuti la
mem-malpakantan dosieron lec-005.exe (4K)
(Startu poste dosieron 5.bat !)
Ni skribu la sep fontotekstojn kaj storu ilin sur la spuroj 10, 14, 15,
16, 17, 18 kaj 19. Poste ni kompilu la tuton per EN-D 48 10 0 0 INIT EIN .
( 10 E-kompililo leciono 6 enigu per EN-D 48 10 0 0 INIT EIN )
EN-D 0 14 0 0 KOMPILU
EN-D 0 15 0 0 KOMPILU
EN-D 0 16 0 0 KOMPILU
EN-D 0 17 0 0 KOMPILU
EN-D 0 18 0 0 KOMPILU
EN-D 0 19 0 0 KOMPILU
AUS
FERMU
( 14 )
D variabloj LOKO 127 EN RE 0 0 0 0 0 0 ( standarda enigo )
LOKO 126 EL RE 0 0 0 0 0 0 ( standarda eligo )
LOKO 125 0 0 0 0 0 ( sig = provizora storo por signo )
LOKO 124 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ( teksto-bufro )
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
LOKO 123 ADR 124 ( tk = komenco de la teksto-bufro )
LOKO 121 0 0 ( vk = komenco de la aktuala vorto )
LOKO 119 0 ( eraro? = numero de la eraro )
( 0 = neniu eraro )
.
FERMU
( 15 )
D a->at A-> LOKO 122 00 RE . ( at = aktuala pozicio en la teksto )
D a<-av A<- LOKO 120 00 RE . ( av = pozicio en la aktuala vorto )
FERMU
( 16 )
D tk->at A<- MADR 123 A-> MADR 122
A<- AADR 123 A-> AADR 122 RE .
D nova_linio A= 13 IRS ADR 126 A= 10 IRS ADR 126 RE .
D en<-sig LOKO 0 IRS ADR 127 IR0 ADR 0 A-> ADR 125 RE .
D sig=13? A= 9 A- 0 A<- ADR 125 A- 13 RE .
D sig=8? A= 9 A- 0 A<- ADR 125 A- 8 RE .
D sig->el A<- ADR 125 IRS ADR 126 RE .
D at+1 A= 0 A+ 0 A<- MADR 122 A+ 1 A-> MADR 122
A<- AADR 122 A+ 0 A-> AADR 122 RE .
D at-1 A= 9 A- 0 A<- MADR 122 A- 1 A-> MADR 122
A<- AADR 122 A- 0 A-> AADR 122 RE .
( ***************************************************** )
D tk->av A<- MADR 123 A-> MADR 120
A<- AADR 123 A-> AADR 120 RE .
D av=32? A= 9 A- 0 a<-av A- 32 RE .
D av->vk A<- MADR 120 A-> MADR 121
A<- AADR 120 A-> AADR 121 RE .
D av+1 A<- MADR 120 A+ 1 A-> MADR 120
A<- AADR 120 A+ 0 A-> AADR 120 RE .
( ***************************************************** )
FERMU
( 17 )
D skribu_tekston
tk->at
nova_linio
LOKO 0 en<-sig
sig=13? IR0 ADR 1
sig->el
a->at at+1
sig=8? IR0 ADR 2
IRU ADR 0
LOKO 2 at-1 at-1 IRU ADR 0
LOKO 1 A= 32 a->at at+1
A= 13 a->at at+1 RE .
( *********************** )
D serchu_unuan_vortkomencon
tk->av
LOKO 0 av=32? IR0 ADR 1
av->vk RE
LOKO 1 av+1 IRU ADR 0 .
D av=13? A= 9 A- 0 a<-av A- 13 RE . ( Chu aktuala signo en vorto = 13? )
D eraro? A= 0 A+ 0 A<- ADR 119 A+ 0 RE . ( Chu okazis eraro ? )
D eraroprogramo A= 32 EL A= 33 EL RE . ( eligi !-signon kiam estas eraro )
D prilaboru_sekvan_vorton A= 32 EL A= 112 EL RE .
FERMU
( 18 )
D prilaboru_tekston
serchu_unuan_vortkomencon
LOKO 0 av=13? IR0 ADR 1
prilaboru_sekvan_vorton
eraro? IR0 ADR 0
eraroprogramo RE
LOKO 1 RE .
FERMU
( 19 )
D E-KOMPILILO LOKO 0 skribu_tekston prilaboru_tekston IRU ADR 0 .
D E-KOMPILILO skribu_tekston prilaboru_tekston RE .
D e=1 A= 1 A-> ADR 119 RE .
D e=0 A= 0 A-> ADR 119 RE .
FERMU
Tio estis la sesa leciono
Se vi ne ŝatas tajpi mem la fontotekstojn vi povas alŝuti la
mem-malpakantan dosieron lec-006.exe (4K)
(Startu poste dosieron 6.bat !)
Ni skribu la sep fontotekstojn kaj storu ilin sur la spuroj 10, 14, 15,
16, 17, 18 kaj 19. Poste ni kompilu la tuton per EN-D 48 10 0 0 INIT EIN .
( 10 E-kompililo leciono 7 enigu per EN-D 48 10 0 0 INIT EIN )
EN-D 0 14 0 0 KOMPILU
EN-D 0 15 0 0 KOMPILU
EN-D 0 16 0 0 KOMPILU
EN-D 0 17 0 0 KOMPILU
EN-D 0 18 0 0 KOMPILU
EN-D 0 19 0 0 KOMPILU
AUS
FERMU
( 14 )
D variabloj
LOKO 127 EN RE 0 0 0 0 0 0 ( standarda enigo )
LOKO 126 EL RE 0 0 0 0 0 0 ( standarda eligo )
LOKO 125 0 0 0 0 0 ( sig = provizora storo por signo )
LOKO 124 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ( teksto-bufro )
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
LOKO 123 ADR 124 ( tk = komenco de la teksto-bufro )
LOKO 121 0 0 ( vk = komenco de la aktuala vorto )
( *********************** )
LOKO 119 0 ( eraro? = numero de la eraro )
( 0 = neniu eraro )
( *********************** )
LOKO 118 0 ( ekzist? 0 = vorto ne ekzistas )
LOKO 117 0 ( k-mod? 0 = aplikomodo 1 = kompilomodo )
LOKO 116 0 ( nombr? 0 = ne estas nombro )
LOKO 115 0 ( k-nro? 0 = ne kompilu nombron )
( *********************** )
.
FERMU
( 15 )
D a->at A-> LOKO 122 00 RE . ( at = aktuala pozicio en la teksto )
D a<-av A<- LOKO 120 00 RE . ( av = posicio en la aktuala vorto )
( *********************** )
FERMU
( 16 )
D tk->at A<- MADR 123 A-> MADR 122
A<- AADR 123 A-> AADR 122 RE .
D nova_linio A= 13 IRS ADR 126 A= 10 IRS ADR 126 RE .
D en<-sig
LOKO 0 IRS ADR 127 IR0 ADR 0 A-> ADR 125 RE .
D sig=13? A= 9 A- 0 A<- ADR 125 A- 13 RE .
D sig=8? A= 9 A- 0 A<- ADR 125 A- 8 RE .
D sig->el A<- ADR 125 IRS ADR 126 RE .
D at+1 A= 0 A+ 0 A<- MADR 122 A+ 1 A-> MADR 122
A<- AADR 122 A+ 0 A-> AADR 122 RE .
D at-1 A= 9 A- 0 A<- MADR 122 A- 1 A-> MADR 122
A<- AADR 122 A- 0 A-> AADR 122 RE .
( *********************** )
D tk->av A<- MADR 123 A-> MADR 120
A<- AADR 123 A-> AADR 120 RE .
D av=32? A= 9 A- 0 a<-av A- 32 RE .
D av->vk A<- MADR 120 A-> MADR 121
A<- AADR 120 A-> AADR 121 RE .
D av+1 A= 0 A+ 0 A<- MADR 120 A+ 1 A-> MADR 120
A<- AADR 120 A+ 0 A-> AADR 120 RE .
( *********************** )
D v? A= 0 A+ 0 A<- ADR 118 A+ 0 RE .
D k? A= 0 A+ 0 A<- ADR 117 A+ 0 RE .
D n? A= 0 A+ 0 A<- ADR 116 A+ 0 RE .
D n->bf? A= 0 A+ 0 A<- ADR 115 A+ 0 RE .
D komparu_chu_vorto_ekzistas A= 32 EL A= 75 EL A= 69 EL RE . ( "KE" )
D serchu_sekvan_vortkomencon A= 32 EL A= 83 EL A= 86 EL RE . ( "SV" )
D e=1 A= 1 A-> ADR 119 RE .
D transformu_al_nombro A= 32 EL A= 84 EL A= 78 EL RE . ( "TN" )
D kompilu_nombron A= 32 EL A= 75 EL A= 78 EL RE . ( "KN" )
D al_kompilokodo A= 32 EL A= 65 EL A= 75 EL RE . ( "AK" )
D al_aplikokodo A= 32 EL A= 65 EL A= 65 EL RE . ( "AA" )
( *********************** )
FERMU
( 17 )
D skribu_tekston
tk->at
nova_linio
LOKO 0 en<-sig
sig=13? IR0 ADR 1
sig->el
a->at at+1
sig=8? IR0 ADR 2
IRU ADR 0
LOKO 2 at-1 at-1 IRU ADR 0
LOKO 1 A= 32 a->at at+1
A= 13 a->at at+1 RE .
( *********************** )
D serchu_unuan_vortkomencon
tk->av
LOKO 0 av=32? IR0 ADR 1
av->vk RE
LOKO 1 av+1 IRU ADR 0 .
D av=13? A= 9 A- 0 a<-av A- 13 RE . ( Chu aktuala signo en vorto =13? )
D eraro? A= 0 A+ 0 A<- ADR 119 A+ 0 RE . ( Chu okazis eraro? )
D eraroprogramo A= 32 EL A= 33 EL A= 0 A-> ADR 119 RE . ( eligi !-signon )
( *********************** )
D prilaboru_sekvan_vorton
komparu_chu_vorto_ekzistas
v? IR0 ADR 0
k? IR0 ADR 1
al_kompilokodo
IRU ADR 2
LOKO 1 al_aplikokodo
IRU ADR 3
LOKO 0 transformu_al_nombro
n? IR0 ADR 4
n->bf? IR0 ADR 5
IRU ADR 6
LOKO 5 kompilu_nombron
LOKO 4 e=1
LOKO 2
LOKO 3
LOKO 6
LOKO 7 serchu_sekvan_vortkomencon RE .
FERMU
( 18 )
D prilaboru_tekston
serchu_unuan_vortkomencon
LOKO 0 av=13? IR0 ADR 1
prilaboru_sekvan_vorton
eraro? IR0 ADR 0
eraroprogramo RE
LOKO 1 RE .
FERMU
( 19 )
D E-KOMPILILO
LOKO 0 skribu_tekston
prilaboru_tekston
IRU ADR 0 RE .
D E-KOMPILILO
skribu_tekston
prilaboru_tekston
RE .
D e=0 A= 0 A-> ADR 119 RE .
D k=1 A= 1 A-> ADR 117 RE .
D k=0 A= 0 A-> ADR 117 RE .
D n=1 A= 1 A-> ADR 116 RE .
D n=0 A= 0 A-> ADR 116 RE .
D n->bf=1 A= 1 A-> ADR 115 RE .
D n->bf=0 A= 0 A-> ADR 115 RE .
D v=1 A= 1 A-> ADR 118 RE .
D v=0 A= 0 A-> ADR 118 RE .
FERMU
Tio estis la sepa leciono
Se vi ne ŝatas tajpi mem la fontotekstojn vi povas alŝuti la
mem-malpakantan dosieron lec-007.exe (4K)
(Startu poste dosieron 7.bat !)
Baldaŭ sekvas la aliaj lecionoj!
zurueck / reen!