Слово XMM не преобразуется в шестнадцатеричное. То, что инструкция использует регистры XMM, является свойством кода операции и префиксов. Индекс операндов регистра в основном кодируется байтом ModRM, немного в префиксе, для некоторых операций в GPR имя регистра кодируется в байте кода операции.
Помимо сложностей, вот простой пример с префиксом VEX, vpaddb xmm1, xmm4, xmm6
. Его запись в руководстве (под леммой paddb
) гласит: «1005 *
»
VEX.NDS.128.66.0F.WIG
для префикса VEX. NDS означает, что поле vvvv кодирует регистр источника. 128
означает не устанавливать бит L, поэтому регистры используют версии X MM, в противном случае это будут версии Y MM (так как вы видите, что это различие закодировано единичным битом в префиксе VEX, а не путем записи слова «XMM» в шестнадцатеричном формате в точности) 66
указывает настройку для поля pp, которая соответствует обязательному префиксу в устаревшей кодировке, а именно pp = 01. WIG = W , что на самом деле не имеет значения.
В любом случае, это может быть 2-байтовый префикс VEX (без причудливой карты кодов операций, низкие номера регистров), поэтому начните с C5
, а затем объедините поля ~R|~vvvv|L|pp
(где |
- конкатенация). ~ vvvv является дополнением к vvvv, vvvv = 0100 (xmm 4 ). Поле R является расширением поля reg байта ModRM, xmm1
имеет индекс ниже 8, поэтому поле R равно 0, следовательно, ~ R равно 1. В совокупности второй байт префикса равен 1|1011|0|01 = D9
.
Байт кода операции FC
, здесь ничего смешного не происходит.
/r
означает кодировать оставшиеся операнды как ModRM (+ SIB), поэтому здесь используется mod = 11 (два регистра, операнд памяти отсутствует), rm = 110 (xmm 6 ), рег = 001 (хмм 1 ), поэтому 11001110 = CE
Таким образом, всего vpaddb xmm1,xmm4,xmm6
становится c5 d9 fc ce
.
Вы можете найти эту информацию (и некоторые детали, которые я пропустил) в Приложении B ISDM, "Форматы и кодировки инструкций".