Извините, ничего не найдено.

Не расстраивайся! Лучше выпей чайку!
Регистрация
Справка
Календарь

Вернуться   forum.boolean.name > Программирование игр для мобильных телефонов > MidletPascal > Основной форум

Основной форум Сюда все проблемы связанные с программированием.

Ответ
 
Опции темы
Старый 30.09.2008, 01:22   #61
satan
Нуждающийся
 
Регистрация: 10.02.2007
Сообщений: 99
Написано 18 полезных сообщений
(для 28 пользователей)
Re: создание MIDletPascal compiler'a

Мля... полна жпа!!!!!!!!!

Пошол в сортир, втыкаю в распечатаный код, прогоняю помалень, вкуриваю...
И тут... Асенило...
Ептель, ты мутишь не токма дизассемблер, но и декомпилер в одном флаконе,
и как тока прогоняю тему все становица на свои места!
Ё... Ты так в следучий раз не шути, луче сразу колись шо ишо задумал, гы...
Если ишо и деобфускатор, ваще попец полный!!!
Ну да ладно, хоть ща догнал тему.

Вопрос на засыпку:
Скока ишо народу понимает суть дела, и ваще хто ишо тута тусу тусуит???

__________________________________________________ _____________________
satan, призываю общаться на нормальном литературном русском языке и не флудить!

Последний раз редактировалось ViNT, 30.09.2008 в 17:01.
(Offline)
 
Ответить с цитированием
Старый 30.09.2008, 19:20   #62
abcdef
Знающий
 
Регистрация: 16.09.2008
Сообщений: 299
Написано 71 полезных сообщений
(для 123 пользователей)
Ответ: создание MIDletPascal compiler'a

на данный момент главное - это распознать все byte-code коменды и их особенности, потому что ассемблер должен понимать обрабатывать их все. Но для компилятора языка паскаль хватит не более 30-ти штук..

что-то затянулась у нас стадия разбора команд. Участие в экспериментах пока принимать не могу (попросту нет времени). Когда все будет готово ассемблер можно будет создать за 2-а вечера.

Насчет профилировщика ты правильно понял satan. Но сейчас нужно получить полностью разбор всех java-команд..
желаю удачи - у тебя хороший багаж знаний!
(Offline)
 
Ответить с цитированием
Старый 30.09.2008, 23:04   #63
satan
Нуждающийся
 
Регистрация: 10.02.2007
Сообщений: 99
Написано 18 полезных сообщений
(для 28 пользователей)
Re: создание MIDletPascal compiler'a

Вопщем ассемблер там простой... Работает со стеком,
все мнемокоды вида MNEMO OP1 OP2 - где MNEMO - мнемокод а OP1 OP2 первый и второй оператор (иногда их 10-14)
OP1 OP2 - байткод который идет сразу за мнемокодом комманды он может быть адресом переменной в константном пуле или адресом перехода или переменной типа WORD
Стек заполняецо сверху в низ и при исполнении команды результат заменяет операнды в стеке на себя
Пример

15+25

bipush 15 - грузим число 15 в стек
bipush 25 - грузим число 25 в стек
iadd - складываем числа в стеке и результат помещаем в верх стека тоесть щас у нас в верху стека число 40 Тоесть все настолько просто, что осталось лишь сказать спасибо ребятам с Java Sun!

class calc{
public static void main(String [] args){
int a,i;
i=1240;
a=i+20;
}
}

Смотрим на код. У нас две переменные, одной из них присваевается ответ. Смотрим код

0000h 11 04 D8 sipush 04D8h
0003h 3D istore_2
0004h 1C iload_2
0005h 10 14 bipush 14h
0007h 60 iadd
0008h 3C istore_1
0009h B1 return

Начало кода ПОЛЮБАС оператор, значение 11 – это
sipush
Загрузка в стек двухбайтового целого со знаком ,оператор двух байтовый значит следущие два байта – значение переменной
04D8h или 1240
Далее 3D
istore_<n>
Сохранение целого в локальной переменной
Тоесть грузим 1024 в i
Ну и тд. Тп.

