Anders Franzén
<5258>
· Text 2432 · w8 · kommentar
1986-09-07 15:29
Ärende: Självmodifierande kod !
Det kan vara variabler som programmet uppdaterar
ibland, dessa ligger i RAM. Det kan också vara så
att programmet går in och ändrar adresser i
instruktioner som JP. Det kan vara praktiskt i
tidskrävande snuttar att inte behöva tänka utan
bara hoppa. När det inte händer så mycket (när
programmet får tid) kan det gå in och modifiera
adressen i JP-satsen. JP HIT kan ändras till
JP DIT.
Man kan ändra värden som ska laddas in i register
med instruktionen LD, t ex kan LD A,3 ändras till
LD A,4. Samma sak här, det kan behövas när det
ställs stora krav på snabbhet. Man skulle ju lika
gärna hämta värdet till A från någon plats i
minnet, LD A,(nn), och byta värde där men det
tar längre tid.
Jaha, det som beskrivits ovan handlar bara om
midifieringar av data i programmet. Man kan också
modifiera själva instruktionerna. Om man vill
bli av med en liten snutt kan man slänga in
några NOP-instruktioner där. Eller ändra ett
CALL till JP osv. Här sätter bara fantasin
gränsen.
Om man inte behöver så bör man inte göra
program som ändrar i själva maskinkoden. Dels
blir programmet svårdokumenterat och dessutom
är det lätt att göra fel.
Man kan jämföra med BASIC, tänk att POKE-a
i BASIC-programmet så att hopp inte sker till
rad 10 utan till rad 20 i vissa fall! Man
slipper en IF-sats och sparar alltså tid
men vad svårt att förstå!
Självmodifierande program måste alltså ligga
i RAM när de körs.