Язык ассемблера [дубликат]

Другим случаем, когда NullReferenceExceptions может случиться, является (неправильное) использование оператора as :

class Book {
    public string Name { get; set; }
}
class Car { }

Car mycar = new Car();
Book mybook = mycar as Book;   // Incompatible conversion --> mybook = null

Console.WriteLine(mybook.Name);   // NullReferenceException

Здесь Book и Car являются несовместимыми типами; a Car не может быть преобразован / передан в Book. Когда этот сбой завершается неудачно, as возвращает null. Используя mybook после этого, вы вызываете NullReferenceException.

В общем случае вы должны использовать cast или as, как показано ниже:

Если вы ожидаете преобразования типа в всегда преуспевает (т. е. вы знаете, какой объект должен быть впереди времени), тогда вы должны использовать cast:

ComicBook cb = (ComicBook)specificBook;

Если вы не уверены в типе, но хотите попробовать , чтобы использовать его как определенный тип, затем используйте as:

ComicBook cb = specificBook as ComicBook;
if (cb != null) {
   // ...
}

8
задан Tim 28 July 2011 в 13:59
поделиться

7 ответов

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

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

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

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

11
ответ дан Tom Anderson 27 August 2018 в 19:19
поделиться

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

1
ответ дан Karoly Horvath 27 August 2018 в 19:19
поделиться

Ассемблер переводит мнемонику (например, jump, mov, add и т. д.) из языка ассемблера в машинные команды.

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

Здесь здесь . Я имею в виду

2
ответ дан octy 27 August 2018 в 19:19
поделиться

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

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

2
ответ дан old_timer 27 August 2018 в 19:19
поделиться

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

2
ответ дан Patrick87 27 August 2018 в 19:19
поделиться

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

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

3
ответ дан Thorsten Dittmar 27 August 2018 в 19:19
поделиться

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

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

Это не так сильно применимо для встроенного ассемблерного кода, например C, поскольку он в основном используется для чисто вычислений, связанных с CPU, более умным / быстрым способом, чем ожидается от компилятора).

4
ответ дан user 27 August 2018 в 19:19
поделиться