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

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

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

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

Ответ
 
Опции темы
Старый 22.09.2008, 11:01   #16
abcdef
Знающий
 
Регистрация: 16.09.2008
Сообщений: 299
Написано 71 полезных сообщений
(для 123 пользователей)
Ответ: создание MIDletPascal compiler'a

спасибо! это уже что-то, хотя решение не простое, и нужно ставить java.
буду смотреть...
при беглом просмотре скачанных файлов меня заинтересовали исходники, т.е. *.class-файлы из каталога pascal.zip/pascal/pas3/mhc/compiler/

P.S. можно конечно сделать конвертирощик из pascal-исходника в java-исходник, но идея состоит именно в получении готового *.class-файла без дополнительных утилит и программ
(Offline)
 
Ответить с цитированием
Старый 22.09.2008, 17:32   #17
satan
Нуждающийся
 
Регистрация: 10.02.2007
Сообщений: 99
Написано 18 полезных сообщений
(для 28 пользователей)
Re: создание MIDletPascal compiler'a

Тогда вот пример создания PE файла, расписана почти вся структура, короче прилепить суда тока Синт. и Лексич. анализаторы и готов компилер в exe.
http://sharing.ho.com.ua/freeide/test.zip бинарный файл (5.45кб)
Ща поднимаю форматы class файлов, но по памяти там вроде все в массивы запихнуто, типа

0х00 Массив структур
0х20 Массив классов
.........................

Помню что там чота оч простое.

Потом хорошоб достать Java декомпилер (ща пробую исходники достать)

А вообще надо с автором MP насчет исходников как то связаца.

http://www.uni-vologda.ac.ru/java/jvm/outline.htm
На русском и формат CLASS и спецификация...

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

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

Ну да... просто я к тому, что в принципе база для создания всего что нужно уже есть, причом CLASS файлы луче создавать именно массивом а не структурами, так как это работает в несколько сот раз быстрее... Гы...

Ну чо, изучаем тогда.... помалень...
(Offline)
 
Ответить с цитированием
Старый 23.09.2008, 07:47   #20
Piligrim
Оптимист
 
Регистрация: 07.01.2006
Сообщений: 961
Написано 105 полезных сообщений
(для 259 пользователей)
Ответ: создание MIDletPascal compiler'a

Товарищ которому авторы МР отдали исходники как в воду канул. Не появляется на форуме и на личку не отвечает.
(Offline)
 
Ответить с цитированием
Старый 23.09.2008, 09:09   #21
abcdef
Знающий
 
Регистрация: 16.09.2008
Сообщений: 299
Написано 71 полезных сообщений
(для 123 пользователей)
Ответ: создание MIDletPascal compiler'a

Если товарищ хотел непомню сколько $ за регистрацию,.. то врятли отдаст исходники, даже за зеленые...
(Offline)
 
Ответить с цитированием
Старый 23.09.2008, 11:23   #22
Piligrim
Оптимист
 
Регистрация: 07.01.2006
Сообщений: 961
Написано 105 полезных сообщений
(для 259 пользователей)
Ответ: создание MIDletPascal compiler'a

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

Пора видать мне на форуме отписать все что я о пиндосах думаю... Но ет лирика

Короче дуем для начала на http://www.febooti.com/products/file...rs/hex-editor/ там много всего вкусного, но нам нужен HEX editor (он прям в свойства прописывается и данные копируюца в текстовом формате)

Итак чо я посмотрел и проверил... Значицо для начала компильнул класс типа

class HelloWorld{
public static void main(String [] args){
System.out.println("Hello World!");
}
}

с помощью jikes.exe и получил байткод

CA FE BA BE 00 00 00 30 00 1D
01 00 0A 48 65 6C 6C 6F 57 6F
72 6C 64 07 00 01 01 00 10 6A
61 76 61 2F 6C 61 6E 67 2F 4F
62 6A 65 63 74 07 00 03 01 00
04 6D 61 69 6E 01 00 16 28 5B
...................................

