Показать сообщение отдельно
Старый 29.09.2008, 06:05   #55
abcdef
Знающий
 
Регистрация: 16.09.2008
Сообщений: 299
Написано 71 полезных сообщений
(для 123 пользователей)
Ответ: создание MIDletPascal compiler'a

вот собрал шаблонный декомпилер, вида
<строка_название_команды> список_параметров: (1й, 2й, 3й, 4й)
в подпрограмме <disasm> - происходит разбор по типам параметров (эт для корректной обработки каждого типа, хотя можно было бы ограничиться 3-мя case условиями)

нужно подработать список команд, т.е. напротив каждой команды проставить список параметров для этой команды, я заполнил не все, может и ошибся..

satan поэкспериментируй а я на работу..
насчет эмулятора - там оч.много нужно делать библиотек, - дело не благодарное..

{$apptype console}
{$S+}
type
  tcode = record
    s : array[0..15] of char;
    b : array[0..3] of byte;
  end;
const
  nb   = 1;  {1байт целое беззнаковое}
  ns   = 2;  {1байт целое знаковое}
  nw   = 3;  {2байта целое беззнаковое}
  ni   = 4;  {2байта целое знаковое}
  cb   = 5;  {1байт индекс в константном пуле }
  cw   = 6;  {2байта индекс в константном пуле 2-х байтовой константы}
  cl   = 7;  {2байта индекс в константном пуле 2-х словной константы}
  cp   = 8;  {2байта индекс в константном пуле Получение статического поля класса  Элементом константного пула
             будет поле ссылки на статическое поле класса - полями шириной как 64-бита так и 32-бита}
  cv   = 9;  {2байта индекс в константном пуле текущего класса - сигнатура метода}
  cn   = 10; {2байта - конструирование индекса в константном пуле}
  ck   = 11; {2байта индекс на класс}
  cs   = 12; {2байта индекс на строку}
  lii  = 13; {загрузка целого из локальной переменной}
  lil  = 14; {загрузка длинного целого из локальной переменной}
  lif  = 15; {загрузка вещественного одинарной точности из локальной переменной}
  lid  = 16; {загрузка вещественного двойной точности из локальной переменной}
  lio  = 17; {загрузка объектной ссылки из локальной переменной}
  sii  = 18; {сохранение целого значения в локальной переменной}
  sil  = 19; {сохранение длинного целого в локальной переменной}
  sif  = 20; {Сохранение вещественного одинарной точности в локальной переменной}
  sid  = 21; {Сохранение двойного вещественного в локальной переменной}
  sio  = 22; {Сохранение объектной ссылки в локальной переменной}
  ac   = 23; {Увеличение локальной переменной на константу}
  of2  = 24; {16-битное знаковое смещение}
  of4  = 25; {32-битное знаковое смещение}
  ofp2 = 26; {16-битное знаковое смещение Переход на подпрограмму}
  ofp4 = 27; {32-битное знаковое смещение Переход на подпрограмму}
  rtb  = 28; {8-битный адрес Возврат из подпрограммы - адрес возврата}
  rtw  = 29; {16-битный адрес возврата}
  {-----------------------------------}
  jbc : array[0..255] of tcode = (
{00}  (s:'nop             '; b:(0,0,0,0)),      {Ничего не делает}
{01}  (s:'aconst_null     '; b:(0,0,0,0)),      {Загрузка в стек null ( пустой ссылки на объект)}
{02}  (s:'iconst_m1       '; b:(0,0,0,0)),      {Загрузка целочисленной константы -1}
{03}  (s:'iconst_0        '; b:(0,0,0,0)),      {Загрузка целочисленной константы 0}
{04}  (s:'iconst_1        '; b:(0,0,0,0)),      {Загрузка целочисленной константы 1}
{05}  (s:'iconst_2        '; b:(0,0,0,0)),      {Загрузка целочисленной константы 2}
{06}  (s:'iconst_3        '; b:(0,0,0,0)),      {Загрузка целочисленной константы 3}
{07}  (s:'iconst_4        '; b:(0,0,0,0)),      {Загрузка целочисленной константы 4}
{08}  (s:'iconst_5        '; b:(0,0,0,0)),      {Загрузка целочисленной константы 5}
{09}  (s:'lconst_0        '; b:(0,0,0,0)),      {Загрузка длинной целочисленной константы 0}
{0A}  (s:'lconst_1        '; b:(0,0,0,0)),      {Загрузка длинной целочисленной константы 1}
{0B}  (s:'fconst_0        '; b:(0,0,0,0)),      {Загрузка вещественного числа одинарной точности 0}
{0C}  (s:'fconst_1        '; b:(0,0,0,0)),      {Загрузка вещественного числа одинарной точности 1}
{0D}  (s:'fconst_2        '; b:(0,0,0,0)),      {Загрузка вещественного числа одинарной точности 2}
{0E}  (s:'dconst_0        '; b:(0,0,0,0)),      {Загрузка вещественного числа двойной точности 0}
{0F}  (s:'dconst_1        '; b:(0,0,0,0)),      {Загрузка вещественного числа двойной точности 1}
{10}  (s:'bipush          '; b:(nb,0,0,0)),     {1,Загрузка в стек однобайтового целого со знаком}
{11}  (s:'sipush          '; b:(ni,0,0,0)),     {2,Загрузка в стек двухбайтового целого со знаком}
{12}  (s:'ldc1            '; b:(cb,0,0,0)),     {1,Загрузка в стек элемента из константного пула}
{13}  (s:'ldc2            '; b:(cw,0,0,0)),     {2,Загрузка в стек элемента из константного пула}
{14}  (s:'ldc2w           '; b:(cl,1,0,0)),     {2,Загрузка в стек длинного целого или двойного
                                                вещественного значения из константного пула}
{15}  (s:'iload           '; b:(lii,0,0,0)),    {1,Загрузка целого из локальной переменной}
{16}  (s:'lload           '; b:(lil,0,0,0)),    {1,Загрузка длинного целого из локальной переменной}
{17}  (s:'fload           '; b:(lif,0,0,0)),    {1,Загрузка вещественного одинарной точности из локальной переменной}
{18}  (s:'dload           '; b:(lid,0,0,0)),    {1,Загрузка вещественного двойной точности из локальной переменной}
{19}  (s:'aload           '; b:(lio,0,0,0)),    {1,Загрузка объектной ссылки из локальной переменной}
{1A}  (s:'iload_0         '; b:(0,0,0,0)),      {Загрузка целого из локальной переменной 0}
{1B}  (s:'iload_1         '; b:(0,0,0,0)),      {Загрузка целого из локальной переменной 1}
{1C}  (s:'iload_2         '; b:(0,0,0,0)),      {Загрузка целого из локальной переменной 2}
{1D}  (s:'iload_3         '; b:(0,0,0,0)),      {Загрузка целого из локальной переменной 3}
{1E}  (s:'lload_0         '; b:(0,0,0,0)),      {Загрузка длинного целого из локальной переменной 0}
{1F}  (s:'lload_1         '; b:(0,0,0,0)),      {Загрузка длинного целого из локальной переменной 1}
{20}  (s:'lload_2         '; b:(0,0,0,0)),      {Загрузка длинного целого из локальной переменной 2}
{21}  (s:'lload_3         '; b:(0,0,0,0)),      {Загрузка длинного целого из локальной переменной 3}
{22}  (s:'fload_0         '; b:(0,0,0,0)),      {Загрузка вещественного одинарной точности из локальной переменной 0}
{23}  (s:'fload_1         '; b:(0,0,0,0)),      {Загрузка вещественного одинарной точности из локальной переменной 1}
{24}  (s:'fload_2         '; b:(0,0,0,0)),      {Загрузка вещественного одинарной точности из локальной переменной 2}
{25}  (s:'fload_3         '; b:(0,0,0,0)),      {Загрузка вещественного одинарной точности из локальной переменной 3}
{26}  (s:'dload_0         '; b:(0,0,0,0)),      {Загрузка вещественного двойной точности из локальной переменной 0}
{27}  (s:'dload_1         '; b:(0,0,0,0)),      {Загрузка вещественного двойной точности из локальной переменной 1}
{28}  (s:'dload_2         '; b:(0,0,0,0)),      {Загрузка вещественного двойной точности из локальной переменной 2}
{29}  (s:'dload_3         '; b:(0,0,0,0)),      {Загрузка вещественного двойной точности из локальной переменной 3}
{2A}  (s:'aload_0         '; b:(0,0,0,0)),      {Загрузка объектной ссылки из локальной переменной 0}
{2B}  (s:'aload_1         '; b:(0,0,0,0)),      {Загрузка объектной ссылки из локальной переменной 1}
{2C}  (s:'aload_2         '; b:(0,0,0,0)),      {Загрузка объектной ссылки из локальной переменной 2}
{2D}  (s:'aload_3         '; b:(0,0,0,0)),      {Загрузка объектной ссылки из локальной переменной 3}
{2E}  (s:'iaload          '; b:(0,0,0,0)),      {Загрузка целого из массива}
{2F}  (s:'laload          '; b:(0,0,0,0)),      {Загрузка длинного целого из массива}
{30}  (s:'faload          '; b:(0,0,0,0)),      {Загрузка вещественного из массива}
{31}  (s:'daload          '; b:(0,0,0,0)),      {Загрузка двойного вещественного из массива}
{32}  (s:'aaload          '; b:(0,0,0,0)),      {Загрузка объектной ссылки из массива}
{33}  (s:'baload          '; b:(0,0,0,0)),      {Загрузка байта со знаком из массива}
{34}  (s:'caload          '; b:(0,0,0,0)),      {Загрузка символа из массива}
{35}  (s:'saload          '; b:(0,0,0,0)),      {Загрузка короткого из массива}
{36}  (s:'istore          '; b:(sii,0,0,0)),    {1,Сохранение целого значения в локальной переменной}
{37}  (s:'lstore          '; b:(sil,0,0,0)),    {1,Сохранение длинного целого в локальной переменной}
{38}  (s:'fstore          '; b:(sif,0,0,0)),    {1,Сохранение вещественного одинарной точности в локальной переменной}
{39}  (s:'dstore          '; b:(sid,0,0,0)),    {1,Сохранение двойного вещественного в локальной переменной}
{3A}  (s:'astore          '; b:(sio,0,0,0)),    {1,Сохранение объектной ссылки в локальной переменной}
{3B}  (s:'istore_0        '; b:(0,0,0,0)),      {Сохранение целого в локальной переменной 0}
{3C}  (s:'istore_1        '; b:(0,0,0,0)),      {Сохранение целого в локальной переменной 1}
{3D}  (s:'istore_2        '; b:(0,0,0,0)),      {Сохранение целого в локальной переменной 2}
{3E}  (s:'istore_3        '; b:(0,0,0,0)),      {Сохранение целого в локальной переменной 3}
{3F}  (s:'lstore_0        '; b:(0,0,0,0)),      {Сохранение длинного целого в локальной переменной 0}
{40}  (s:'lstore_1        '; b:(0,0,0,0)),      {Сохранение длинного целого в локальной переменной 1}
{41}  (s:'lstore_2        '; b:(0,0,0,0)),      {Сохранение длинного целого в локальной переменной 2}
{42}  (s:'lstore_3        '; b:(0,0,0,0)),      {Сохранение длинного целого в локальной переменной 3}
{43}  (s:'fstore_0        '; b:(0,0,0,0)),      {Сохранение вещественного одинарной точности в локальной переменной 0}
{44}  (s:'fstore_1        '; b:(0,0,0,0)),      {Сохранение вещественного одинарной точности в локальной переменной 1}
{45}  (s:'fstore_2        '; b:(0,0,0,0)),      {Сохранение вещественного одинарной точности в локальной переменной 2}
{46}  (s:'fstore_3        '; b:(0,0,0,0)),      {Сохранение вещественного одинарной точности в локальной переменной 3}
{47}  (s:'dstore_0        '; b:(0,0,0,0)),      {Сохранение двойного вещественного в локальной переменной 0}
{48}  (s:'dstore_1        '; b:(0,0,0,0)),      {Сохранение двойного вещественного в локальной переменной 1}
{49}  (s:'dstore_2        '; b:(0,0,0,0)),      {Сохранение двойного вещественного в локальной переменной 2}
{4A}  (s:'dstore_3        '; b:(0,0,0,0)),      {Сохранение двойного вещественного в локальной переменной 3}
{4B}  (s:'astore_0        '; b:(0,0,0,0)),      {Сохранение объектной ссылки в локальной переменной 0}
{4C}  (s:'astore_1        '; b:(0,0,0,0)),      {Сохранение объектной ссылки в локальной переменной 1}
{4D}  (s:'astore_2        '; b:(0,0,0,0)),      {Сохранение объектной ссылки в локальной переменной 2}
{4E}  (s:'astore_3        '; b:(0,0,0,0)),      {Сохранение объектной ссылки в локальной переменной 3}
{4F}  (s:'iastore         '; b:(0,0,0,0)),      {Сохранение в целочисленном массиве}
{50}  (s:'lastore         '; b:(0,0,0,0)),      {Сохранение в массиве из длинных целых}
{51}  (s:'fastore         '; b:(0,0,0,0)),      {Сохранение в массиве из одинарных вещественных}
{52}  (s:'dastore         '; b:(0,0,0,0)),      {Сохранение в массиве из двойных вещественных}
{53}  (s:'aastore         '; b:(0,0,0,0)),      {Сохранение в массиве из объектных ссылок}
{54}  (s:'bastore         '; b:(0,0,0,0)),      {Сохранение в массиве байтов со знаком}
{55}  (s:'castore         '; b:(0,0,0,0)),      {Сохранение в символьном массиве}
{56}  (s:'sastore         '; b:(0,0,0,0)),      {Сохранение в массиве из коротких целых}
{57}  (s:'pop             '; b:(0,0,0,0)),      {Извлечение слова с вершины стека}
{58}  (s:'pop2            '; b:(0,0,0,0)),      {Извлечение двух слов с вершины стека}
{59}  (s:'dup             '; b:(0,0,0,0)),      {Дублирование слова на вершине стека}
{5A}  (s:'dup_x1          '; b:(0,0,0,0)),      {Дублирование слово на вершине стека
                                                и помещение копии в стек на два слова ниже}
{5B}  (s:'dup_x2          '; b:(0,0,0,0)),      {Дублирование вершины стека и помещение копии на три слова ниже}
{5C}  (s:'dup2            '; b:(0,0,0,0)),      {Дублирование двух слов на вершине стека}
{5D}  (s:'dup2_x1         '; b:(0,0,0,0)),      {Дублирование двух слов на вершине стека и помещение копий на два слова ниже}
{5E}  (s:'dup2_x2         '; b:(0,0,0,0)),      {Дублирование двух слов на вершине стека и помещение копий на три слова ниже}
{5F}  (s:'swap            '; b:(0,0,0,0)),      {Обмен двух слов на вершине стека}
{60}  (s:'iadd            '; b:(0,0,0,0)),      {Сложение целых}
{61}  (s:'ladd            '; b:(0,0,0,0)),      {Сложение длинных целых}
{62}  (s:'fadd            '; b:(0,0,0,0)),      {Сложение одинарных вещественных}
{63}  (s:'dadd            '; b:(0,0,0,0)),      {Сложение двойных вещественных}
{64}  (s:'isub            '; b:(0,0,0,0)),      {Вычитание целых}
{65}  (s:'lsub            '; b:(0,0,0,0)),      {Вычитание длинных целых}
{66}  (s:'fsub            '; b:(0,0,0,0)),      {Вычитание одинарных вещественных}
{67}  (s:'dsub            '; b:(0,0,0,0)),      {Вычитание двойных вещественных}
{68}  (s:'imul            '; b:(0,0,0,0)),      {Умножение целых}
{69}  (s:'lmul            '; b:(0,0,0,0)),      {Умножение длинных целых}
{6A}  (s:'fmul            '; b:(0,0,0,0)),      {Умножение одинарных вещественных}
{6B}  (s:'dmul            '; b:(0,0,0,0)),      {Умножение двойных вещественных}
{6C}  (s:'idiv            '; b:(0,0,0,0)),      {Деление целых}
{6D}  (s:'ldiv            '; b:(0,0,0,0)),      {Деление длинных целых}
{6E}  (s:'fdiv            '; b:(0,0,0,0)),      {Деление одинарных вещественных}
{6F}  (s:'ddiv            '; b:(0,0,0,0)),      {Деление двойных вещественных}
{70}  (s:'irem            '; b:(0,0,0,0)),      {Остаток от деления целых}
{71}  (s:'lrem            '; b:(0,0,0,0)),      {Остаток от деления длинных целых}
{72}  (s:'frem            '; b:(0,0,0,0)),      {Остаток от деления одинарных вещественных}
{73}  (s:'drem            '; b:(0,0,0,0)),      {Остаток от деления двойных вещественных}
{74}  (s:'ineg            '; b:(0,0,0,0)),      {Отрицание целого}
{75}  (s:'leg             '; b:(0,0,0,0)),      {Отрицание длинного целого}
{76}  (s:'fneg            '; b:(0,0,0,0)),      {Отрицание одинарного вещественного}
{77}  (s:'dneg            '; b:(0,0,0,0)),      {Отрицание двойного вещественного числа}
{78}  (s:'ishl            '; b:(0,0,0,0)),      {Сдвиг целого влево}
{79}  (s:'lshl            '; b:(0,0,0,0)),      {Сдвиг длинного целого влево}
{7A}  (s:'ishr            '; b:(0,0,0,0)),      {Арифметический сдвиг целого вправо}
{7B}  (s:'lshr            '; b:(0,0,0,0)),      {Арифметический сдвиг длинного целого вправо}
{7C}  (s:'iushr           '; b:(0,0,0,0)),      {Логический сдвиг целого вправо}
{7D}  (s:'lushr           '; b:(0,0,0,0)),      {Логический сдвиг длинного целого вправо}
{7E}  (s:'iand            '; b:(0,0,0,0)),      {Логическое И с операндами целого типа}
{7F}  (s:'land            '; b:(0,0,0,0)),      {Логическое И с операндами длинного целого типа}
{80}  (s:'ior             '; b:(0,0,0,0)),      {Логическое ИЛИ с целочисленными операндами}
{81}  (s:'lor             '; b:(0,0,0,0)),      {Логическое ИЛИ с операндами длинного целого типа}
{82}  (s:'ixor            '; b:(0,0,0,0)),      {Исключающее ИЛИ с целочисленными операндами}
{83}  (s:'lxor            '; b:(0,0,0,0)),      {Исключающее ИЛИ с операндами длинного целого типа}
{84}  (s:'iinc            '; b:(ac,ns,0,0)),    {2,Увеличение локальной переменной на константу}
{85}  (s:'i2l             '; b:(0,0,0,0)),      {Преобразование целого в длинное целое}
{86}  (s:'i2f             '; b:(0,0,0,0)),      {Целое в вещественное}
{87}  (s:'i2d             '; b:(0,0,0,0)),      {Целое в двойное вещественное}
{88}  (s:'l2i             '; b:(0,0,0,0)),      {Длинное целое в целое}
{89}  (s:'l2f             '; b:(0,0,0,0)),      {Длинное целое в вещественное}
{8A}  (s:'l2d             '; b:(0,0,0,0)),      {Длинное целое в двойное вещественное}
{8B}  (s:'f2i             '; b:(0,0,0,0)),      {Вещественное в целое}
{8C}  (s:'f2l             '; b:(0,0,0,0)),      {Вещественное в длинное целое}
{8D}  (s:'f2d             '; b:(0,0,0,0)),      {Вещественное в двойное вещественное}
{8E}  (s:'d2i             '; b:(0,0,0,0)),      {Двойное вещественное в целое}
{8F}  (s:'d2l             '; b:(0,0,0,0)),      {Двойное вещественное в длинное целое}
{90}  (s:'d2f             '; b:(0,0,0,0)),      {Двойное вещественное в вещественное}
{91}  (s:'int2byte        '; b:(0,0,0,0)),      {Целое в знаковый байт}
{92}  (s:'int2char        '; b:(0,0,0,0)),      {Целое в символ}
{93}  (s:'int2short       '; b:(0,0,0,0)),      {Целое в короткое}
{94}  (s:'lcmp            '; b:(0,0,0,0)),      {Сравнение длинных целых}
{95}  (s:'fcmpl           '; b:(0,0,0,0)),      {Сравнение вещественных одинарной точности (-1 при NaN)}
{96}  (s:'fcmpg           '; b:(0,0,0,0)),      {Сравнение вещественных одинарной точности (1 при NaN)}
{97}  (s:'dcmpl           '; b:(0,0,0,0)),      {Сравнение вещественных двойной точности(-1 при NaN)}
{98}  (s:'dcmpg           '; b:(0,0,0,0)),      {Сравнение вещественных двойной точности(1 при NaN)}
{99}  (s:'ifeq            '; b:(of2,0,0,0)),    {2,Переход, если равно 0}
{9A}  (s:'ifne            '; b:(of2,0,0,0)),    {2,Переход, если не равно 0}
{9B}  (s:'iflt            '; b:(of2,0,0,0)),    {2,Переход, если меньше 0}
{9C}  (s:'ifge            '; b:(of2,0,0,0)),    {2,Переход, если больше или равно 0}
{9D}  (s:'ifgt            '; b:(of2,0,0,0)),    {2,Переход, если больше 0}
{9E}  (s:'ifle            '; b:(of2,0,0,0)),    {2,Переход, если меньше или равно 0}
{9F}  (s:'if_icmpeq       '; b:(of2,0,0,0)),    {2,Переход, если целые равны}
{A0}  (s:'if_icmpne       '; b:(of2,0,0,0)),    {2,Переход, если целые не равны}
{A1}  (s:'if_icmplt       '; b:(of2,0,0,0)),    {2,Переход, если целое меньше 0}
{A2}  (s:'if_icmpge       '; b:(of2,0,0,0)),    {2,Переход, если целое больше или равно}
{A3}  (s:'if_icmpgt       '; b:(of2,0,0,0)),    {2,Переход, если целое больше 0}
{A4}  (s:'if_icmple       '; b:(of2,0,0,0)),    {2,Переход, если целое меньше или равно}
{A5}  (s:'if_acmpeq       '; b:(of2,0,0,0)),    {2,Переход, если ссылки на объект равны}
{A6}  (s:'if_acmpne       '; b:(of2,0,0,0)),    {2,Переход, если ссылки на объект не равны}
{A7}  (s:'goto            '; b:(of2,0,0,0)),    {2,Переход на}
{A8}  (s:'jsr             '; b:(ofp2,0,0,0)),   {2,Переход на подпрограмму}
{A9}  (s:'ret             '; b:(rtb,0,0,0)),    {1,Возврат из подпрограммы}
{AA}  (s:'tableswitch     '; b:(0,0,0,0)),      {Доступ к таблице перехода по индексу и переход}
{AB}  (s:'lookupswitch    '; b:(0,0,0,0)),      {Доступ к таблице перехода по сравнению с ключом и переход}
{AC}  (s:'ireturn         '; b:(0,0,0,0)),      {Возврат целого значения функции}
{AD}  (s:'lreturn         '; b:(0,0,0,0)),      {Возврат длинного целого значения функции}
{AE}  (s:'freturn         '; b:(0,0,0,0)),      {Возврат одинарного вещественного значения функции}
{AF}  (s:'dreturn         '; b:(0,0,0,0)),      {Возврат двойного вещественного значения функции}
{B0}  (s:'areturn         '; b:(0,0,0,0)),      {Возврат объектной ссылки из функции}
{B1}  (s:'return          '; b:(0,0,0,0)),      {Возврат(опустошающий) из процедуры}
{B2}  (s:'getstatic       '; b:(cp,0,0,0)),     {2,Получение статического поля класса}
{B3}  (s:'putstatic       '; b:(cp,0,0,0)),     {2,Установка статического поля в классе}
{B4}  (s:'getfield        '; b:(cp,0,0,0)),     {2,Перенос поля из объекта}
{B5}  (s:'putfield        '; b:(cp,0,0,0)),     {2,Установка поля в объекте}
{B6}  (s:'invokevirtual   '; b:(cv,0,0,0)),     {2,Вызывает метод экземпляра, основываясь на типе времени выполнения}
{B7}  (s:'invokenonvirtual'; b:(cv,0,0,0)),     {2,Вызывает метод экземпляра, основываясь на не виртуальном типе}
{B8}  (s:'invokestatic    '; b:(cv,0,0,0)),     {2,Вызов метода класса (статического метода)}
{B9}  (s:'invokeinterface '; b:(cv,nb,nb,0)),   {4,Вызывает метод интерфейса}
{BA}  (s:'                '; b:(0,0,0,0)),      {}
{BB}  (s:'new             '; b:(cn,0,0,0)),     {2,Создает новый объект}
{BC}  (s:'newarray        '; b:(nb,0,0,0)),     {1,atype>
                                                T_BOOLEAN=4,T_CHAR=5,T_FLOAT=6,T_DOUBLE=7,T_BYTE=8,T_SHORT=9,T_INT=9,T_LONG=11}
{BD}  (s:'anewarray       '; b:(ck,0,0,0)),     {2,Объявление нового массива из ссылок на объекты}
{BE}  (s:'arraylength     '; b:(0,0,0,0)),      {Возвращает длину массива}
{BF}  (s:'athrow          '; b:(0,0,0,0)),      {Генерация обработки или ошибки}
{C0}  (s:'checkcast       '; b:(cs,0,0,0)),     {2,Проверяет, что объект имеет данный тип}
{C1}  (s:'instanceof      '; b:(ck,0,0,0)),     {2,Определяет, имеет ли объект данный тип}
{C2}  (s:'monitorenter    '; b:(0,0,0,0)),      {Вход в контролируемую область кода}
{C3}  (s:'monitorexit     '; b:(0,0,0,0)),      {Выход из контролируемой области кода}
{C4}  (s:'wide            '; b:(nw,0,0,0)),     {1,Расширенный индекс для доступа к локальным переменным для
                                                команд загрузки, сохранения и приращени}
{C5}  (s:'multianewarray  '; b:(cn,nb,0,0)),    {3,Размещение нового многомерного массива}
{C6}  (s:'ifnull          '; b:(of2,0,0,0)),    {2,Переход, если пустой указатель}
{C7}  (s:'ifnonnull       '; b:(of2,0,0,0)),    {2,Переход, если не пустой указатель}
{C8}  (s:'goto_w          '; b:(of4,0,0,0)),    {4,Переход на (расширенный индекс)}
{C9}  (s:'jsr_w           '; b:(ofp4,0,0,0)),   {4,Переход на подпрограмму (расширенный индекс)}
{CA}  (s:'breakpoint      '; b:(0,0,0,0)),      {Остановка и передача контроля обработчику прерываний}
{CB}  (s:'                '; b:(0,0,0,0)),      {}
{CC}  (s:'                '; b:(0,0,0,0)),      {}
{CD}  (s:'                '; b:(0,0,0,0)),      {}
{CE}  (s:'                '; b:(0,0,0,0)),      {}
{CF}  (s:'                '; b:(0,0,0,0)),      {}
{D0}  (s:'                '; b:(0,0,0,0)),      {}
{D1}  (s:'ret_w           '; b:(rtw,0,0,0)),    {2,Возврат из подпрограммы (расширенный индекс)}
{D2}  (s:'                '; b:(0,0,0,0)),      {}
{D3}  (s:'                '; b:(0,0,0,0)),      {}
{D4}  (s:'                '; b:(0,0,0,0)),      {}
{D5}  (s:'                '; b:(0,0,0,0)),      {}
{D6}  (s:'                '; b:(0,0,0,0)),      {}
{D7}  (s:'                '; b:(0,0,0,0)),      {}
{D8}  (s:'                '; b:(0,0,0,0)),      {}
{D9}  (s:'                '; b:(0,0,0,0)),      {}
{DA}  (s:'                '; b:(0,0,0,0)),      {}
{DB}  (s:'                '; b:(0,0,0,0)),      {}
{DC}  (s:'                '; b:(0,0,0,0)),      {}
{DD}  (s:'                '; b:(0,0,0,0)),      {}
{DE}  (s:'                '; b:(0,0,0,0)),      {}
{DF}  (s:'                '; b:(0,0,0,0)),      {}
{E0}  (s:'                '; b:(0,0,0,0)),      {}
{E1}  (s:'                '; b:(0,0,0,0)),      {}
{E2}  (s:'                '; b:(0,0,0,0)),      {}
{E3}  (s:'                '; b:(0,0,0,0)),      {}
{E4}  (s:'                '; b:(0,0,0,0)),      {}
{E5}  (s:'                '; b:(0,0,0,0)),      {}
{E6}  (s:'                '; b:(0,0,0,0)),      {}
{E7}  (s:'                '; b:(0,0,0,0)),      {}
{E8}  (s:'                '; b:(0,0,0,0)),      {}
{E9}  (s:'                '; b:(0,0,0,0)),      {}
{EA}  (s:'                '; b:(0,0,0,0)),      {}
{EB}  (s:'                '; b:(0,0,0,0)),      {}
{EC}  (s:'                '; b:(0,0,0,0)),      {}
{ED}  (s:'                '; b:(0,0,0,0)),      {}
{EE}  (s:'                '; b:(0,0,0,0)),      {}
{EF}  (s:'                '; b:(0,0,0,0)),      {}
{F0}  (s:'                '; b:(0,0,0,0)),      {}
{F1}  (s:'                '; b:(0,0,0,0)),      {}
{F2}  (s:'                '; b:(0,0,0,0)),      {}
{F3}  (s:'                '; b:(0,0,0,0)),      {}
{F4}  (s:'                '; b:(0,0,0,0)),      {}
{F5}  (s:'                '; b:(0,0,0,0)),      {}
{F6}  (s:'                '; b:(0,0,0,0)),      {}
{F7}  (s:'                '; b:(0,0,0,0)),      {}
{F8}  (s:'                '; b:(0,0,0,0)),      {}
{F9}  (s:'                '; b:(0,0,0,0)),      {}
{FA}  (s:'                '; b:(0,0,0,0)),      {}
{FB}  (s:'                '; b:(0,0,0,0)),      {}
{FC}  (s:'                '; b:(0,0,0,0)),      {}
{FD}  (s:'                '; b:(0,0,0,0)),      {}
{FE}  (s:'                '; b:(0,0,0,0)),      {}
{FF}  (s:'                '; b:(0,0,0,0)));     {}


  CONSTANT_Class = 7;
  CONSTANT_Fieldref = 9;
  CONSTANT_Methodref = 10;
  CONSTANT_InterfaceMethodref = 11;
  CONSTANT_String = 8;
  CONSTANT_Integer = 3;
  CONSTANT_Float = 4;
  CONSTANT_Long = 5;
  CONSTANT_Double = 6;
  CONSTANT_NameAndType = 12;
  CONSTANT_Utf8 = 1;
  CONSTANT_Unicode = 2;
  {------------------------------}
  ACC_PUBLIC = 1;
  ACC_PRIVATE = 2;
  ACC_PROTECTED = 4;
  ACC_STATIC = 8;
  ACC_FINAL = 16;
  ACC_SYNCHRONIZED = 32;
  ACC_SUPER = 32;
  ACC_VOLATILE = 64;
  ACC_TRANSIENT = 128;
  ACC_NATIVE = 256;
  ACC_INTERFACE = 512;
  ACC_ABSTRACT = 1024;
  {}
