ПРИЛОЖЕНИЕ В. ПРОГРАММЫ ВВОДА-ВЫВОДА НА ЯЗЫКАХ ВЫСОКОГО УРОВНЯ

На вычислительных системах семейства VAX удобным способом дли выполнения ввода-вывода является использование средств ввода и вывода языков высокого уровня. Приведённые здесь программы обеспечивают выполнение таких же функций ввода-вывода, как и программы, описанные в приложении Б. Однако в них применяются подпрограммы, процедуры и функции, написанные на Фортране, Бейсике и Паскале. Чтобы сделать последовательность действий, необходимых для вызова подпрограмм, одинаковой с последовательностями вызова подпрограмм, приведённых в приложении Б, сюда включается программа на языке ассемблера, которая служит для согласования связи программ на языке ассемблера с программами на языках высокого уровня. В гл. 9 описывается соглашение о связях между программами на языке ассемблера и программами на языках высокого уровня. Единственным замечанием является то, что все системы ввода-вывода, используемые в языках высокого уровня, сами выполняют свою инициализацию. Как следствие, программа IOINIT становится ненужной. Тем не менее для совместимости была включена фиктивная программа IOINIT, не выполняющая никаких действий, но возвращающая управление сразу после её вызова.

ПРОГРАММА НА ЯЗЫКЕ АССЕМБЛЕРА

Приведённая ниже программа используется для вызова подпрограмм, написанных на перечисленных выше трёх языках высокого уровня. Она может быть включена в основную программу пользователя как её составная часть либо может быть отдельно ассемблирована и связана на этапе компоновки с основной программой и с подпрограммами, написанными на языках высокого уровня.

;
; ЭТА ПРОГРАММА РАБОТАЕТ АНАЛОГИЧНО RNUM, PNUM И Т.Д.
; ВЫЗЫВАЕМЫЕ ПРОГРАММЫ НАПИСАНЫ НА ЯЗЫКАХ ВЫСОКОГО УРОВНЯ
;
        .EXTERNAL   FRNUM,FPNUM,FRSTR,FPSTR
;
IOINIT::
        RSB                 ; IOINIT НЕ ТРЕБУЕТСЯ
;
RNUM::
        PUSHR   #^M<R1>     ; СОХРАНИТЬ R1
        CALLS   #0,FRNUM    ; ВЫЗВАТЬ RNUM (ЯЗЫК ВЫСОКОГО УРОВНЯ)
        POPR    #^M<R1>     ; ВОССТАНОВИТЬ R1
        RSB                 ; РЕЗУЛЬТАТ В R0
;
PNUM::
        PUSHR   #^M<R1>     ; СОХРАНИТЬ R1
        PUSHL   R0          ; ПОМЕСТИТЬ АРГУМЕНТ В СТЕК
        PUSHAL  (SP)        ; ПОМЕСТИТЬ АДРЕС В СТЕК
        CALLS   #1,FPNUM    ; ВЫЗВАТЬ PNUM (ЯЗЫК ВЫСОКОГО УРОВНЯ)
        MOVL    (SP)+,R0    ; ВОССТАНОВИТЬ R0
        POPR    #^M<R1>     ; ВОССТАНОВИТЬ R1
        RSB
;
RLINE::
        PUSHL   R0          ; ПОМЕСТИТЬ АДРЕС В ДЕСКРИПТОР
        MOVZWL  R1,-(SP)    ; И ДЛИНУ В СТЕК
        PUSHAL  (SP)        ; ДЕСКРИПТОР ПЕРЕДАЁТСЯ КАК АРГУМЕНТ
        CALLS   #1,FRSTR    ; ВВЕСТИ СТРОКУ
        ADDL2   #8,SP       ; УДАЛИТЬ ИЗ СТЕКА ДЕСКРИПТОР
        MOVZWL  R0,R1       ; ПОМЕСТИТЬ ДЛИНУ В R1
        MOVL    #1,R0       ; И ПРИЗНАК УДАЧНОГО ЗАВЕРШЕНИЯ В R0
        RSB
