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

список изменений к исходнику предложенному ранее.
1. добавить константу wide
2. заменить подпрограмму disasm;
3. добавить в подпрограмму load_attribute_info переменную "n : integer;"

что еще не сделано: "lookupswitch" и некоторые др. команды.
_____________________________
техника проверки disassembling'a:
1. скачиваем NMI's Java Code Viewer 6.0 http://www.samsfan.ru/soft/?action=view&id=49&parent=7
2. распаковываем лубую навороченную jar-программку, желательно работающую с double-числами.
3. диассемблируе class файлы Java Code Viewer и нашей программкой, запуск командной строки вида: программа.exe > out.txt
4. сверяем полученные участки кода, если где не состыковка, корректируем алгоритм разбора.. (так сразу видно где лишние байты прихватило)


const
  ....
  rtw  = 29; {16-битный адрес возврата}
  wide = 30; {расширить следующую команду}
  jbc : array....

{C4}  (s:'wide            '; b:(wide,0,0,0)),   {1,Расширенный индекс для доступа к локальным переменным для команд загрузки, сохранения и приращени}
....

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
        get(p,1);
        write(hex(byte(p^)),' ');
        inc(p);
      end;
    ns:   {1байт целое знаковое}
      begin
        get(p,1);
        write(hex(byte(p^)),' ');
        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
        get(p,1);
        write(hex(byte(p^)),' ');
        inc(p,1);
      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:  {1байт загрузка целого из локальной переменной}
      begin
        get(p,1);
        write(hex(byte(p^)),' ');
        inc(p,1);
      end;
    lil:  {загрузка длинного целого из локальной переменной}
      begin
        get(p,1);
        write(hex(byte(p^)),' ');
        inc(p);
      end;
    lif:  {загрузка вещественного одинарной точности из локальной переменной}
      begin
        get(p,1);
        write(hex(byte(p^)),' ');
        inc(p);
      end;
    lid:  {загрузка вещественного двойной точности из локальной переменной}
      begin
        get(p,1);
        write(hex(byte(p^)),' ');
        inc(p);
      end;
    lio:  {загрузка объектной ссылки из локальной переменной}
      begin
        get(p,1);
        write(hex(byte(p^)),' ');
        inc(p);
      end;
    sii:  { сохранение целого значения в локальной переменной}
      begin
        get(p,1);
        write(hex(byte(p^)),' ');
        inc(p,1);
      end;
    sil:  {сохранение длинного целого в локальной переменной}
      begin
        get(p,1);
        write(hex(byte(p^)),' ');
        inc(p);
      end;
    sif:  {Сохранение вещественного одинарной точности в локальной переменной}
      begin
        get(p,1);
        write(hex(byte(p^)),' ');
        inc(p);
      end;
    sid:  {Сохранение двойного вещественного в локальной переменной}
      begin
        get(p,1);
        write(hex(byte(p^)),' ');
        inc(p);
      end;
    sio:  {Сохранение объектной ссылки в локальной переменной}
      begin
        get(p,1);
        write(hex(byte(p^)),' ');
        inc(p);
      end;
    ac:   {Увеличение локальной переменной на константу}
      begin
        get(p,1);
        write(hex(byte(p^)),' ');
        inc(p,1);
      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
        get(p,1);
        write(hex(byte(p^)),' ');
        inc(p);
      end;
    rtw:  {16-битный адрес возврата}
      begin
        write(hex2(word(swap2(get(p,2),0)^)),' ');
        inc(p,2);
      end;
    wide:
      begin
        write(' _ ');
        disasm;
        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_attribute_info;
var
  offs,start :^byte;
  n : integer;
begin
.....
(Offline)
 
Ответить с цитированием