Тэк-с, чей-то я тут нагенерил из таблиц qemu:
00000008 /* 00 add C_MODRM */
00000008 /* 01 add C_MODRM */
00000008 /* 02 add C_MODRM */
00000008 /* 03 add C_MODRM */
00000080 /* 04 add C_DATA1 */
00000040 /* 05 add C_DATA66 */
00000000 /* 06 push */
00000000 /* 07 pop */
...
Может быть даже получится взлететь Ж-)))
UPD А от чего бы и не получится?
8048480: 31 ed
8048482: 5e
8048483: 89 e1
8048485: 83 e4 f0
8048488: 50
8048489: 54
804848a: 52
804848b: 68 64 8c 04 08
8048490: 68 1c 8c 04 08
8048495: 51
8048496: 56
8048497: 68 09 89 04 08
804849c: e8 7f ff ff ff
...
И так далее. А вот что плохо, так это то, что всю эту х-ню придется тестировать. Тщательно, бля. На залупастых всяких опкодах. Ненавижу.
UPD теперь с FPU
uint8_t yad_float_mem[8] = { 0x58, 0x2a, 0xe0, 0xfe, 0xb2, 0xf2, 0x04, 0x0a, };
uint8_t yad_float_reg[8][8] = {
0x00, /* d8 XX fadd */
0x00, /* d8 XX fmul */
0x00, /* d8 XX fcom */
0x00, /* d8 XX fcomp */
0x00, /* d8 XX fsub */
0x00, /* d8 XX fsubr */
0x00, /* d8 XX fdiv */
0x00, /* d8 XX fdivr */
0x00, /* d9 XX fld */
0x00, /* d9 XX fxch */
0xfe, /* d9 XX reg=02, RM (0-7): fnop (bad) (bad) (bad) (bad) (bad) (bad) (bad)*/
....................................
/* parse ModRM and SIB */
if (flags & (C_MODRM|C_GROUP)) {
....................................
if ((c = diza->opcode) >= 0xd8 && c <= 0xdf) {
c -= 0xd8;
if (mod != 3) {
if (yad_float_mem[c] & (1 << reg))
return 0;
} else {
c = yad_float_reg[c][reg];
if (c & (1 << rm))
return 0;
}
}
$ gcc test2.c
$ ./a.out
Invalid instruction
А вот HDE:
$ gcc example.c hde32.o
$ ./a.out
d9 0c 00
length of command: 0x03
immediate32: 0x00000000
displacement8: 0x00
|