"tweetable" "symbolic" hex COM loader

Dave Long dave.long at bluewin.ch
Wed May 9 12:39:25 EDT 2012


(hey Kragen, how did the bytebeat performances go?)

Apropos the bootstrapping thread[0], here's another hex loader:

0000000: 31c9 bf00 03ba 8a01 b40a cd21 a18b 013c  1..........!...<
0000010: 047c 17b8 0001 01c8 bb00 0202 1e8c 0189  .|..............
0000020: 07be 8c01 a5a5 9041 ebdb 31c0 a320 0289  .......A..1.. ..
0000030: cd31 c9be 0003 bf00 02bb 0100 31c9 31d2  .1..........1.1.
0000040: b800 42cd 21b8 0040 cd21 ac31 d231 c0ac  ..B.!.. at .!.1.1..
0000050: 3c20 740f bb01 0101 cb29 da01 f889 c38b  < t......)......
0000060: 0701 c231 c0ac 0c20 d410 d503 2c09 c0e0  ...1... ....,...
0000070: 0401 c2ac 0c20 d410 d503 2c09 01c2 9090  ..... ....,.....
0000080: b402 cd21 4139 e975 c1c3 5000            ...!A9.u..P.

The main advantage of keying in the extra 100 bytes is to gain branch  
relocation with (mono-)symbolic labels, facilitating alternations and  
repetitions, and hence paving the way for real (or at least multiple  
character) symbol tables and automated handling of other relocations 
[1].  Its format is fairly restrictive[2], with the first 4  
characters of each line defining an output byte:
	0:	defines a label
	1:	calculates a pc-relative reference to a label
	2:	high nybble value
	3:	low nybble value

As an example, here's a load file for a variant of fr-16:
   b8
   13
   00    # mov ax,13
   cd
   10    # int 10
   c4
   2f    # les bp,[bx]
l aa    # loop: stosb
   11
   f8    # adc ax,di
   15
   32
   11    # adc ax,1132
   eb
  l00    # jmp loop
(or see the footnotes for the "source"[3])

In principle, there's one branch too many[4] in this code; it should  
be possible to run the second pass entirely in straight-line code.   
On the other hand, 15 additional bytes and slight modifications to  
the input format suffice to provide absolute relocations without any  
additional logic...

-Dave

[0] http://lists.canonical.org/pipermail/kragen-discuss/2011-April/
[1] in fact, if one adds enough evaluation to an assembler it becomes  
indistinguishable from a linker ... conversely, a sufficiently  
advanced linker is indistinguishable from an assembler.  cf
Jones DW, "Assembly Language as Object Code", SP&E 13, Aug 1983
Fraser & Hanson, "A Machine Independent Linker", SP&E 12, Apr 1982
http://drhanson.s3.amazonaws.com/storage/documents/link.pdf
[2] have I mentioned that my first PL/1 program failed to compile  
because I had mistakenly entered code in the first 6 columns?
[3] encoded here with newlines replaced by commas:
   31,  c9,  bf,  00,  03,A ba,  8a,  01,  b4,  0a,  cd,  21,  a1,   
8b,  01,  3c,  04,  7c, B00,  b8,  00,  01,  01,  c8,  bb,  00,  02,   
02,  1e,  8c,  01,  89,  07,  be,  8c,  01,  a5,  a5,  90,  41,  eb,  
A00,B 31,  c0,  a3,  20,  02,  89,  cd,  31,  c9,  be,  00,  03,   
bf,  00,  02,  bb,  01,  00,  31,  c9,  31,  d2,  b8,  00,  42,  cd,   
21,  b8,  00,  40,  cd,  21,G ac,  31,  d2,  31,  c0,  ac,  3c,  20,   
74, D00,  bb,  01,  01,  01,  cb,  29,  da,  01,  f8,  89,  c3,  8b,   
07,  01,  c2,D 31,  c0,  ac,  0c,  20,  d4,  10,  d5,  03,  2c,  09,   
c0,  e0,  04,  01,  c2,  ac,  0c,  20,  d4,  10,  d5,  03,  2c,  09,   
01,  c2,  90,  90,  b4,  02,  cd,  21,  41,  39,  e9,  75, G00,  c3,   
50,  00,
[4] the first pass loop-and-a-half could also lose a branch if one  
specified that loader files must end with, say, the string ' []' as a  
tombstone.



More information about the Kragen-discuss mailing list