· Начало · Отвђтить · Статистика · Поиск · FAQ · Правила · Установки · Язык · Выход · WASM.RU · Noir.Ru ·

 WASM Phorum —› WASM.ASSEMBLER —› опять я с опкодами ........

. 1 . 2 . 3 . 4 . >>

Посл.отвђт Сообщенiе


Дата: Янв 6, 2004 00:15:40

привет всем вобщем начал я писать задуманное и наткнулся на такую вещь
0000 - - размер 2 байта
008b - размер 6 байт :(
это со всеми опкодами ? тоесть в зависимости от 2 байта длинна может быть больше или меньше ? или это только к 0000 относится ????
надеюсь понятно обьяснил :)


Дата: Янв 6, 2004 00:32:01

Разумеется, непонятно :)


Дата: Янв 6, 2004 00:37:07 · Поправил: Toxic

А как это в бинарном числе стоит восмерка? А если это hex, то почему нету постфикса?

Да, кстати, это первый(младший) байт.

А длина (больше или меньше) от содержимого не зависит.


Дата: Янв 6, 2004 00:52:24

volodya =)

вобщем так

00401000 0000 add [eax],al
00401002 чего то там не важно

так вот если
00401000 008bxxxx вот если 2 байт равен 00 то размер команды получается 2 байта а если 2 байт не 00 то размер получается 6 байт !!!
вот мне нужно знать это относится ко всем командам или же это только у 00 так
точный вопос:
зависит ли размер команды от 2 байта ???

P.S. да это hex


Дата: Янв 6, 2004 01:02:54

Я бы за такие объяснения... Осьминога тебе в жопу сапогом утрамбовать >:|


Дата: Янв 6, 2004 01:08:14

angel_aka_ks

Мне кажется ты не там ответы ищешь. Тебе нужно чего-то почитать, правда оно всё на английском, может The Svin когда-нить книжкой разродится на родном языке.


Дата: Янв 6, 2004 01:18:34 · Поправил: angel_aka_ks

volodya спасибо
блин ну вобщем еще раз попробую
короче для начала обьясню задачу
мене нужно составить таблицу адресов по которым расположенны команды
например
00401000 00
00401001 00
00401002 0f
00401003 84
и т.д. так вот моя задача
посмотреть 1 опкод 00 значит размер этой команды будет 2 байта значит следущий опкод я буду смотреть по адресу 00401002 это 0f размер команды 6 байт следущий 00401008 и т.д. вот в таблицу мне нужно записать адреса команд тоесть
00401000
00401002
00401008
и т.д. НО для этого мне нужно знать размер команд вот я и спрашиваю зависит ли размер команды от 2 байта или же размер команды можно вычеслить по 1 байту если нет то обясните по какому принципу hiew вычесляет длинну команд ??
P.S. Toxic а от чего она зависит длинна ??


Дата: Янв 6, 2004 02:26:55

volodya
Жестоко! :)))))))))))))))))

angel_aka_ks
Ну так сразу за команды надо было говорить, а то "байты", "байты"...

а от чего она зависит длина
Это не ко мне. Но все рано мне кажется, что со второго байта никто не начинает; зачем тогда первый? Смотришь первый байт, если информации недостаточно, то смотришь второй - ведь к этому самому логически можно было прийти. Не так ли?


Дата: Янв 6, 2004 02:58:43

ОК, тебя интересует принцип работы дизассемблера длин?
Я в этом не спец. Самый большой спец во всей сети - это The Svin. Ты идешь не по правильному пути - хексовые мнемоники тебе ничего не дадут, тут принцип надо понимать. Дай я в группу напишу, The Svin мне расскажет, а sars даст свой Catchy - дизассемблер длин. Тогда я тебе все как тот ретранслятор :)))


Дата: Янв 6, 2004 03:29:23 · Поправил: angel_aka_ks

volodya :) ок жду !!!
спасибо за отклик !!!


Дата: Янв 6, 2004 04:18:07 · Поправил: AsmGuru62

