Дизассемблирование опкода 0x63 (Intel x86-64)

Тема в разделе "WASM.RESEARCH", создана пользователем EvilsInterrupt, 17 авг 2006.

  1. EvilsInterrupt

    EvilsInterrupt Постигающий азы дзена

    Публикаций:
    0
    Регистрация:
    28 окт 2003
    Сообщения:
    2.428
    Адрес:
    Russia
    Вот есть опкод 0x63 про него в интеле написано:

    ARPL i64
    Ew,Gw

    MOVSXD o64
    Gv,Ev

    Как я понял в 64-битном режиме, команда с опкодом становится командой movsxd.

    Сам-то запомню,но надо дать процу запомнить, я же дизасм пишу :)

    но как это лучше всего алгоритмически за кодировать?

    Вот уменя есть массив структур:

    Код (Text):
    1. typedef struct _HOPCODE {
    2.     LPVOID  Addr;
    3.     BYTE        Options32;
    4.     BYTE        Oprions64;
    5. } HOPCODE,*POPCODE;
    и заполняется в виде:
    Код (Text):
    1. HOPCODE NormalOpcode[] = {
    2.     /* 00 */ { "add",1,Opt64None },
    3.     /* 01 */ { "add",1,Opt64None },
    где цифры это форма представления инструкции, к примеру 1 - xxxx xxxx : mod r/m

    прошу подсказать как лучше закодировать для данного опкода?
     
  2. Ustus

    Ustus New Member

    Публикаций:
    0
    Регистрация:
    8 авг 2005
    Сообщения:
    834
    Адрес:
    Харьков
    EvilsInterrupt
    м-м-м... а как ты разбирался с 40-4F? Это посложнее будет. Наверное надо вообще предусмотреть два варианта кода - на 32 и 64, уж очень много у них отличий.

    [offtop]
    а нету такого: Intel x86-64 :)
    есть только x86-64, AMD64, Intel EM64T. Разница не обнаружена :)
    [/offtop]
     
  3. EvilsInterrupt

    EvilsInterrupt Постигающий азы дзена

    Публикаций:
    0
    Регистрация:
    28 окт 2003
    Сообщения:
    2.428
    Адрес:
    Russia
    Ustus
    Нет еще только начал, но ведь китайчег со своим udis86 сделал же универсальный! :)
     
  4. Ustus

    Ustus New Member

    Публикаций:
    0
    Регистрация:
    8 авг 2005
    Сообщения:
    834
    Адрес:
    Харьков
    Ну... если я правильно понял, про какой udis86 идет речь то у него 40-4F во как:
    Код (Text):
    1.   for (i = 0, p = 0; p == 0; ++i) {
    2.     if ((inp_curr(u) & 0xF0) == 0x40) { /* REX */
    3.         if (u->dis_mode == 64) {
    4.             u->pfx_rex = inp_curr(u);
    5.             inp_next(u);
    6.         } else p = 1; /* Bail out, its an inc/dec */
    7.     }
    то бишь явная проверка - это неинтересно...
    и 63 явно:
    Код (Text):
    1.   if (inp_curr(u) == 0x90) {
    2.     if (!(u->dis_mode == 64 && P_REX_B(u->pfx_rex))) {
    3.         if (u->pfx_rep) {
    4.             u->mapen = &pause;
    5.             u->pfx_rep = 0;
    6.         } else  u->mapen = &nop;
    7.     }
    8.   } else if (u->dis_mode == 64 && (u->mapen)->mnemonic == UD_Iarpl)
    9.     u->mapen = &movsxd;
    Я тоже страдаю дизассемблером, правда скорее для души, в свободное время, так хотелось бы поуниверсальнее, чтобы алгоритмической обработки был минимум :dntknw: