§ Превью

Я очень давно искал инструмент, с помощью которого можно было бы откомплировать файл Си в мышиный код. Это произошло спустя несколько сотен лет. Итак:
1all:
2	bcc -O -0 main.c -Md -c main.o
3	ld86 main.o -o main.out
4	objdump86 main.out > main.txt
5	php out2bin.php main.txt MAIN.COM
6	rm *.o *.out *.txt
Компилирует файл main.c в особый код. Ниже приведен файл main.c:
1int main() {
2
3    unsigned char* m = (unsigned char*) 0xA000;
4
5    int i;
6    for (i = 0; i < 4096; i++) m[i] = i;
7    return 0;
8}
Что получается по итогу при вызове функции objdump86 test:
OBJECTFILE 'test'
HLEN 32
CPU  i386 LITTLE_ENDIAN
FLAGS: A_EXEC
a_total  = 0x00008038
a_syms   = 0x00000020

text     data     bss  dec  hex  filename
56       0        0    56   38   test

SYMBOLS
00000000 T _main
00000000 a main.off

TEXTSEG
: 55 89 e5 57 56 4c 4c c7  46 fa 00 a0 4c 4c 31 c0  U..WVLL.F...LL1.
: 89 46 f8 eb 10 8b 46 f8  03 46 fa 89 c3 8a 46 f8  .F....F..F....F.
: 88 07 ff 46 f8 81 7e f8  00 10 7c e9 31 c0 83 c4  ...F..~...|.1...
: 04 5e 5f 5d c3 00 00 00                           .^_]....
DATASEG
Отсюда можно извлечь с помощью каких-нибудь скриптов необходимую последовательность байт и записать в виде COM-файла для запуска.

§ Код скрипта

Для извлечения бинарного кода.
1<?php
2
3$b = '';
4foreach (file($argv[1]) as $m) {
5
6    $x = "([0-9a-f]{2})";
7    if (preg_match("~:\s$x\s$x\s$x\s$x\s$x\s$x\s$x\s$x\s+$x\s$x\s$x\s$x\s$x\s$x\s$x\s$x~", $m, $c)) {
8        for ($i = 1; $i <= 16; $i++) $b .= chr(hexdec($c[$i]));
9    } else if (preg_match("~:\s$x\s$x\s$x\s$x\s$x\s$x\s$x\s$x~", $m, $c)) {
10        for ($i = 1; $i <= 8; $i++) $b .= chr(hexdec($c[$i]));
11    }
12}
13
14file_put_contents($argv[2], $b);