Нет, программы сильно зависят от операционной системы.Чтобы записать вывод, например «Hello, world!», Программа обычно делает запрос к операционной системе.Как правило, программа помещает аргументы для запроса в место, указанное операционной системой (например, регистр EAX
), а затем выполняет инструкцию, которая запрашивает обслуживание у операционной системы.
Запросы операционной системыобычно кодируются по номеру или какой-либо аналогичной схеме.Таким образом, чтобы запросить запись символов в выходной поток, вы помещаете одно число в EAX
.Чтобы открыть файл, вы используете другой номер, и так далее.Очевидно, что коды отличаются от операционной системы к операционной системе.(Эти запросы обычно заключаются в вызовы библиотеки. Когда вы вызываете библиотеку наподобие «write», она содержит инструкции сделать что-то похожее на то, что я описал выше.)
Даже если вы хотите «сделать это самостоятельно»и вывод на экран манипуляциями с оборудованием, есть некоторые проблемы.Во-первых, операционная система должна предоставлять вам доступ к оборудованию.Большинство систем в наши дни не позволяют программам пользовательского режима иметь прямой доступ к оборудованию.Во-вторых, ваша программа должна быть разработана для конкретного оборудования.Возможно, существует BIOS в старом стиле, в который вы можете отправлять символы, или, возможно, в системе есть какая-то современная прошивка.Вам нужны разные методы для работы с разными прошивками или другими компонентами вне ЦП.
Тем не менее, может быть невозможно написать программу на языке ассемблера, которая будет работать в нескольких разных операционных системах.Есть несколько программ (называемых polyglots ), написанных одновременно на нескольких языках высокого уровня, таких как FORTRAN и C. Например, программа может начинаться с буквы «C» в столбце, который указывает, что это комментарий.в FORTRAN, но в первой строке указан правильный код C.И этот код C может начать комментарий.Последующие строки затем располагаются так, что они представляют собой либо код FORTRAN и комментарии C, либо комментарии FORTRAN и код C.Может быть возможно сделать что-то похожее с исполняемым файлом, так что две разные операционные системы принимают его как исполняемый файл и выдают «Hello, world!»на каждом (или, что еще лучше, делает что-то свое на каждом из них).
Формат DOS .COM может быть полезен для этого, так как это необработанный двоичный файл.Если первые несколько байтов исполняемого файла для другой системы могут быть байтами, представляющими инструкцию перехода, то файл .COM может вызвать переход в другое место в файле, где вы можете расположить любые байты, какие захотитев то время как файл в противном случае является исполняемым файлом для другой системы.
Это, конечно, не предполагаемый способ создания исполняемых файлов, и это не простая задача.
Этоможет быть невозможным для большинства форматов файлов, отличных от .COM, поскольку большинство форматов объектных или исполняемых файлов требуют, чтобы первые два или четыре байта файла были магическим числом , которое идентифицирует формат файла .Многоплатформенный исполняемый файл с широко используемым форматом ELF может быть возможен, если вы можете найти способ, чтобы разные платформы могли видеть разные значения для полей в файле ELF, которые определяют, для какой платформы оно предназначено.