It's debatable whether there's still any real benefit to compressing exe files. Originally the reduced storage space would have been an advantage as would the slightly reduced disk (or even tape) load time. Nowadays the potential benefits are lower network bandwidth and smaller downloads.
Exe compressors present some interesting challenges for a programmer. The effectiveness of the compression has to be balanced against the size of the decompressor. The compression algorithm has to be chosen carefully for speedy decompression. If the program has a relocation table, what's the best way to optimise it? How can the additional memory requirements be minimised?
It shouldn't come as any surprise that hundreds of programmers have risen to the challenge and written an exe packer. A quick search of the net turns up at least 80 for DOS / Windows and several for other environments.
In 8086 assembly, a Run Length decoder for a DOS .COM file can be written in under 40 bytes and decoders for the simplest LZ77 derivatives in under 50 bytes. Here's an example RLE decoder:
; 8086 .COM RLE decoder move: ; copy unpacker and compressed ; code elsewhere in memory mov si, unpack mov di, freemem mov cx, codeend-unpack push di rep movsb ; setup RLE paremeters mov si, freemem+code-unpack mov di, program mov bx, num_of_tokens ; transfer control to unpack ret ; unpack compressed program unpack: push di rle: lodsb cmp al, token jne single lodsw mov cl,ah db 0F3h ; rep single: stosb dec bx jne rle ; transfer control to program ret code: ; ..... codeend:If you have any thoughts on the advantages / disadvantages of exe packers or any implementation ideas I'd love to hear them. Also does anyone know anything about the history of exe packers? The earliest I've found is from November 1987.