В.Н. Пильщиков - Программирование на языке ассемблера IBM PC (1110551), страница 13
Текст из файла (страница 13)
Таким образом, эта коь(аида очепь похожа иа комагщу САН., ио только вызывает процедуры более "хитрым" способом. Отметим, что по комэиде Р)Т можио сгенерировать прерымщие с любым иомером, например, прерывание, соответствующее делению иа 0 или иажатию клавиши иа клавиатуре. Олцако делать этого ие следует, а надо использовать эту комаилу только для вызова процедур ОС. Далее. В состав ОС (имеется в виду дисковая операпиоииая система фирмы М1сгозо(г - М8 ))ОЯ) входит много процедур и для иих ие хватает допустимых номеров прерываний. В связи с этим процедуры обьедиияютея в группы с тем, чтобы процелуры из одной группы вызмвались по прерыванию с одиим и тем же иомером. Процедуры одной группы принято называть фуикциями соответствую-, щего прерывания.
Чтобы различать их, перед выполнением комаиды ВчтТ в регистр АН записывают помер нужной функции: иоч хи, <лонер фуаяпеи> глт <лемэр прериэааея> Получив по комэцде ПЧТ управлеиие, ОС по номеру из регистра АН определяет, к какой именно фушшии произошло обращение, после чего и передает управление ей. Для выполнения функции может потребоваться определенная ииформация (иапример, для функции вывода символа иа экран нужно указать код этого символа).
Такая иифорьпщия передается через репгсгры. Какие именно параметры илло передавать и через какие регистры - зависит от конкретной фуикпии, общих правил здесь иет. Мы ие будем перечислягь иомера всех прерываний и функций ОС, это можио найти в многочисленных книгах по МВ ПОЗ. Мы рассмотрим лишь некоторые лэад-зээсд. пр рзи функции, реалшующие ввод-вмвод и окончание счета программы, - те, на основе котормх чуть позже будут определены операции вмзда-вывода, которыми мы пользуемся в данной книге. Отметим, что все они явщются функциями прерывания с шестнадцатеричнмм номером 21 (десятмчным 33). 13.23.
Некоторые функции прерывания 21Ь Завэршэидв программ и Завершив все свои действия, програьпга обязана вернуть управление операционной системе, чтобы пользователь мог продолжить работу на ПК. Такой возврат, соответствующий операции "завершить программу", реализуется функцией 4СЬ прерывания 21Ь: ИОт ИЬ,<код эаээриэвак>' нот ьл,зси хнт 21и Каждан программа, вообще говора, обязана сообщить, успешно или нет она швершила свою работу.
Дело в том, что любая программа вызывается из кахой-то другой программы (например, из операшюнной снстемм), и иногда вызвавшей программе, чтобы правильно продожкить работу, надо зназь, выполнила ли вызванная программа все, что надо, или она проработала с ошибкой. Такая информациа передается в виде када завершения программы (некоторого целого числа), который должен быть нулевым, если программа проработала правильно, н' ненулевыы (каким именно - оговаривается в каждом случае особо) в противном случае. (Узнать код завершения вызванной програмым можно с помощью функции 4РЬ прерывания 21Ь.) Потребуется этот код илн нет, прогрэыма все равно должна выдать его. Вывод иа экран (э шэксшээаэг режима) Дяя вывода одного сиывола на экран ПК исповьзуепж функшм 02 прерывания 21Ь: иот вк,<код эааодамото сзаюолэ> нот зл,з 1нт 21и Выводимый символ высвечивается в позиции курсора (что бы там ни было записано), после чего курсор сдвнгаетса на одну позицию вправо.
Если курсор находился в конце строки экрана, то он перемещается на начало следующей строки, а если курсор был в конце последней строки экрана, то содержимое экрана сдвигаетсв на одну строку вверх, а внизу поавллетса пустая строка, в начало которой н устанавливаетса курсор. Особым образом осуществляется вывод символов с кодами 7, 8, 9, 10 (ОАЬ) и 13 (01)Ь).
Символ с кодом 7 (Ье11, звонок) на экране не высвечиваегса (н курсор не сдвигается), а вызывает звуковой сигнал. Символ с кодом 8 (Ьасйзрасе, шаг назад) вошращает курсор на одну позицюо влево, если только он не был в самой левой позиции строки. Символ с ходоы 9 (гаЬ, табуащия) сме- 244 пиелеммироввиие ие ломке ассемблера гнм Рс шает курсор вправо на ближайшую позицию, кратную 8. Символ с кодом 10 (11пе Геед, перевод строки) перемещает курсор в следующ)ло строку экрана, оставляя его в той же колонке.
Символ с кодом 13 (сагпяе гецлп, возврат каретки) устанавливает курсор на начало текущей строки; вывод подряд символов с кодами 13 и 10 означает перевод курсора на начало следующей строки. Вля вывода на экран строки (последовательности символов) можно, конечно, использовазь функшяо 02, однако сделать это можно и за один прием с помощью фуншщи 09 прермвания 21Ь: вя:вх г начальная алрос оэроюз иос лн,в гнт 21ь Перед обращением х этой функции в репгстр РБ должен быть помещен номер того сегмента памяти, в котором находится выводимая строка, а в регистр РХ- смещение строки внутри этого сегмента.
При этом в конце строки должен находиться символ 5' (код 24Ь), юпормй служит прюнэхом ковша строки и сам не выводится. Среди фушший 1)03 нет такой, которая выловит числа. Такую операцию, если надо, приходится реализоапь на основе рассмотренных функций. ВееО о кллеиаюуры При нажатии (в любой момент) клавиши на клавиатуре ее код (соответ. ствуюший символ) юноситсл опепэционной системой в специальный буфер ввода, откуда эти ходы будут затем считываться функциямн ввода. Тем самым возможен "досрочный" ввсп: символы могут быть набраны еще до того, хак программа начнет ввод. Размер этого буфера ОС - 15 позиций, поэтому если до выполнения какой-нибудь функции ввода уже было нюкато 15 клавиш, то на нажатие 1б-й и последующих клавиш ОС не реагирует (кроме выдачи звукового сигнала).
По мере считывания из этого буфера коды сдвигаются в его начало и кодм новых нажатых клавиш дописываются в конец буфера; функции ввода всеща считывают символы из начала буфера. Если вызвана функция ввода, а в буфере нет никахих символов, то ОС ожидает нажатия клавиши. Если программа не желает вводить символы, которые были набраны досрочно, то она должна очистить буфер ввода ОС, для чего следует выполнить функцию ОСЬ (12) прерывания 21Ь при нулевом репютре А1:.
иоч ьь,е моч лн,ось гит лзь Из всех функций 1303, реализующих ввод с клавиатуры, мы рассмотрим только одну - функцию ОАЬ (10) прерыванию 21Ь, с помощью которой можно ввестИ сразу несколько символов (строху) и когорал допускает редактирование набирае. мого текста: вася-э юл. и р вэв Па:ВХ ° адрес буаерэ для эаээсэ ээедеээоа стрехи иот ьа,саь пгт хза Эта функция вводит символы до тех пор, поха не будет нажата клавиша Епгег, и записывает их в указанный буфер. Вводимые символы высвечиваются на экране (ввод с эхом).
Пока не нажата клавиша Епгег, набираемый текст можно редактировать с поьющыо следующих клавиш: +-, Васхэрасе - отмена последнего символа Езс - отмена всего набранного текста Буфер, начальный адрес которого задается в регистрах Рб и РХ (это не буфер ОС, а буфер программы), должен изгсть следующую структуру: шах и з1 з2 ... зп СК 0 1 2 3 и+1 и+2 шах+1 Перед обращением к функции в начальный баГгт (с индексом 0) буфера должно быть записано число (шах), указывающее максимальное количество символов, которое имеет право ввести эта функция (размер буфера должен быть рассчитан на это количество). Если уже введено шах-1 символов, то следующие символы не вводятся и не записываются в буфер, а лишь раздается звуковой сигнал (шах-ым символом будет код клавиши Епгег).
Число (и) реально введенных символов записывается функцией в байт буфера с индексом 1, а свми символм - начиная с позиции, имеющей индекс 2. В (и+2)-ю позицию буфера записывается "конец строки" Сй (код 13), соответствующий клавише Епгег, однахо в числе и он не учитмвается.
Пример: ввг пв зо, г, зо рог<' '> ;э сегменте деээээ ьха пх,ввг иот ан,оьь гнт 21ь Если при вводе были набраны символы АВС, то содержимое буфера В()Р будет следующиьс ВОГ(С1-ЗС, Вщцг)-З, ВВГ121-ЭЗЬ <х д Ь1, ВВГ(З1-ЭЗЬ, ВОГ(Э)-ЭЗЬ, Вог151 13 <са)р оателэлее беате ле лелееетае 13З. Операции ввода-вывода Кэк ватно, функции ОС реализуют очень полезные, но, к сожалению, слишком мелкие операции ввода-вывода.
Например, с их помощью можно вывести на экран символ, но нельзя вывести число. Это не очень приятно. Во-первых, более крупные операции (типа вывода чисел) приходится реализовывать в программах кюкдый раз заново. Во-вторых, отсутствие таких операций вмзывает Лноюг-миэи- явн пваевммиюввниа на замяв ассемблера ИЫ лп 13ЗЛ. Сиена храиениа и подключения операций ваада-вывода Вначале рассмотрим схему хранения операций ввода-вывода (ВВ) и подключения нх к прогрш|мам: 1О.АЗМ Р.АЗМ 1пс1 го.аип макросм процедур В — ~'~МАЕМ М-юР,ОВ1-и~ ЫЯД вЂ” зь Р.ЕХЕ 1ОРКОС.ОВ1 / программа Часть операций ввода-вывода реализована в виде процедур, описания которых собранм в отдельном модуле, хранящемся в файле с именем 1ОРКОС.АЗМ (текст модуля приведен ниже). Предполагается, по этот модуль заранее отгранслнрован и в виде обьехтного модула записан в файл с именем 1ОРКОС.ОВ1.