Бройдо В.Л., Ильина О.П. Архитектура ЭВМ и систем (2006) (1186249), страница 83
Текст из файла (страница 83)
Выражение может быть: [3 константой: сопэ1 ОВ 56; сопз1 ОЧЧ 1936; сопз1 00 ЗЕРН. Обязательно следует учитывать диапазон и вместимость байта, слова и т. д.; так, для ОВ константа не может быть больше 255, для ОЧЧ вЂ” 65 535, для 00 — 65 535 — 1 - 4 294 967 295; 13 вектором или таблицей: 1аЫе1 ОВ 30, 4, -15, О, О, О, 56; 1аЫе2 ОЪЧ 1936, 3004, 56, 15. В одном псевдооператоре допускается поместить строку до 132 позиций, причем вместо повторения одного и того же значения несколько раз (О в 1аЫе1) можно использовать псевдооператор 00р (г[пр![саге — дублировать): 1аЫе1 ОВ 30, 4, -15, 3 оор(0), 56); 13 строкой символов: в1г1 ОВ 'Вы ввели слишком большое число", згг2 ОВ 'Ваб совгпапП", в псевдооператоре ОВ строка может содержать 255 символов, во всех остальных (ОЧЧ, 00, 00, ОТ) — только 2 символа.
13 пустым полем: ро1е1 ОВ?; ро!е2 ОЧЧ 12 Пор(?), при этом в элементы резервируемой памяти при загрузке программы ничего не записывается (заносится не О, как, например, в директиве ро1еЗ ОЧЧ 5 оир(0), а просто резервируются ячейки памяти); (з символическим именем переменной: чаг1 ОЧЧ Пер; чаг2 ОО чес1ог (одна переменная определяется адресом другой, в директивах указывать оПае1 не надо, поскольку имя переменной воспринимается как ее адрес). Такой вариант подходит, например, для хранения адресов ячеек памяти, меток, на которые допустимо ссылаться в программе (чаг1 ОЧЧ ОЧвр), причем, если переменная находится в том же сегменте, что и ссылающаяся команда, то достаточно в качестве адреса указать только смещение (2 байт), то есть обойтись ОЧЧ; если же Глава 18.
Элементы программирования на языке ассемблера переменная находится в другом сегменте, то необходимо указать и сегмент, и смещение (всего 4 байт), то есть следует использовать уже ОО (чаг2 ОО чес1ог); П простым выражением: 1п1 08 80*3; 1п2 Очч (П!зр) + 256, вычисляемым, разумеется, только при трансляции программы. Директивы определения сегментов и процедур Сегмент определяется псевдооператорами: иия сег зедвепС иия сег епбз В программе можно использовать четыре сегмента (по числу сегментных регистров) и для каждого указать соответствующий регистр сегмента псевдооператором А88ОМЕ (аззцгпе — присвоить), например: собезед зебвепг аззцве С5:собезед.
05:батазед. 55:зтасХзед собезед епбз В директиве А88ОМЕ регистр сег:нмя сег [, ], в частности, А88ОМЕ сз:собезед, указывается, что для сегмента нмя сег (сооезед) выбран регистр регистр сег (С8). После директивы А88ОМЕ следует явным образом загрузить адрес начала сегмента данных в регистр 08: воч АХ, батазед ноч 05. АХ Подобная же инициализация сегментных регистров С8 и 88 выполняется автоматически (по умолчанию). Процедура определяется псевдооператорами: иня процедуры ргос [1аг) ...
гет иия процедуры епбр При определении процедуры после ключевого слова ргос должен быть указан атрибут дистанции пеаг или 1аг; если этого атрибута нет, то по умолчанию подразумевается пеаг. Обычно процедура должна заканчиваться командой ге1 (гегцгп). Если процедура объявлена как пеаг, то обращение к ней (сад) должно производиться из того же сегмента; если ргос 1аг, то из любого сегмента (в этом случае командой ге1 из стека при возврате будет извлечено два слова: для 1Р и для С8).
Директивы управления трансляцией Их несколько, наиболее часто используется Е[ч0. Директива Е[ч0 отмечает конец программы и указывает ассемблеру, где завершить трансляцию. Формат: ЕНО [имя программы]. 377 Программирование работы с дисплеем Краткие сведения о программировании процедур работы с устройствами ввода-вывода Процедуры ввода-вывода в ПК выполняются, как правило, по прерываниям. Состав и использование основных видов прерываний и служебных функций 005 прерывания 21Н рассмотрены в работах [10, 351.
Ниже мы кратко остановимся на вопросах программирования ввода-вывода лишь прерываний для отображения информации на дисплее, ввода с клавиатуры, вывода на принтер и работы с файлами. Программирование работы с дисплеем Задание режимов работы и обмен данными с дисплеем можно выполнять при прерываниях В105 типа 10Н, а вывод данных на дисплей — и при прерываниях ПОИ типа 21Н. Для уяснения отличий прерываний В105 от прерываний РОЯ рассмотрим в качестве примера несколько функций видеопрерываний В105.
Видеооперации с прерыванием 10Н ВЮВ Это прерывание обеспечивает выполнение 16 различных процедур работы с дисплеем (идентифицируются содержимым регистра АН). Приведем самые важные из ннх: 1. Перемещение курсора в заданную позицию: АН = 2. Координаты курсора (строка, столбец) предварительно засылаются, соответственно, в регистры йН, 01 В регистре ВН указывается номер страницы буфера: по умолчанию и в графическом режиме ВН - О. 2. Очистка экрана дисплея: АН = 6 и А1 = 0 или АН = 7 и А1. - О.
3. Чтение символа, находящегося в текущей позиции курсора„и его атрибута (только для текстовых режимов): АН = 8. В регистре ВН указывается номер страницы буфера. Считанный символ возвращается в А(., а его атрибуты — в АН (атрибуты символа — это его характеристики: цвет, цвет фона, яркость, инвертирование, мигание и т. д.). 4. Установка видеорежима изображения (текстовый, графический, цветность, формат, разрешающая способность и т. и.): АН = О. Видеорежим определяется содержимым регистра Аь.
5. Запись новых атрибутов символа и вывод символа в текущую позицию курсора: АН = 9. Прочие регистры должны содержать: О А1. — записываемый символ; О В1. — его атрибуты или цвет (в графическом режиме); О ВН вЂ” номер видеостраницы; О СХ вЂ” счетчик записываемых символов (число повторений символа). 378 Глава 18.
Элементы программирования нв языке ассемблера 6. Вывод символа в текущую позицию курсора: АН = 9 и ВС- О. Содержимое дг, ВН и СХ аналогично п. 5. 7. Чтение текущего видеостатуса: АН - ОгЬ. Возвращает: в АС вЂ” текущий режим; в АН вЂ” число столбцов на экране; в ВН вЂ” активную страницу буфера. 8. Вывод строки символов: АН = 13Ь и АС - О. Прочие регистры должны содержать: О Е8:ВР— указатель строки (ее начальный адрес в памяти); О СХ вЂ” длину строки; О ОХ вЂ” строку дисплея; О ВН вЂ” номер страницы буфера. Видеооперации с прерыванием 21Н 008 О Вывод символа на экран дисплея: АН - 2 или АН = 6 и ОС <> ОГНЬ. В регистре Ог должен быть А8СП-код символа Фрагмент программы (вывод символа «Си): еоч АН.
б еач Ог. 43Н ; 43Н вЂ” это А5С!1-код сиивола С тпг 21н О Вывод строки символов: АН - 9 (чаше всего используемая функция). В регистрах 08:ОХ должен находиться начальный адрес строки символов, которая обязана заканчиваться символом 8. Пример фрагмента программы (отображение текста 'вывод строки символов8'): Техг бЬ 'вывод строки сииволовэ' ноч АН, 9 еоч Ох. оттэег гехг : это адрес выводииой строки тпг 21Н О Ввод-вывод из файла через логический номер. Стандартные файловые логические номера определяют тип и устройство ввода-вывода: О 0 — ввод с клавиатуры; О 1 — вывод на экран дисплея; О 2 — вывод на экран сообщения об ошибке; О 3 — ввод-вывод на внешнее устройство; О 4 — вывод на печать.
Для ввода предназначена функция АН - ЗгЬ прерывания 21Н, для вывода служит функция АН - 40Ь прерывания 21Н. В регистр СХ предварительно заносится число вводимых-выводимых байтов, а в регистр 0Х записывается начальный адрес поля памяти для ввода-вывода. В случае успешного завершения процедуры ввода-вывода обнуляется флаг переноса СЕ, а в регистре АХ возвращается количество фактически переданных байтов. При неудачной операции флаг СГ устанавливается в 1, а в регистр АХ заносится код ошибки. Приведенный ниже пример содержит фрагмент программы для вывода на экран текстового файла техт, содержащего 50 байт: гехг бЬ 50 бирС ') яоч АН, 40Н 379 Программирование работы с клавиатурой «оч ВХ.
1; указание устройства вывода воч СХ, 50 ; указание числа выводикых байтов «ач ОХ, оттзег гехт; ух««ание начального адреса : поля паняти. содержащего текст тпт 21Н Программирование работы с клавиатурой При программировании работы с клавиатурой могут быть использованы прерывание 16Н В105 и прерывание 21Н (АН - 1, 6, 7, 8, А, В, С) ЕгОЯ. Прерывание 16Н В108 предусматривает довольно простые операции обмена данными с клавиатурой, полезные при написании программ, выполняемых независимо от операционной системы 1)ОБ.
Так, при АН - 0 и 1 считываются из буфера клавиатуры зсап-код клавиши в регистр АН и АБСП-код клавиши в регистр АС; при АН - 2 в АС возвращается байт состояния клавиатуры — состояние управляющих клавиш: ЗПйй Стгй Ай, Вегой Соей, Ныгп Соей и!пвепй при АН - 3 — устанавливаются режимы работы клавиатуры в 1ВМ РС)г. Ввод с клавиатуры по прерыванию 21Н 1)ОБ предполагает: 1. Чтение символа с клавиатуры (с ожиданием ввода) и отображение символа на экране дисплея: АН - 1 или АН = 6 и 0С - ОРГ)т; то же, но без эха-отображения символа на экране дисплея: АН - 7 или АН = 8. Считанный символ (АБСП-код) помещается в регистр АС («сап-код не передается). Если к моменту запроса на чтение символа клавиша еще не нажата, то управление прерванной программе не будет возвращено до тех пор, пока это не будет сделано.
Если код клавиши расширенный (клавиши гт-ртО, АИ, Стй и т. д.), необходимо повторное чтение. Пример фрагмента программы чтения символа: еоч АН, 1 тпг 21Н 2. Чтение строки символов с буферизацией: АН = ОА)т. Для инициализации такого чтения необходимо: О задать буфер, указав в нем число символов строки, подлежащих вводу, директивой Ьи1 0В и, О, О, ..., О, О (Ьыт — имя поля, которое, в принципе, может быть и любым другим); количество нулей в директиве должно быть на 2 больше, чем и (п — максимальное количество вводимых символов), на место следующего нуля после ввода будет записано количество фактически введенных символов, на место последующих нулей будут введены АЯСП-коды символов строки и еще один нуль для кода клавиши Ептег — 13; О занести в регистр 0х адрес буфера. При выполнении рассматриваемого прерывания управление прерванной (основной) программе не возвратится до тех пор, пока не нажаты все нужные клавиши и клавиша Ептег.
При нажатии каждой очередной клавиши ее код записывается в буфер клавиатуры и отображается на дисплее, но из буфера по- 380 Глава та. Элементы программирования нв языке ассемблера ступит в основную программу (в поле Ьыт) только после нажатия клавиши Ептег. Если до Ептег клавиш нажато больше, чем указано в буфере, то раздастся звуковой сигнал и лишние символы восприняты не будут, Пример фрагмента программы чтения строки символов: Ьыт ОВ 9.0,0,0,0.0.0.0,0.0,0.0 яоч АН, ОАН яоч ОХ, оттает Ьыт тпт 21Н В поле буфера будут записаны АБСП-коды символов строки, и если в программе предусмотрены операции над двоичными кодами символов (цифр) строки, то есть если она предполагает ввод числового значения, то необходимо преобразовать АБСП-коды в двоичный код числа.