Меню сайта

Урок 182. Вставка короткой программы

В предыдущем примере рассматриваласьдовольно большая программа
— — — на языке ассемблера, хранящаяся всобственном объектном файле и
— — — загружаемая в память интерпретаторомБейсика. А как в случае очень
— — — маленькой программы. Представляется, чтодля такой программы
— — — тратилось бы слишком много усилий на однутолько загрузку ее из
— — — собственного файйла. В приложении Cсправочника по языку Бейсик
— — — приведен способ «упаковки»программы на машинном языке в область
— — — памяти за пределами рабочей областиинтерпретатора. Приведем пример
— — — применения другого способа.

— — — — — На Фиг. 10.8 показана программа,написанная на языке
— — — ассемблера, которой мы воспользуемся. Этапрограмма обращается к
— — — BIOS для сдвига изображения на экране.Рассмотрев параметры,
— — — хранящиеся в регистрах CX и DX, можноувидеть, что сдвигаемое окно
— — — отображает лишь часть экрана. Мы будемисползовать приведенную
— — — программу для разбиения экрана нанесколько окон, в каждом из
— — — которых сдвиг может производитьсянезависимо. Поскольку средства
— — — реализации этого в языке Бейсикотсутствуют, понадобится процедура
— — — на языке ассемблера.

— — — — — — — — — — -Microsoft (R) Macro Assembler Version 5.00 — — — — — — — — — — — — — — 1/1/8004:07:03
— — — — — — — — — — — -Фиг. 10.8 Программа прокрутки окон на дисплее — — — — — — — — — — -Page — — — — 1-1


— — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — -PAGE ,132
— — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — -TITLE — — — — — Фиг. 10.8 Программа прокрутки окон на дисплее
— — — — — — — — — — — -0000 — — — — — — — — — — — — — — — — — — — — — — — CODE SEGMENT
— — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — -ASSUME -CS:CODE
— — — — — — — — — — — -0000 — — — — — — — — — — — — — — — — — — — — — — — SCROLL — PROC — — — — FAR
— — — — — — — — — — — -0000 — — — — — 55 — — — — — — — — — — — — — — — — — — — — — PUSH BP
— — — — — — — — — — — -0001 — — — — — 8B EC — — — — — — — — — — — — — — — — — — MOV — BP, SP
— — — — — — — — — — — -0003 — — — — — 8B 76 06 — — — — — — — — — — — — — — — MOV — SI, [BP+6] — Загрузка адресапараметра
— — — — — — — — — — — -0006 — — — — — 8B 0C — — — — — — — — — — — — — — — — — — MOV — CX, [SI] — — — Загрузка параметра
— — — — — — — — — — — -0008 — — — — — 0A C0 — — — — — — — — — — — — — — — — — — OR — — AL, AL
— — — — — — — — — — — -000A — — — — — B7 07 — — — — — — — — — — — — — — — — — — MOV — BH, 7
— — — — — — — — — — — -000C — — — — — B8 0601 — — — — — — — — — — — — — — — -MOV — AX, 601h
— — — — — — — — — — — -000F — — — — — 75 0C — — — — — — — — — — — — — — — — — — JNZ — WINDOW1 — — — — Определениетребуемого окна
— — — — — — — — — — — -0011 — — — — — B9 0200 — — — — — — — — — — — — — — — -MOV — CX, 200h — — — Окно 1
— — — — — — — — — — — -0014 — — — — — BA 1010 — — — — — — — — — — — — — — — -MOV — DX, 1010h
— — — — — — — — — — — -0017 — — — — — — — — — — — — — — — — — — — — — — — DO_SCROLL:
— — — — — — — — — — — -0017 — — — — — CD 10 — — — — — — — — — — — — — — — — — — INT — 10h
— — — — — — — — — — — -0019 — — — — — 5D — — — — — — — — — — — — — — — — — — — — — POP — BP
— — — — — — — — — — — -001A — — — — — CA 0002 — — — — — — — — — — — — — — — -RET — 2
— — — — — — — — — — — -001D — — — — — — — — — — — — — — — — — — — — — — — WINDOW1:
— — — — — — — — — — —
-001D — — — — — B9 0514 — — — — — — — — — — — — — — — -MOV — CX, 514h — — — Окно 2
— — — — — — — — — — — -0020 — — — — — BA 1224 — — — — — — — — — — — — — — — -MOV — DX, 1224h
— — — — — — — — — — — -0023 — — — — — EB F2 — — — — — — — — — — — — — — — — — — JMP — DO_SCROLL
— — — — — — — — — — — -0025 — — — — — — — — — — — — — — — — — — — — — — — SCROLL — ENDP
— — — — — — — — — — — -0025 — — — — — — — — — — — — — — — — — — — — — — — CODE ENDS
— — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — -END

