Kristoffer Eriksson
<5357>
· Text 9169 · w8 · kommentar
1989-10-30 00:06
Ärende: ASM-PROGRAM
Ok, klister var det:
Först basic-programhuvudet (behöver jag beskriva det närmare? Det
mesta är bara 0.), sen en byte 129, som betyder GOTO, och två byte med
avstånd till relokeringsrutinen, som ligger i slutet av programmet.
Avståndet räknas från den senare byten i avståndsangivelsen.
Sen så har vi relokeringsrutinen. Den börjar med en byte 203, som står
för en konstant sträng i Basic, följt av en byte som anger längden på
denna sträng, varefter strängens innehåll följer. Denna sträng ska
innehålla relokeringsrutinen, eller om hela inte får plats i 256
bytes, åtminstone början av densamma. Efter strängen kommer en byte
184, som tar Basictolken med överrumpling och får den att börja
exekvera innehållet i strängen som maskinkod (tolken använder
strängens adress som returadress).
I mitt fall har jag bara början av relokeringsrutinen i strängen.
Denna rutin måste naturligtvis vara positionsoberoende. Den relokerar
resten av relokeringsrutinen till en känd adress (jag tar dosbuf 6),
så den inte behöver vara positionsoberoende längre. Rutinen börjar med
att göra sig av med stränglängden som ligger överst på stacken vid det
laget, och sparar sedan undan returadressen till Basictolken, ifall
man är intresserad av den (praktiskt t ex för att exekvera CHAIN, för
någon fast entrypunkt till tolken har man inte). Vidare så har man i
register DE Basicens aktuella instruktionspekare, vilket råkar vara
adressen närmast efter den här strängen som exekverar och den kod som
åstadkom inhoppet i den. Om man där har resten av relokeringsrutinen,
så vet man var den finns.