type
  tfield_info = record
  access_flags : word;
  name_index : word;
  signature_index : word;
  attributes_count : word;
  {attributes[attribute_count]}
  end;
  {}
  tmethod_info = record
  access_flags : word;
  name_index : word;
  signature_index : word;
  attributes_count : word;
  {attributes[attribute_count]}
  end;
  {--атрибуты--}
  tGenericAttribute_info = record
  attribute_name : word;
  attribute_length : longInt;
  {info[attribute_length] of byte}
  end;
  {}
  tSourceFile_attribute = record
  attribute_name_index : word;
  attribute_length : longInt;
  sourcefile_index : word;
  end;
  {}
  tLineNumberTable_attribute = record
  attribute_name_index : word;
  attribute_length : longInt;
  line_number_table_length : word;
  {line_number_table[line_number_table_length] of record start_pc,line_number:word;end;}
  end;
  {}
  tConstantValue_attribute = record
  attribute_name_index : word;
  attribute_length : longInt;
  constantvalue_index : word;
  end;
  {}
  tLocalVariableTable_attribute = record
  attribute_name_index : word;
  attribute_length : longInt;
  local_variable_table_length : word;
  {local_variable_table[local_variable_table_length]}
  end;
  tLocal_variable_table = record
  start_pc : word;
  length : word;
  name_index : word;
  signature_index : word;
  slot : word;
  end;
  {}
  tExceptions_attribute = record
  attribute_name_index : word;
  attribute_length : longInt;
  number_of_exceptions : word;
  {exception_index_table[number_of_exceptions] of word}
  end;
  {}
  tInnerClasses_attribute = record
  attribute_name_index : word;
  attribute_length : longInt;
  number_of_classes : word;
  {classes[number_of_classes] of record
  inner_class_info_index : word;
  outer_class_info_index : word;
  inner_name_index : word;
  inner_class_access_flags : word;
  end}
  end;
  {}
  tSynthetic_attribute = record
  attribute_name_index : word;
  attribute_length : longInt;
  end;
  {}
  Deprecated_attribute = record
  attribute_name_index : word;
  attribute_length : longInt;
  end;
  {}
  tCode_attribute = record
  {attribute_name_index : word;
  attribute_length : longInt;{}
  max_stack : word;
  max_locals : word;
  code_length : longInt;
  end;
  {code[code_length]}
  {exception_table_length : word;{***}
  {exception_table[exception_table_length]}
  {attributes_count : word;{***}
  {attribute_info[attribute_count]}
  tException_table = record
  start_pc : word;
  end_pc : word;
  handler_pc : word;
  catch_type : word;
  end;
  {--------------------------}
  tarr = array[0..$FFFF-1] of byte;
var
  cf : record {ClassFile}
  magic : longInt;
  minor_version : word;
  major_version : word;
  constant_pool_count : word;
  cp_info :^tarr; {constant_pool[constant_pool_count - 1]}
  access_flags : word;
  this_class : word;
  super_class : word;
  interfaces_count : word;
  interfaces :^tarr; {[interfaces_count]}
  fields_count : word;
  field_info :^tarr; {fields[fields_count]}
  methods_count : word;
  method_info :^tarr; {methods[methods_count]}
  attributes_count : word;
  attribute_info :^tarr; {attributes[attribute_count]}
end;

var
  f : file;
  i,j,n,rc : integer; {longInt;}
  s : string;
  tag : byte;
  p :^byte;
  pfield_info :^tfield_info;
  pmethod_info :^tmethod_info;
  pGenericAttribute_info :^tGenericAttribute_info;
  pCode_attribute :^tCode_attribute;
  pException_table :^tException_table;
  pexception_table_length :^word;
  pattributes_count :^word;
  pLocalVariableTable_attribute :^tLocalVariableTable_attribute;
  pLocal_variable_table :^tLocal_variable_table;


function hex(b : byte) : string;
const
  h : array[0..$F] of char = '0123456789ABCDEF';
begin
  hex := h[b shr 4]+h[b and $F];
end;


function hex2(w : word) : string;
begin
  hex2 := hex(hi(w))+hex(lo(w));
end;

function hex4(l : longInt) : string;
var        {longInt to hexLongInt}
  b : array[0..3] of byte absolute l;
Begin
  hex4 := hex(b[3])+hex(b[2])+hex(b[1])+hex(b[0]);
End;


function get(p : pointer; count : integer) : pointer;
var
  n : integer;
begin
  blockRead(f,p^,count,n);
  inc(longInt(p),n); {pasc}
  inc(rc,n);
  get := p; {get := ptr(cardinal(p)+count); //delphi}
end;

function swap2(p : pointer; offs : integer) : pointer;
var
  b1,b2 :^byte;
  b : byte;
begin
  dec(longInt(p),offs+1);
  b1 := p;
  dec(longInt(p));
  b2 := p;
  b := b1^; b1^ := b2^; b2^ := b;
  swap2 := p;
end;


function swap4(p : pointer; offs : integer) : pointer;
var
  w1,w2 : ^word;
  w : word;
begin
  w1 := swap2(p,0);
  w2 := swap2(w1,0);
  w := w1^; w1^ := w2^; w2^ := w;
  swap4 := w2;
end;


function pconst(i : integer) : pointer;
var
  w :^word;
  p :^byte;
begin
  p := nil;
  if (i>=1) and (i<cf.constant_pool_count-1) then
  begin
    p := @cf.cp_info^;
    while i>=1 do
    begin
      case p^ of
        CONSTANT_Class:
          inc(p,1+2);
        CONSTANT_Fieldref,CONSTANT_Methodref,CONSTANT_InterfaceMethodref:
          inc(p,1+4);
        CONSTANT_String:
          inc(p,1+2);
        CONSTANT_Integer,CONSTANT_Float:
          inc(p,1+4);
        CONSTANT_Long:
          inc(p,1+8 );
        CONSTANT_NameAndType:
          inc(p,1+4);
        CONSTANT_Utf8, CONSTANT_Unicode:
          begin {null=$0000, 1b=$0001-$007F,2b=$0008-$07FF,3b=$0800-$FFFF{}
            inc(p);
            w := @p^;
            inc(p,2);
            inc(p,w^)
          end;
        else begin p := nil; i := 0; end;
      end;
      dec(i);
    end;
  end;
  pconst := p;
end;

function getConstStr(index : word) : string;
var
  s : string;
  j : word;
  p :^byte;
  w :^word;
begin
  s := '';
  p := pconst(index);
  if p<>nil then
  case p^ of
    CONSTANT_Class:
      begin
        w := @p^;
        inc(w);
        p := pconst(w^);
      end;
    CONSTANT_Fieldref,CONSTANT_Methodref,CONSTANT_InterfaceMethodref:
      begin
        w := @p^;
        inc(w);
        p := pconst(w^);
      end;
    CONSTANT_String:
      begin
        w := @p^;
        inc(w);
        p := pconst(w^);
      end;
    CONSTANT_NameAndType:
      begin
        w := @p^;
        inc(w);
        p := pconst(w^);
      end;
  end;
  {null=$0000, 1b=$0001-$007F,2b=$0008-$07FF,3b=$0800-$FFFF{}
  if p<>nil then
    if (p^ in [CONSTANT_Utf8, CONSTANT_Unicode]) then
    begin
      inc(p);
      w := @p^;
      inc(p,2);
      for j := 0 to w^-1 do
      begin
        s := s+chr(p^);
        inc(p);
      end;
    end;
  getConstStr := s;
end;

{-------------------}
procedure disasm;
var
  op,k : byte;
begin
  get(p,1);
  op:=byte(p^);
  inc(p);
  write(hex(op),' '+jbc[op].s+' ');
  for k:=0 to 3 do
  case jbc[op].b[k] of
    0: begin end;
    nb:   {1байт целое беззнаковое}
      begin
        write(hex(byte(get(p,1)^)),' ');
        inc(p);
      end;
    ns:   {1байт целое знаковое}
      begin
        write(hex(byte(get(p,1)^)),' ');
        inc(p);
      end;
    nw:   {2байта целое беззнаковое}
      begin
        write(hex2(word(swap2(get(p,2),0)^)),' ');
        inc(p,2);
      end;
    ni:   {2байта целое знаковое}
      begin
        write(hex2(word(swap2(get(p,2),0)^)),' ');
        inc(p,2);
      end;
    cb:   {1байт индекс в константном пуле }
      begin
        write(hex(byte(get(p,2)^)),' ');
        inc(p,1);{}
{       write(hexw(word(swap2(get(p,2),0)^)),' ');
        inc(p,2);{}
      end;
    cw:   {2байт индекс в константном пуле 2-х байтовой константы}
      begin
        write(hex2(word(swap2(get(p,2),0)^)),' ');
        inc(p,2);
      end;
    cl:   {2байт индекс в константном пуле 2-х словной константы}
      begin
        write(hex2(word(swap2(get(p,2),0)^)),' ');
        inc(p,2);
      end;
    cp:   {2байт индекс в константном пуле Получение статического поля класса  Элементом константного пула
          будет поле ссылки на статическое поле класса - полями шириной как 64-бита так и 32-бита}
      begin
        write(hex2(word(swap2(get(p,2),0)^)),' ');
        inc(p,2);
      end;
    cv:   {2байт индекс в константном пуле текущего класса - сигнатура метода}
      begin
        write(hex2(word(swap2(get(p,2),0)^)),' ');
        inc(p,2);
      end;
    cn:   {2байт - конструирование индекса в константном пуле}
      begin
        write(hex2(word(swap2(get(p,2),0)^)),' ');
        inc(p,2);
      end;
    ck:   {2байт  индекс на класс}
      begin
        write(hex2(word(swap2(get(p,2),0)^)),' ');
        inc(p,2);
      end;
    cs:   {2байт  индекс на строку}
      begin
        write(hex2(word(swap2(get(p,2),0)^)),' ');
        inc(p,2);
      end;
    lii:  {загрузка целого из локальной переменной}
      begin
{        write(hex(byte(get(p,1)^)),' ');
        inc(p);{}
        write(hex2(word(swap2(get(p,2),0)^)),' ');
        inc(p,2);
      end;
    lil:  {загрузка длинного целого из локальной переменной}
      begin
{        write(hex(byte(get(p,1)^)),' ');
        inc(p);{}
        write(hex2(word(swap2(get(p,2),0)^)),' ');
        inc(p,2);
      end;
    lif:  {загрузка вещественного одинарной точности из локальной переменной}
      begin
{        write(hex(byte(get(p,1)^)),' ');
        inc(p);{}
        write(hex2(word(swap2(get(p,2),0)^)),' ');
        inc(p,2);
      end;
    lid:  {загрузка вещественного двойной точности из локальной переменной}
      begin
{        write(hex(byte(get(p,1)^)),' ');
        inc(p);{}
        write(hex2(word(swap2(get(p,2),0)^)),' ');
        inc(p,2);
      end;
    lio:  {загрузка объектной ссылки из локальной переменной}
      begin
{       write(hex(byte(get(p,1)^)),' ');
        inc(p,1);{}
        write(hex2(word(swap2(get(p,2),0)^)),' ');
        inc(p,2);
      end;
    sii:  {сохранение целого значения в локальной переменной}
      begin
{        write(hex(byte(get(p,1)^)),' ');
        inc(p);{}
        write(hex2(word(swap2(get(p,2),0)^)),' ');
        inc(p,2);
      end;
    sil:  {сохранение длинного целого в локальной переменной}
      begin
{        write(hex(byte(get(p,1)^)),' ');
        inc(p);{}
        write(hex2(word(swap2(get(p,2),0)^)),' ');
        inc(p,2);
      end;
    sif:  {Сохранение вещественного одинарной точности в локальной переменной}
      begin
{        write(hex(byte(get(p,1)^)),' ');
        inc(p);{}
        write(hex2(word(swap2(get(p,2),0)^)),' ');
        inc(p,2);
      end;
    sid:  {Сохранение двойного вещественного в локальной переменной}
      begin
{        write(hex(byte(get(p,1)^)),' ');
        inc(p);}
        write(hex2(word(swap2(get(p,2),0)^)),' ');
        inc(p,2);
      end;
    sio:  {Сохранение объектной ссылки в локальной переменной}
      begin
{        write(hex(byte(get(p,1)^)),' ');
        inc(p);}
        write(hex2(word(swap2(get(p,2),0)^)),' ');
        inc(p,2);
      end;
    ac:   {Увеличение локальной переменной на константу}
      begin
{        write(hex(byte(get(p,1)^)),' ');
        inc(p);}
        write(hex2(word(swap2(get(p,2),0)^)),' ');
        inc(p,2);
      end;
    of2:  {16-битное знаковое смещение}
      begin
        write(hex2(word(swap2(get(p,2),0)^)),' ');
        inc(p,2);
      end;
    of4:  {32-битное знаковое смещение}
      begin
        write(hex4(longInt(swap4(get(p,4),0)^)),' ');
        inc(p,4);
      end;
    ofp2: {16-битное знаковое смещение Переход на подпрограмму}
      begin
        write(hex2(word(swap2(get(p,2),0)^)),' ');
        inc(p,2);
      end;
    ofp4: {32-битное знаковое смещение Переход на подпрограмму}
      begin
        write(hex4(longInt(swap4(get(p,4),0)^)),' ');
        inc(p,4);
      end;
    rtb:  {8-битный адрес Возврат из подпрограммы - адрес возврата}
      begin
        write(hex(word(get(p,1)^)),' ');
        inc(p);
      end;
    rtw:  {16-битный адрес возврата}
      begin
        write(hex2(word(swap2(get(p,2),0)^)),' ');
        inc(p,2);
      end;
    else writeln('Error: str:[', op, ',', k, ']=', jbc[op].b[k]);
  end;
end;
{-------------------}

procedure load_const;
begin
  get(p,1);
  tag := p^;
  inc(p);
  write(tag:2,' ');
  case tag of
    CONSTANT_Class:
      begin
        p := get(p,2);
        write('CONSTANT_Class:              ',word(swap2(p,0)^));
      end;
    CONSTANT_Fieldref,CONSTANT_Methodref,CONSTANT_InterfaceMethodref:
      begin
        case tag of
          CONSTANT_Fieldref : write('CONSTANT_Fieldref:           ');
          CONSTANT_Methodref: write('CONSTANT_Methodref:          ');
          CONSTANT_InterfaceMethodref: write('CONSTANT_InterfaceMethodref:');
        end;
        p := get(p,4);
        write(word(swap2(p,2)^),' ',word(swap2(p,0)^));
      end;
    CONSTANT_String:
      begin
        p := get(p,2);
        write('CONSTANT_String:             ',word(swap2(p,0)^));
      end;
    CONSTANT_Integer,CONSTANT_Float:
      begin
        case tag of
          CONSTANT_Integer  : write('CONSTANT_Integer:           ');
          CONSTANT_Float    : write('CONSTANT_Float:             ');
        end;
        p := get(p,4);
        write(longInt(swap4(p,0)^));
      end;
    CONSTANT_Long,CONSTANT_Double:
      begin
        case tag of
          CONSTANT_Long: write('CONSTANT_Integer:          ');
          CONSTANT_Double: write('CONSTANT_Double:         ');
        end;
        p := get(p,8 );
        write('_hi:',longInt(swap4(p,4)^),'_lo:',longInt(swap4(p,0)^));
        inc(i);
      end;
    CONSTANT_NameAndType:
      begin
        p := get(p,4);
        write('CONSTANT_NameAndType:       ',word(swap2(p,2)^),' ',word(swap2(p,0)^));
      end;
    CONSTANT_Utf8,CONSTANT_Unicode:
      begin {null=$0000, 1b=$0001-$007F,2b=$0008-$07FF,3b=$0800-$FFFF{}
        p := get(p,2); {length}
        n := word(swap2(p,0)^);
        write('CONSTANT_Utf8-Unicode [',n:3,']','=');
        for j := 0 to n-1 do
        begin
          get(p,1);
          write(chr(p^));
          inc(p);
        end;
      end;
    else if tag<>0 then
    begin
      write('error:',tag);
      halt;
    end;
  end;
  writeln;
end;


procedure load_attribute_info;
var
  offs,start :^byte;
begin
  writeln(hex4(rc), 'h  genericAttribute_info');
  p:=get(p,sizeof(pGenericAttribute_info^));
  pGenericAttribute_info:=swap2(swap4(p,0),0);
  s := getConstStr(pGenericAttribute_info^.attribute_name-1);
  writeln('       attribute_name:  ',pGenericAttribute_info^.attribute_name,' -> ',s);
  writeln('       attribute_length:',pGenericAttribute_info ^.attribute_length);
  if s='Code' then
  begin
    writeln(hex4(rc), 'h  Code:');
    p := get(p,sizeof(pCode_attribute^));
    pCode_attribute := swap2(swap2(swap4(p,0),0),0);
    writeln(hex4(rc-sizeof(pCode_attribute^.max_stack)),
    'h  max_stack:  ', pCode_attribute^.max_stack);
    writeln(hex4(rc-sizeof(pCode_attribute^.max_locals)),
    'h  max_locals: ', pCode_attribute^.max_locals);
    writeln(hex4(rc-sizeof(pCode_attribute^.code_length)),
    'h  code_length:', pCode_attribute^.code_length);
    start := @p^;
    offs  := @p^;
    inc(longInt(offs), pCode_attribute^.code_length);
    writeln('_______DISASSEMBLE-START_______');
    while (longInt(p) < longInt(offs)) do
    begin
      write(hex4(longInt(p)-longInt(start)),'h   ');
      disasm;
      writeln;
    end;
    writeln('________DISASSEMBLE-END________');
(*  writeln;
    n := 0;
    while n < pCode_attribute^.code_length do
    begin
      write(hexw(n),'h'#9, hex(byte(p^)),' ');
      op:=byte(get(p,1)^);
      inc(p);
      case byte(p^) of
{1}     18:
          begin
            get(p,1); p1:=byte(p^); write(hex(byte(p^)),' ');
            write(TAB2,ByteCode[op],' ',hex(p1),'h');
            inc(n);
          end;
{2}     17,19,20,132,153..168,178..184,187,189,192,193,198,199,209:
          begin
            get(p,1); p1:=byte(p^); write(hex(byte(p^)),' ');
            get(p,1); p2:=byte(p^); write(hex(byte(p^)),' ');
            write(TAB,ByteCode[op],' ',hex(p1),hex(p2),'h');
            inc(n,2);
          end;
{3}     197:
          begin
            inc(n,3);
          end;
{4}     185,200,201:
          begin
            inc(n,4);
          end;
{10}    171:
          begin
          end;
{14}    170:
          begin
          end;
        else write('  ',ByteCode[byte(p^)]);
      end;
      writeln;
      inc(n);
    end;
    {for n := 0 to pCode_attribute^.code_length-1 do
    begin
      get(p,1);
      write(hex(byte(p^)),' ');
      if (n mod 8)=0 then writeln;
    end;{}*)

    writeln;
    p := get(p,sizeof(pexception_table_length^));
    pexception_table_length:=swap2(p,0);
    writeln(hex4(rc-sizeof(pexception_table_length^)),'h  pexception_table [',pexception_table_length^,']=');
    for n := 0 to pexception_table_length^-1 do
    begin
      writeln(hex4(rc), 'h  exception_table:',i,'_');
      p := get(p,sizeof(pException_table^));
      pException_table := swap2(swap2(swap2(swap2(p,0),0),0),0);
      writeln('     start_pc:  ', pException_table^.start_pc);
      writeln('     end_pc:    ', pException_table^.end_pc);
      writeln('     handler_pc:', pException_table^.handler_pc);
      writeln('     catch_type:', pException_table^.catch_type);
    end;
    p := get(p,sizeof(pattributes_count^));
    pattributes_count :=swap2(p,0);
    writeln('     attributes [',pAttributes_count^,']=');
    for n := 0 to pAttributes_count^-1 do
    begin
      writeln(hex4(rc),'h  attributes_info :',n,'_');
      load_attribute_info;
    end;
  end
  else if s='LocalVariableTable' then
  begin
    writeln(hex4(rc), 'h  LocalVariableTable');
    p := get(p,sizeof(pLocalVariableTable_attribute^));
    pLocalVariableTable_attribute := swap2(swap4(swap2(p,0),0),0);
    writeln(hex4(rc-sizeof(pLocalVariableTable_attribute^.attribute_name_index)),
    '     attribute_name_index:       ', pLocalVariableTable_attribute^.attribute_name_index);
    writeln(hex4(rc-sizeof(pLocalVariableTable_attribute^.attribute_length)),
    '     attribute_length:           ', pLocalVariableTable_attribute^. attribute_length);
    writeln(hex4(rc-sizeof(pLocalVariableTable_attribute^.local_variable_table_length)),
    '     local_variable_table_length:', pLocalVariableTable_attribute^.local_variable_table_length);
    for n := 0 to pLocalVariableTable_attribute^.local_variable_table_length-1 do
    begin
      writeln(hex4(rc),'h  localVariableTable_attribute',i,'_');
      p := get(p,sizeof(pLocal_variable_table^));
      pLocal_variable_table := swap2(swap2(swap2(swap2(swap2(p,0),0),0),0),0);
      writeln('     start_pc:       ', pLocal_variable_table^.start_pc);
      writeln('     length:         ', pLocal_variable_table^.length);
      writeln('     name_index:     ', pLocal_variable_table^.name_index);
      writeln('     signature_index:', pLocal_variable_table^. signature_index);
      writeln('     slot:           ', pLocal_variable_table^.slot);
    end;
  end
  else if s='LineNumberTable' then
  begin
    writeln(hex4(rc),'h  LineNumberTable [', pGenericAttribute_info^.attribute_length,']=');
    for n := 0 to pGenericAttribute_info^.attribute_length-1 do
    begin
      get(p,1);
      {write(hex(byte(p^)),' ');{}
      inc(p);
    end;
    {p:=get(p,2);
    n:=word(swap2(p,0)^);
    writeln(hex4(rc),'h  line_number_table [',n,']=');
    while n>0 do
    begin
      writeln('     start_pc    :', hexw(word(swap2(get(p,2),0)^)));
      inc(p,2);
      writeln('     line_number :', hexw(word(swap2(get(p,2),0)^)));
      inc(p,2);
      dec(n);
    end;}
  end
  {if s='SourceFile' then
  begin
  end{}
  else {don't know... skip atributes}

  begin
    writeln(hex4(rc),'h  ANY_BLOCK [', pGenericAttribute_info^.attribute_length,']=');
    for n := 0 to pGenericAttribute_info^.attribute_length-1 do
    begin
      get(p,1);
      write(' ',hex(byte(p^)));
      if ((n+1) mod 16)=0 then writeln;
      inc(p);
    end;
  end;
  writeln;
end;


procedure load_interfaces;
begin
  p := get(p,2);
  write(word(swap2(p,0)^),',');
end;


procedure load_field_info;
begin
  p := get(p,sizeof(pfield_info^));
  pfield_info := swap2(swap2(swap2(swap2(p,0),0),0),0);
  writeln('       access_flags:    ',pfield_info^.access_flags) ;
  writeln('       name_index:      ',pfield_info^.name_index);
  writeln('       signature_index: ',pfield_info^.signature_index);
  writeln('       attributes_count:',pfield_info^.attributes_count);
  for j := 0 to pfield_info^.attributes_count-1 do
  begin
    writeln(hex4(rc),'h  attributes_info :',j,'_');
    load_attribute_info;
  end;
end;


procedure method_info;
begin
  p := get(p,sizeof(pmethod_info^));
  pmethod_info := swap2(swap2(swap2(swap2(p,0),0),0),0);
  s := getConstStr(pmethod_info^.name_index-1);
  writeln('       access_flags:    ',pmethod_info^.access_flags );
  writeln('       name_index:     [',pmethod_info^.name_index,'] -> ',s);
  writeln('       signature_index: ',pmethod_info^.signature_index);
  writeln('       attributes_count:',pmethod_info^.attributes_count);
  for j := 0 to pmethod_info^.attributes_count-1 do
  begin
    writeln(hex4(rc),'h  attributes_info :',j,'_');
    load_attribute_info;
  end;
end;


begin
  getMem(cf.cp_info,            $FFFF);
  getMem(cf.interfaces,         $7FFF);
  getMem(cf.field_info,         $FFFF);
  getMem(cf.method_info,        $FFFF);
  getMem(cf.attribute_info,     $FFFF);
  fillChar(cf.cp_info^,         $FFFF, 0);
  fillChar(cf.interfaces^,      $7FFF, 0);
  fillChar(cf.field_info^,      $FFFF, 0);
  fillChar(cf.method_info^,     $FFFF, 0);
  fillChar(cf.attribute_info^,  $FFFF, 0);
  assign(f,'fw.cla');
  {cf.magic := $CAFEBABE; cf.minor_version := $0000; cf.major_version := $002E;
  rewrite(f,1);
  blockWrite(f,cf.magic,sizeof(cf.magic),n);
  blockWrite(f,cf.minor_version,sizeof(cf.minor_version),n);
  blockWrite(f,cf.major_version,sizeof(cf.major_version),n);{...}
  reset(f,1);
  rc := 0;
  swap4(get(@cf.magic,sizeof(cf.magic)),0);
  swap2(get(@cf.minor_version,sizeof(cf.minor_version)),0);
  swap2(get(@cf.major_version,sizeof(cf.major_version)),0);
  swap2(get(@cf.constant_pool_count,sizeof(cf.constant_pool_count)),0);
  p := @cf.cp_info^;
  i := 1;
  while i < cf.constant_pool_count do
  begin
    write(hex4(rc-1),'h ',i:3,' ');
    load_const;
    inc(i);
  end;
  writeln;
  swap2(get(@cf.access_flags,sizeof(cf.access_flags)),0);
  writeln(hex4(rc-sizeof(cf.access_flags)),'h  access_flags:',cf.access_flags);
  swap2(get(@cf.this_class,sizeof(cf.this_class)),0);
  writeln(hex4(rc-sizeof(cf.this_class)),  'h  this_class:  ',cf.this_class);
  swap2(get(@cf.super_class,sizeof(cf.super_class)),0);
  writeln(hex4(rc-sizeof(cf.super_class)), 'h  super_class: ',cf.super_class);
  writeln;
  swap2(get(@cf.interfaces_count,sizeof(cf.interfaces_count)),0);
  writeln(hex4(rc-sizeof(cf.interfaces_count)),'h  INTERFACES_INFO [',cf.interfaces_count,']=');
  p := @cf.interfaces^;
  for i := 0 to cf.interfaces_count-1 do
  begin
    writeln(hex4(rc), 'h  interfaces_info :',i,'___');
    load_interfaces;
  end;
  writeln;
  swap2(get(@cf.fields_count,sizeof(cf.fields_count) ),0);
  writeln(hex4(rc-sizeof(cf.fields_count)),'h  FIELD_INFO [',cf.fields_count,']=');
  p := @cf.field_info^;
  for i := 0 to cf.fields_count-1 do
  begin
    writeln(hex4(rc), 'h  field_info :',i,'___');
    load_field_info;
  end;
  writeln;
  swap2(get(@cf.methods_count,sizeof(cf.methods_count)),0);
  writeln(hex4(rc-sizeof(cf.methods_count)), 'h  METHOD_INFO [',cf.methods_count,']=');
  p := @cf.method_info^;
  for i := 0 to cf.methods_count-1 do
  begin
    writeln(hex4(rc),'h  method_info :',i,'___');
    method_info;
  end;
  writeln;
  swap2(get(@cf.attributes_count,sizeof(cf.attributes_count)),0);
  writeln(hex4(rc-sizeof(cf.attributes_count)),'h  ATTRIBUTE_INFO [',cf.attributes_count,']=');
  p := @cf.attribute_info^;
  for i := 0 to cf.attributes_count-1 do
  begin
    writeln(hex4(rc),'h  attributes_info :',i,'___');
    load_attribute_info;
  end;
  close(f);
  freeMem(cf.attribute_info,  $FFFF);
  freeMem(cf.method_info,     $FFFF);
  freeMem(cf.field_info,      $FFFF);
  freeMem(cf.interfaces,      $7FFF);
  freeMem(cf.cp_info,         $FFFF);
end.
(Offline)
 
Ответить с цитированием