Self-modifying code

Peter Miller peter at neccan.oz
Tue Oct 9 11:29:47 AEST 1990


in article <1990Oct08.183922.12541 at eecs.wsu.edu>, rdubey at eecs.wsu.edu (Rakesh Dubey - grad student) says:
> Though I *think* you can do it, but you shouldn't be needing
> such tricky/unreliable kind of stuff.

I have used self-modifying code on a number of occasions,
and while I don't advise its use as a general rule,
I think it has a place in every programmers box of tricks.
Examples:

1. On a Z80 I wrote some code which used a NMI (non-maskable interrupt).
   The problem was that the Z80 has no 16-bit indirect load opcode,
   only 8-bit indirect, and (for various reasons which would take ages to
   describe) it was not avoidable to do the 16-bit indirect load.
   Murphy's Law sprang into play, (I was doing the 16-bit indirect as 2 8-bit
   indirects) and the NMI, every few hours, fell beween the 2 8-bit indirects,
   giving an impossible result and causing all sorts of weird behaviour.
   I solved it by declaring an array of 4 chars and setting it to the absolute
   load opcode, the 16-bit address, and an rts opcode.  The I cast the array
   pointer to a function pointer and called it.  Viola, 16-bit indirecting
   function.
	char barf[4];
	barf[0] = opcode ld hl,N
	barf[1] = addr;
	barf[2] = addr>>8;
	barf[3] = opcode rts
	result = (*(char *(*)())barf)();

2. On a pseudo-emacs editor I wanted real regular expressions,
   So I wrote a RE compiler in Lisp which produced lisp as output,
   and promplty executed that output.  Lisp makes self-modifying code easy.

3. A very long time ago I used an apple ][ (skeleton rattles).
   Disassembling the disk driver is enlightening.  The disk io needed every
   last cycle from the machine, and so the code first calculated the hardware's
   memory addresses and poked it into the absolute load instructions for the
   rest of the disk io code, thus getting better performance from the
   code (abs, rather than register indexed) and freeing up a register, too.

4. At some point, I realized that using a compiler is rather like
   self-modifying code.  The compiler, itself a binary data file, chews on a
   text file and makes a binary data file.  When we run the program we just
   compiled, we are asking the OS to load a binary data file and leap into it.

Regards
Peter Miller	UUCP	uunet!munnari!pdact.pd.necisa.oz!pmiller
/\/\*		CSNET	pmiller%pdact.pd.necisa.oz at au
		ACSnet	pmiller at pdact.pd.necisa.oz
Disclaimer:  The views expressed here are personal and do not necessarily
	reflect the view of my employer or the views or my colleagues.
D



More information about the Comp.lang.c mailing list