Стандартизированы ли мнемонические средства сборки x86?

Включает ли стандарт x86 мнемонику или он просто определяет коды операций?

Если они не включены, существует ли другой стандарт для разных сборщиков?


person mame98    schedule 25.01.2019    source источник
comment
ЦП заботится только о машинном коде. Тем не менее, в повседневном использовании для мнемоник используются только разновидности intel и at & t, а последние (за некоторыми исключениями) в основном просто добавляют суффиксы размера, если это необходимо. Возможно, y86 является альтернативным подмножеством мнемоники для того же машинного кода.   -  person Jester    schedule 25.01.2019
comment
Это скорее условность. Например, мнемоника Intel и мнемоника AT&T немного различаются. На Intel MOV всегда MOV. В AT&T это может быть MOVL, MOVQ и так далее, указывающее размер данных в самой мнемонике.   -  person zx485    schedule 25.01.2019
comment
У Intel есть стандарт. Microsoft MASM близок к этому стандарту и включает расширения. Синтаксис ATT меняет порядок операндов источника и назначения, возможно, это был порт существующего ассемблера.   -  person rcgldr    schedule 25.01.2019
comment
@rcgldr Да! Фактически, как я объяснял в другом месте, синтаксис AT&T был разработан так, чтобы выглядеть как сборка PDP-11.   -  person fuz    schedule 25.01.2019
comment
Intel документирует свои инструкции x86 с использованием определенных мнемоник, но не применяет их в качестве стандарта для сторонних инструментов ассемблера. Ассемблер может использовать любую мнемонику для создания исполняемого кода x86. Ассемблер может называть перемещение, сложение и вычитание с помощью moe, larry и curly, если он хочет, хотя это может быть труднее читать код. Для ясности, большинство ассемблеров x86 придерживаются довольно близких к мнемонике, предложенной Intel.   -  person lurker    schedule 25.01.2019
comment
сборка в целом не относится к одной цели, предположим, что нет никаких стандартов, так как нет способа предотвратить различия. Все, что имеет значение, - это то, что машинный код соответствует цели, ассемблер, инструмент, который превращает язык ассемблера в машинный код, может использовать любой синтаксис / язык, который он хочет, до тех пор, пока он выполняет свою работу. все зависит от автора.   -  person old_timer    schedule 01.02.2019
comment
говоря, что вы очень часто обнаружите, что синтаксис для большинства целей, x86, arm, mips и т. д. различается в зависимости от ассемблера, но чем больше они похожи, чем отличаются в отношении самой мнемоники, тем чаще различия возникают с остальной частью языка , метка vs метка:; комментарий vs @ coment ТЕКСТ РАЗДЕЛА vs .text и т. д. и бесчисленное множество других. но вы увидите с некоторыми инструкциями, что мнемоника или другие версии этой строки будут отличаться, а не только at & t vs intel ...   -  person old_timer    schedule 01.02.2019
comment
@lurker Между прочим, SUN назвала несколько своих инструментов поддержки ELF lari, crle и moe   -  person fuz    schedule 02.08.2020
comment
@fuz это великолепно! :)   -  person lurker    schedule 02.08.2020


Ответы (2)


Мнемоника не стандартизирована, и разные ассемблеры используют разную мнемонику. Некоторые примеры:

  • Ассемблеры в стиле AT&T применяют суффиксы b, w, l и q ко всем мнемоникам, чтобы указать размер операнда. Ассемблеры в стиле Intel обычно указывают это ключевыми словами byte, word, dword и qword.
  • Ассемблеры в стиле AT&T распознают cbtw, cwtl, cltq и cqto, в то время как ассемблеры в стиле Intel распознают те же инструкции, что и cbw, cwd, cdq и cqo
  • Ассемблеры в стиле AT&T распознают movz?? и movs??, где ?? - два суффикса размера для того, что ассемблеры в стиле Intel называют movzx, movsx и movsxd
  • некоторые ассемблеры в стиле Intel распознают только 63 /r как movsxd, в то время как другие также распознают movsx как вариант этой инструкции
  • Ассемблеры в стиле Plan 9 (например, используемые в Go) просто странные и различаются по многим параметрам, например, использование мнемоники в стиле Motorola для условных переходов.
  • Исторически ассемблер NEC, предоставленный для клона NEC V20 8086, имел почти полностью другую мнемонику. Например, int назывался brk.
person fuz    schedule 25.01.2019
comment
AT&T также создала новую мнемонику для MOVABS. А если вы говорите о других архитектурах, то все будет еще сложнее. Например, некоторые платформы записывают XOR как EOR, и существует множество вариантов инструкций сдвига, таких как SAR, SRA, ASR, SHL, SLL ... - person phuclv; 26.01.2019
comment
@phuclv На самом деле нет смысла сравнивать мнемонику между архитектурами. - person fuz; 26.01.2019
comment
Я сказал это, потому что вы упомянули архитектуры Plan 9 или NEC V20. - person phuclv; 26.01.2019
comment
@phuclv NEC V20 - это модернизированный 8086, так что это не совсем другая архитектура. Plan 9 - это не архитектура, а, скорее, операционная система. - person fuz; 26.01.2019
comment
@fuz Пожалуйста, проверьте правильность четвертого маркера после моего редактирования. Может, вы имели в виду ассемблеры и ассемблеры в стиле Intel ... - person Sep Roland; 01.02.2019
comment
Вы, должно быть, хотели сказать, что AT&T не следует стандарту ... Это называется синтаксисом Intel по известной причине ... Это есть в их руководствах. - person Christoffer Bubach; 02.08.2020
comment
@ChristofferBubach Ознакомьтесь с таблицей данных 8086. Вы обнаружите, что на самом деле он вообще не определяет никакого синтаксиса сборки. Синтаксис сборки Intel был описан только для собственной инструментальной цепочки Intel, но в те времена было обычным делом, что каждый поставщик инструментальной цепочки придумывал свой собственный синтаксис. - person fuz; 02.08.2020
comment
Да все мнемоники есть? Лист данных для 8086 @ course.ece.cmu.edu/~ece740/f11/lib/exe/ - person Christoffer Bubach; 28.05.2021

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

