Меню сайта

Урок 181. Процедура Бэйсика BLOAD

При первом способе подпрограмма намашинном языке добавляется к
— — — программе для интерпретатора Бэйсика.Пожалуй, использование
— — — интерпретатора Бейсика является наиболеераспространенным методом
— — — написания программ для персональной ЭВМ.Подпрограмма на языке
— — — ассемблера, которую предполагаетсявключить в разрабатываемую
— — — программу, довольно велика — более 100байт. Ассемблерную процедуру
— — — такой длины трудно вставить в текстпрограммы на языке Бейсик,
— — — способ, позволяющий сделать это будетрассмотрен в следующем
— — — примере.

— — — — — Функция, которую мы добавляем к программена языке Бейсик
— — — позволяет выводить на принтер графическиеизображения. IBM PC
— — — снабжена графическими средствами.Графические команды позволяют
— — — программно управлять отдельными точками,выводимыми на принтер, во
— — — многом подобно тому, как в графическомрежиме адаптер цветного
— — — дисплея дает программисту возможностьуправлять отдельными точками
— — — растра. На Фиг. 10.4 представленыграфические команды, которые
— — — потребуются в рассматриваемом примере.Практически, графические
— — — функции реализуются на принтере черезуправляющие последователь-
— — — ности символов. Вместо символа в кодеASCII программа выдает на
— — — принтер служебный символ (27 в кодеASCII). Следующие за ним
— — — символы задают уже не символы для выводана печать, а определенные
— — — действия принтера. Как видно из Фиг. 10.4,существуют команды для
— — — вывода на принтер изображения точки, врезультате выполнения
— — — которых печатается определенная точкаизображения.

— — — — — — — — — — — Команда — — — — — — — — — Действие
— — — — — ———————————————————
— — — — — -ESC + «3» + n — — — — — — — — — — — — — — — — Установка промежутка между
— — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — -строками n/216
— — — — — -Esc + «K» +n1+n2+v1…vk — — — Печатать образы точек v1…vk
— — — — — — -(k = n1 + 256*n2) — — — — — — как 480 точек поперек страницы
— — — — — ———————————————————
— — — — — — — — — — — -Фиг.10.4 Графические команды для принтера
— — — — — Приведенная на Фиг. 10.5 программаиспользует указанные команды
— — — для вывода на принтер образа экранаграфического дисплея размером
— — — 320*200 точек. Каждая точка растрапередается на принтер. Если
— — — точка на экране имеет цвет фона, тосоответствующая точка на печать
— — — не выдается. Если точка окрашена в один изтрех основных цветов, то
— — — программа выводит на печать черную точку.Эта программа не
— — — масштабирует изображение, поэтомуокружность на экране может
— — — отобразиться в эллипс на принтере. Междутремя основными цветами не
— — — проводится различий. Цветное изображениепревращается в
— — — черно-белое.

— — — — — Подпрограмма PRINT_SCREEN являетсяпроцедурой типа FAR. Вызов
— — — ее из языка Бейсик является вызовом типаFAR, поэтому и возврат в
— — — программу должен быть соответствующеготипа. Последовательность ESC
— — — + «3» + 24 устанавливает такойинтервал между строками печати, что
— — — один ряд точек вплотную примыкает кдругому. В печатающей головке
— — — имеется восемь иголок, расстояние междукоторыми равно 1/72 дюйма.
— — — Если сделать интервал между строкамиравным 8/72 дюйма (или 24/216
— — — дюйма), то ряды точек соединятся.Приведенный фрагмент программы
— — — показывает способ пересылки на устройствопечати последовательности
— — — служебных символов. Управляющаяпоследовательность символов и чисел
— — — пересылается на принтер как обычныесимволы. Остальное обеспечивает
— — — устройство печати.

— — — — — При каждом проходе печатающей головки набумаге остается по
— — — восемь рядов точек (по одному на каждуюиголку печатающей головки)
— — — в — каждой из 320 колонок. От метки NEXT_ROW впрограмме
— — — последовательность ESC + «K» +64 + 1 пересылается на принтер. Это
— — — означает, что последующие 320 байт (64 +1*256) являются образами
— — — точек для получения графическогоизображения на принтере. В< br> — — — графическом режиме «K» напринтере можно получить изображение
— — — шириной до 480 точек.

