Знающий
Регистрация: 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
.....
|