Различается ли вывод ассемблера между операционными системами? - PullRequest
1 голос
/ 15 января 2010

Код ассемблера, сгенерированный ассемблером из исходного кода C, зависит от архитектуры процессора, лежащей в его основе, например, x-86.

Тогда какой вывод ассемблера простого C-исходного кода (содержащий общие вызовы функций для Windows и Linux) отличается в разных операционных системах?

Ответы [ 5 ]

3 голосов
/ 15 января 2010

Это сложный вопрос. Если я скомпилирую следующий код:

void f() {
  int x = 0;
  x = x + 1;
}

к файлу .o (т.е. не связанному) на обеих платформах, можно ли ожидать, что вывод x86 будет одинаковым?

Ответ: возможно. Но я бы не удивился, если бы этого не было.

2 голосов
/ 15 января 2010

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

Однако, есть несколько вариантов:

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

  2. Операционные системы также будут иметь различные соглашения для компоновки (например, статическое связывание против динамического связывания и т. Д.). Таким образом, конечный исполняемый файл может быть другим.

  3. То, что созданные файлы одинаковы, не означает, что полученные объектные файлы являются переносимыми. Для системных вызовов идентификатор обработчика прерываний отличается в разных ОС. Поэтому, если вы жестко закодируете прерывание, необходимое для системного вызова в ASM, этот код может не работать в разных ОС.

1 голос
/ 15 января 2010

Код ассемблера может не отличаться для разных платформ с одинаковыми кодами машин, однако он зависит от ассемблера. Вывод gas (GNU Assembler) должен собираться на любой платформе, которая его поддерживает, но не может компилироваться в nasm (ассемблер Netwide).

0 голосов
/ 16 января 2010

Вывод будет варьироваться от компилятора к компилятору, в том числе от одной версии gcc к другой, от одного gcc в одном дистрибутиве до другого или на той же машине. В основном ответ - да, результаты могут и будут широко варьироваться. Сказать, что вы можете сначала не найти разницу в зависимости от кода и в зависимости от параметров вашего компилятора, но чем больше разных машин вы пробуете, 32-битными и 64-битными, незначительными различиями в обновлениях в одном и том же дистрибутиве и т. Д. что исходный код C - это конец, программа выполнена, производительность завершена и т. д. Реальность такова, что существует значительное количество вариаций, оставшихся от C до двоичного кода даже на одной машине с одним и тем же компилятором, каждый вариант имеет Возможности и проблемы, отлаживаемые или нет, производительность или нет, ошибки компилятора или нет. с достаточно большой программой легко продемонстрировать увеличение производительности в несколько раз, используя различные ключи на компиляторе или лучший компилятор. Не имеет значения, если вы компилируете в asm или объект (который в зависимости от компилятора может и будет останавливаться на временном ассемблированном файле, а затем отбрасываются промежуточные файлы), порядок и выбор инструкций будут различаться. Даже несколько простую программу пытаются выполнить с отладочным материалом или без него (-g я думаю, что я НИКОГДА не использую его) и различными уровнями оптимизации -O0, -O1, -O2, -O3. 8 комбинаций прямо здесь, вы должны получить несколько разных результатов, в частности от отсутствия оптимизации до некоторой оптимизации.

0 голосов
/ 15 января 2010

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

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