весь не привожу сами увидите, ну что открываем спецификацию и пробуем разобраться

ClassFile {
u4 magic;
u2 minor_version;
u2 major_version;
u2 constant_pool_count;
...........................

Разбиваем наш БК как я понял u2..u4 это кол-во байт, и согласно этому получаем

CA FE BA BE // MAGIC - магическое число u4(4 байта)
00 00 // Minor version - младшая версия Java
u2(2 байта)
00 30 // Major version - старшая версия Java
u2(2 байта)
00 1D //
Constant_pool_count u2(2байта)
....................................

Так вот ребята, у кого старшая версия компилера (4.5) проверте мое предположение насчот u1..u2..u4 типов, если я прав, то тогда попробую расписать полностью формат CLASS файла по смещениям, потом попробуем в ручную создать, прям в байт-коде простенькое приложение, и если получица, будем хренарить уже компилер...

ЗЫ...
Магическое число прикольное - Кафе бабе, прям как у нас Кабак и Бабы :D

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

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

сразу говорю что не все команды будут использоваться... многие из них это упрощенные константные команды

начинать надобы с простенького ассеблера, на мой взгляд лучше сделать два массива (или области памяти), 1-для записи структур заголовка, 2-й - для записи байт-кода... а еще лучше под каждую структуру заголовка отдельный массив... т.к. компилятор однопроходный, а при разборе текста программы будут добавляться новые вызываемые методы, т.е. заголовок будет расти... после компиляции заголовок а затем код сбрасываются в файл
_________
add = 0; { opcodes }
neg = 1;
mul = 2;
divd = 3;
remd = 4;
div2 = 5;
rem2 = 6;
eqli = 7;
neqi = 8;
lssi = 9;
leqi = 10;
gtri = 11;
geqi = 12;
dupl = 13;
swap = 14;
andb = 15;
orb = 16;
load = 17;
stor = 18;
hlt = 19; { terminate program }
stop = 20; { end of code }
wri = 21;
wrc = 22;
wrl = 23;
rdi = 24;
rdc = 25;
rdl = 26;
eofi = 27; { check eof }
eol = 28;
ldc = 29;
lda = 30; { load address }
ldla = 31;
ldl = 32;
ldg = 33;
stl = 34;
stg = 35;
move = 36;
copy = 37;
addc = 38;
mulc = 39;
jump = 40;
jumpz = 41;
call = 42;
adjs = 43;
sets = 44;
exit = 45;
---------------------
aconst_null = 1; //Загрузка в стек null ( пустой ссылки на объект)
iconst_m1 = 2; //Загрузка целочисленной константы -1
iconst_0 = 3; //Загрузка целочисленной константы 0
iconst_1 = 4; //Загрузка целочисленной константы 1
iconst_2 = 5; //Загрузка целочисленной константы 2
iconst_3 = 6; //Загрузка целочисленной константы 3
iconst_4 = 7; //Загрузка целочисленной константы 4
iconst_5 = 8; //Загрузка целочисленной константы 5
lconst_0 = 9; //Загрузка длинной целочисленной константы 0
lconst_1 = 10; //Загрузка длинной целочисленной константы 1
fconst_0 = 11; //Загрузка вещественного числа одинарной точности 0
fconst_1 = 12; //Загрузка вещественного числа одинарной точности 1
fconst_2 = 13; //Загрузка вещественного числа одинарной точности 2
dconst_0 = 14; //Загрузка вещественного числа двойной точности 0
dconst_1 = 15; //Загрузка вещественного числа двойной точности 1
bipush = 16; //1,Загрузка в стек однобайтового целого со знаком
sipush = 17; //2,Загрузка в стек двухбайтового целого со знаком
ldc1 = 18; //1,Загрузка в стек элемента из константного пула
ldc2 = 19; //2,Загрузка в стек элемента из константного пула
ldc2w = 20; //2,Загрузка в стек длинного целого или двойного вещественного значения из константного пула
iload = 21; //1,Загрузка целого из локальной переменной
lload = 22; //1,Загрузка длинного целого из локальной переменной
iload_0 = 26; //Загрузка целого из локальной переменной 0
iload_1 = 27; //Загрузка целого из локальной переменной 1
iload_2 = 28; //Загрузка целого из локальной переменной 2
iload_3 = 29; //Загрузка целого из локальной переменной 3
lload_0 = 30; //Загрузка длинного целого из локальной переменной 0
lload_1 = 31; //Загрузка длинного целого из локальной переменной 1
lload_2 = 32; //Загрузка длинного целого из локальной переменной 2
lload_3 = 33; //Загрузка длинного целого из локальной переменной 3
fload = 23; //1,Загрузка вещественного одинарной точности из локальной переменной
fload_0 = 34; //Загрузка вещественного одинарной точности из локальной переменной 0
fload_1 = 35; //Загрузка вещественного одинарной точности из локальной переменной 1
fload_2 = 36; //Загрузка вещественного одинарной точности из локальной переменной 2
fload_3 = 37; //Загрузка вещественного одинарной точности из локальной переменной 3
dload = 24; //1,Загрузка вещественного двойной точности из локальной переменной
dload_0 = 38; //Загрузка вещественного двойной точности из локальной переменной 0
dload_1 = 39; //Загрузка вещественного двойной точности из локальной переменной 1
dload_2 = 40; //Загрузка вещественного двойной точности из локальной переменной 2
dload_3 = 41; //Загрузка вещественного двойной точности из локальной переменной 3
aload = 25; //1,Загрузка объектной ссылки из локальной переменной
aload_0 = 42; //Загрузка объектной ссылки из локальной переменной 0
aload_1 = 43; //Загрузка объектной ссылки из локальной переменной 1
aload_2 = 44; //Загрузка объектной ссылки из локальной переменной 2
aload_3 = 45; //Загрузка объектной ссылки из локальной переменной 3
istore = 54; //1,Сохранение целого значения в локальной переменной
istore_0 = 59; //Сохранение целого в локальной переменной 0
istore_1 = 60; //Сохранение целого в локальной переменной 1
istore_2 = 61; //Сохранение целого в локальной переменной 2
istore_3 = 62; //Сохранение целого в локальной переменной 3
lstore = 55; //1,Сохранение длинного целого в локальной переменной
lstore_0 = 63; //Сохранение длинного целого в локальной переменной 0
lstore_1 = 64; //Сохранение длинного целого в локальной переменной 1
lstore_2 = 65; //Сохранение длинного целого в локальной переменной 2
lstore_3 = 66; //Сохранение длинного целого в локальной переменной 3
fstore = 56; //1,Сохранение вещественного одинарной точности в локальной переменной
fstore_0 = 67; //Сохранение вещественного одинарной точности в локальной переменной 0
fstore_1 = 68; //Сохранение вещественного одинарной точности в локальной переменной 1
fstore_2 = 69; //Сохранение вещественного одинарной точности в локальной переменной 2
fstore_3 = 70; //Сохранение вещественного одинарной точности в локальной переменной 3
dstore = 57; //1,Сохранение двойного вещественного в локальной переменной
dstore_0 = 71; //Сохранение двойного вещественного в локальной переменной 0
dstore_1 = 72; //Сохранение двойного вещественного в локальной переменной 1
dstore_2 = 73; //Сохранение двойного вещественного в локальной переменной 2
dstore_3 = 74; //Сохранение двойного вещественного в локальной переменной 3
astore = 58; //1,Сохранение объектной ссылки в локальной переменной
astore_0 = 75; //Сохранение объектной ссылки в локальной переменной 0
astore_1 = 76; //Сохранение объектной ссылки в локальной переменной 1
astore_2 = 77; //Сохранение объектной ссылки в локальной переменной 2
astore_3 = 78; //Сохранение объектной ссылки в локальной переменной 3
iinc = 132; //2,Увеличение локальной переменной на константу
wide = 196; //1,Расширенный индекс для доступа к локальным переменным для команд загрузки, сохранения и приращения
newarray = 188; //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
anewarray = 189; //2,Объявление нового массива из ссылок на объекты
multianewarray = 197; //2,Размещение нового многомерного массива
arraylength = 190; //Возвращает длину массива
iaload = 46; //Загрузка целого из массива
laload = 47; //Загрузка длинного целого из массива
faload = 48; //Загрузка вещественного из массива
daload = 49; //Загрузка двойного вещественного из массива
aaload = 50; //Загрузка объектной ссылки из массива
baload = 51; //Загрузка байта со знаком из массива
caload = 52; //Загрузка символа из массива
saload = 53; //Загрузка короткого из массива
iastore = 79; //Сохранение в целочисленном массиве
lastore = 80; //Сохранение в массиве из длинных целых
fastore = 81; //Сохранение в массиве из одинарных вещественных
dastore = 82; //Сохранение в массиве из двойных вещественных
aastore = 83; //Сохранение в массиве из объектных ссылок
bastore = 84; //Сохранение в массиве байтов со знаком
castore = 85; //Сохранение в символьном массиве
sastore = 86; //Сохранение в массиве из коротких целых
nop = 0; //Ничего не делает
pop = 87; //Извлечение слова с вершины стека
pop2 = 88; //Извлечение двух слов с вершины стека
dup = 89; //Дублирование слова на вершине стека
dup2 = 92; //Дублирование двух слов на вершине стека
dup_x1 = 90; //Дублирование слово на вершине стека и помещение копии в стек на два слова ниже
dup2_x1 = 93; //Дублирование двух слов на вершине стека и помещение копий на два слова ниже
dup_x2 = 91; //Дублирование вершины стека и помещение копии на три слова ниже
dup2_x2 = 94; //Дублирование двух слов на вершине стека и помещение копий на три слова ниже
swap = 95; //Обмен двух слов на вершине стека
iadd = 96; //Сложение целых
ladd = 97; //Сложение длинных целых
fadd = 98; //Сложение одинарных вещественных
dadd = 99; //Сложение двойных вещественных
isub = 100; //Вычитание целых
lsub = 101; //Вычитание длинных целых
fsub = 102; //Вычитание одинарных вещественных
dsub = 103; //Вычитание двойных вещественных
imul = 104; //Умножение целых
lmul = 105; //Умножение длинных целых
fmul = 106; //Умножение одинарных вещественных
dmul = 107; //Умножение двойных вещественных
idiv = 108; //Деление целых
ldiv = 109; //Деление длинных целых
fdiv = 110; //Деление одинарных вещественных
ddiv = 111; //Деление двойных вещественных
irem = 112; //Остаток от деления целых
lrem = 113; //Остаток от деления длинных целых
frem = 114; //Остаток от деления одинарных вещественных
drem = 115; //Остаток от деления двойных вещественных
ineg = 116; //Отрицание целого
leg = 117; //Отрицание длинного целого
fneg = 118; //Отрицание одинарного вещественного
dneg = 119; //Отрицание двойного вещественного числа
ishl = 120; //Сдвиг целого влево
ishr = 122; //Арифметический сдвиг целого вправо
iushr = 124; //Логический сдвиг целого вправо
lshl = 121; //Сдвиг длинного целого влево
lshr = 123; //Арифметический сдвиг длинного целого вправо
lushr = 125; //Логический сдвиг длинного целого вправо
iand = 126; //Логическое И с операндами целого типа
land = 127; //Логическое И с операндами длинного целого типа
ior = 128; //Логическое ИЛИ с целочисленными операндами
lor = 129; //Логическое ИЛИ с операндами длинного целого типа
ixor = 130; //Исключающее ИЛИ с целочисленными операндами
lxor = 131; //Исключающее ИЛИ с операндами длинного целого типа
i2l = 133; //Преобразование целого в длинное целое
i2f = 134; //Целое в вещественное
i2d = 135; //Целое в двойное вещественное
l2i = 136; //Длинное целое в целое
l2f = 137; //Длинное целое в вещественное
l2d = 138; //Длинное целое в двойное вещественное
f2i = 139; //Вещественное в целое
f2l = 140; //Вещественное в длинное целое
f2d = 141; //Вещественное в двойное вещественное
d2i = 142; //Двойное вещественное в целое
d2l = 143; //Двойное вещественное в длинное целое
d2f = 144; //Двойное вещественное в вещественное
int2byte = 145; //Целое в знаковый байт
int2char = 146; //Целое в символ
int2short = 147; //Целое в короткое
ifeq = 153; //2,Переход, если равно 0
ifnull = 198; //2,Переход, если пустой указатель
iflt = 155; //2,Переход, если меньше 0
ifle = 158; //2,Переход, если меньше или равно 0
ifne = 154; //2,Переход, если не равно 0
ifnonnull = 199; //2,Переход, если не пустой указатель
ifgt = 157; //2,Переход, если больше 0
ifge = 156; //2,Переход, если больше или равно 0
if_icmpeq = 159; //2,Переход, если целые равны
if_icmpne = 160; //2,Переход, если целые не равны
if_icmplt = 161; //2,Переход, если целое меньше 0
if_icmpgt = 163; //2,Переход, если целое больше 0
if_icmple = 164; //2,Переход, если целое меньше или равно
if_icmpge = 162; //2,Переход, если целое больше или равно
lcmp = 148; //Сравнение длинных целых
fcmpl = 149; //Сравнение вещественных одинарной точности (-1 при NaN)
fcmpg = 150; //Сравнение вещественных одинарной точности (1 при NaN)
dcmpl = 151; //Сравнение вещественных двойной точности(-1 при NaN)
dcmpg = 152; //Сравнение вещественных двойной точности(1 при NaN)
if_acmpeq = 165; //2,Переход, если ссылки на объект равны
if_acmpne = 166; //2,Переход, если ссылки на объект не равны
goto = 167; //2,Переход на
goto_w = 200; //4,Переход на (расширенный индекс)
jsr = 168; //2,Переход на подпрограмму
jsr_w = 201; //4,Переход на подпрограмму (расширенный индекс)
ret = 169; //1,Возврат из подпрограммы
ret_w = 209; //2,Возврат из подпрограммы (расширенный индекс)
ireturn = 172; //Возврат целого значения функции
lreturn = 173; //Возврат длинного целого значения функции
freturn = 174; //Возврат одинарного вещественного значения функции
dreturn = 175; //Возврат двойного вещественного значения функции
areturn = 176; //Возврат объектной ссылки из функции
return = 177; //Возврат(опустошающий) из процедуры
breakpoint = 202; //Остановка и передача контроля обработчику прерываний
tableswitch = 170; //Доступ к таблице перехода по индексу и переход
lookupswitch = 171; //Доступ к таблице перехода по сравнению с ключом и переход
putfield = 181; //2,Установка поля в объекте
getfield = 180; //2,Перенос поля из объекта
putstatic = 179; //2,Установка статического поля в классе
getstatic = 178; //2,Получение статического поля класса
invokevirtual = 182; //2,Вызывает метод экземпляра, основываясь на типе времени выполнения
invokenonvirtual = 183; //2,Вызывает метод экземпляра, основываясь на не виртуальном типе
invokestatic = 184; //2,Вызов метода класса (статического метода)
invokeinterface = 185; //4,Вызывает метод интерфейса
athrow = 191; //Генерация обработки или ошибки
new = 187; //2,Создает новый объект
checkcast = 192; //2,Проверяет, что объект имеет данный тип
instanceof = 193; //2,Определяет, имеет ли объект данный тип
monitorenter = 194; //Вход в контролируемую область кода
monitorexit = 195; //Выход из контролируемой области кода
(Offline)
 
Ответить с цитированием
Эти 2 пользователя(ей) сказали Спасибо abcdef за это полезное сообщение:
satan (27.09.2008), Tadeus (23.09.2008)
Старый 23.09.2008, 20:49   #25
satan
Нуждающийся
 
Регистрация: 10.02.2007
Сообщений: 99
Написано 18 полезных сообщений
(для 28 пользователей)
Re: создание MIDletPascal compiler'a

Ну ты монстрище... Мля, зачот, не знаю прада как тут плюсы ставить, да и хрен с ними... Потом обставимся...
Такис, ча займусь токда переводом примера верхнего на нормальный язык.
А насчот массивов - то да, структуры можн писать write() но медленно работает, токда как BlockWrite() и массивы помойму в 10 000 раз быстрее, тем боле что сам dcc32.exe на С++ написан, а все что написано на Си по определению луче на массивы перевести. Здорово оно с ними работает.
Кста можно извратица в Delphi и сделать чота типа типизированых массивов, шоб голову не ломать с типами данных, определить тип вроде _head,_cpool...
а потом просто обращатся к ним напрямую, Header[_head][$0] = $CA
извратица б ишо как нить так Header[_head][0..3] := ([$0,$1,$2,$3]);
Ну да ето просто вопрос техники...
(Offline)
 
Ответить с цитированием
Старый 24.09.2008, 02:36   #26
satan
Нуждающийся
 
Регистрация: 10.02.2007
Сообщений: 99
Написано 18 полезных сообщений
(для 28 пользователей)
Re: создание MIDletPascal compiler'a

Вкуриваем устройство JAVA компилятора!

Итак возьмем наш стандартный файл HelloWord.java и скомпилим его для разбора на косточки.

class
HelloWorld{
public static void main(String [] args){
System.out.println("Hello World!");
}
}

Вот что получается при просмотре в каком нибудь HEXeditor:

CA FE BA BE ------------------------------------ Кюєѕ
00 00
------------------------------------------ ..
00 30
------------------------------------------ .0
00 1D
------------------------------------------ ..
01 00 0A
--------------------------------------- ...
48 65 6C 6C 6F 57 6F 72 6C 64 ------------------ HelloWorld
07 00 01
--------------------------------------- ...
01 00 10
--------------------------------------- ...
6A 61 76 61 2F 6C 61 6E 67 2F 4F 62 6A 65 63 74 -java/lang/Object
07 00 03
--------------------------------------- ...
01 00 04
--------------------------------------- ...
6D 61 69 6E
------------------------------------ main
01 00 16
--------------------------------------- ...
28 5B 4C 6A 61 76 61 2F 6C 61 6E 67 2F 53 74 72
69 6E 67 3B 29 56
------------------------------ ([Ljava/lang/String.)V
01 00 04
--------------------------------------- ...
43 6F 64 65
------------------------------------ Code
01 00 0F
--------------------------------------- ...
4C 69 6E 65 4E 75 6D 62 65 72 54 61 62 6C 65 --- LineNumberTable
01 00 03
--------------------------------------- ...
6F 75 74
--------------------------------------- out
01 00 15
--------------------------------------- ...
4C 6A 61 76 61 2F 69 6F 2F 50 72 69 6E 74 ------ Ljava/io/Print
53 74 72 65 61 6D 3B
--------------------------- Stream;
0C 00 09 00 0A 01 00 10
------------------------ ........
6A 61 76 61 2F 6C 61 6E 67 2F 53 79 73 74 65 6D 20 java/lang/System
..................................................
07 00 0C 09 00 0D 00 0B 01 00 0C 48 65 6C 6C 6F ...........Hello
57 6F 72 6C 64 21 08 00 0F 01 00 07 70 72 69 6E World!......prin
74 6C 6E 01 00 15 28 4C 6A 61 76 61 2F 6C 61 6E tln...(Ljava/lan
67 2F 53 74 72 69 6E 67 3B 29 56 0C 00 11 00 12 g/String)V.....
01 00 13 6A 61 76 61 2F 69 6F 2F 50 72 69 6E 74 ...java/io/Print
53 74 72 65 61 6D 07 00 14 0A 00 15 00 13 01 00 Stream..........
06 3C 69 6E 69 74 3E 01 00 03 28 29 56 0C 00 17 .<init>...()V...
00 18 0A 00 04 00 19 01 00 0A 53 6F 75 72 63 65 ..........Source
46 69 6C 65 01 00 0F 48 65 6C 6C 6F 57 6F 72 6C File...HelloWorl
64 2E 6A 61 76 61 00 20 d.java.
..................................................
00 02 00 04 00 00 00 00 ........
00 02 00 09 00 05 00 06 00 01 00 07 00 00 00 25 ...............%
00 02 00 01 00 00 00 09 B2 00 0E 12 10 B6 00 16 ........І....¶..
B1 00 00 00 01 00 08 00 00 00 0A 00 02 00 00 00 ±...............
03 00 08 00 04 00 00 00 17 00 18 00 01 00 07 00 ................
00 00 21 00 01 00 01 00 00 00 05 2A B7 00 1A B1 ..!........*·..±
00 00 00 01 00 08 00 00 00 0A 00 02 00 00 00 01 ................
00 04 00 01 00 01 00 1B 00 00 00 02 00 1C ..............

Я разделил на секции, что бы было понятнее. Поехали.

Сигнатура CLASS файла.

CA FE BA BE Кюєѕ

Далее идет описание младшей и старшей версии компилятора

00 00 .. // Младшая 0.0
00 30 .0 // Старшая 3.0

Число объектов в описании файла

00 1D ..

Тоесть число всех наших записей в пуле

HelloWorld
java/lang/Object
main
([Ljava/lang/String)V
Code
LineNumberTable

Тут равно 29... нужно проверить на меньшее значение!?

Самое интересное начинается. Описание или КОНСТАНТНЫЙ ПУЛ

По таблице смотрим 1 байт или tag, он равен 01 или в переводе CONSTANT_Utf8, тобиш значит в описании будет срока UTF8, следующие два поля 00 0А говорят нам о количестве элементов пула, то есть по просту размер строки который тут равен 10 или в 16h
01 00 0A ...
Потом идет сама строка
48 65 6C 6C 6F 57 6F 72 6C 64 HelloWorld
Сдесь я ещё не совсем вкурил но по всему, что это CONSTANT_Class
07 00 01
Далее опять описание CONSTANT_Utf8 строки и размер
01 00 10 ...
6A 61 76 61 2F 6C 61 6E 67 2F 4F 62 6A 65 63 74 java/lang/Object

И так далее и тому подобное...Тоесть проще не куда, вот поэтому наверно декомпилировать классы очень легко, но тут возникает проблемка, компилятор придется делать в купе с транслятором PASCAL->JAVA, а затем уже компилировать, можно в принципе и сразу, но писать придется на чистом ООП...

Последний раз редактировалось satan, 24.09.2008 в 02:56.
(Offline)
 
Ответить с цитированием
Старый 24.09.2008, 04:30   #27
satan
Нуждающийся
 
Регистрация: 10.02.2007
Сообщений: 99
Написано 18 полезных сообщений
(для 28 пользователей)
Re: создание MIDletPascal compiler'a

Все братва, разобрался...
Все просто, как и все простое... Гы...
Значит давайте пройдем маленький цикл компиляции в ручную, что бы понять смысл байт-кода.
class
HelloWorld{
public static void main(String [] args){
System.out.println("Hello World!");
}
}
Вообщем, весь процесс сводится к записи двумерного массива примерно так, читаем сверху в низ
class
HelloWorld
HelloWorld– это строка, значит тип UTF8
Array[1][0..0A]=”
HelloWorld48 65 6C 6C 6F 57 6F 72 6C 64
Это класс, значит просто указываем на имя класса
Array[2][0..03]=”
01[0001]->HelloWorld07 00 01
Вызываем стандартные библиотеки Java
Array[3][0..10]=”java/lang/Object
.......

И т.д, тоесть нам надо описать тип новый массива и писать в него
4 поля которые нам нужны, мы всегда знаем, это индекс массива, его длину, его содержимое и его тип, потом этот массив считываем в файл и добавляем асм код стандартных функций Java...

А теперь шо я хотел написать на форуме МП.

Здаров гандоны и пиндосы!
Шож вы паскуды заныкали исходники MP? Вам мля все наверно денег мало? 
Типа считая себя пердячей косточкой вселенной, вы решили, что имеете 
право делать все? Никуя... Уроды вы вонючие... Накуй нам теперь нужен 
ваш ссаный код, мы решили сами написать систему, которая урыкает нах 
вашу паибень, как волк овечку.
Спрашивается, на кой куй постить в форуме такие заявки?
Отвечу, мля за вас – да патаму что вы, как использованный презерватив. 
Ни себе ни людям. Если вы думаете, что таким образом вы поднимете себе 
рейтинг и уважение, то вы прямехонько, с такими мыслями попадаете пальцем 
в попу. Причом хорошо если в свою. Суки вы бл@ продажные, теперь, кокда 
мы разрабатываем систему, пусть тока хоть один инглоязычный пес пернет 
на своем тухлом языке шо нить по поводу объяснения как работает система. 
Не можите поступать по человечиски и к вам будет такой же отношение. 
Я нах все сказал!
  МЛЯ!!!
(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
dimanche13 (24.09.2008)
Старый 24.09.2008, 06:19   #28
odd
Мастер
 
Аватар для odd
 
Регистрация: 06.09.2007
Адрес: Донецк, ДНР
Сообщений: 1,023
Написано 298 полезных сообщений
(для 713 пользователей)
Ответ: создание MIDletPascal compiler'a

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

Это я такой тупой, что ничего не понимаю, или просто из-за того, что только проснулся? О_о
(Offline)
 
Ответить с цитированием
Старый 24.09.2008, 09:24   #30
abcdef
Знающий
 
Регистрация: 16.09.2008
Сообщений: 299
Написано 71 полезных сообщений
(для 123 пользователей)
Ответ: создание MIDletPascal compiler'a

вложенный файл <1.zip> - кусочек из "Canterbury Pascal for J2ME" (компилятора написанного на java).
файл pascal/pas3/mhc/compiler/ClassFile.* дает структуру и некоторые алгоритмы записи.

Анализировать классы буду когда полностью спроектирую удобную структуру представления в delphi, т.е. когда корректно будут загружаться хотябы простейшие class-файлы.

кто хочет поучавствовать в проекте вот декомпилер calss-файлов: Java Code Viewer 6.0. -keyGen внутри архива
(конвертирует из *.class в *.java)
ссылка на скачивание http://www.samsfan.ru/soft/?action=get&openwin=1&id=49

ссылка на страничку http://www.samsfan.ru/soft/?action=view&id=49&parent=7

если есть дельные советы прошу выкладывать кусочки кода, или ссылки для скачки исходников java-виртуальных_машин/ассемблеров/дизассемблеров/и т.д. но в пределах разумного, я каждый байт в инете считаю...

p.s. Давайте не будем ругаться,... потому что:
1. пользуемся чей-то выложенной в инете информацией
2. какой-бы не был MP, на нем другие работают
3. на данный момент у нас нет хоть какого-либо компилятора
Вложения
Тип файла: zip 1.zip (5.7 Кб, 440 просмотров)
(Offline)
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
Piligrim (24.09.2008)
Ответ


Опции темы

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

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, время: 01:12.


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