Показать сообщение отдельно
Старый 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)