таблицы кодирования инструкций x86
Я в середине переписывания моего ассемблера. В то время как мне интересно, как реализовать разборку. Я хочу сделать его простым и компактным, и есть понятия, которые я могу использовать при этом.
можно определить остальную часть кодировки инструкций x86 из кода операции (возможно, также требуются префиксные байты, немного). Я знаю, что многие люди написали таблицы для этого.
меня не интересует мнемоника, но кодирование команд, потому что это реальная трудная проблема там. Для каждого номера кода операции мне нужно знать:
- содержит ли эта инструкция modrm?
- сколько непосредственных полей имеет эта инструкция?
- какую кодировку использует немедленное использование?
- является ли поле immediate in относительным адресом указателя инструкции?
- какие регистры использует 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 ответов
Я верю ref.x86asm.net может иметь то, что вы ищете. Это список всех инструкций x86-64 в формате XML, который должен быть легко разобран.
IIRC для внутреннего ассемблера компилятора Free Pascal мы изначально использовали таблицы, извлеченные из источников NASM.