На вычислительных системах семейства 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.
< НАЗАД | ОГЛАВЛЕНИЕ | ВПЕРЁД > |