Self-modifying code
David Goodenough
dg at lakart.UUCP
Wed Jul 13 03:11:16 AEST 1988
>From article <225800044 at uxe.cso.uiuc.edu>, by mcdonald at uxe.cso.uiuc.edu:
>
>> [discussion of execute-only code segments]
>> > Besides, I thought that self-modifying code was (a) extremely difficult
>> >to write, and (b) considered poor programming practice.
>>
>> Yes, it is and it is.
>>
> Yes, it is and yes it is, but only by those who don't need it. There
> are good uses for self-modifying code: I have used it recently in
> two places (one on an IBMPC and the second on a PDP-11.
These are MY OPINIONS ONLY - you are free to agree and disagree and flame as
you see fit. I have used S-M-C only once when doing a section of code that
handled single stepping. The problem W/ the Z80 (comp.lang.c ??????) is that
it has conditional jumps, calls AND returns. Now I go and fetch an instruction
out of the code portion (i.e. where my PC is pointing to). It's 0xc2. Aha, I
have a conditional instruction. Now to figure out whether the condition is
met I have two choices:
1. Decode the bits that determine which flag is being looked at, and
whether the flag should be set or reset. Get the flags into
some register where I can use them. Mask out the flag in
question. Do a condional jump on the result of the mask
and whether the flag shold be set or clear.
2. Turn the instruction into a conditional jump (and with a mask
then or with a mask - turns any condional (except the
relative jumps) into a conditional jump). Drop the condional
jump into a hole - get the flags and do the jump.
If someone wants to see the code that I produced for both of the above I can
e-mail. I ask you to take it on faith that 1 was about 40-50 lines, whereas
2 was 6 lines. Also BECAUSE I COMMENTED, it was possible to figure out what
was going on. My mark of good commenting is code that can be read a year later
and still understood. I agree that this is not for the faint at heart, but
it was faster, and to my mind easier to understand. Note also that in this
application speed was a premium: when I'm single stepping 1000 instructions
I want things to happen PDQ as I would like to see the program appear to run
as fast as possible. But then I'm a little insane, because who in their
right mind writes a single step utility for a dead micro like the Z80 :-)
Like everything it has it's place: and is not to be misused. Misuse of
S-M-C *_IS_* a sin (well I think so), but where it is justified I will
use it.
--
dg at lakart.UUCP - David Goodenough +---+
| +-+-+
....... !harvard!cca!lakart!dg +-+-+ |
+---+
More information about the Comp.lang.c
mailing list