ПРОЦЕДУРИ І ВСТАВКИ

Не у багатьох системах пропонуються справжні процедури, що представляють собою сукупності команд, певною мірою схожі на блокові функції, однак у більшості версій Бейсика для мікроЕОМ передбачаються певні команди для виклику і виконання з програми на Бейсике вставок на машинному коді

643 ЗАСТОСУВАННЯ МАШИННОГО КОДА

В принципі застосування в програмах на Бейсике вставок, написаних на машинному коді, є не такою вже важким завданням, тому що в багатьох системах передбачений, принаймні, один спосіб виклику таких вставок Однак на практиці при цьому доводиться стикатися з безліччю дрібних деталей, наприклад з адресою осередків памяті і списками числових значень, які треба правильним чином встановлювати при кожному виклику вставки Цього і слід було очікувати, так як машинний код має справу з фізичною реальністю ЕОМ тому й доводиться відшукувати і

використовувати фактичні адреси комірок памяті, завантажувати значення в арифметичні регістри,

перевіряти і змінювати покажчики стека

У більшості систем передбачені дві команди рейок (поглянути) і Роке (помістити), роль яких важко переоцінити Ці команди дозволяють полегшити виконання зазначених вище дій Але ними треба користуватися тільки в тих ситуаціях, коли в Бейсике не передбачені кошти приєднання вставок на машинному коді Ці команди йдуть абсолютно врозріз з усіма поданнями про розробку програм мовою високого рівня, і користуватися ними в загальному випадку не рекомендується

Команди рейок і Роке

Загальна форма запису: POKE I, J (Оператор) і змінна = Рейок (I) (Функція) де

I містить десятковий (або шістнадцятковий, якщо вказаний відповідний символ) адреса байта памяті ЕОМ у діапазоні 0 .. 65 535

J містять десяткове (або шістнадцяткове) значення, яке треба помістити в байт з адресою I Значення J повинно лежати в межах 0 .. 255

Врахуйте, що в Бейсике ВВС цих функцій немає

Таким чином, оператор 10 Роке 16251,22

помістить значення 22 в байт памяті з адресою 16251 Можна користуватися і змінними якщо вони не є цілими, то їх значення будуть округлені до найближчих цілих чисел

100 А = 62000

110 В = 33

120 Роке А, В

Деякі системи дозволяють користуватися шестнадцатерічнимі значеннями, перед якими для відмінності інших величин вказуються символи & або & Н Наприклад, & FF являє собою шістнадцятковий еквівалент числа 255, а & 1А – шістнадцятковий еквівалент 26 Таким чином, оператор

10 Роке & 5A00, & FF

помістить 255 в осередок з адресою 23040

Команда рейок покаже Вам значення будь-якого байта (8 біт) памяті Її застосування ілюструється наступною програмою:

10 Rем ЧИТАННЯ ВМІСТУ ПАМЯТІ

20 INPUT Введіть ПОЧАТКОВИЙ АДРЕСА; I%

30 INPUT Введіть число байтів; У%

40 FOR N%=0 TO B%-1

50 PRINT Рейок (I% + N%)

60 NEXT N%

70 PRINT

80 END

Після введення початкової адреси і необхідного числа байтів програма роздруковує в десятковому вигляді (у діапазоні 0 .. 255) значення байтів памяті Використовуючи оператор PRINT ; CHR $ (PEEK (1% + N%)) можна отримати символьне представлення значення кожного байта У версії Бейсика Microsoft передбачена функція НЕХ $ (X), яка повертає шістнадцятковий еквівалент десяткового значення X, і нею можна скористатися замість CHR $ Таким чином, заповнені значення можна дуже легко зобразити в десятковому, символьному і шістнадцятковому вигляді

Зворотною процедурою по відношенню до читання значень блоків байтів памяті служить запис нових значень в область памяті за допомогою POKE Вона являє собою зручний спосіб вставки невеликого числа машинних команд в програму на Бейсике Наприклад, програма

10 REM ДЕМОНСТРАЦІЯ ДІЇ Роке

20   DATA  31,167,208,165,179166

30   DATA 180,133,180,134,179,162

40   DATA   0,161179,168,138, 76

50   DATA 120,210

60   FOR I%=0 TO 19 70  READ N% 80   POKE I%+826,N%

90   NEXT I%

100   END