— — — — — — — -Фиг. 10.8 Процедура сдвига изображения для Бэйсика

— — — — — Как можно увидеть на листингеассемблирования на Фиг. 10.8, для
— — — определения, в каком из двух окон долженпроизводиться сдвиг,
— — — используется входной параметр. Программа,написанная на языке
— — — Бейсик, передает этот параметр вассемблерную подпрограмму
— — — оператором CALL. На Фиг.10.9(а) показаносодержимое стека в момент
— — — вызова в Бэйсике процедуры SCROLL.Оператор CALL помещает в стек
— — — адрес параметра перед выполнением дальнеговызова (FAR CALL)
— — — подпрограммы на машинном языке. Адрес встеке является смещением
— — — параметра относительно регистра DS. Первыекоманды процедуры SCROLL
— — — извлекают этот адрес из регистра SI длятого, чтобы загрузить
— — — истинное значение в регистр CX. НаФиг.10.9(b) показано содержимое
— — — стека после того, как процедура SCROLLпоместила содержимое
— — — регистра BP в стек, а затем переслаласодержимое регистра SP в
— — — регистр BP. Обратите внимание, чтопараметр находится в шести
— — — байтах от вершины стека. Если бы программана языке Бейсик
— — — передавала более одного параметра, передвызовом они были бы
— — — аналогичным образом помещены в стек.Забегая вперед, заметим, что
— — — перед возвратом процедура, используякоманду RET 2, извлекает
— — — параметры из стека. Интерпретатор Бейсикапредполагает, что перед
— — — возвратом подпрограмма удаляет параметрыиз стека.

— — — — — — — — — -ГДДДДДДДДДДДДґ — — — — — — — — — ГДДДДДДДДДДДДґ
— — — — — SPДДДДД&gt-і Смещение — — і — SPДДДД&gt-і Старое зна-і
— — — — — — — — — -і возврата — — і — — — — — — — — — і чение BP — — і&lt-ДДДДBP
— — — — — — — — — -ГДДДДДДДДДДДДґ — — — — — — — — — ГДДДДДДДДДДДДґ
— — — — — — — — — -і Сегмент — — — і — — — — — — — — — і Смещение — — і [BP+2]
— — — — — — — — — -і возврата — — і — — — — — — — — — і возврата — — і
— — — — — — — — — -ГДДДДДДДДДДДДґ — — — — — — — — — ГДДДДДДДДДДДДґ
— — — — — — — — — -і Смещение — — і — — — — — — — — — і Сегмент — — — і [BP+4]
— — — — — — — — — -і аргумента — і — — — — — — — — — і возврата — — і
— — — — — — — — — -ГДДДДДДДДДДДДґ — — — — — — — — — ГДДДДДДДДДДДДґ
— — — — — — — — — — — — — — — — — — — — — — — — — — — — — і Смещение — — і [BP+6]
— — — — — — — — — — — — — — — — — — — — — — — — — — — — — і аргумента — і
— — — — — — — — — — — — — — — — — — — — — — — — — — — — — ГДДДДДДДДДДДДґ

