Декомпиляция Фортрана. Идеи?

18 views
Skip to first unread message

Leo B.

unread,
Jul 18, 2021, 8:29:50 PM7/18/21
to БЭСМ-6
По просьбам трудящихся, я начал задумываться над декомпиляцией Фортрана; в частности, чтобы понять, что на самом деле умел СИПРОД. 

В первую очередь оказалось, что СИПРОД был скомпилирован Фортраном-Дубна, а не Фортраном-ГДР. У нас есть две версии библиотеки, из ИТМ и из 

С одной стороны, если компилятор не оптимизирующий, то это должно быть удобнее; например, мне удалось практически с первой попытки вручную декомпилировать  одну из самых маленьких процедур, и ассемблерный код выдачи 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
Reply all
Reply to author
Forward
0 new messages