— — — — — Для считывания точек с дисплея программаиспользует видео
— — — функцию BIOS . Эта функция считываетвосемь рядов точек текущнго
— — — столбца и собирает их в один байт:»1″ означает, что точка имеет
— — — основной цвет и должна появиться набумаге. Цикл продолжается через
— — — метку NEXT_COLUMN — до тех пор, пока все320 столбцов (что
— — — соответствует 320 байтам) не будутпереданы на принтер . После
— — — перехода принтера на новую строку припомощи служебных символов
— — — «возврат каретки» и»перевод строки» (13 и 10 в коде ASCII),
— — — программа пересылает следующую группу извосьми рядов. За 25
— — — проходов печатающей головки выводятся все200 рядов. Возврат в
— — — интерпретатор Бейсика производится припомощи возврата типа FAR.

— — — — — В рассматриваемой программе было бы удобноиспользовать
— — — процедуру PRINT. Эта процедура выдает одинбайт на принтер при
— — — помощи функции печати BIOS. Функцияпомещает необходиые для базовой
— — — системы ввода-вывода установки регистров вопределенное место. Если
— — — не использовать указанную функцию, топрограмма сама должна была бы
— — — устанавливать регистры AH и DX равныминулю перед каждым вызовом
— — — процедуры PRINT.
A
— — — — — — — — — — — — — — — Microsoft (R) Macro Assembler Version 5.00 — — — — — — — — — — — -1/1/80 04:06:57
— — — — — — — — — — — -Фиг. 10.5 Печать графической копии дисплея — — — — — — — — — — — — — — Page — — — — 1-1

— — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — -PAGE ,132
— — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — -TITLE — — — — — Фиг. 10.5 Печать графической копии дисплея

