11:58
Компилятор Си для 8086 — Лисья нора
§ Превью
Я очень давно искал инструмент, с помощью которого можно было бы откомплировать файл Си в мышиный код. Это произошло спустя несколько сотен лет. Итак:all: bcc -O -0 main.c -Md -c main.o ld86 main.o -o main.out objdump86 main.out > main.txt php out2bin.php main.txt MAIN.COM rm *.o *.out *.txtКомпилирует файл main.c в особый код. Ниже приведен файл
main.c:int main() { unsigned char* m = (unsigned char*) 0xA000; int i; for (i = 0; i < 4096; i++) m[i] = i; return 0; }Что получается по итогу при вызове функции
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-файла для запуска.
§ Код скрипта
Для извлечения бинарного кода.<?php $b = ''; foreach (file($argv[1]) as $m) { $x = "([0-9a-f]{2})"; 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)) { for ($i = 1; $i <= 16; $i++) $b .= chr(hexdec($c[$i])); } else if (preg_match("~:\s$x\s$x\s$x\s$x\s$x\s$x\s$x\s$x~", $m, $c)) { for ($i = 1; $i <= 8; $i++) $b .= chr(hexdec($c[$i])); } } file_put_contents($argv[2], $b);