Как я могу скомпилировать 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-файл, а затем выполнить какой-то перевод системных вызовов... но это будет своего рода обман и все же будет занимать довольно много времени.

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

1 ответ

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

Если у вас есть работа 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, но он должен хотя бы каким-то образом сообщить код выхода в систему.

Другие вопросы по тегам