— — — — — — — — — — — — -(a) — — — — — — — — — — — — — — — — — — — — — — (b)
— — — — — — — — — — — -Фиг. 10.9 Стек при вызове процедуры

— — — — — Подпрограмма SCROLL в зависимости отзначения параметра
— — — обрабатывает одно из двух оконэкрана. — Если параметр равен нулю,
— — — то изображение в окне, заданномкоординатами (2, 0) и (16, 16)
— — — сдвигается вверх на одну строку. — Если параметр не равен нулю, то
— — — на одну строку вверх сдвигаетсяизображение в окне (5, 20), (18,
— — — 36). -Перемещается текст только в заданном окне, остальной текст
— — — или данные на экране остаютсянеподвижными. — Реализация такого
— — — оконного режима входит в функцию сдвигаBIOS. — Для ее использования
— — — требу
ется лишь вызвать BIOS с правильнозаданными параметрами.

— — — — — На Фиг. -10.10 представлена программа на языке Бейсик,
— — — обращающаяся к процедуре SCROLL. — В этом простом примере в каждое
— — — окно записывается строка символов, а затемвызывается процедура
— — — сдвига текста вверх. — Эта Бэйсик-программа не более чем
— — — иллюстрирует использование сдвига окон.

— — — — — Первое, на что следует обратить внимание,это — способ загрузки
— — — программы на машинном языке всистему. — Программа содержится в
— — — символьной строке P$. — Каждый символ в строке соответствует одному
— — — байту объектного кода из Фиг. — 10.8. -В программу на Бэйсике эта
— — — программа вводится с клавиатуры полистингу ассемблирования. — Это —
— — — одна из причин, по которой применениерассмотренного способа
— — — ограничено лишь короткимипрограммами. — При вводе программы таким
— — — способом очень легко сделать ошибки.
A — — —
— — — — — — — — — — — 1 CLS
— — — — — — — — — — — 5 DEFINT A-Z
— — — — — — — — — — — 10P$=CHR$(&amp-H55)+CHR$(&amp-H8B)+CHR$(&amp-HEC)+CHR$(&amp-H8B)+CHR$(&amp-H76)+CHR$(&amp-H6)
— — — — — — — — — — — 20P$=P$+CHR$(&amp-H8B)+CHR$(&amp-HC)+CHR$(&amp-HA)+CHR$(&amp-HC9)+CHR$(&amp-HB7)+CHR$(&amp-H7)
— — — — — — — — — — — 30P$=P$+CHR$(&amp-HB8)+CHR$(&amp-H1)+CHR$(&amp-H6)+CHR$(&amp-H75)+CHR$(&amp-HC)+CHR$(&amp-HB9)
— — — — — — — — — — — 40P$=P$+CHR$(&amp-H0)+CHR$(&amp-H2)+CHR$(&amp-HBA)+CHR$(&amp-H10)+CHR$(&amp-H10)+CHR$(&amp-HCD)
— — — — — — — — — — — 50P$=P$+CHR$(&amp-H10)+CHR$(&amp-H5D)+CHR$(&amp-HCA)+CHR$(&amp-H2)
— — — — — — — — — — — 60P$=P$+CHR$(&amp-H0)+CHR$(&amp-HB9)+CHR$(&amp-H14)
— — — — — — — — — — — 70P$=P$+CHR$(&amp-H5)+CHR$(&amp-HBA)+CHR$(&amp-H24)+CHR$(&amp-H12)+CHR$(&amp-HEB)+CHR$(&amp-HF2)
— — — — — — — — — — — 100ENTRY!=(PEEK(VARPTR(P$)+1))+(PEEK(VARPTR(P$)+2))*256
— — — — — — — — — — — 110 IF ENTRY!&gt-32768! THENENTRY%=ENTRY!-65536! ELSE ENTRY%=ENTRY!
— — — — — — — — — — — 120 A$=»АБВГДЕЖЗИК»
— — — — — — — — — — — 130 L=0:R=1
— — — — — — — — — — — 140 LOCATE 1,1:PRINT «Примерсдвига окна . . .э
— — — — — — — — — — — 200 LOCATE 15,1:PRINT A$-
— — — — — — — — — — — 210 CALL ENTRY%(L)
— — — — — — — — — — — 220 LOCATE 18,21:PRINT A$-
— — — — — — — — — — — 230 CALL ENTRY%(R)
— — — — — — — — — — — 240 A$=RIGHT$(A$,9)+LEFT$(A$,1)
— — — — — — — — — — — 250 GOTO 200
— — — — — — — — -Фиг. 10.10 Бэйсик-программа для сдвига окон