Документация Intel очень близка к стандарту x86, но в некоторых случаях дает более строгие гарантии, чем современные процессоры AMD. например Intel гарантирует атомарность загрузки или сохранения 1/2/4/8 байтов из / в кэшируемую память с любым выравниванием, которое не пересекает границу строки кэша. Но AMD гарантирует это только для кешируемых загрузок / хранилищ, которые не пересекают 8-байтовую границу.

Почему целочисленное присваивание Естественно выровненная атомарная переменная на x86? цитирует руководство Intel, показывающее, что все гарантии даны, поскольку процессор Intel486 (и более новые процессоры с тех пор) гарантирует такие-то и такие-то. Не существует базовых показателей, применимых ко всем процессорам x86 (или, что более важно, ко всем процессорам x86-64). Я думаю, что фактическая общая базовая линия на практике для x86 (включая pre-x86-64) составляет 1 байт из-за 8088.

Таким образом, программное обеспечение, которое хочет работать на современных процессорах x86-64, не может предполагать атомарность для 8-байтовых загрузок / хранилищ, если они фактически не выровнены. Я думаю, мы все можем согласиться с тем, что гарантии атомарности являются неотъемлемой частью современного многоядерного процессора x86. Атомарность некэшированного доступа к MMIO имеет значение даже для одного ядра; современные Intel и AMD согласны с этим, но, опять же, Intel документирует это только в терминах Pentium и более поздних процессоров. Неявно более поздние процессоры Intel.


Тем не менее, документация Intel действительно определяет мнемонику для каждого кода операции и регистрирует имена. Документация AMD согласуется с документацией Intel по всем этим вопросам.

См. том 2 Руководства Intel по разработке программного обеспечения x86 . HTML-фрагменты только записей руководства по эксплуатации (без разделов, объясняющих обозначения и формат инструкций) можно найти по адресу https://www.felixcloutier.com/x86/index.html и https://github.com/HJLebbink/asm-dude/wiki, и в других местах старые версии отформатированы по-другому.


Как объясняет @fuz, большинство ассемблеров предпочитают следовать этому стандарту, но это не обязательно. Важной частью является двоичная совместимость, а не совместимость с исходным кодом asm.

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


Я не уверен, что руководства Intel даже полностью определяют полный синтаксис asm (например, как указать префиксы переопределения сегмента в режиме адресации).

В некоторых случаях они выходят далеко за рамки описания того, какой машинный код что делает, например в строковых инструкциях lods / stos / movs / cmps / scas (и, возможно, ins / out) вы найдете параграфы, подобные этому, в руководстве Intel vol.2:

На уровне ассемблерного кода разрешены две формы этой инструкции: форма «явных операндов» и форма «без операндов». Форма явных операндов (указанная с помощью мнемоники MOVS) позволяет явно указывать исходный и целевой операнды. Здесь операнды источника и назначения должны быть символами, которые указывают размер и расположение исходного значения и места назначения соответственно. Эта форма явных операндов предназначена для документирования; Однако учтите, что документация, представленная в этой форме, может вводить в заблуждение. То есть символы исходного и целевого операндов должны указывать правильный тип (размер) операндов (байты, слова или двойные слова), но они не должны указывать правильное расположение < / сильный>. Расположение исходных и целевых операндов всегда определяется регистрами DS: (E) SI и ES: (E) DI, которые должны быть правильно загружены перед выполнением инструкции перемещения строки.

(выделение воспроизведено из (выдержка HTML) оригинала PDF)

Некоторые ассемблеры синтаксиса Intel, такие как NASM, игнорируют это и разрешают использовать только movs с размером как часть мнемоники, например movsb. NASM также имеет синтаксис для указания префикса переопределения сегмента, такого как fs lodsd, который не требует операндов, поэтому это полностью исключает возможность использования операндов, которые указывают неправильный операнд памяти, но все же ассемблируют.

(Строковые инструкции используют только неявные операнды памяти, а не режим адресации ModR / M.)

NASM: parser: инструкция ожидаемых реп-мов

Преобразование инструкций в файлы и стоты кода сборки чтобы NASM мог компилировать


Итак, да, существует несколько вариантов сборки Intel-syntax, не говоря уже о очень разных синтаксисах, таких как AT&T.

AT&T намеренно использует разные мнемоники для некоторых инструкций, даже разделяя некоторые коды операций, которые используют мнемонику в синтаксисе Intel, на отдельные мнемоники, например movzb для movzx-with-a-byte-source и movzw для версии word-source. (Обычно также используется с суффиксом размера, например movzbl, но l может быть выведен из 32-битного регистра назначения, если хотите.)

Синтаксис AT&T непреднамеренно меняет местами fsubr на fsub при использовании с двумя операндами регистров, то есть ошибка разработки синтаксиса, с которой мы столкнулись. (К счастью, x87 в целом устарела.)

person Peter Cordes    schedule 26.01.2019