По просьбам трудящихся, я начал задумываться над декомпиляцией Фортрана; в частности, чтобы понять, что на самом деле умел СИПРОД.
В первую очередь оказалось, что СИПРОД был скомпилирован Фортраном-Дубна, а не Фортраном-ГДР. У нас есть две версии библиотеки, из ИТМ и из
С одной стороны, если компилятор не оптимизирующий, то это должно быть удобнее; например, мне удалось практически с первой попытки вручную декомпилировать одну из самых маленьких процедур, и ассемблерный код выдачи DTRAN сошелся полностью:
FILLS:,NАМЕ,DТRАN /01.04.83/
*SТR*:,LС,27 COMMON /STR/ длиной 27 слов
GАК/2:,ЕQU,*SТR*+24 отдельные переменные в блоке /STR/
GАК/3:,ЕQU,*SТR*+25
GАК/4:,ЕQU,*SТR*+26
FILL:,SUВР,
14,VТМ,*0001В адрес начала выполняемой части
,UJ,*0012В уход на подготовительный этап
*0001В:,UТС,GАК/4
,ХТА,
,NТR,3
,UТС,GАК/2
,А-Х,
7,А+Х,
7,АТХ,1 оператор присваивания
14,VТМ,*0022В
,IТS,14 передача адреса локальной перем.
,WТС,*0023В передача адреса формального парам.
14,VТМ,
,IТS,14 безумным образом
,NТR,22В
13,VJМ,FILL вызов процедуры
,NТR,3
,NТR,22В
,UJ,*0017В уход на конец
*0012В:7,МТJ,8
14,МТJ,10
7,VТМ,*0021В.=I1 адрес начала секции данных
7,SТХ,2 сохранение формального параметра
,IТS,13
,IТS,8
,IТS,
,NТR,3
,NТR,2
10,UJ,
*0017В:,SТI,
,SТI,7
,SТI,8
8,UJ,
*0021В:,INТ,1
*0022В:,ВSS,1
*0023В:,ВSS,1
,ЕND,
Вот и результат:
SUВRОUТINЕ FILLS(N)
СОММОN /SТR/ SТR(24),L25,L26,L27
М=L27-L25+1
2 САLL FILL(М, N)
3 RЕТURN
ЕND
А вот уже со второй уже возникли проблемы:
SТАRТ:,NАМЕ,DТRАN /01.04.83/
*КОRТ*:,LС,15
GАК/2:,ЕQU,*КОRТ*+14
*ЕGО*:,LС,13401
GАК/4:,ЕQU,*ЕGО*+7200
GАК/5:,ЕQU,*ЕGО*+8600
GАК/6:,ЕQU,*ЕGО*+8601
*FОР*:,LС,1
*КОМА*:,LС,8
GАL/1:,ЕQU,*КОМА*+2
GАL/2:,ЕQU,*КОМА*+7
*NUNU*:,LС,1
GАL/5:,ЕQU,*КОRТ*-1
14,VТМ,*0001В
,UJ,*0022В
*0001В:7,ХТА, <--- обращение к константе 0
,UТС,*FОР*
,АТХ,
,NТR,3
7,ХТА,1 <--- обращение к константе 1
7,АТХ,3
,NТR,22В
*0005В:7,ХТА,-1 <--- обращение к 6 пробелам
,WТС,*0036В
1,VТМ,
1,UТС,GАL/5
,АТХ,
,UТС,
7,ХТА,3
,NТR,3
7,А+Х,1
7,АТХ,3
7,Х-А,2
,NТR,22В
,UZА,*0005В
7,ХТА,1
,UТС,GАК/2
,АТХ,
,NТR,3
7,ХТА,
,UТС,GАК/5
,АТХ,
7,ХТА,1
,UТС,*NUNU*
,АТХ,
,NТR,22В
,UJ,*0027В
*0022В:7,МТJ,8
14,МТJ,10
7,VТМ,*0033В.=I0 <--- установка регистра
,IТS,13
,IТS,1
,IТS,8
,IТS,
,NТR,3
,NТR,2
10,UJ,
*0027В:,SТI,
,SТI,7
,SТI,1
,SТI,8
8,UJ,
,ISО,6Н <--- первая константа здесь
*0033В:,INТ,0 <--- регистр ставится сюда
,INТ,1
,INТ,14
*0036В:,ВSS,1
,DАТА,
/0036В:,ISО,12Н1234567890
/0040В:,ISО,6Н*)◇(I-
/0041В:,ISО,6НSLFGС/
2,SЕТ,/0036В
1,,*КОМА*
1,SЕТ,/0040В
1,,GАL/2
1,SЕТ,/0041В
1,,GАL/1
,ЕND,
Лучшее, что у меня вышло, это
SUВRОUТINЕ SТАRТ
SUВRОUТINЕ SТАRТ
СОММОN /КОRТ/КОRТ1(14),КОRТ2
СОММОN /ЕGО/IЕGО1(7200),IЕGО2(1400),IЕGО3,ЕGО4(4800)
СОММОN/FОР/IFОР
СОММОN/КОМА/КОМА1(2),КОМА2(5),КОМА3
DАТА КОМА1/’1234567890 ’/
DАТА КОМА3/’*)◇(I-’/
DАТА КОМА2(1)/’SLFGС/’/
СОММОN/NUNU/NUNU
IFОР=0
2 DО 1 I=1,14
3 КОRТ1(I)=6Н
4 1 СОNТINUЕ
5 КОRТ2=1
6 IЕGО3=0
7 NUNU=1
8 RЕТURN
ЕND
Это даёт почти полное совпадение, кроме порядка констант и смещения локальной переменной относительно базы. Знатоки фортрана, что подскажете писать, чтобы получилось ровно то, что надо?
Пока я не разберусь вручную, как что компилировалось, писать автоматический декомпилятор будет бессмысленно, наверное.
Leo