— — — — — — — — — — — -= 001B — — — — — — — — — — — — — — — ESC — EQU — 27 — — — — — — — — — Символ Escape
— — — — — — — — — — — -0000 — — — — — — — — — — — — — — — — — — — — — — — CODE SEGMENT
— — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — -ASSUME -CS:CODE
— — — — — — — — — — — -0000 — — — — — — — — — — — — — — — — — — — — — — — PRINT_SCREEN — — — — PROC FAR
— — — — — — — — — — — -0000 — — — — — B0 1B — — — — — — — — — — — — — — — — — — MOV — AL, ESC — — — — Установкаперевода строки на 1/8 дюйма
— — — — — — — — — — — -0002 — — — — — E8 0060 R — — — — — — — — — — — — — — CALL PRINT
— — — — — — — — — — — -0005 — — — — — B0 33 — — — — — — — — — — — — — — — — — MOV — AL, ‘3’
— — — — — — — — — — — -0007 — — — — — E8 0060 R — — — — — — — — — — — — — — CALL PRINT
— — — — — — — — — — — -000A — — — — — B0 18 — — — — — — — — — — — — — — — — — — MOV — AL, 24 — — — — 1/8 = 24/216 дюйма
— — — — — — — — — — — -000C — — — — — E8 0060 R — — — — — — — — — — — — — — CALL PRINT
— — — — — — — — — — — -000F — — — — — BA 0000 — — — — — — — — — — — — — — — -MOV — DX, 0 — — — — — — — — — — — — Номер строки
— — — — — — — — — — — -0012 — — — — — — — — — — — — — — — — — — — — — — — NEXT_ROW:
— — — — — — — — — — — -0012 — — — — — B0 1B — — — — — — — — — — — — — — — — — — MOV — AL, ESC
— — — — — — — — — — — -0014 — — — — — E8 0060 R — — — — — — — — — — — — — — CALL PRINT
— — — — — — — — — — — -0017 — — — — — B0 4B — — — — — — — — — — — — — — — — — — MOV — AL, ‘K’
— — — — — — — — — — — -0019 — — — — — E8 0060 R — — — — — — — — — — — — — — CALL PRINT
— — — — — — — — — — — -001C — — — — — B0 40 — — — — — — — — — — — — — — — — — — MOV — AL, 320-256
— — — — — — — — — — — -001E — — — — — E8 0060 R — — — — — — — — -&n
bsp- — — — — CALL PRINT
— — — — — — — — — — — -0021 — — — — — B0 01 — — — — — — — — — — — — — — — — — — MOV — AL, 1
— — — — — — — — — — — -0023 — — — — — E8 0060 R — — — — — — — — — — — — — — CALL PRINT
— — — — — — — — — — — -0026 — — — — — B9 0000 — — — — — — — — — — — — — — — -MOV — CX, 0 — — — — — — — — — — — — Номер столбца
— — — — — — — — — — — -0029 — — — — — — — — — — — — — — — — — — — — — — — NEXT_COLUMN:
— — — — — — — — — — — -0029 — — — — — 52 — — — — — — — — — — — — — — — — — — — — — PUSH DX — — — — — — — — — Сохранение номера строки
— — — — — — — — — — — -002A — — — — — BB 0008 — — — — — — — — — — — — — — — -MOV — BX, 8 — — — — — — — — — — — — Число одновлеменно обрабатываемыхточек
— — — — — — — — — — — -002D — — — — — — — — — — — — — — — — — — — — — — — NEXT_DOT:
— — — — — — — — — — — -002D — — — — — D0 E7 — — — — — — — — — — — — — — — — — — SHL — BH, 1 — — — — — — — — — — — -Освобождение младшего разряда
— — — — — — — — — — — -002F — — — — — B4 0D — — — — — — — — — — — — — — — — — — MOV — AH, 13 — — — — Чтение цвета точки из памяти дисплея
— — — — — — — — — — — -0031 — — — — — CD 10 — — — — — — — — — — — — — — — — — — INT — 10h
— — — — — — — — — — — -0033 — — — — — 0A C0 — — — — — — — — — — — — — — — — — — OR — — AL, AL
— — — — — — — — — — — -0035 — — — — — 74 03 — — — — — — — — — — — — — — — — — — JZ — — BACKGROUND — Проверка нацвет фона
— — — — — — — — — — — -0037 — — — — — 80 CF 01 — — — — — — — — — — — — — — — OR — — BH, 1 — — — — — — — — — — — — Не фон,необходимо вывести точку на печать
— — — — — — — — — — — -003A — — — — — — — — — — — — — — — — — — — — — — — BACKGROUND:
— — — — — — — — — — — -003A — — — — — 42 — — — — — — — — — — — — — — — — — — — — — INC — DX — — — — — — — — — Переключение на следующую строку
— — — — — — — — — — — -003B — — — — — FE CB — — — — — — — — — — — — — — — — — — DEC — BL — — — — — — — — — Уменьшениесчетчика строк в данном проходе
— — — — — — — — — — — -003D — — — — — 75 EE — — — — — — — — — — — — — — — — — — JNZ — NEXT_DOT
— — — — — — — — — — — -003F — — — — — 8A C7 — — — — — — — — — — — — — — — — — — MOV — AL, BH — — — — Печать 8-ми точек
— — — — — — — — — — — -0041 — — — — — E8 0060 R — — — — — — — — — — — — — — CALL PRINT — — — — — — — — — — — — Вывод напечать
— — — — — — — — — — — -0044 — — — — — 5A — — — — — — — — — — — — — — — — — — — — — POP — DX — — — — — — — — — Восстановление номера строки началапрохода
— — — — — — — — — — — -0045 — — — — — 41 — — — — — — — — — — — — — — — — — — — — — INC — CX — — — — — — — — — Переключение на следуюий столбец
— — — — — — — — — — — -0046 — — — — — 81 F9 0140 — — — — — — — — — — — — — CMP — CX, 320 — — — — Все столбцывыведены?
— — — — — — — — — — — -004A — — — — — 75 DD — — — — — — — — — — — — — — — — — — JNZ — NEXT_COLUMN
— — — — — — — — — — — -004C — — — — — B0 0D — — — — — — — — — — — — — — — — — — MOV — AL, 13 — — — — Переход на следующую строку на принтере
— — — — — — — — — — — -004E — — — — — E8 0060 R — — — — — — — — — — — — — — CALL PRINT
— — — — — — — — — — — -0051 — — — — — B0 0A — — — — — — — — — — — — — — — — — — MOV — AL, 10
— — — — — — — — — — — -0053 — — — — — E8 0060 R — — — — — — — — — — — — — — CALL PRINT
— — — — — — — — — — — -0056 — — — — — 83 C2 08 — — — — — — —
— — — — — — — — ADD — DX, 8 — — — — — — — — — — — -Переключение на слдующую группу из 8 строк
— — — — — — — — — — — -0059 — — — — — 81 FA 00C8 — — — — — — — — — — — — — CMP — DX, 200 — — — — Все строкивыведены?
— — — — — — — — — — — -005D — — — — — 72 B3 — — — — — — — — — — — — — — — — — — JB — — NEXT_ROW
— — — — — — — — — — — -005F — — — — — CB — — — — — — — — — — — — — — — — — — — — — RET — — — — — — — — — — — — — — Возврат в BASIC