занесе закінчену вставку на машинному коді в область памяті з адресами від 826-го до 845-го для подальшого виклику

У багатьох версіях Бейсика передбачено два способи виклику вставки на машинному коді Найбільш загальним способом є застосування оператора CALL (виклик), що має наступний вигляд:

CALL адреса, вхідні параметри (вхідні параметри можуть бути відсутні), наприклад: 10

CALL&ampFF10

У версії Бейсика Microsoft для мікроЕОМ з мікропроцесором 6502 виклик вставки має дещо іншу форму:

10   START=&ampFF10

20   CALL%START (10,20,30)

Виконання команд передається Бейсиком вставці на машинному коді, що починається з заданого адреси Якщо їй потрібно передати які-небудь значення, то вони можуть бути завантажені в деякі з регістрів, або в регістри можуть бути занесені посилання на ці значення, або ці значення можуть бути переписані в певну область памяті, на яку буде матися посилання в парі регістрів Деталі процесу передачі значень залежать від того, на якому саме мікропроцесорі виконана Ваша система Якщо необхідно, Ваша вставка на машинному коді повинна буде першим справою зберегти поточні значення регістрів і покажчиків стека, а безпосередньо перед поверненням в Бейсік відновити ці значення з тим, щоб Бейсік міг нормально продовжити свою роботу з того місця, звідки була викликана вставка

Інший спосіб виклику вставки на машинному коді полягає в тому, що вставка використовується як проста функція з єдиним вхідним значенням (аргументом) і єдиним вихідним значенням (результатом) Звернення до неї здійснюється за допомогою функції USR (X), наприклад:

10   A=USR (2*B+3)

Іноді потрібно, щоб вхідний значення було цілим Тоді у разі речового X воно округлюється до найближчого цілого числа У деяких системах і результат повинен бути цілим числом Так як заздалегідь не відомо, де розташовується вставка, то перед викликом вставки її початкова адреса має бути занесена в певне місце (яке саме, залежить від конкретної системи) за допомогою команди POKE, наприклад:

100 Роке 1,58 110 Роке 2,4 120 A = USR (B)

Для занесення 16-бітового адреси в память за допомогою команди PОКЕ доводиться розщеплювати його на два 8-бітових байта, поміщаючи зазвичай молодші адреси в перший з байтів У наведеному вище прикладі в байт з номером 1 заносилося значення 58, що дорівнює 3 * 16 +10 або ЗА в шістнадцятковій 201

записи, а в байт з номером 2 – значення 4, що дорівнює 4 в шістнадцятковій запису

Шістнадцяткові значення ЗА і 4 в байтах 1 і 2 відповідно дають адресу

4*256 + 3*16+ 10=1082

Після того як USR передає управління вставці, що починається з цієї адреси, остання витягує значення вхідного параметра (змінної В в наведеному вище прикладі) з певної області памяті, на яку вказує пара резисторів У версії Бейсика Microsoft додатково передбачено простий засіб для передачі адреси: якщо зазначений оператор

10   DEF USR0 = 2400

то при будь-якому наступному зверненні до USR0 (X) використовується десятковий адресу, вказану в DEF USR0 (Після USR можна вказувати одну цифру, так що доступно до десяти різних вставок)

В системі ВВС також передбачена функція USR, але остання бере адресу вставки з вхідного параметра, зазначеного при виклику USR, наприклад:

20 A = USR (Z%) і

50   PRINT USR (&amp 1000)

При виклику USR значення спеціальних змінних А%, Х%, Y% і С% копіюються в мікропроцесорні регістри А, X, Y і однобітовий прапор (регістр) перенесення С для подальшого використання у вставці Оператор CALL в Бейсике ВВС має форму, схожу на описану вище, але додатково допускає можливість такої ж передачі параметрів через регістри і прапор переносу, як у випадку USR Деталі процесу передачі параметрів вставці знайти у посібнику Бейсік ВВС

Врахуйте, що в системі ВПС не передбачаються команди рейок і Роке, але зате пропонується дуже корисна можливість вставки команд на асемблері прямо в звичайні оператори Бейсика Одна або кілька команд на асемблері вказуються після відкриває квадратної дужки ([), яку можна поставити в будь-якому місці до або після оператора Бейсика Вставка завершується закриває квадратної дужкою (] ), Наприклад:

120  INPUT SUM

