Как языки ассемблера зависят от операционных систем? - PullRequest
10 голосов
/ 28 июля 2011

Поскольку язык ассемблера реализует символическое представление инструкций процессора, которые не зависят от ОС, в то время как ассемблеры всегда работают под некоторыми ОС, мне было интересно, как языки ассемблера зависят от операционных систем?Например, будут ли языки ассемблера одинаковыми для одного и того же процессора с разными ОС?Спасибо!

Ответы [ 7 ]

12 голосов
/ 28 июля 2011

Как уже отмечали другие, системные вызовы и прерывания отличаются. Я могу вспомнить еще несколько различий.

Набор инструкций одинаков во всех ОС на данном процессоре, но формат исполняемого файла может не совпадать. Например, на x86 Windows использует формат PE, Linux использует ELF, а MacOS использует Mach-O. Это означает, что ассемблеры на этих платформах должны выводить свои данные в этих форматах, что является разницей.

Соответственно, соглашение о вызовах также может быть различным в разных ОС. Это, вероятно, имеет значение только в тех случаях, когда вы пишете ассемблерный код, который вызывает или вызывается подпрограммами скомпилированного кода, или, возможно, когда вы пишете встроенный ассемблер в некотором скомпилированном коде. Соглашение о вызовах определяет, какие регистры используются для каких целей во время вызова функции, поэтому разные соглашения требуют разного использования регистров при вызове и вызываемом коде. Они также накладывают ограничения на положение указателя стека и другие разные вещи. Как это бывает, соглашения о вызовах исторически были редким примером согласованности между операционными системами во многих случаях: я считаю, что соглашения о вызовах Windows и UNIX одинаковы для x86 (и все они основаны на почтенной спецификации UNIX System V ABI), и совместимы между операционными системами на большинстве других архитектур. Однако в x86_64 соглашения между Windows и UNIX теперь разные.

Кроме того, могут быть различия в синтаксисе, используемом языком ассемблера. Снова на x86, ассемблеры Windows и Linux использовали другой синтаксис, причем ассемблер Windows использовал синтаксис, изобретенный Intel, а ассемблер Linux (на самом деле, ассемблер GNU), используя традиционный синтаксис UNIX, изобретенный AT & T. Эти синтаксисы описывают один и тот же набор команд, но написаны по-разному. В настоящее время ассемблер GNU также может понимать синтаксис Intel, поэтому разницы меньше.

4 голосов
/ 28 июля 2011

Доступные инструкции (и, конечно, семантика каждой инструкции) зависят от процессора, а не от ОС - так что, в некотором смысле, вы правы.

Но для большинства задачинтерес (например, ввод / вывод), вам нужно поговорить с ОС (делать системные вызовы).Кроссплатформенные абстракции над этими вещами не существуют на этом уровне (ну, вы могли бы попытаться использовать, например, libc, но даже тогда вам нужно знать используемое соглашение о вызовах, которое может различаться междуплатформы и т. д. - в конце концов, вам придется приложить немало усилий для создания такой абстракции самостоятельно, так что AFAIK лишь немногие из немногих, кто программирует на ассемблере, пытаются попробовать), чтобы сделать что-то невозможное с (ОСинструкции процессора, вы должны знать, для какой ОС вы программируете и как указывать этой ОС делать это.

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

4 голосов
/ 28 июля 2011

Языки ассемблера зависят не от ОС, а от набора команд процессора.

Только если вы вызываете функции API (например, функцию Windows API из встроенного кода ассемблера в MSVC), вы получаете зависимость от ОС.

2 голосов
/ 28 июля 2011

Язык ассемблера не имеет к этому никакого отношения, вы можете задать свой вопрос (как язык xyz зависит от операционных систем) и использовать C, pascal, ada, fortran и длинный список других языков и задать тот же вопрос с помощьюОтвет тот же, язык тут не причем.Системные вызовы в операционную систему с использованием соглашения о вызовах для операционной системы - вот что важно: IF вы используете тот же язык или язык с тем же соглашением о вызовах, что и определение операционной системы, что упрощает жизньно не запирает тебя ни во что.практически любой язык может быть использован, как вы, вероятно, хорошо знаете, стандарты C, C ++ и т. д., а также интерпретируемые виртуальные или во время выполнения и т. д. java, perl, python, сценарий оболочки, javascript и т. д. Все они, похоже, работают на моем компьютере.компьютер по крайней мере.Где-то (в зависимости от языка) это прокладка, которая делает системные вызовы в операционной системе способом, определяемым операционной системой.Asm облегчает жизнь некоторым из этих языков, так как вы не связаны какими-либо правилами, которые вы можете использовать asm, чтобы сделать эту разницу между соглашением о вызовах языка и желаемым вызовом операционной системы.Аналогично, использование asm упрощает взаимодействие с любым соглашением о вызовах, будь то язык или операционная система.

Кроме того, как уже было сказано, язык ассемблера не зависит от операционной системы или любого другого программного обеспечения, запущенного на процессоре.он напрямую связан с набором команд процессора.Теперь есть машинный код, фактически выполняемые процессором биты, они не меняются, но файлы ascii, используемые для представления тех инструкций, которые могут изменить язык, но не из-за процессора или операционной системы, эти различия должны делатьс цепочкой инструментов.Например, синтаксис x86 att против синтаксиса Intel.Одинаковый набор инструкций, одинаковый машинный код, другой язык ассемблера.и если вы посмотрите вокруг достаточно tasm, masm и т. д., есть много ассемблеров для x86, и у каждого есть свои собственные директивы и другие нюансы, связанные с набором инструментов.

2 голосов
/ 28 июля 2011

Ассемблер переводит мнемонику (например, jump, mov, add и т. Д.) С языка ассемблера в машинные инструкции. Машинные инструкции полностью зависят от аппаратного обеспечения (они представляют набор аппаратных / процессорных команд).

Если вы когда-нибудь хотели придумать язык ассемблера, вам также необходимо спроектировать / написать ассемблер, который будет выполнять отображение на машинные инструкции. В этом смысле, если вы ориентируетесь на конкретную архитектуру машины, ассемблер должен создавать код, специфичный для машины, а не код, специфичный для ОС. Однако реализация на ассемблере может (и, как правило, * * *) * зависит от ОС, поскольку из-за создаваемой им программы вывода (исполняемый файл Unix отличается от исполняемого файла Windows, даже если базовый набор машинных инструкций, например, x86).

Смотрите здесь что я имею в виду.

2 голосов
/ 28 июля 2011

Язык ассемблера должен быть одинаковым; Как вы указали, набор команд зависит только от процессора и его архитектурного дизайна. Я полагаю, что вы начинаете сталкиваться с проблемами в разных ОС, когда начинаете вызывать, например, прерывания (обычно для ввода / вывода), которые могут определенно означать программы, написанные, например, для MSDOS не будет работать, например, Солярис (возможно, плохой пример).

1 голос
/ 28 июля 2011

ОС не имеет значения.У вас может быть один и тот же ассемблер в разных ОС, вы можете использовать разные компиляторы в одной и той же ОС, эй, вы можете даже кросс-компилировать, ориентируясь на разные системы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...