Для примера, есть немного кода 8086, который охота хоть как-то завести под линуксом на современных машинах.
019C jc 000001B0
019E sar ax,07
01A1 add ax,7D60
01A4 add di,ax
01A6 mov al,[si]
01A8 dec byte [si]
01AA cmp al,es:[di]
01AD jle 01B0
01AF stosb
Само собой, код получен декомпиляцией. В полном варианте более 1500 строк и я замучился разматывать клубок из графа с сотнями переходов. Пока вижу 3 варианта:
1. написать что-то среднее между транслятором и эмулятором в си, т.е. к примеру mov al,[si] транслируется в al=data[si], но во-первых, при таком подходе нужно эмулировать все-все регистры, а во-вторых, при использовании более сложных команд, эмулировать все-все флаги, а их до чертиков и не факт что они испльзуются. Опять же, даже mov может транслироваться сразу в data[di]=al;data[di+1]=ah;, что уже не так тривиально. На лапшу из goto в общем-то все равно, охота запустить «как есть».
2. написать транслятор в inline asm, который подсунуть GCC, в гугле есть варианты сборки ассебмлера с интелевским синтаксисом, но я не очень понимаю что будет с сегментами данных, стеком и прочими вещами, в учебнике к GCC говорят что интелевский синтаксис плохо, а AT&T хорошо, а вот про стек ничего не нашел.
3. юзать какой-то эмулятор вроде досбокса, но тогда и общаться с программой придется через интерфейсы доса, а этого бы очень хотелось избежать и оформить код в виде сишной функции, которую и дергать.
IDA генерит граф, местами помечает красным «я тут не смогла», HexRays говорит что 16-битный код не умеет, REC валится на этапе анализа, DCC не очень понятно как использовать.
Какие варианты?