таблицы кодирования команд x86 - PullRequest
10 голосов
/ 18 мая 2010

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

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

Меня интересует не мнемоника, а кодировка инструкций, потому что это действительно сложная проблема. Для каждого кода операции мне нужно знать:

  • содержит ли эта инструкция modrm?
  • сколько непосредственных полей есть в этой инструкции?
  • какая кодировка используется немедленно?
  • является непосредственным в поле указателем инструкции - относительный адрес?
  • какие регистры использует модем для полей операндов и регистров?

sandpile.org содержит довольно много того, что мне нужно, но в формате, который не так просто разобрать.

Прежде чем я сам начну писать и проверять эти таблицы, я решил написать этот вопрос. Знаете ли вы, что такого рода таблицы существуют где-то? В форме, которая не требует слишком больших усилий для разбора.

b   byte
w   word
v   word or dword (or qword), depends on operand size attribute (0x66)
z   word or dword (or dword), depends on operand size attribute
J   instruction-relative address (next character describes type)
G   instruction group, has modrm-field (next character describes operand type)
R   has modrm-field (next two characters describe register and operand type)
M   modrm, but operand field must point to memory
O   direct offset (next character describes type)
F   FPU
T   separate table
_   defined, but no arguments

x    0    1    2    3    4    5    6    7    8    9    A    B    C    D    E    F
0  Rbb  Rvv  Rbb  Rvv    b    z            Rbb  Rvv  Rbb  Rvv    b    z         T
1  Rbb  Rvv  Rbb  Rvv    b    z            Rbb  Rvv  Rbb  Rvv    b    z
2  Rbb  Rvv  Rbb  Rvv    b    z            Rbb  Rvv  Rbb  Rvv    b    z
3  Rbb  Rvv  Rbb  Rvv    b    z            Rbb  Rvv  Rbb  Rvv    b    z
4    _    _    _    _    _    _    _    _    _    _    _    _    _    _    _    _
5    _    _    _    _    _    _    _    _    _    _    _    _    _    _    _    _
6    _    _  Mvv                             z Rvvz    b Rvvb
7   Jb   Jb   Jb   Jb   Jb   Jb   Jb   Jb   Jb   Jb   Jb   Jb   Jb   Jb   Jb   Jb
8  Gbb  Gvz  Gbb  Gvb  Rbb  Rvv  Rbb  Rvv  Rbb  Rvv  Rbb  Rvv       Mvv
9    _    _    _    _    _    _    _    _                        _    _    _    _
A   Ob   Ov   Ob   Ov    _    _    _    _    b    z    _    _    _    _    _    _
B    b    b    b    b    b    b    b    b    v    v    v    v    v    v    v    v
C  Gbb  Gvb    w    _                                            _    b    _    _
D   Gb   Gv   Gb   Gv                        F    F    F    F    F    F    F    F
E                                           Jz   Jz        Jb
F                        _    _   Gb   Gv    _    _    _    _    _    _   Gb   Gv

Здесь у меня есть таблица для первого операнда. Формат таков, что таблица может быть проанализирована прямо из текстового файла, который содержит его. Я оставил некоторые инструкции по CISC и сегментации.

Для двухбайтовых инструкций мне нужны четыре такие таблицы. Для трехбайтовых инструкций мне понадобятся еще две таблицы. Инструкции FPU требуют 8 таблиц, которые, к счастью, очень просты. После этого у меня будет довольно большой кусок инструкций x86. Хотя я отлично справляюсь только с одним или двумя столами.

Кроме того, немногим группам команд может потребоваться несколько небольших массивов для распознавания типа инструкции.

Ответы [ 2 ]

8 голосов
/ 21 мая 2010

Я думаю, ref.x86asm.net может иметь то, что вы ищете. Это список всех инструкций x86-64 в формате XML, которые должно быть легко проанализировано.

5 голосов
/ 14 июня 2010

IIRC для внутреннего ассемблера компилятора Free Pascal, мы изначально использовали таблицы, извлеченные из источников NASM.

...