Включает ли стандарт x86 мнемонику или он просто определяет коды операций?
Если они не включены, существует ли другой стандарт для разных сборщиков?
Включает ли стандарт x86 мнемонику или он просто определяет коды операций?
Если они не включены, существует ли другой стандарт для разных сборщиков?
Мнемоника не стандартизирована, и разные ассемблеры используют разную мнемонику. Некоторые примеры:
b
, w
, l
и q
ко всем мнемоникам, чтобы указать размер операнда. Ассемблеры в стиле Intel обычно указывают это ключевыми словами byte
, word
, dword
и qword
.cbtw
, cwtl
, cltq
и cqto
, в то время как ассемблеры в стиле Intel распознают те же инструкции, что и cbw
, cwd
, cdq
и cqo
movz??
и movs??
, где ??
- два суффикса размера для того, что ассемблеры в стиле Intel называют movzx
, movsx
и movsxd
63 /r
как movsxd
, в то время как другие также распознают movsx
как вариант этой инструкцииint
назывался brk
.К сожалению, на самом деле нет единого стандарта 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 в целом устарела.)
MOV
всегдаMOV
. В AT&T это может бытьMOVL
,MOVQ
и так далее, указывающее размер данных в самой мнемонике. - person zx485   schedule 25.01.2019moe
,larry
иcurly
, если он хочет, хотя это может быть труднее читать код. Для ясности, большинство ассемблеров x86 придерживаются довольно близких к мнемонике, предложенной Intel. - person lurker   schedule 25.01.2019lari
,crle
иmoe
- person fuz   schedule 02.08.2020