Из второго б тома Интела про инструкции, аппендикс а: ЗЫ: Перевожу этот аппендикс на русский, очень нужная штука, может кто вычитать этот мой первый перевод на русский не просто технического, но текста вообще на английском?
Звучит странно: как это 3-х байтовая инструкция может быть 4-х байтов длины? "Трёх-байтовые инструкции занимающие 4 байта начинаются с обязательного префикса (66h, F2h или F3h) и двух переключающих байт (0F38h или 0F3Ah). Старшие и младшие 4 бита четвёртого байта служат индексами строки и столбца в Таблице А-4 или Таблице А-5."
AsmGuru62 Там же ясно сказано 1 префикс два escape байта и 1 основной байт! того 4ре. Просто я почему то был уверен, что инструкций с длиной опкода более 3 байт не бывает, а получается что есть, пример тому PALIGNR XMM0,XMM1,8
Bill_Prisoner Незначающие префиксы НЕ являются опкодами!!! А речь изначально идет про опкоды и именно про их длину!
EvilsInterrupt меня больше смутила разница (в опкодах) между командами MOVLPS и MOVHLPS чтобы различать это нужно довольно грамотно построить таблицу так же рекомендую обратить внимание на MONITOR и MWAIT.
BTW. Согласен, что по логике modrm включаться не должен (по аналогии с известными описаниями опкодов у них не включается даже если поле r\code содержит коды). Но IMHO они использовали слова "4 bytes opcode" типа на будущее. По крайней мере, я не помню ни одного такого опкода. 3х байтных полно, 4х - не встречал ни разу. Т.е. 1.modrm - действительно не включается 2. IMHO 4х байтные опкоды только намечены в перспективе, в реальности пока отсутсвуют.
doctor_Ice Все просто, когда поймешь как в таблицы опкод глядеть, я увидел и понял как они это сделали. Щас вот сижу и думаю, какие лучше сво-ва задать в массивах задать, чтобы получилась такая же ссылочность, как и в таблицах опкодах. Пока пришел к выводу: typedef struct _hopcode { BYTE OpcodeOptions; // modrm | o64 | i64 | notprefix etc еще не продумал, но главное сво-во | nexttab DWORD AddrTN; }hopcode, *popcode; если установлен nexttab в OpcodeOptions то надо смотреть другой массив, иначе это текст мнемоники Ну и таблиц может много, ибо есть несколько групп, таблица А-4 Аппендикса А, тома 2Б + Ну и таблицы связанные с 0Fxx - ескап-байт
"3х-байтные опкоды длиной в 4 байта" -- это нормальное высказывание, с учетом новой роли префиксов 66h, F2h и F3h. Раньше это были чисто префиксы, сейчас же они влияют на декодирование определенных команд (вроде SSEx). Т.е. для этих команд эти префиксы можно считать как бы частью опкода. Но в то же время -- 66h, F2, F3 -- это ведь Префиксы, как ни крути Отсюда и "3х-байтные опкоды длиной в 4 байта". Вот пример: 2х байтный опкод длиной 2 байта: 0F 51 FF sqrtps xmm7, xmm7 2х байтный опкод длиной 3 байта: F3 0F 51 FF sqrtss xmm7, xmm7 Аналогично для "Three-byte opcodes that are 4 bytes in length". P.S. Кстати opcode extension не входит в эти "4 байта", т.е. теоретически может существовать команда, в которой опкод будет размазан по 5 (!) байтам.
EvilsInterrupt И какой там r/m ? например PSHUFB Pq, Qq - чего в нем необычного-то? И какой мануал, Интел чего-то темнит пока...
Блин, опять заблудился на интеловском сайте... EvilsInterrupt так чем r/m не нравится-то??? но кстати я так подумал: так что похоже имеется ввиду, что первый байт опкода - префикс. Бред по-моему. А если, например, там между 66 и 0F еще чего-нибудь влезет, REX например? Какой у него номер будет, 1.5 что ли? [offtop] У меня появляется устойчивое ощущение, что начиная с MMX опкоды выбираются Как Попало. [/offtop]
Ustus Изначально создал тему со смыслом, что есть опкоды длиной в 4 байта (опкод != машинная инструкция) Там же ясно приведено, для такого опкода обязательно, должны быть: 1. один из "префиксов" 66, F2,F3 - уже 1 байта, т.к. ковычки не случайны! 2. 2 ESC-байта 0F38 или 0F3A - еще 2 байта, того 3 байта и только после этих 3х байт разрешается смотреть в таблицу для декодирования 4го байта. Вот к примеру - 66 0F 38 0B дадут нам команду: pmulhrsw. Но тут, еще играет роль байт 66. Взял я этот пример из Vol 2B, A-16, линки на талмуды выше
EvilsInterrupt Ну так то же самое можно было сказать про двухбайтные опкоды из которых добрая часть точно также зависит от префиксов - напр. -- 0F 5A ... - cvtps2pd ... F3 0F 5A ... - cvtss2sd ... 66 0F 5A ... - cvtpd2ps ... F2 0F 5A ... - cvtsd2ss ... (точнее злая это половина и недобрая, особенно для дизассемблера ) А талмуды-то сыроваты - в таблице эти самые SSE4 прикручены, а в основном-то списке команд их и нет...
на самом деле ведь и опкоды (команды) отмирают... Как-то был разговор на эту тему в др.форуме. Intel этот понапридумывал ненужного воз и маленькую тележку... сплошное дублирование. AFAIK в 64битном режиме на место оч. старых опкодов пришли новые. Примеров сейчас не приведу, но об этом читал. Да и ещё ведь надо новые команды куда-то впихивать, вот они и удаляют старые никому не нужные