2010-05-18 61 views
10

Estoy en medio de la reescritura de mi ensamblador. Si bien tengo curiosidad por implementar el desmontaje también. Quiero que sea simple y compacto, y hay conceptos que puedo explotar al hacerlo.x86 tablas de codificación de instrucciones

Es posible determinar el resto de la codificación de instrucción x86 desde el código de operación (tal vez también se requieren bytes de prefijo). Sé que muchas personas han escrito tablas para hacerlo.

No me interesan los mnemotécnicos sino la codificación de instrucciones, porque es un problema realmente difícil. Para cada número de código de operación, necesito saber:

  • ¿esta instrucción contiene modrm?
  • ¿cuántos campos inmediatos tiene esta instrucción?
  • ¿qué codificación hace un uso inmediato?
  • ¿el campo inmediato es una dirección relativa a un puntero de instrucción?
  • ¿qué tipo de registros utiliza el modrm para operando y registra campos?

sandpile.org tiene algo más de lo que necesitaría, pero está en un formato que no es fácil de analizar.

Antes de comenzar a escribir y validar esas tablas, decidí escribir esta pregunta. ¿Sabes que este tipo de tablas existen en alguna parte? En una forma que no requiere demasiado esfuerzo para analizar.

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 

Aquí tengo la tabla para el primer operando. El formato es tal que la tabla se puede analizar directamente desde un archivo de texto que lo contiene. Dejé algunas instrucciones relacionadas con CISC y segmentación.

Para instrucciones de dos bytes, lo más probable es que necesite cuatro de esas tablas. Para instrucciones de tres bytes necesitaré dos tablas más. Las instrucciones FPU requieren 8 tablas, que afortunadamente son muy simples. Después de eso, tendría una gran cantidad de instrucciones x86 tapadas. Aunque voy bien con solo una o dos tablas.

Además, algunos grupos de instrucciones pueden requerir algunas matrices pequeñas para reconocer el tipo de instrucción.

Respuesta

8

Creo que ref.x86asm.net podría tener lo que estás buscando. Es una lista de todas las instrucciones x86-64, en un formato XML que debería ser fácil de analizar.

+0

Eso contiene suficiente información para un ensamblador completo. Supongo que es suficientemente buena mesa. Veamos si puedo construir un generador de código basado en él. – Cheery

5

IIRC para el ensamblador interno del compilador Free Pascal, inicialmente utilizamos tablas extraídas de las fuentes NASM.

Cuestiones relacionadas