Anders Franzén
<5258>
· Text 3955 · w8 · kommentar
1987-11-15 19:56
Ärende: ASS.BAC - nästlade EQU-satser!
För att förstå hur det hela hänger ihop måste
man veta vad ett pass är. En läsning av källkoden
rent sekventiellt kallas ett pass. Med kommandot
ASS sker läsningen av källkoden i ett pass och
kommandot PASS medför en läsning i två pass. För
att lösa upp nedanstående exempel måste källkoden
läsas i fem pass vilket inte ASS klarar:
; EXEMPEL 1
;
LABEL1 EQU LABEL2
LABEL2 EQU LABEL3
LABEL3 EQU LABEL4
LABEL4 EQU LABEL5
LABEL5 EQU 1987
;
LD A,LABEL1
;
END
Varför måste källkoden läsas fem gånger för att
klara ut detta? Låt oss betrakta vad som händer
när ASS assemblerar med kommadot PASS. Ungefär
så här tänker ASS vid det första passet:
-Aha, en EQU-sats! LABEL1 skall ha värdet LABEL2
men jag vet inte vad LABEL2 är ännu. Bäst att
nollställa LABEL1 och hoppas att nästa pass ger
svaret.
-Jaha, en till EQU-sats. LABEL2 skall tydligen
få värdet LABEL3 men LABEL3 är ännu okänd. Jag
nollställer LABEL2 och hoppas det löser sig i
nästa pass!
osv...
Låt oss nu begrunda hur ASS tänker under det
andra passet:
-Aha, en EQU-sats! LABEL1 skall ha värdet LABEL2
och LABEL2 har värdet noll.
-Jaha, ännu en EQU-sats. LABEL2 skall ha värdet
LABEL3, dvs noll.
osv...
Man kan alltså dra följande slutsats:
Om man skall använda nästade EQU-satser i källkod
som skall assembleras av ASS måste alla labels
definieras i omvänd ordning. Man kan lösa ovanstående
problem genom att skriva om källkoden:
; EXEMPEL 2
;
LABEL5 EQU 1987
LABEL4 EQU LABEL5
LABEL3 EQU LABEL4
LABEL2 EQU LABEL3
LABEL1 EQU LABEL2
;
LD A,LABEL1
;
END
Slutligen kan man i nedanstående exempel se en
vanligt förekommande EQU-sats med omvänd definition
som fungerar utmärkt:
; EXEMPEL 3
;
TEXT DEFM "1987"
LÄNGD EQU ¤-TEXT
;
END
Känner man till det här kan man förstå att resultatet
kan bli underligt om man använder nästlade EQU-satser
i fel ordning. Man skulle kunna tänka sig att ASS
dynamiskt anpassar antalet pass till antalet nivåer
i nästhärvan men det krånglar till andra saker. Ett
annat sätt att lösa problemet är ett felmeddelande
typ "För många nivåer i nästade EQU-satser!".