
Сообщение от
Patron
Насчёт ассемблерных вставок - это вряд ли, а вот использование каких-то подпрограмм для доступа к ячейкам, типа PUT(adr,val) и GET(adr) - то почему бы и нет. Нужно только найти правильные имена в описании системной библиотеки фортрана ( SYSLIB ).
Можно использовать подпрограммы/функции на ассемблере. Принцип такой: создается файл .MAC с нужными подпрограммами, имя подпрограммы совпадает с меткой ассемблера (должна быть объявлена глобальной). На входе R5 указывает на вектор в котором первое слово - количество переданных аргументов, а следующие слова - адреса передаваемых параметров или -1 (177777 восьм.) если параметр пропущен. Если это функция, возвращать параметры можно через R0 (R0:R1 для двухсловных значений). Все регистры можно менять. Дополнительно остановлюсь на том, что в фортране параметры подпрограмм всегда передаются ссылкой в отличие от C или паскаля, если делается скажем CALL XXX(1), а внутри подпрограммы SUBROUTINE XXX(I) делается присвоение вида I = 3, то при следующем попадании на этот же вызов, в качестве аргумента будет передано 3.
Пример:
Фортран:
Код:
J = IFUFL(1, 2, , 'TEXT', , I)
Ассемблер:
Код:
IFUFL::
;
; В ЭТОМ МЕСТЕ:
; (R5) - 6 (ЧИСЛО АРГУМЕНТОВ)
; 2(R5) - ССЫЛКА НА АРГУМЕНТ "1"
; 4(R5) - ССЫЛКА НА АРГУМЕНТ "2"
; 6(R5) - -1 (АРГУМЕНТ ПРОПУЩЕН)
; 10(R5) - ССЫЛКА НА ASCIZ СТРОКУ 'TEXT'
; 12(R5) - -1 (АРГУМЕНТ ПРОПУЩЕН)
; 14(R5) - ССЫЛКА НА АРГУМЕНТ "I"
;
...
MOV #123456,R0 ;ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ
RETURN ;ВОЗВРАТ ПО RTS PC
Живой пример:
Код:
PROGRAM TEST
CALL TXT('LALALA','XAXAXA',,'BUBUBU')
CALL EXIT
END
.TITLE TXT -- ПЕЧАТЬ ТЕКСТОВЫХ СТРОК
.MCALL .PRINT
TXT:: MOV (R5)+,R1 ;ЧИСЛО АРГУМЕНТОВ
BEQ 30$ ;EQ - НЕТ АРГУМЕНТОВ
10$: MOV (R5)+,R0 ;АДРЕС ОЧЕРЕДНОГО АРГУМЕНТА
CMP #-1,R0 ;ЕСЛИ -1 - АРГУМЕНТ ПРОПУЩЕН
BEQ 20$ ;...ПРОПУСКАЕМ
.PRINT ;ПЕЧАТАЕМ СТРОКУ
20$: SOB R1,10$ ;ЦИКЛИМСЯ ПОКА ЕСТЬ АРГУМЕНТЫ
30$: RETURN ;ВОЗВРАЩАЕМ УПРАВЛЕНИЕ
.END
.SET FOR F77
.FORT F
.MAC A
.LIN F,A,SY:FORLIB/LIB
.RUN F
LALALA
XAXAXA
BUBUBU
.