130   [SHIFT ROR A

140      INT

150      CPY 8

160      BNE SHIFT ]

170  PRINT SUM

Передбачені в Бейсике ВВС операції непрямої адресації (, І $) є більш гнучкими,

ніж команди рейок і Роке, але виконують аналогічні дії, наприклад:

А = У еквівалентно А = рейок (В)

? А = В еквівалентно Роке А, В

Операція застосовується до одному байту, операція до одного слова, що складається з чотирьох байтів, операція $ – до рядка символів

644 ПРОЦЕДУРИ

Підпрограми, для роботи з якими використовуються оператори GOSUB і RETURN, мають справу виключно з глобальними змінними, доступними в будь-якому місці програми Перед входом в підпрограму певні змінні повинні містити відповідні вхідні значення Однорядкові функції можуть користуватися як значеннями, зазначеними в списку параметрів функції, так і значеннями глобальних змінних Формальні змінні зі списку параметрів насправді є локальними по відношенню до функції і відрізняються від однойменних

глобальних змінних Блокові функції розширюють можливості застосування локальних змінних, допускаючи визначення ряду локальних змінних, що володіють аналогічним властивістю Але однорядкові функції повертають одне і тільки одне значення в те місце, звідки їх викликають В принципі також можуть надходити і блокові функції, хоча вони можуть мати доступ і до глобальних змінних і змінювати їх, якщо потрібно повертати декілька значень Процедури доступні в декількох системах з Бейсиком для великих ЕОМ, але серед мікроЕОМ тільки система ВВС дає можливість користуватися процедурами, що виглядає наступним чином: виклик процедури здійснюється по імені, наприклад

100   PROCPICTURE (9,27,6, BIG)

Процедурі можна передавати будь-яке число вхідних параметрів Відповідні їм (по типу та номером) формальні змінні є локальними по відношенню до процедури, і, крім того, можна визначити додаткові локальні змінні оператором LOCAL Процедурі доступні і глобальні змінні, але користуватися ними треба обережно, так як бажано зберегти істотну незалежність процедури Значення у списку параметрів, копіюються в локальні параметри для подальшого використання Процедура має наступний вигляд:

500   DEF PROCPICTURE (A,B,C$)

510   LOCAL I%,S

520   PRINT B,C$

530   FOR I%=A TO B

800   END PROC

Вона починається оператором DEF PROC імяі завершується оператором ENDPROC Як і блокові функції, процедури можуть бути рекурсивними Процедури служать ідеальним засобом реалізації модульного програм203

мування, проповедуемого у цій та інших книгах Їх слід віддавати перевагу підпрограмам Як і функції в Бейсике ВВС, процедури треба поміщати за кінцем основної програми

Параметри процедури можна використовувати для передачі їй вхідних значень всі ті значення, які повинні служити результатом виклику процедури, необхідно передавати через глобальні змінні (тобто змінні, використовувані в основній частині програми) Якщо результатом є єдине значення, то замість процедури слід використовувати блокову функцію Нижче наведено приклад процедури PROCNUM, що обчислює два значення (суму двох чисел і максимальне число) і повертає їх через глобальні змінні С і D відповідно:

10 INPUT A,B

20 PROCNUM (А, В)

30 PRINT C,D

40 END

50 DEF PROCNUM(XY)

60 C = X + Y: REM З ВИКОРИСТОВУЄТЬСЯ ДЛЯ ПОВЕРНЕННЯ ЗНАЧЕННЯ

70 IF X> Y THEN D = X ELSE D = Y: REM І D ТЕЖ

80 ENDPROC

Наведемо приклад іншої процедури, яка чекає доти, поки не буде натиснута клавіша з символом, заданих в А $:

250 DEF PROCWAIT (А $)

260 PRINT натисніть клавішу; А $ ДЛЯ ПРОДОВЖЕННЯ

270   REPEAT UNTIL GETS =A$

280   ENDPROC

Джерело: Уолш Б Програмування на Бейсике: Пер з англ М: Радіо і звязок, 1988 336 с: ил

Схожі статті:


Сподобалася стаття? Ви можете залишити відгук або підписатися на RSS , щоб автоматично отримувати інформацію про нові статтях.

Коментарів поки що немає.

Ваш отзыв

Поділ на параграфи відбувається автоматично, адреса електронної пошти ніколи не буде опублікований, допустимий HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

*

*