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

добавил структуру и алгоритм вычисления и постороения переходов с использованием меток, теперь pascal-компилятору практически ни чего не нужно знать о командах java-assembler'а, не вести пересчет смещений и т.д.

вот структура для организации переходов:
_______
const
maxlab=1024*5; {кол-во ячеек для сохранения}
typemp=0; {пустой элемент таблицы}
typlab=1; {метка}
typmod2=2; {элемент коррекции 2-х байтового смещения}
typmod4=2; {элемент коррекции 4-х байтового смещения}
var
lab:array[0..maxlab] of record
typ:byte; {тип элемента}
name:string[6]; {название метки}
adr:word; {адрес в коде}
end;
lmax:integer; {кол-во элементов}
_______
логика работы:
метка выглядит так ":имя"
в командах перехода если следующий символ не число, то прочитать имя метки и получить смещение к ней. Если метка еще не добавлена (т.е. переход вперед), то записать элемет как элемент_коррекции.
В завершении метода просматриваем таблицу меток и правим элементы_коррекции на смещение к нужным меткам.
Если метка не найдена, то генерировать ошибку.
__
т.к. размер таблицы переходов ограничен, то рекомендую сделать в pascal'e генератор имён_меток так:
метка - число, конвертируется в текст только при сохранении в выходной файл например так write(':l'+hex2(label)+' '); где label:integer - инкриментируемое число.
Т.к. таблица перехода в ассемблере имеет ограниченный размер, то:
в подпрограмме генерации метки сохраняем номер строки предыдущей метки oldStrNum, а при создании новой:
if currentStrNum<>oldStrNum then
begin
inc(label);
oldStrNum:=currentStrNum;
end;
т.е. не создаем лишних меток...
(Offline)
 
Ответить с цитированием