Стандарт на ассемблере - PullRequest
       16

Стандарт на ассемблере

8 голосов
/ 09 ноября 2011

Существует ли стандарт , который определяет синтаксис и семантику из ассемблера ? Точно так же, как язык C имеет ISO стандарт, а язык C # имеет ECMA стандарт? Есть только один стандарт или их больше?

Я спрашиваю, потому что я заметил , что язык ассемблера код выглядел другой на Windows и Linux среда. Я надеялся, что язык ассемблера не зависит от ОС, что это только язык с определенным стандартом и через ассемблер (компилятор языка ассемблера) переводится в машинные инструкции для конкретного процессор .

спасибо за ответ

Ответы [ 7 ]

5 голосов
/ 09 ноября 2011

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

Если бы существовал язык ассемблера, использование которого было сравнимо с C или C ++, то вы могли бы ожидать, что организация попытается разработать стандарт. Частично проблема по-прежнему заключается в том, что с такими вещами, как язык C, существует интерпретация до того, как он достигнет аппаратного обеспечения, а с ассемблером практически ничего не остается, поэтому производитель микросхем собирается делать все, что хочет, из-за рыночных факторов и стандарт должен был быть перетащен, чтобы соответствовать аппаратному обеспечению, а не наоборот, где стандарт ведет поставщиков.

Процессор opencore может быть тем, который может быть основан на стандартах, поскольку он не зависит от поставщика, возможно, он уже есть.

При сборке предположим, что каждая версия каждой программы / программного обеспечения / инструмента на ассемблере имеет свои собственные правила синтаксиса в одном наборе команд, а также в разных наборах команд. (что на самом деле вы получаете с C / C ++, но это уже другая тема): либо выберите свой любимый инструмент и узнайте только его, либо постарайтесь запомнить все варианты во всех инструментах, либо я предпочитаю избегать как можно большего количества инструментов конкретный синтаксис и нюансы, и попробуйте найти золотую середину, которая работает или, по крайней мере, имеет шанс работать или портировать через инструменты.

5 голосов
/ 10 ноября 2011

Да, есть стандарт.

Люди, которые собирали ассемблеры вплоть до 1980-х годов, выбрали невероятное разнообразие синтаксических схем.

Сообщество IEEE отреагировало стандартом, чтобы попытаться избежатьэта проблема:

694-1985 - Стандарт IEEE для языка ассемблера микропроцессоров

Как и во многих других вещах в мире программного обеспечения, он был и остается в основном игнорируемым.

2 голосов
/ 09 ноября 2011

Нет, стандарта нет.Существует даже два различных типа синтаксиса : синтаксис intel, который преобладает на платформах Windows, и AT & T-sytanx, который доминирует в мире * nix.Относительно по-разному выглядящего кода в википедии: пример windows использует Win32API, а пример linux использует системный вызов прерывания 0x80 .

1 голос
/ 09 ноября 2011

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

Язык ассемблера не зависит от ОС как таковой, он специфичен для процессора, но для процедуры сборкичтобы получить доступ к вещам, которые кажутся вам стандартными (например, некоторая подпрограмма для печати текста в консоли), нужен специфичный для ОС код.Для MSDOS вы должны использовать подпрограммы обработки прерываний BIOS и DOS (вызывается на процессоре x86 через инструкции int 13h, int 10h, int 21h, int 33h и т. Д.), Для Windows вы будете использовать Windows '(доступно через int 2eh и sysenter)./ syscall), для Linux вы бы использовали Linux '(например, int 80h).Все они реализованы по-разному в разных ОС и ожидают различного количества и видов параметров и в разных местах (регистры или память).Вы не можете стандартизировать эту часть.Единственное, что вы можете с этим поделать, это создать уровень совместимости / абстракции поверх функциональности ОС, чтобы он выглядел одинаково с точки зрения ваших процедур сборки.

1 голос
/ 09 ноября 2011

Синтаксис / язык сборки зависит от процессора, а не от ОС.Однако для семейства процессоров x86 есть два синтаксиса: AT & T (используется по умолчанию в Unix-подобных операционных системах) и Intel (используется в Windows, DOS и т. Д.)

Однако оба примера сборки в вики работают по-разномувещи.Пример Windows использует API-интерфейс WIN32 и для отображения окна сообщения, поэтому все аргументы функции помещаются в стек в обратном порядке, а затем вызывает функцию MessageBox (), которая в свою очередь создает окно сообщения.

LinuxВ примере используется системный вызов write для записи строки в стандартный вывод.Здесь все «аргументы» сохраняются в регистрах, а затем int 0x80 создает «прерывание», теперь ОС входит в землю ядра, и ядро ​​выводит строку в стандартный вывод.

Сборка Linux может быть переписана как:

section .data
msg:   db     "Hello, world!", 10
.len: equ    $ - msg

section .text

extern write
extern exit

global _start
_start:
        push msg.len
        push msg
        push dword 1
        call write

        push dword 0
        call exit

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

Следует также отметить, что Windows и Unix-подобные операционные системы используют разные форматы файлов в своих библиотеках и приложениях.

Unix-подобные системы используют ELF http://en.wikipedia.org/wiki/Executable_and_Linkable_Format, а в Windows используется PE http://en.wikipedia.org/wiki/Portable_Executable

Вот почему вы видите различные разделы сборок на вики-странице.

1 голос
/ 09 ноября 2011

Языки ассемблера отличаются от процессора к процессору, поэтому нет, стандарта нет.

В общем, «стандартный» язык ассемблера для определенного семейства процессоров - это то, что говорят разработчики процессоров. Например, «стандартный» синтаксис для x86 - это то, что говорит Intel. Однако это не мешает другим людям создавать вариант языка ассемблера, предназначенный для процессора с немного другим синтаксисом или дополнительными функциями (например, Nasm).

1 голос
/ 09 ноября 2011

Ну, я не уверен, что вы спрашиваете о синтаксисе для процессоров x86 (я полагаю, да, потому что вы упоминаете NASM).

Но есть два общих стандарта:

  • Синтаксис Intel, который первоначально использовался для документации по платформе x86.
  • Синтаксис AT & T, распространенный в мире Linux / Unix.

NASM, который вы упомянули, предпочитает синтаксис Intel.

Некоторые примеры различий в синтаксисе можно найти в этой статье: http://www.ibm.com/developerworks/linux/library/l-gas-nasm/index.html.

...