2014-02-02 2 views
5

Я смущен относительно зависимости от платформы. Я хотел бы получить это прямо. Итак, если я правильно понимаю, определенная архитектура оборудования будет иметь определенный набор команд.Язык ассемблера и платформа Независимость

Справа? Например. если говорить о процессоре Intel 8086, то для этого процессора есть определенный набор инструкций. Если я код в этом наборе команд, это означает, что я кодирую на ассемблере, поддерживаемом Intel 8086. Правильно?

Теперь эта конкретная архитектура процессора может использоваться различными машинами и операционными системами. Например. MAC, использующий Mountain Lion OSX, машину Lenovo, использующую Ubuntu в качестве ОС и машину VAIO VAIO, использующую Windows 7 как свою ОС, все эти машины могут иметь свою базовую архитектуру процессора как Intel 8086. Правильно?

Итак, теперь, если я пишу код (чтобы добавить 2 цифры) на ассемблере для процессора Intel 8086, этот код должен работать без проблем на всех упомянутых выше трех машинах. И обычный ассемблер должен иметь возможность конвертировать этот код в код уровня машины на всех этих трех машинах. Правильно?

Итак, где же зависимость от платформы возникает здесь? Поскольку код asm записывается для одной и той же базовой архитектуры процессора, должен ли он работать не только на всех платформах?

Я просто пытаюсь выяснить, где я ошибаюсь и путаюсь. Что мне здесь не хватает? Пожалуйста, несите меня, если вопрос звучит путающе или глупо.

+1

Физическое оборудование исключительно не является «платформенным». – WhozCraig

+0

Как бы вы запускали свою программу? Что-то должно его запускать (BIOS, система Windows, Linux один). –

+1

Этот вопрос должен быть перенесен на программистов. Stackexchange –

ответ

6

Я дам вам плохую автомобильную аналогию о том, почему возникают проблемы.

Автомобили всех марок построены с помощью винтов и болтов одного и того же типа (8086 кодов)

И хотя вы можете взять винт от Форда (Windows) и ввернуть его в Toyota (OSX), вам не может взять панель кузова от Ford (Internet explorer) и закрепить его на Toyota (OSX).

Панели могут быть прикреплены с помощью винтов и болтов того же типа, но панели никогда не будут соответствовать между двумя брендами.

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

(я сказал вам, что это будет плохая аналогия)

+1

На самом деле это отличный ответ +1 –

6

К сожалению, ваша ассемблерная программа не будет очень далеко, без использования API и ABI для ввода и вывода. И API и ABI : зависят от платформы.

+1

Чтобы еще раз взглянуть на это: [Wine] (http://www.winehq.org/) реализует платформу Windows ABI (включая исполняемый загрузчик и т. Д.), Чтобы позволить программам Windows запускаться на других платформах. То есть разные платформы (операционные системы) реализуют разные ABI, но в этом нет ничего волшебного, и да, базовый машинный код «независим от платформы», это интерфейсы между компонентами, специфичными для платформы. –

1

Прежде всего, «8086» уже не совсем точно. Были добавлены расширения номера в набор команд с момента его первого выпуска, в частности, когда он был расширен до 64 бит. Таким образом, одним из источников несовместимости уже является то, предназначен ли код для работы в режиме 64 или 32 бит (или даже 16-разрядный режим).

В любом случае Проблема заключается в интерфейсе между оборудованием и операционной системой. Код ассемблера для набора инструкций x86 будет одинаковым для всех трех, но полученный машинный код может/будет по-прежнему несовместимым. Различные ОС могут использовать разные константы, условные обозначения или схемы для таких вещей, как таблицы системных вызовов, ввод и выход функций и распределение стека.Например, в 64-битных версиях большинство x86 Unices используют регистры для первых 6 аргументов, а затем перетаскивают остальные в стек, тогда как Windows использует регистры только для первых 4 и подталкивает дополнительное 32-байтовое поле в стек, чтобы отразить те регистрирует каждый вызов функции. Какие регистры также используются, например, Windows помещает первый аргумент без плавающей запятой в RCX, но Unix использует RDI. вы Это можно объяснить всем этим с помощью макросов компилятора, но тогда у вас нет бинарной совместимости.

1

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

Так что нет, вы не можете сказать, что если бы вы взяли одну строку asm, добавив два числа, которые он будет переносить.

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

Я могу взять те же кирпичи и один и тот же раствор и построить разные, несовместимые здания, предназначенные для разных целей. Таким образом, навыки кирпичной кладки переносимы, но то, что мы строим с ними, - нет.

То же самое касается многих других языков программирования, некоторые из которых были первоначально разработаны для переноски.

Смежные вопросы