— — — — — Поскольку программа на машинном языкезадана в строке P$, то
— — — для определения адреса этой строкипрограмма на языке Бейсик
— — — использует функцию VARPTR. — — — — — Для оператора CALL необходим адрес
— — — подпрограммы, поэтому для его нахождения ииспользуется функция
— — — VARPTR. -Воспользовавшись информацией из приложения C справочника
— — — по Бейсику, можно найти адрес строки вовтором и третьем байтах
— — — дескриптора строки. — Возвращаемое функцей VARPTR значениеявляется
— — — адресом дескриптора строки для P$. — — — Программа извлекает адрес
— — — строки из дескриптора и присваивает егозначение переменной ENTRY!.
— — — Поскольку это значение может находиться вдиапазоне от 0 до 65536,
— — — подпрограмма должна преобразовать его вцелое значение длиной в
— — — одно слово, со значением от от -32768 до32767. — Это слово
— — — помещается в переменную ENTRY%. — В остальных строках программы в
— — — сдвигаемые окна записывается символьнаястрока, а затем для
— — — перемещения текста вызывается подпрограммаSCROLL.

— — — — — При запуске этой программы вы увидите, чтоданные в двух окнах
— — — перемещаются независимо. — Такой прием позволяет задать два
— — — различных окна на экране и перемещать вних текст независимо друг
— — — от друга. -Если написать немного более длинную программу, можно
— — — было бы ограничить каждое окно рамкой,чтобы деиствительно отделить
— — — их друг от друга. — Применение подобных методов построения окон
— — — позволяет писать довольно симпатичныепрограммы с одновременным
— — — выводом на экран наскольких фрагментовтекста.

— — — — — Прежде чем покончить с этой программой,давайте просмотрим
— — — через отладчик часть программы, написаннуюна машинном языке. — Для
— — — этого надо иметь готовую к выполнениюпрограмму ДОС DEBUG. — — — Это
— — — достигается следующим образом: — сначала загружается программа
&nb
sp- — — DEBUG, а затем загружается BASIC.COM (илиBASICA.COM, если
— — — используется расширенный Бейсик). — После загрузки программы Бейсик
— — — замените первый символ в P$ (исоответственно, первый байт
— — — программы на машинном языке), наCHR$($HCC). — Это — код для
— — — прерывания INT 3 прерывания по точкепрерывания. — Теперь, когда во
— — — время выполнения программы на языке Бейсикона вызывает
— — — подпрограмму на машинном языке, управлениеполучает программа
— — — DEBUG. -Теперь можно вновь заменить код 0CCH на исходное значение
— — — (в данном случае 055H). — Программу DEBUG можно использовать для
— — — трассировки программы на машинномязыке. — Конечно, если программа
— — — на языке ассемблера хорошо написана икоротка, то такая отладка не
— — — так необходима. — На самом же деле вы, вероятно, заметите, что в
— — — большинстве случаев из-за ошибок при вводес клавиатуры программы
— — — на машинном языке в строку интерпретатораБейсик возникает
— — — множество проблем.

Категория: Программирование на Ассемблере | Дата: 22.02.13

Меню раздела
Блок