как конвертировать коды операций в шестнадцатеричные - PullRequest
0 голосов
/ 08 сентября 2018

Я действительно в тупике, пожалуйста, помогите ...

Я заказал кучу книг от Intel, руководства для разработчиков программного обеспечения, и внутри них они дают мне все эти коды операций, такие как "VEX.128 ..." или "0F 5B"

и в этих книгах говорится что-то вроде "это работает с регистрами XMM", но ни в одной из книг не говорится о том, как преобразовать слово XMM в шестнадцатеричное?

То, что я пытаюсь сделать, это как написать привет, мир в чистом шестнадцатеричном формате без использования ассемблера! пожалуйста помоги! Я надеюсь, что это имело смысл, я новичок в мире сборки и hexcodes

1 Ответ

0 голосов
/ 08 сентября 2018

Слово 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, "Форматы и кодировки инструкций".

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