Как я могу скомпилировать C / C ++ в исполняемый файл CP / M-86 (CMD)

У меня есть этот проект: Скомпилировать программу C / C ++ в исполняемый файл CP / M-86 (CMD-файл) с помощью современного компилятора. Целевая архитектура — 16-битная x86. Вы можете подумать, что я сумасшедший, но я делаю это для удовольствия и для изучения CP / M-86 и низкоуровневого программирования x86 в целом.

Я почти ничего не знаю о программировании на ассемблере x86, но я сделал пример «Hello World», в котором я могу использовать ASM86 и GENCMD для генерации CMD-файла. И это работает. ASM86 — это ассемблерная программа для CP / M-86, которая будет генерировать H86-файл, то есть (насколько я понимаю) Intel Hex Code. GENCMD читает этот HEX-файл и создает исполняемый файл CMD. CMD является эквивалентом CP / M-86 исполняемых файлов EXE, известных из DOS и Windows.

У меня есть «современный» инструмент, который скомпилирует и свяжет 16-битный x86-код NASM и выведет работающую CMD, которую я могу запустить на своем компьютере CP / M-86 — полностью собрав ее на моем компьютере Linux. Однако мне нужен компилятор C / C ++, который создаст этот совместимый код NASM. Или, может быть, какой-то плоский двоичный файл, который легко конвертируется в CMD.

Второе — системные вызовы. Я могу, вероятно, сделать функцию, похожую на печать, используя встроенную сборку и проверить это. Сейчас я просто хочу скомпилировать эту программу, которая ничего не делает (и, надеюсь, не выполняет никаких системных вызовов?):

int main()
{
return 0;
}

Компиляторы C существуют для CP / M-86, но они очень, очень старые и в значительной степени непригодны для использования. Особенно, если я хочу делать C ++, как я действительно хочу. Итак, это должно быть сделано с помощью современного компилятора, такого как gcc или llvm-clang или что-то в этом роде.

В крайнем случае можно было бы скомпилировать 16-битный DOS-совместимый EXE-файл и затем выполнить какой-то перевод системных вызовов … но это будет своего рода обман и все же будет занимать довольно много времени.

Как я могу достичь своей цели? Заранее спасибо. Любой совет приветствуется 🙂

3

Решение

Как я могу достичь своей цели?

Если у вас есть работа C компилятор, тогда я думаю LLVM-CBE это то, что вы ищете. Это бэкэнд для clang-llvm (и любых компиляторов llvm, я думаю), он принимает промежуточное представление llvm (IR) и преобразует его в C, Таким образом, вы можете скомпилировать код C ++ 17 для любой машины, которая имеет c компилятор.

Около

int main()
{
return 0;
}

На Linux этот код будет вызывать open/close (и другие вещи, связанные с файлами), из-за libc работать с stdout/stderr/stdin,
также это называется exit_groupЯ не уверен насчет MS-DOS, но он должен хотя бы каким-то образом сообщить код выхода в систему.

1

Другие решения

Других решений пока нет …