;
PLINE::
        PUSHR   #^M<R0,R1>  ; СОХРАНИТЬ R0 И R1
        PUSHL   R0          ; ПОМЕСТИТЬ АДРЕС В ДЕСКРИПТОР
        MOVZWL  R1,-(SP)    ; И ДЛИНУ В СТЕК
        PUSHAL (SP)         ; ДЕСКРИПТОР ПЕРЕДАЁТСЯ КАК АРГУМЕНТ
        CALLS   #1,FPSTR    ; НАПЕЧАТАТЬ СТРОКУ
        ADDL2   #8,SP       ; УДАЛИТЬ ИЗ СТЕКА ДЕСКРИПТОР
        POPR    #^M<R0,R1>  ; ВОССТАНОВИТЬ R0 И R1
        RSB

ПРОГРАММЫ НА ЯЗЫКЕ ФОРТРАН

Следующие подпрограммы и функции компилируются и компонуются с основной программой, написанной на языке ассемблера, а также с приведёнными выше программами на языке ассемблера, используемыми для вызова данных подпрограмм и функций. По своему действию они в основном идентичны программам ввода-вывода из приложения Б. за исключением незначительных различий в формате ввода-вывода данных.

INTEGER FUNCTION FRNUM()
TYPE '(''$ВВЕДИТЕ ШЕСТНАДЦАТЕРИЧНОЕ ЧИСЛО - '')'
ACCEPT '(BN, Z8)',FRNUM
RETURN
END
 
SUBROUTINE FPNUM(N)
INTEGER N
TYPE '(''ВЫВОД''Z9.8''(ШЕСТНАДЦ.)''I14''(ДЕСЯТИЧ.)'')',N,N
RETURN
END
 
INTEGER FUNCTION FRSTR(S)
INTEGER M,MIN0,LEN
CHARACTER *(*) S
TYPE '(''$ВВЕДИТЕ СТРОКУ - '')'
ACCEPT '(Q,A)',M,S
FRSTR=MIN0(M,LEN(S))
RETURN
END
 
SUBROUTINE FPSTR(S)
CHARACTER *(*) S
TYPE '(1X,A)',S
RETURN
END

ПРОГРАММЫ НА ЯЗЫКЕ БЕЙСИК

Ниже следуют программы, написанные на расширенном диалекте языка Бейсик, поддерживаемого в ОС VAX/VMS. Однако так как в языке Бейсик отсутствует шестнадцатеричный формат представления данных, то ввод и вывод чисел выполняется исключительно в десятичном формате. Для преобразования данных в шестнадцатеричное представление или для обратного преобразования могли бы потребоваться довольно большие программы преобразования, что свело бы на нет преимущество применения языка высокого уровня вместо языка ассемблера.

100     FUNCTION INTEGER FRNUM
110     INPUT "ВВЕДИТЕ ДЕСЯТИЧНОЕ ЧИСЛО - ";Х%
120     FRNUM=X%
130     FUNCTIONEND
 
 
200     SUB FPNUM( N%)
210     PRINT "ВЫВОД ";N%;"(ДЕСЯТИЧНОЕ)"
220     SUBEND
 
 
300     FUNCTION INTEGER FRSTR(S$)
310     LINPUT "ВВЕДИТЕ СТРОКУ - ";S$
320     FRSTR=LEN(S$)
330     FUNCTIONEND
 
400     SUB FPSTR(S$)
410     PRINT S$
420     SUBEND

ПРОГРАММЫ НА ЯЗЫКЕ ПАСКАЛЬ

Приведённые ниже программы написаны на расширенном диалекте языка Паскаль, поддерживаемого в ОС VAX/VMS. Так как в языке Паскаль отсутствует простой способ обработки символьных строк переменной длины, то в данный пример не были включены программы RLINE и PLINE.

MODULE PRPNUM (INPUT, OUTPUT);
  FUNCTION FRNUM : INTEGER;
  VAR N : INTEGER;
  BEGIN
    WRITE ('ВВЕДИТЕ ДЕСЯТИЧНОЕ ЧИСЛО - ')
    READLN (N);
    FRNUM := N;
  END;
  
  PROCEDURE FPNUM (N : INTEGER);
  BEGIN
    WRITELN ('ВЫВОД - ', N,' (ДЕСЯТИЧНОЕ)');
  END;
END.

 

< НАЗАД ОГЛАВЛЕНИЕ ВПЕРЁД >