— — — — — — — — — — — — — — — — — Фиг. 10.5 — Печатьграфического экрана (начало)
— — — — — — — — — — — -0060 — — — — — — — — — — — — — — — — — — — — — — — PRINT_SCREEN — — — — ENDP

— — — — — — — — — — — -0060 — — — — — — — — — — — — — — — — — — — — — — — PRINT — — — — — PROC NEAR
— — — — — — — — — — — -0060 — — — — — 52 — — — — — — — — — — — — — — — — — — — — — PUSH DX
— — — — — — — — — — — -0061 — — — — — B4 00 — — — — — — — — — — — — — — — — — — MOV — AH, 0 — — — — — — — — — — — — Печатьсимвола, находящегося в регистре AL
— — — — — — — — — — — -0063 — — — — — BA 0000 — — — — — — — — — — — — — — — -MOV — DX, 0
— — — — — — — — — — — -0066 — — — — — CD 17 — — — — — — — — — — — — — — — — — — INT — 17h
— — — — — — — — — — — -0068 — — — — — 5A — — — — — — — — — — — — — — — — — — — — — POP — DX
— — — — — — — — — — — -0069 — — — — — C3 — — — — — — — — — — — — — — — — — — — — — RET
— — — — — — — — — — — -006A — — — — — — — — — — — — — — — — — — — — — — — PRINT — — — — — ENDP
— — — — — — — — — — — -006A — — — — — — — — — — — — — — — — — — — — — — — CODE ENDS
— — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — — -ENDA


— — — — — — — — — — — Фиг. 10.5 — Печать графического экрана (продолжение)

— — — — — Как же обратиться к этой процедуре изпрограммы, написанной на
— — — языке Бейсик? В языке Бейсик существуютдва способа подключения
— — — подпрограмм. Во время работы интерпретаторБейсика использует
— — — оставшуюся память системы (до 64 кбайт) вкачестве рабочей области.
— — — Если в системе более 96 кбайт памяти,часть памяти будет не
— — — доступна для интерпретатора Бейсика. Лучшевсего поместить нашу
— — — процедуру в эту область. Если свободнойобласти памяти нет, то
— — — можно специально выделить некоторый объемпамяти из рабочей области
— — — интерпретатора Бейсика для храненияподпрограммы. В данном примере
— — — подпрограмма будет храниться вне рабочейобласти интерпретатора
— — — Бейсика. В следующем примере будетпоказано, как включить процедуру
— — — в контролируемую интерпретатором Бейсикаобласть памяти.

— — — — — На Фиг. 10.6 показана последовательностьдействий для
— — — подготовки подпрограммы к дальнейшемуиспользованию.
— — — Соответствующая информация приведена вприложении C справочника по
— — -языку Бейсик. Программа (на Фиг. 10.6) предназначена для машины с
— — — оперативной памятью 96 кбайт и более.Программа ассемблируется
— — — обычным образом. При редактировании связейзадается опция /H.
— — — Редактор связей создает файл типа .EXEтаким образом, что программа
— — — загружается в верхние адреса оперативнойпамяти, а не с самого
— — — низкого из доступных адресов.

— — — — — Чтобы подключить процедуру к программе,написанной на языке
— — — Бейсик, нам потребуется программа DEBUG.После загрузки программы
— — — на языке Бейсик во время работы программыDEBUG и уточнения
— — — значений регистров, загружаем процедуру наязыке ассемблера.
— — — Приведенный пример реализован на машине спамятью 128 кбайт.
— — — Значение регистра CS, равное 1FF9H,указывает на то, что программа
— — — помещена в 70H байт от конца оперативнойпамяти. Заметим, что

