Если я напишу на ассемблере или машинном языке, будет ли программа работать на любом компьютере с совместимым процессором? - PullRequest
2 голосов
/ 25 июня 2011

По сути, я хочу знать, могу ли я использовать машинный или ассемблерный язык для написания программы, которая будет работать на любом компьютере с процессором x86, несмотря на различия в операционных системах.Например, вы запускаете программу, и независимо от того, на каком компьютере она установлена, она отображает «Hello, World!»Я знаю, что немного безумно хотеть знать любой из этих языков, но я думаю, что это невероятная вещь для изучения, так почему бы и нет?

Ответы [ 6 ]

2 голосов
/ 25 июня 2011

Нет, программы сильно зависят от операционной системы.Чтобы записать вывод, например «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, которые определяют, для какой платформы оно предназначено.

2 голосов
/ 25 июня 2011

В общем, №

Разные ОС будут по-разному поддерживать функции API и поддерживать разное оборудование по разным адресам.

Если вы хотите охватить наибольшее количество платформ, тогда, вероятно, стоит использовать java.

1 голос
/ 25 июня 2011

«Это зависит»

Если вы хотите фактически исполняемый двоичный файл, то ответ - нет.Однако, если вы просто хотите написать фрагмент сборки, а затем встроить его в больший исполняемый файл, ответ будет «да»;однако вам не разрешат вызывать какие-либо специфические функции ОС в этом блоке кода сборки.Таким образом, вы, вероятно, не сможете реализовать эту мечту о создании единой программы сборки, которая печатает «Hello world» на нескольких операционных системах.

0 голосов
/ 04 января 2014

Чушь.MACHINE LANGUAGE для компьютеров x86 не меняется с компьютера на компьютер.что они делают, это добавляют инструкции и т. д., если вы хотите, чтобы программа делала что-то более сложное, чем «привет мир», то способ достижения этого будет немного отличаться в зависимости от того, как он обрабатывает пейджинг и т. д. длянебольшая программа, которая не прыгала в оперативной памяти, она была бы почти одинаковой для каждого.

0 голосов
/ 25 июня 2011

Да, и нет, это ваш ответ.Вы можете написать, скажем, сборку x86, и она будет делать то же самое в Linux, Mac OS X и MS Windows ... Но, делая то же самое, я имею в виду, что буквально она будет принимать данные из одного места, выполнять то же самоеопераций и сохранить его где-то в памяти.

Таким образом, вы можете выполнять быструю 3d-математику или что-то одно и то же на всех платформах, но так, как вы получаете данные в свою процедуру сборки и из нееи то, для чего вы его используете, будет отличаться на всех платформах.Таким образом, вы не можете «отображать» hello world на любой ОС, но вы, безусловно, можете поместить символы «hello world» (или набор преобразованных вершин) в память где-нибудь, чтобы код, специфичный для вашей ОС, мог его извлечь и использовать.

0 голосов
/ 25 июня 2011

Короче говоря, нет.

Операционные системы обычно не просто начинают выполнение первого байта двоичной программы.Вместо этого они устанавливают адресное пространство для приложения, которое будет включать такие вещи, как то, насколько большим он хочет, чтобы его стек вызовов был, какие значения он хочет предварительно назначить константам, и какие части двоичного файла должны быть загружены как исполняемыекод, а не записываемые данные.

Способ, которым двоичная программа инструктирует операционную систему о том, как она хочет сконфигурировать свое адресное пространство, варьируется от операционной системы к операционной системе.

...