СОВРЕМЕННАЯ ЭЛЕКТРОНИКА №4/2012

ПРОГРАММИРОВАНИЕ граммыOUTP() производится 4 м опе ратором. Рассмотрим подробнее саму проце дуру вызова, например, в 1 м опера торе loop until band(INP(3fdh),20h). В самом начале идёт обращение к подпрограмме, которая в программе In.cpp имеет название INP() и атрибут «внешний» (extern "C"): extern "C" unsigned char INP(un signed int Port_number) В эту подпограмму из Clarion пере даётся значение адреса порта (3fdh) в переменную Port_number. Далее под программа INP() вызывает подпро грамму inportb(Port_number), имею щую атрибут static: static unsigned char inportb(un signed int Port_number)= { 0xEC, // in al,dx }; Значение адреса порта (3fdh) из подпрограммы INP() ещё раз передаёт ся в подпрограмму inportb() в процес сорном регистре dx с помощьюдирек тивы reg_param => (dx). Далее выпол няется подключаемая подпрограмма (уже третья), имеющая машинный (объектный) код 0xEC, который яв ляется кодом операции ввода in в ре гистр al содержимого адреса порта dx. Результат ввода возвращается в ре гистр ax (точнее, в al) директивой reg_return => (ax). Этот результат вна чале передаётся из подпрограммы inportb() в подпрограмму INP(), а отту да уже в подпрограмму OUTBYTE. Все эти действия производятся ради вы полнения единственной машинной команды ввода из порта in al,dx с объ ектным кодом 0xEC, отсутствующей в языке Clarion. Если бы подпрограмма INP() выпол нялась только один раз, то такой «трой ной» вызов был бы оправдан, но обра щение к этойподпрограмме из подпро граммы OUTBYTE происходит мно гократно. Это же касается и подпро граммы OUTP(). И многократно всё описанное повторяется сотни и тыся чи раз в программах, использующих подпрограмму OUTBYTE. Если процессор может выполнить машинные команды ввода из порта (0xEC) и вывода в порт (0xEЕ), то поче му бы его не заставить выполнить сра зу всю подпрограмму (в машинных кодах) вывода байта? В этом случае вызов такой подпрограммы будет про изводиться только один раз из Clarion, а все операции ввода/вывода, анализ состояния портов и т.п. перейдут в подпрограмму в машинных кодах. Кроме того, выполнение готовой ко довой последовательности команд в процессоре происходит на порядок быстрее. Подпрограмма вывода байта на встроенном в Clarion v.6.0 языке TopSpeed C++ (Outbasm.cpp), использу ющая подключаемуювставку в машин ных кодах, приведенана сайтежурнала. Сравнив комментарии к этой под программе вывода байта в ассемб лерной мнемонике с подпрограммой OUTBYTE() на языке Clarion, а также с вышеприведённой блок схемой (см. рис. 5), можно заметить, что они логи ческиодинаковы. Вызовподпрограммы OUTBASM(unsignedchar byte)изClarion производится следующим образом: OUTASM(OUTB) В качестве параметра в вызываемую подпрограмму необходимо подставить выводимый байт в переменную OUTB. Внешняя подпрограмма OUTBASM вы зывает статическую подпрограмму outpasm (unsigned char byt), в которую в качестве параметра передаёт зна чение выводимого байта (byt) через регистр bx (точнее, через его млад ший байт bl) с помощью директивы reg_param => (bx). Чтобы вся конструкция работа ла, для неё необходимо создать про тотип: MODULE('IN/OUT.CPP') OUTASM(BYTE),NAME('_OUTBASM') END Крометого,вфайл проектнеобходимо включить подпрограммуOutbasm.cpp. Теперь рассмотрим подпрограмму ввода байта в компьютере. Соответ ствующая блок схема, отражающая осциллограммы (см. рис. 3), показана на рисунке 6. Подпрограмма ввода байта на встроенном в Clarion v.6.0 языке TopSpeed C++ (Inbasm.cpp), ис пользующая подключаемую вставку в машинных кодах, приведена на сайте журнала. Еслисравнитькомментарииккодовой части подключаемой подпрограммы inbtasm() с вышеприведённойблок схе мой (см. рис. 6), то можно заметить их полнуюлогическуюидентичность. Вызов внешней подпрограммы extern "C" unsigned char INBASM() из Clarion производится следующим об разом: B=INASM() В переменной B – результат ввода байта. Результат ввода байта возвраща ется в подпрограмму INBASM регист ре ax (точнее, al) с помощью прагмы reg_return => (ax), а из подпрограммы INBASM– уже в Clarion в переменнуюB. 69 WWW.SOEL.RU СОВРЕМЕННАЯ ЭЛЕКТРОНИКА ◆ № 4 2012 © СТА-ПРЕСС

RkJQdWJsaXNoZXIy MTQ4NjUy