— — рассматриваемая программа имеет объемоколо 6AH байт, так что
— — — редактор связей разместил программу ссамого старшего адреса
— — — памяти, допускающего выравнивание по границепараграфа. Следует
— — — также заметить, что эта программа являетсясегментно —
— — — перемещаемой. Это означает, что ее можноперемещать в памяти,
— — — поскольку первая ее команда имеет смещение0 относительно текущего
— — — сегмента кода. При переносе этой программына машину с большим или
— — — меньшим объемом памяти эта особенностьоказывается решающей.
A

— — — — — B&gt-A:MASM FIG10-5,,,-
— — — — — The IBM Persona Computer MACRO Assembler
— — — — — Version 1.00 (C)Copyright IBM Corp 1981

— — — — — Warning Severe
— — — — — Errors — — — — — Errors
— — — — — 0 — — — — 0

— — — — — B&gt-A:LINK FIG10-5,,,/H-

— — — — — IBM Personal Computer Linker
— — — — — Version 1.10 (C)Copyright IBM Corp 1982

— — — — — -Warning: No STACK segment

— — — — — There was 1 error detected

— — — — — B&gt-A:DEBUG A:BASIC.COM
— — — — — -R

— — — — — AX=0000 BX=0000 CX=2B80 DX=0000 SP=FFF0BP=0000 SI=0000 DI=0000
— — — — — DS=04B5 ES=04B5 SS=04B5 CS=04B5 IP=0100 NVUP DI PL NZ NA PO NC
— — — — — 04B5:0100 E91329 — — — — — — JMP — — — 2A16
— — — — — -NFIG10-5.EXE
— — — — — -L
— — — — — -R

— — — — — AX=0000 BX=0000 CX=006A DX=0000 SP=0000BP=0000 SI=0000 DI=0000
— — — — — DS=04B5 ES=04B5 SS=1FF9 CS=1FF9 IP=0000 NVUP DI PL NZ NA PO NC
— — — — — 1FF9:0000 B01B — — — — — — — — — MOV — AL,1B

— — — — — -RSS
— — — — — SS 1FF9
— — — — — :4B5

— — — — — -RCS
— — — — — CS 1FF9
— — — — — :4B5

— — — — — -RIP
— — — — — IP 0000
— — — — — :100

— — — — — -G

— — — — — —- В интерпретаторе Бэйсика введитекоманды

— — — — — DEF SEG = &amp-H1FF9
— — — — — BSAVE «FIG10-5»,0,&amp-H70

— — — — — — — — — — — — -Фиг. 10.6 (а) Создание подпрограммы для Бэйсика
— — — — — B&gt-A:MASM FIG10-5,,,-
— — — — — The IBM Persona Computer MACRO Assembler
— — — — — Version 1.00 (C)Copyright IBM Corp 1981

— — — — — Warning Severe
— — — — — Errors — — — — — Errors
— — — — — 0 — — — — 0

— — — — — B&gt-A:LINK FIG10-5,,,/H-

— — — — — IBM Personal Computer Linker
— — — — — Version 1.10 (C)Copyright IBM Corp 1982

— — — — — -Warning: No STACK segment

— — — — — There was 1 error detected

— — — — — B&gt-A:DEBUG A:BASIC.COM /M:&amp-H8000
— — — — — -R

— — — — — AX=0000 BX=0000 CX=2B80 DX=0000 SP=FFF0BP=0000 SI=0000 DI=0000
— — — — — DS=04B5 ES=04B5 SS=04B5 CS=04B5 IP=0100 NVUP DI PL NZ NA PO NC
— — — — — 04B5:0100 E91329 — — — — — — JMP — — — 2A16
— — — — — -NFIG10-5.EXE
— — — — — -L
— — — — — -R
— — — — — AX=0000 BX=0000 CX=006A DX=0000 SP=0000BP=0000 SI=0000 DI=0000
— — — — — DS=04B5 ES=04B5 SS=0FF9 CS=0FF9 IP=0000 NVUP DI PL NZ NA PO NC
— — — — — 0FF9:0000 B01B — — — — — — — — — MOV — AL,1B

— — — — — -RSS
— — — — — SS 0FF9
— — — — — :4B5

— — — — — -RCS
— — — — — CS 1FF9
— — — — — :4B5

— — — — — -RIP
— — — — — IP 0000
— — — — — :100

— — — — — -G
Продолжение в комментариях…

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

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