Байт 1-й - это код операции.
Байт 2-й - это так называемый MOD/R/M байт.
Этот самый MOD/R/M отвечает за последующие байты инструкции - иногда последующих байт нет и полный размер инструкции - 2 байта. Иногда (при другом MOD/R/M) есть ещё байты после байта 2-го. В описанном случае там лежит 32-битное значение (4 байта) и длина получается - 6 байт. Всё это хорошо описано в руководствах по Intel CPU.


Дата: Янв 6, 2004 04:21:10

angel_aka_ks
ты бы ещё в первом своем пояснении написал :"от чего зависит длина байт" -)))))
а теперь по теме : Питер Абель тебе поможет - там (если не ошибаюсь) есть разборка опкодов ia32
помимо этого у Юрова тоже есть.


Дата: Янв 6, 2004 06:58:07

Питер Абель тебе поможет - там (если не ошибаюсь) есть разборка опкодов ia32

Я Питера просто обожаю, но это у него на редкость погано расписано. Более-менее в art of disassembly, а лучше Свина не знаю никого! Поэтому пусть малехо подождет. Завтра займусь.


Дата: Янв 6, 2004 13:04:40 · Поправил: Dr.Golova

Мля! Задрали с такими вопросами! Фтыкай как разбирается опкод 00 и всетаки пойми что у этого опкода есть ModR/M во втором байте, соответсно его длина зависит от того что в этом ModR/M!
// disasm_flag values:
#define C_MODRM        0x00000001       // modrm present

// -------------------------------------------------------

#define ERR_DISASM (0)

tINT FAR GetIA32CmdLen(tBYTE FAR* Cmd)
{
  tBYTE FAR* opcode;
  tUINT disasm_modrm;
  tUINT disasm_datasize;
  tUINT disasm_opcode2;
  tUINT disasm_memsize;
  tUINT disasm_defdata;
  tUINT disasm_opcode;
  tUINT disasm_defmem;
  tUINT disasm_flag;
  tUINT disasm_sib;
  tUINT mod;
  tUINT rm;

  opcode = Cmd;
  disasm_flag     = 0;
  disasm_datasize = 0;
  disasm_memsize  = 0;
  disasm_defdata  = 4;
  disasm_defmem   = 4;

  disasm_opcode = *opcode++;

  switch (disasm_opcode)
  {
    case 0x00: case 0x01: case 0x02: case 0x03:
               disasm_flag |= C_MODRM;
               break;
// other opcodes skipped
  } //switch

  if (disasm_flag & C_MODRM)
  {
    disasm_modrm = *opcode++;
    mod = disasm_modrm & 0xC0;

    if (mod != 0xC0)
    {

      if (mod == 0x40) disasm_memsize++;
      if (mod == 0x80) disasm_memsize += disasm_defmem;
      rm = disasm_modrm & 0x07;

      if (disasm_defmem == 2)           // modrm16
      {
        if ((mod == 0x00)&&(rm == 0x06)) disasm_memsize+=2;
      }
      else                              // modrm32
      {
        if (rm==0x04)
        {
          disasm_sib = *opcode++;
          rm = disasm_sib & 0x07;
        }
        if ((rm==0x05)&&(mod==0x00)) disasm_memsize+=4;
      }
    }
  } // C_MODRM

  opcode += disasm_memsize;
  opcode += disasm_datasize;
  return (opcode - Cmd);
}


Дата: Янв 6, 2004 19:55:20

Первый ответ мне:
Ответил FatMoon:

Длина = длина опкода по таблице
;строго говоря, для префиксов надо вызывать это рекурсивно,
;но для простоты будем считать префиксы однобайтовыми опкодами

если это группа Jxx/JMP/CALL (без mod_reg_r/m), то длина = длина +
адрес/смещение, конец

если опкод имеет mod_reg_r/m, то
длина = длина +1
если есть смещение, то длина + длина смещения
если есть SIB, то
длина = длина + 1
... и т.п.
;(формат mod_reg_r/m и SIB лучше знает Александр, но можно
; и по таблицам посмотреть самому - я уже убегаю домой, а на
; память не скажу так сразу)

. 1 . 2 . 3 . 4 . >>


Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.083