Компиляцию я показывал сверху, проводица она рекурсией причом очень простенькой

Последний раз редактировалось satan, 01.10.2008 в 00:00.
(Offline)
 
Ответить с цитированием
Старый 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)
 
Ответить с цитированием
Старый 03.10.2008, 20:29   #65
abcdef
Знающий
 
Регистрация: 16.09.2008
Сообщений: 299
Написано 71 полезных сообщений
(для 123 пользователей)
Ответ: создание MIDletPascal compiler'a

satan как успехи? наш раздел по посещаемости такими темпами скоро будет бить рекорды - всем интересно...

жаль если не получим готорого продукта, а именно публичные исходники простого Pascal byte-code компилятора.

Мне итак приходиться выкладывать сырые исходники, как говориться - только из под пера... чтобы не уводить разработку компилятора не потому пути..
на данный момент времени на эксперименты мало, сейчас главное получить полностью работающий java-asm компилятор и попутно разобраться в сложных командах языка java, поэтому в исходниках так много комментариев напротив java-комманд.
______
нужно сделать разбор таблицы локальных переменных и таблицу обработчика исключений, поиграться с byte-code командами и том, что не написанно в документации
(Offline)
 
Ответить с цитированием
Старый 04.10.2008, 00:56   #66
satan
Нуждающийся
 
Регистрация: 10.02.2007
Сообщений: 99
Написано 18 полезных сообщений
(для 28 пользователей)
Re: создание MIDletPascal compiler'a

Я корочь ужо составляю BNF (вернее лекс организовал), тута тормоза в том, что хочу извратицо и сделать совместимость не токма с oPascal но и с Delphi, ну тоесть что бы прога работала и на том и на том.

Кстати сложного с Java командами в принципе никаких, вот только синтаксис не знаю какой, классику или ООП выбрать. Мне ООП больше прикалывает, хотя и класика тож ничо.

Пилгрим - если не трудно закинь в оркестр инфу о том как в Мидлетах ООП организовываеца! Типа простенький пример инклюда объектов. Так то структуру я понимаю, а вот как инклюдить это???

ЗЫ... Ча ребят чутка потерпите, я проект один добью...

Первый компилер с поддержкой рус яз... мля... перспективы...

Причом по ходу, что бы была полная поддержка Java вырисовывается следующаа схема
Pascal->Java (*.pas->*.java транслятор) это очень легко
Java -> Class (*.java->*.class) посложнее...
Причом пример соответствия
Program LaLaLa; -> Class LaLaLa
begin - end; соответственно {}
procedure AnaHono
; -> public static void
AnaHono()

И самый прикол, что можно сделать классически, тоесть на Pas написать пару библиотек
и включить поддержку INLINE, тогда функции приобретут клёвый вид

Program HelloWord; -> class HelloWorld

uses
System; -> подключим нашу библиотеку
.....

begin -> {
writeln
(
'Hello World!');
end
; -> }

Где в модуле System оформим фукцию

procedure writeln(S: String); -> public static void writeln(String [] args)
begin -> {
inline
System.out.println(S); // Вставиться без изменения
end;
end; -> }

Короче это тока наметки но в итоге получца шойта вроде

class HelloWorld{
    public static void main(){
        writeln("Hello World!");
    }
    public static void writeln(String [] args){
        System.out.println("Hello World!");
    }
}
Тут не правильно ничего, но не в этом дело...

Другой метод, сразу переводить в байт код, тоесть делать на прямую компилятор Pascal - VM ByteCode
но тогда мы не сможем подключать библиотеки написанные на Java или придеца извращатся как с МП!!!

Последний раз редактировалось satan, 04.10.2008 в 02:45.
(Offline)
 
Ответить с цитированием
Старый 04.10.2008, 19:24   #67
abcdef
Знающий
 
Регистрация: 16.09.2008
Сообщений: 299
Написано 71 полезных сообщений
(для 123 пользователей)
Ответ: создание MIDletPascal compiler'a

satan, все можно сделать гораздо проще, об этом говорил еще в начале:
делаем файл, на каждой строке в котором будет полное название класса, метода и его параметры. При компиляции в байт-код будет искаться метод и проверятся параметры. т.о. можно напрямую вызывать java, будет еще список сопоставлений где команде языка Pascal ставится аналогичный Java-метод.

этап Pascal->byte-code будет создавать список констант и асм-код, который обращается к ним

по поводу организации ООП в java все завязано на подмене индекса класса на наш, в котором мы что-нить меняем
(Offline)
 
Ответить с цитированием
Старый 05.10.2008, 12:03   #68
satan
Нуждающийся
 
Регистрация: 10.02.2007
Сообщений: 99
Написано 18 полезных сообщений
(для 28 пользователей)
Re: создание MIDletPascal compiler'a

Вот накатал сканер, пригодица для дальнейшей работы...

ЗЫ...

Исправил косяки...
Вложения
Тип файла: zip Compiler.zip (2.4 Кб, 418 просмотров)

Последний раз редактировалось satan, 05.10.2008 в 16:12.
(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
abcdef (05.10.2008)
Старый 05.10.2008, 17:11   #69
satan
Нуждающийся
 
Регистрация: 10.02.2007
Сообщений: 99
Написано 18 полезных сообщений
(для 28 пользователей)
Re: создание MIDletPascal compiler'a

Пора на форум ставить капчу и подтверждалку администрацией! А то уже спамеры виагру толкать начали!!!
(Offline)
 
Ответить с цитированием
Старый 14.10.2008, 00:17   #70
satan
Нуждающийся
 
Регистрация: 10.02.2007
Сообщений: 99
Написано 18 полезных сообщений
(для 28 пользователей)
Re: создание MIDletPascal compiler'a

Народ видю заскучал...
Забрасываю начальный парсер...
Парсит строки вида 1+22- 44.5678 / 44*2.345
тоесть пока без кавычек. Сканер сдвинул в отдельный модуль, кто хочет может его дорабатывать на свое усмотрение
Вложения
Тип файла: zip Scaner.zip (3.2 Кб, 404 просмотров)
(Offline)
 
Ответить с цитированием
Старый 15.10.2008, 19:25   #71
abcdef
Знающий
 
Регистрация: 16.09.2008
Сообщений: 299
Написано 71 полезных сообщений
(для 123 пользователей)
Ответ: создание MIDletPascal compiler'a

выбрал свободное время доработал java-decompiler, сделан в TurboPacsal7.1.
правда остались сомнения насчет разбора tableswitch и lookupswitch; также необходимо сделать разбор структуры StackMap.
файл JD.ZIP (исходник, exe, пример_использования)

файл JCC.ZIP - наброски java class-assembler
после декомпиляции примера из архива JD.ZIP получаем структуру для ассемблируемых файлов, т.е. примерно так будет выглядеть файл для перевода в class-файл JCC.ZIP/j.txt

cделал наброски общей структуры разбора и работы с константами, теперь нужно проработать формирование блока METHOD...

исходники java-asseblera написанные на java (3.1 M можно посмотреть по адресу: http://sourceforge.net/project/showf...ease_id=438525
home page: http://jasmin.sourceforge.net/

и еще: http://sourceforge.net/project/showf...ease_id=391215
home page: http://sourceforge.net/projects/tinapoc

оттуда можно подсмотреть реализацию некоторых алгоритмов, но делать как там мы не будем.. слишком раздуто.. наш ассеблер будет не хуже, но проще
_____
p.s. народ не стесняемся,.. подключаемся к проекту..
Вложения
Тип файла: zip JD.ZIP (22.5 Кб, 415 просмотров)
Тип файла: zip JCC.ZIP (4.2 Кб, 415 просмотров)
(Offline)
 
Ответить с цитированием
Старый 23.10.2008, 18:35   #72
abcdef
Знающий
 
Регистрация: 16.09.2008
Сообщений: 299
Написано 71 полезных сообщений
(для 123 пользователей)
Ответ: создание MIDletPascal compiler'a

вот, усиленно посидел пару-тройку вечеров и родил java-assembler
полностью разбирает и компилирует в hello.class
собранный нами дизассемблер разбирает его, а вот NMI's Java Code Viewer 6.0 не хочет, и соответственно не хочет запускаться в эмуляторе.
Возможно это из-за того что забита нулями какая-нибудь служебная переменная или не хватает еще дополнительных констант в заголовке...

что не сделано, так это генерирование StackMap - структуры..

___
в архиве так же лежит доработанный java-decompiler (перекомпилирован с дерективами проверки переменных и кое-где изменен алгоритм)
т.к. компилятор TurboPascal7.1 то длина UTF8 - строчек в разбираемых классах не должна превышать 255 символов, чтобы снять это ограничение нужно перекомпилировать в Delphi

___
p.s. satan поэкспериментируй с assembler'ом, нужно немножко поправить...
Вложения
Тип файла: zip java.zip (45.3 Кб, 410 просмотров)
(Offline)
 
Ответить с цитированием
Старый 24.10.2008, 13:32   #73
Phantom
Элита
 
Аватар для Phantom
 
Регистрация: 14.06.2008
Адрес: Украина, Киев
Сообщений: 2,273
Написано 754 полезных сообщений
(для 1,833 пользователей)
Ответ: создание MIDletPascal compiler'a

Ыыыы... А я немного въехал в тему. Хотя по-началу нифига не понял, потом стал сам классы расковыривать. За утро нашёл там всякие закономерности, байты по группам разложил. Но толком не мог понять, какой байт что значит. Только разобрался со строками. Потом зашёл снова в эту тему и резко многое понял. Я ща прямо фигею, как я всё в кассе по группам разделил, как у меня ума хватило, гг. Ну так вот. Я целей глобальных не ставлю. Мне всего лишь надо генерировать класс, в котором будет массив объявляться со значениями. На php. Короче, надо, чтобы сервер кое-чего в java проге менял. Просто сервер будет генерировать класс с объявленным массивом и запаковывать его в архив с прогой. А в проге уже другие классы, которые будут брать значение массива из того класса. Ах да, ещё нужно будет генерировать имена методов. Думаю, смогу это сделать. Всем спасибо за тему =)
(Offline)
 
Ответить с цитированием
Старый 24.10.2008, 19:22   #74
satan
Нуждающийся
 
Регистрация: 10.02.2007
Сообщений: 99
Написано 18 полезных сообщений
(для 28 пользователей)
Re: создание MIDletPascal compiler'a

Phantom_wc
Могу подкинуть на PHP создание экзешника, а там уже сам переделаешь в Java Class

ЗЫ...

Ща прорабатываю оптимизированый компилер (на expression уровне)

Последний раз редактировалось satan, 24.10.2008 в 19:28.
(Offline)
 
Ответить с цитированием
Старый 24.10.2008, 19:33   #75
Phantom
Элита
 
Аватар для Phantom
 
Регистрация: 14.06.2008
Адрес: Украина, Киев
Сообщений: 2,273
Написано 754 полезных сообщений
(для 1,833 пользователей)
Ответ: создание MIDletPascal compiler'a

satan, давай, буду признателен. Надеюсь пригодится. Только вопрос, несколько тупой... Что такое "экзешник"? гг
(Offline)
 
Ответить с цитированием
Ответ


Опции темы

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Скачать MidletPascal smesh Прочие вопросы 14 30.06.2011 15:57
создание MIDletPascal obfuscator abcdef Основной форум 7 22.12.2008 23:27
Русификатор MIDletPascal Тренсфер Прочие вопросы 14 26.07.2008 04:00
MidletPascal. Что это. Данил MidletPascal 12 23.10.2007 05:27


Часовой пояс GMT +4, время: 16:19.


vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot
Style crйe par Allan - vBulletin-Ressources.com