Функции dos int 23h адрес выхода по ctrl break


Иллюстрированный самоучитель по задачам и примерам Assembler

Функции MS DOS для работы с консолью

Прямой ввод с эхом символа с клавиатуры (06h int 21h)

Функция 06h также позволяет ввести один символ с клавиатуры. Но в отличие от функции 01h она не ожидает ввода при отсутствии символа в буфере. Вводимый символ отображается на экране (эхо).

Вход: АН = 06h – чтение символа с эхом без ожидания;

  • DL = 0ffn – признак того, что функция 06h используется для ввода;
  • если DL 0ffn, то функция используется для вывода символа (см. ниже).

Выход: если ZF=0, то AL = ASCII-код символа; если ZF-1, то символа в буфере нет.

Результаты работы этой функции необходимо оценивать прежде всего по значению флага ZF. Если ZF=0, то функция поместила в регистр AL ASCII-код символа или 0. Наличие нуля в регистре AL говорит о том, что в буфере клавиатуры находится расширенный ASCII-код и необходимо повторить вызов функции с тем, чтобы прочитать его второй байт.

Функция 06h не проверяет наличие в буфере символов нажатия комбинации CTRL + C (CTRL + Break).

Чтение без эха символа с клавиатуры (07h int 21h)

Функция 07h аналогична функции 01h, за исключением того, что вводит символ с клавиатуры без ожидания его ввода, без эха и без проверки нажатия комбинации CTRL + C (CTRL + Break).

Вход: АН = 07h – чтение символа без эха.

Выход: AL = ASCII-код символа или 0 (см. описание функции 01h int 21h).

Наличие нуля в регистре AL говорит о том, что в буфере клавиатуры находится расширенный ASCII-код и необходимо повторить вызов функции с тем, чтобы прочитать его второй байт.

Чтение без эха символа с клавиатуры (08h int 21h)

Функция 08h аналогична функции 01h, за исключением того, что вводит символ с клавиатуры без отображения его на экране (без эха).

Вход: АН = 08h – чтение символа без эха.

Выход: AL = ASCII-код символа или 0 (см. описание функции 01h int 21h).

Наличие нуля в регистре AL говорит о том, что в буфере клавиатуры находится расширенный ASCII-код и необходимо повторить вызов функции с тем, чтобы прочитать его второй байт.

Функция производит проверку нажатия комбинации CTRL + C (CTRL + Break), при наличии которого вызывается прерывание int 23h.

Ввод строки символов с клавиатуры (0ah int 21h)

Функция 0ah вводит строку символов в буфер памяти специального формата. Если символов в буфере клавиатуры нет, то функция ожидает их ввода. Конец ввода – нажатие клавиши Enter (0dh). Формат буфера:

  • первый байт буфера содержит количество символов для ввода с учетом символа 0dh, завершающего процесс ввода;
  • второй байт содержит реальное число введенных символов, но уже без учета завершающего символа 0dh;
  • начиная с третьего байта содержится строка введенных символов с завершающим символом 0dh, максимальная длина строки – 254 символа.

Вход: АН = 0ah – ввод строки в буфер (до 254 символов);

  • DS:DX – адрес буфера, первый байт которого должен содержать количество символов для ввода.

Выход: введенная строка начиная с третьего байта буфера по адресу в DS:DX, длина строки во втором байте буфера.

Перед вызовом функции 0ah в первый байт буфера необходимо поместить значение максимальной длины строки. Если первый байт равен нулю, то вызов функции игнорируется и программа продолжает выполнение без ожидания ввода строки.

Функция производит проверку нажатия комбинации CTRL + C (CTRL + Break), при наличии которого вызывается прерывание int 23h.

DOS Fn 35H: дать вектор прерывания

Читайте также:

  1. N-МЕРНОЕ ВЕКТОРНОЕ ПРОСТРАНСТВО».
  2. X1, X2, … , Xn – вектора множества X
  3. Аннулирующий многочлен вектора, пространства
  4. Базис и координаты вектора.
  5. Базис системы векторов. Координаты вектора в данном базисе. Разложение вектора по базису — существование и единственность.
  6. Базис. Координаты вектора в базисе
  7. Базис. Координаты вектора в базисе
  8. Базис. Розкладання вектора по базису
  9. В векторной графике
  10. В векторной форме
  11. В этой формуле тензор устанавливает соответствие в 4-пространстве между векторными полями и .

Выход

Вход

DOS Fn 34H: адрес статуса реентерабельности DOS

Выход


Вход

  • AH = 33H
  • AL = 0 чтобы опросить текущий статус контроля Ctrl-Break
  • AL = 1 чтобы установить статус контроля Ctrl-Break
  • DL = требуемый статус (0=OFF, 1=ON) (только при AL=1)
  • DL = текущий статус (0=OFF, 1=ON)

Описание:

если AL=0, в DL возвращается текущий статус контроля Ctrl-Break. если AL=1, в DL возвращается новый текущий статус. когда статус ON, DOS проверяет на Ctrl-Break с консоли для большинства функций (исключая 06H и 07H). при обнаружении, выполняется INT 23H (если оно не перехватывется, то это снимает процесс). когда статус OFF, DOS проверяет на Ctrl-Break лишь при операциях стандартного в/в, стандартной печати и стандартных операциях AUX.

  • AH = 34H НЕТ В ДОКУМЕНТАЦИИ
  • ES:BX = адрес флага активности DOS

Описание:

Эту недокументированную функцию использует PRINT (фоновый процессор печатного спулинга) в момент его установки, так что он может позднее определить, можно ли использовать файловые функции DOS.

При возврате из этой функции ES:BX содержит адрес внутреннего флага DOS, указывающего, выполняется ли в данный момент какая-либо функция DOS. когда спулеру PRINT требуется открыть файл (или использовать какую-либо функцию DOS), он проверяет этот флаг. если ES:[BX] содержит не 0, фоновая программа (TSR, либо popup) НЕ ДОЛЖНА использовать никаких функций DOS.

Резидентные popup-программы часто активизируются по прерыванию от таймера или клавиатуры. так как это может произойти в любой момент, не исключено, что в этот момент будет выполняться какая-либо функция DOS. если теперь popup вызовет функцию DOS, это разрушит стек DOS и, вероятно, приведет к катастрофической ошибке. Путем проверки этого флага popup может определить, возможны ли вызовы функций DOS.

Это, однако, осложняется тем фактом, что COMMAND.COM и некоторые другие программы проводят большую часть времени, запросив ввод с клавиатуры через функцию 0aH (дать строку). таким образом, флаг почти всегда взведен, и на службу DOS наложено табу.

Вы можете выйти из положения, перехватывая INT 21H и отслеживая вызовы функции 0aH. когда приходит такой запрос, не выполняйте его немедленно. Вместо этого организуйте цикл, в котором с некоторой задержкой вызывайте функцию 0bH (дать статус ввода). Циклите, пока не заметите, что нажата клавиша. после этого можно выйти из цикла и вызвать функцию 0aH. Понятно, что при таком способе всегда существует окно времени, в котором проснувшийся popup может без боязни использовать функции DOS. можно также перехватывать INT 28H, если вы любите рисковать.

Предупреждение:

Эта функция не документирована, и опираться на нее рискованно. большинство popup-программ перехватывают INT 21H и отслеживают статус DOS индивидуально (ибо им и так приходится отслеживать 0aH).

| следующая лекция ==>
DOS Fn 33H: установить/опросить статус Ctrl-Break | DOS Fn 40H: писать в файл через описатель

Дата добавления: 2014-01-20 ; Просмотров: 402 ; Нарушение авторских прав? ;

Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет

Функции dos int 23h: адрес выхода по ctrl break

Циклы (т.е. выполнение некоторого участка программы заданное число раз) относятся к числу важнейших элементов программ на любых языках программирования. Для демонстрации техники организации циклов рассмотрим фрагмент программы, в котором создается и выводится на экран текстовый символьный массив, заполненный кодами алфавитно-цифровых и псевдографических символов. Эти символы имеют коды от 32 (пробел) до 254 (сплошной квадратик) . такой массив можно создать в полях данных программы вручную с помощью оператора db :

symbols db 32,33,34,35,36,37,38,39.

однако проще заполнить его данными программным образом (пример 2.1). Для удобства программа примера 2.1 приведена полностью, однако в дальнейшем в примерах будут приводиться только содержательные фрагменты программ. Весь «антураж» (объявления сегментов, инициализация сегментного регистра DS, завершение программы), который всегда остается практически неизменным, будет опускаться.

Рассмотрим содержательную часть программы. Счетчиком шагов цикла служит регистр CX. Поэтому в него надо занести требуемое число шагов цикла (предложение 5), равное длине заполняемого массива. Работа с массивом осуществляется, как правило, с помощью одного из индексных регистров (SI или DI), в которых хранится и наращивается индекс адресуемого элемента массива, т.е. номер байта массива, к которому осуществляется обращение в данном шаге цикла. Поскольку мы начинаем обрабатывать массив с самого начала, в предложении 6 в регистр SI заносится 0. Регистр AL выбран нами для хранения текущего кода символа, отправляемого в массив. С таким же успехом эту роль мог бы выполнить любой другой байтовый регистр — AH, BL, BH, DL или DH (регистры CL и CH, входящие в состав регистра CX, уже заняты). В предложении 7 в регистр AL заносится код первого символа — пробела. Подготовив все необходимые регистры, можно составить само тело цикла. В предложении 8 код из AL отправляется в элемент (байт) массива symbols, номер которого определяется содержимым индексного регистра SI. Это так называемая индексная адресация, у которой существует несколько разновидностей. В частности, в качестве индексного регистра с тем же успехом можно было использовать BX или DI.. в первом шаге цикла заполнится элемент массива с индексом 0. В следующих двух предложениях выполняется инкремент (увеличение на 1) кода очередного символа и индекса в массиве. Наконец, команда loop (петля) (предложение 11) возвращает управление на метку fill, причем делает это ровно 223 раза, в соответствии с исходным содержимым CX.
Чтобы увидеть результаты работы программы, выведем полученный массив на экран. Для этого нельзя воспользоваться уже знакомой нам функцией 09h, потому что где-то в массиве будет содержаться код знака $, а он, как мы уже знаем, не может быть выведен на экран функцией 09h. Поэтому для вывода мы воспользуемся другой функцией DOS, с номером 40h, которая позволяет выводить информацию в файлы и на устройства, в частности, на экран. Приемник выводимой информации определяется числом, заносимым в регистр BX, и называемым дескриптором (или файловый индексом). На этапе инициализации DOS экрану присваивается дескриптор 1, который носит специальное название «дескриптор стандартного вывода». Работа функции 40h с другими дескрипторами будет рассмотрена в дальнейшем. Кроме дескриптора, функция 40h требует, чтобы в регистре CX находилось число выводимых байтов, а в регистре DX (точнее, в паре регистров DS:DX) — адрес выводимой информации (см. строки 14, 15). Наконец команда int 21h передает управление DOS, которая и выполняет требуемую операцию.
В полях данных программы объявлен массив байтов (оператор db), который инициализирован кодами символа «*». Это очень удобный и распространенный прием, который облегчает отладку программы. Если в силу каких-то ошибок в программе массив будет заполнен не весь или не заполнен вообще, на экран будут выведены звездочки. Если же программа работает правильно, исходные звездочки затрутся заполняющими словами.
В заключение отметим еще одну особенность программы 9.1. Это первая программа, в которой выполняется прямое обращение к ячейкам сегмента данных (предложение 8, где заполняется массив с именем symbols). В предыдущих статьях подчеркивалось, что адрес любой ячейки памяти обязательно имеет два компонента: сегментный адрес, хранящийся в одном из сегментных регистров, и относительный адрес, или смещение, которое, в частности, может указываться в команде в виде мнемонического обозначения ячейки. В предложении 8 имеется ссылка на ячейку symbols, т.е. указывается смещение. Каким сегментным регистром будет пользоваться процессор при выполнении этой команды ? Если в команде не указан в явной форме сегментный регистр, по умолчанию используется DS. Собственно, именно в этом предложении мы в начале программы инициализировали регистр DS адресом сегмента данных, в котором расположен массив symbols. Однако для того, чтобы указанное умолчание действовало, необходимо с помощью оператора assume сопоставить DS именно с этим сегментом. Таким образом, определение DS:data в операторе assume стало необходимым только в этой программе, во всех предыдущих можно было обойтись без него.
Рассмотрим теперь вложенные циклы на примере организации программной задержки. Программные задержки широко используются в тех случаях, когда в какой-то точке программы надо приостановить ее выполнение на некоторое время. Такая необходимость часто возникает при программировании относительно медленной аппаратуры компьютера. Если в аппаратуру посылается последовательно несколько управляющих команд, то для того, чтобы дать аппаратуре время их выполнить, между ними включаются программные задержки (на время несколько единиц или десятков микросекунд). Программные задержки значительно большей величины, порядка нескольких секунд, удобно использовать при отладке программ, выводящих на экран некоторую (возможно, отладочную) информацию. Задержка дает возможность программисту проследить результаты выполнения каждого шага программы. В примере 9.2 приведен фрагмент именно такой программы. В дальнейшем часто будут даваться не полные тексты программ, а лишь рассматриваемые фрагменты.

Пример 2.2. Программная задержка.

В примере 2.2 с помощью функции DOS 09h (предложения 3. 5) на экран выводится строка « » с периодом, определяемым программной задержкой. Задержка создается с помощью двух вложенных циклов. Внутренний просто представляет собой команду loop, повторяемую 65535 раз (предложение 9); внешний цикл служит для повторения внутреннего 100 раз. В результате команда loop выполняется 6553500 раз, что, в зависимости от скорости конкретного компьютера, дает задержку приблизительно от одной до нескольких десятков секунд.
Поскольку команда loop выполняется всегда CX раз, этот регистр приходится использовать в каждом цикле заново. Перед входом во внутренний, вложенный цикл текущее значение счетчика внешнего цикла (содержимое CX) сохраняется в стеке командой push, а перед командой loop внешнего цикла восстанавливается командой pop (пары строк 2,12 и 7,10). Разумеется, сохранить значение CX можно где угодно (в любом другом регистре или ячейке памяти), однако команды сохранения в стеке и восстановления из стека эффективнее других в смысле времени выполнения и расходуемой памяти.
Подготовив к выполнению пример 2.2, поэкспериментируйте с длительностью задержки, изменяя число шагов внешнего цикла (предложение 6).

Илон Маск рекомендует:  Стиль программирования

Управление программой с клавиатуры и расширенные коды ASCII.

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

, , и др. Очевидно, что всем этим клавишам назначены определенные скан-коды.
В таблице преобразования, с которой работает системная программа обслуживания клавиатуры, всем таким скен-кодам соответствует нулевой код ASCII. поэтому при нажатии, например, клавиши (скен-код 3Bh) в кольцевой буфер ввода поступает двухбайтовый код 3B00h, а при нажатии клавиши (скен-код 47h) — двухбайтовый код 4700h. Двухбайтовые коды, содержащие на месте кода ASCII ноль, называются расширенными кодами ASCII.
Все функции DOS, предназначенные для посимвольного ввода данных с клавиатуры, позволяют работать и с расширенными кодами ASCII. Для приема с клавиатуры расширенного кода ASCII программа должна вызвать функцию DOS дважды. Первый вызов возвращает младший байт расширенного кода ASCII, т.е. 0. При втором вызове возвращается старший, значащий байт. При этом возникает некоторая неоднозначность. При нажатии «обычных» клавиш каждый вызов функции DOS вводит код одной клавиши. Если же нажата функциональная клавиша, то на ввод кода нажатой клавиши требуется два вызова DOS. Поэтому программа, ожидающая поступления расширенных кодов ASCII, должна проверять каждый введенный код и при поступлении кода 0 выполнять ввод вторично.
Широкое использование интерактивных средств потребовало расширения возможностей ввода с клавиатуры управляющей информации, которую программа должна легко отличать от вводимого текста. С этой целью в компьютерах IBM PC расширенные коды ASCII генерируются не только функциональными клавишами и клавишами управления курсором, но и всеми алфавитно-цифровыми клавишами, если они нажимаются вместе с клавишей . Помимо этого, функциональные клавиши и клавиши управления курсором генерируют различные расширенные коды ASCII в зависимости от того, нажаты ли они в одиночку или в сочетании с клавишами , или . В табл. 13.1. 13.5 приведены значения информационных байтов расширенных кодов ASCII для наиболее употребительных клавиш и их сочетаний.

Таблица 2.1. Информационные байты расширенных кодов ASCII функциональных клавиш.

Клавиша Код клавиши Клавиша Код клавиши Клавиша Код клавиши Клавиша Код клавиши
Dec Hex Dec Hex Dec Hex Dec Hex
F1 59 3Bh F4 62 3Eh F7 65 41h F10 68 44h
F2 60 3Сh F5 63 3Fh F8 66 42h F11 133 85h
F3 61 3Dh F6 64 40h F9 67 43h F12 134 86h

Таблица 2.2. Информационные байты расширенных кодов ASCII функциональных клавиш в сочетании с клавишей Shift


Клавиша Код клавиши Клавиша Код клавиши Клавиша Код клавиши Клавиша Код клавиши
Dec Hex Dec Hex Dec Hex Dec Hex
F1 84 54h F4 87 57h F7 90 5Ah F10 93 5Dh
F2 85 55h F5 88 58h F8 91 5Bh F11 135 87h
F3 86 56h F6 89 59h F9 92 5Ch F12 136 88h

Таблица 2.3. Информационные байты расширенных кодов ASCII функциональных клавиш в сочетании с клавишей Ctrl

Клавиша Код клавиши Клавиша Код клавиши Клавиша Код клавиши Клавиша Код клавиши
Dec Hex Dec Hex Dec Hex Dec Hex
F1 94 5Eh F4 97 61h F7 100 64h F10 103 67h
F2 95 5Fh F5 98 62h F8 101 65h F11 137 89h
F3 96 60h F6 99 63h F9 102 66h F12 138 8Ah

Таблица 2.4. Информационные байты расширенных кодов ASCII функциональных клавиш в сочетании с клавишей Alt

Клавиша Код клавиши Клавиша Код клавиши Клавиша Код клавиши Клавиша Код клавиши
Dec Hex Dec Hex Dec Hex Dec Hex
F1 104 68h F4 107 6Bh F7 110 6Eh F10 113 71h
F2 105 69h F5 108 6Ch F8 111 6Fh F11 139 8Bh
F3 106 6Ah F6 109 6Dh F9 112 70h F12 140 8Ch

Таблица 2.5. Информационные байты расширенных кодов ASCII алфавитно-цифровых клавиш в сочетании с клавишей Alt

Клавиша Код клавиши Клавиша Код клавиши Клавиша Код клавиши Клавиша Код клавиши
Dec Hex Dec Hex Dec Hex Dec Hex
A 30 1Eh J 36 24h S 31 1Fh 1 120 78h
B 48 30h K 37 25h T 20 14h 2 121 79h
C 46 2Eh L 38 26h U 22 16h 3 122 7Ah
D 32 20h M 50 32h V 47 2Fh 4 123 7Bh
E 18 12h N 49 31h W 17 11h 5 124 7Ch
F 33 21h O 24 18h X 45 2Dh 6 125 7Dh
G 34 22h P 25 19h Y 21 15h 7 126 7Eh
H 35 23h Q 16 10h Z 44 2Ch 8 127 7Fh
I 23 17h R 19 13h 129 81h 9 128 80h

Полную таблицу кодов ASCII можно найти в файле HELP в папке TASM(MASM).

Условные переходы.

При использовании кодов ASCII для управления программой возникает необходимость условных переходов. Формат данных переходов имеет следующий вид:

Cmp ах,0;(1)
jсс local_1;(2)

В первой строчке производится сравнение содержимого регистра ax с нулем. Во второй строчке командой jcc ставится какое-либо условие и в соответствии с ним осуществляет переход на метку local_1; Например, если в ax ноль, то команда JE осуществит переход на local_1.

Слова «выше» и «ниже» в таблице относятся к сравнению чисел без знака, слова «больше» и «меньше» учитывают знак.

Таблица 2.6. Таблица условных переходов. Варианты команды Jcc

Код команды Реальное условие Условие для СМР
JA
JNBE
CF=0 и ZF=0 если выше
если не ниже или равно
JAE
JNB
JNC
CF=0 если выше или равно
если не ниже
если нет переноса
JB
JNAE
JC
CF=1 если ниже
если не выше или равно
если перенос
JBE
JNA
CF=1 и ZF=1 если ниже или равно
если не выше
JE
JZ
ZF=1 если равно
если ноль
JG
JNLE
ZF=0 и SF=OF если больше
если не меньше или равно
JGE
JNL
SF=OF если больше или равно
если не меньше
JL
JNGE
SF<>OF если меньше
если не больше или равно
JLE
JNG
ZF=1 и SF<>OF если меньше или равно
если не больше
JNE
JNZ
ZF=0 если не равно
если не ноль
JNO OF=0 если нет переполнения
JO OF=1 если есть переполнение
JNP
JPO
PF=0 если нет четности
если нечетное
JP
JPE
PF=1 если есть четность
если четное
JNS SF=0 если нет знака
JS SF=1 если есть знак

Таблица 2.7. Аналогия с Турбо Паскалем.

Паскаль Ассемблер
If (выражение)
Оператор_1;
Else
Оператор_2;
сmp op1,op2 ;вычисление выражения
jne else1
. ;последовательность команд, соответствующая Оператор_1
jmp endif
else1:
. ;последовательность команд, соответствующая Оператор_2
endif: ;конец условного оператора
;.
While (выражение-условие) do
Begin
Тело цикла
End;
While_begin:
Cmp al,0;вычисление логического выражения “выражение-условие”
Jne end_while;если не равно, то перейти на end_while
. ;тело цикла
jmp while_begin ;переход на начало очередной итерации цикла
end_while: ;конец цикла;
. ;продолжение программы
Repeat
Тело цикла
Until (выражение-условие)
Repeat_begin:
. ;тело цикла
Cmp al,0;вычисление логического выражения “выражение-условие”
Je end_repeat;если равно, то перейти на end_repeat
Jmp Repeat_begin; переход на начало очередной итерации цикла
end_repeat: ;конец цикла;
. ;продолжение программы

Рассмотрим несколько примеров управления программой с клавиатуры. Пусть наша программа вводит с клавиатуры текстовую информацию, и мы хотим предусмотреть возможность аварийного завершения программы при нажатии на функциональную клавишу F10.

Пример 2.3 Завершение программы по F10.

Программа выводит на экран свой запрос « >> », инициализирует регистры BX и SI, которые будут использоваться при записи принимаемых символов в буфер программы, и ставит запрос к DOS на ввод символа с клавиатуры с отображением его на экране (функция 01h). Если код принятого символа равен 0, программа переходит на метку ex_ascii для приема второго байта расширенного кода ASCII и его анализа. Если же поступил код алфавитно-цифровой клавиши, он записывается в буфер txt. В программе используется эффективный способ записи элемента массива с помощью команды mov с базово-индексной адресацией. В этом случае адрес определяется как сумма содержимого обоих используемых в команде регистров. В одном из них (в данном случае BX) хранится базовый адрес массива, в другом (SI) — индекс, т.е. смещение от начала массива. Эффективность команды определяется тем, что исполнительный адрес, т.е. адрес, по которому происходит обращение, не надо извлекать из памяти: его составляющие уже хранятся в регистрах процессора. После занесения введенного символа в буфер txt выполняется инкремент индекса, после чего программа возвращается на ввод очередного символа.
В случае нажатия клавиши или сочетания клавиш, вырабатывающих расширенный код ASCII, программа переходит на метку ex_ascii с целью вторичного выполнения функции DOS ввода символа. Использование функции 08h, которая работает без эха позволяет избавиться от отображения на экране вторых байтов расширенных кодов ASCII. принятый функцией 08h код сравнивается с расширенным кодом ASCII клавиши F10 (44h) и в случае равенства осуществляется выход из программы. Если нажата другая функциональная клавиша, ввод текста продолжается.
Приведенный пример не полон в том отношении, что при аварийном завершении программы результаты ее работы безвозвратно теряются. В реальной программе после ввода пользователем команды завершения (нажатие клавиши F10) следует предусмотреть сохранение на диске результатов ее работы, вывода на экран предупреждающих сообщений и прочее.
Использованный в примере 2.3 метод управления программой характерен тем, что воздействовать на ход выполнения программы можно лишь в тех точках программы, где она ожидает ввода символа с клавиатуры. Во многих случаях желательно иметь средство управления программой, в частности, ее аварийного завершения, в то время, когда программа выполняет некоторые циклические действия, например, обрабатывает и выводит на экран графическое изображение. Если в такой цикл включить вызов функции DOS 01h или 08h, программа, вместо того, чтобы выводить на экран изображение, остановится в ожидании нажатия клавиши. Однако в DOS предусмотрены средства ввода команды с клавиатуры без остановки программы. Для этого используется функция 06h, которая может работать в двух режимах: ввода одиночных символов с клавиатуры и вывода одиночных символов на экран. Эта функция позволяет программе «заглянуть» в буфер ввода с клавиатуры и при наличии в нем символа ввести его в программу, а при отсутствии такового просто продолжить выполнение. Индикатором наличия или отсутствия ожидающего символа является флаг нуля ZF. Если функция обнаружила ожидающий ввод символ, флаг ZF сбрасывается. Если символа нет, флаг ZF устанавливается (обнаружено 0 символов).
В примере 2.4 продемонстрировано использование функции DOS 06h для управления программой в цикле. Управление, как и в предыдущем примере, заключается в аварийном завершении программы при нажатии определенной клавиши (конкретно сочетания Alt/Q).

Пример 2.4 Завершение циклической программы по Alt/Q.

В качестве бесконечного цикла, из которого осуществляется аварийный выход по нажатию Alt/Q, использован периодический (с небольшой задержкой) вывод на экран строки текста.
Для осуществления аварийного выхода из программы в цикл включен вызов функции DOS 06h. Эта функция может работать в двух режимах — ввода с клавиатуры и вывода на экран. Режим определяется содержимым регистра DL в момент вызова функции. Любой код в DL, кроме FFh, приводит к выводу на экран соответствующего этому коду символа. Код FFh (в таблице ASCII ему отвечает «пустой» символ) включает режим ввода с клавиатуры. Команда jnz (jump if not zero, переход, если не нуль) анализирует результат выполнения функции 06h. Если за время прохождения текущего шага цикла не было нажатий клавиш, эта команда «не срабатывает», и следующей командой jmp contrl осуществляется переход на начало цикла. Если же за время шага цикла была нажата какая-либо клавиша, функция 06h сбрасывает флаг ZF, и команда jnz передает управление в точку symb. Здесь прежде всего следует проверить, какой код ASCII ожидает ввода в программу — обычный или расширенный. Если код обычный (не равный 0), он игнорируется и цикл продолжается. Функция DOS 06h работает без эха, и введенный символ не искажает изображение на экране. Если введен расширенный код ASCII, функция 06h вызывается повторно для ввода второго, информационного байта. Далее командой cmp выполняется анализ этого байта. Код 10h — это значащая часть расширенного кода ASCII сочетания Alt/Q. Естественно, в качестве «клавиши завершения» можно выбрать любое другое сочетание. Если нажато Alt/Q, программа завершается; в противном случае цикл продолжается. В результате программный цикл не воспринимает никакие нажатия клавиш, кроме Alt/Q.
Рассмотрим ещё один пример с использованием условий: напишем программу, которая при нажатии F1 выводит одну звёздочку, при нажатии F2 – две звёздочки; F10-выход из программы

Пример 2.5 Нажатие F1 выводит одну звёздочку, нажатие F2 – две звёздочки; F10-выход из программы

Таким образом, видно, что в данной программе организован бесконечный цикл, внутри которого находятся три условия(если нажата F1, если F2, если F10). Первые два условия выполняют нужные действия(выводят звёздочки) и возвращаются в бесконечный цикл, а последнее выполняет выход из программы. Данные условия можно организовать несколько другим способом, используя приведённую выше таблицу “Аналогия с Турбо Паскалем” и таблицу условных переходов.

Средства DOS вывода на экран в текстовом режиме.

Ввод АН = 02h
DL = ASCII-код символа
Вывод Никакого, согласно документации, но на самом деле: AL = код последнего записанного символа (равен DL, кроме случая, когда DL = 09h (табуляция), тогда в AL возвращается 20h).

Эта функция при выводе на экран обрабатывает некоторые управляющие символы — вывод символа BEL (07h) приводит к звуковому сигналу, символ BS (08h) приводит к движению курсора влево на одну позицию, символ НТ (09h) заменяется на несколько пробелов, символ LF (0Ah) опускает курсор на одну позицию вниз, и CR (0Dh) приводит к переходу на начало текущей строки.
Если в ходе работы этой функции была нажата комбинация клавиш Ctrl-Break, вызывается прерывание 23h, которое по умолчанию осуществляет выход из программы.

Функция DOS 06h — Вывести символ без проверки на Ctrl-Break

Ввод АН = 06h
DL = ASCII-код символа (кроме FFh)
Вывод Никакого, согласно документации, но на самом деле: AL = код записанного символа (копия DL).

Эта функция не обрабатывает управляющие символы (CR, LF, HT и BS выполняют свои функции при выводе на экран, но сохраняются при перенаправлении вывода в файл) и не проверяет нажатие Ctrl-Break. Можно заменить в программе dosoutl.asm команду MOV АН,2 на MOV АН,6 и перекомпилировать этот пример, чтобы получить более полную таблицу символов.

Илон Маск рекомендует:  Что такое код setbkcolor

Функция DOS 09h — Вывести строку с проверкой на Ctrl-Break

Ввод АН = 09h
DS:DX = адрес строки, заканчивающейся символом $ (24h)
Вывод Никакого, согласно документации, но на самом деле: AL = 24h (код последнего символа).

Действие этой функции полностью аналогично действию функции 02h, но выводится не один символ, а целая строка, как в программах hello-1.asm и hello-2.asm.
И наконец, последняя функция DOS вывода на экран — недокументированное прерывание 29h.

Эта функция не обрабатывает управляющие символы (CR, LF, HT и BS выполняют свои функции при выводе на экран, но сохраняются при перенаправлении вывода в файл) и не проверяет нажатие Ctrl-Break. Можно заменить в программе dosoutl.asm команду MOV АН,2 на MOV АН,6 и перекомпилировать этот пример, чтобы получить более полную таблицу символов.

INT 29h: Быстрый вывод символа на экран

Ввод AL = ASCII-код символа

В большинстве случаев INT 29h просто немедленно вызывает функцию BIOS «вывод символа на экран в режиме телетайпа», так что никаких преимуществ, кроме экономии байт при написании как можно более коротких программ, она не имеет.

Средства DOS ввода с клавиатуры.



Как и в случае вывода на экран, DOS предоставляет набор функций для чтения данных с клавиатуры, которые используют стандартное устройство ввода STDIN, так что можно использовать в качестве источника данных файл или стандартный вывод другой программы.

Функция DOS 0Ah — Считать строку символов из STDIN в буфер

Ввод АН = 0Ah
DS:DX = адрес буфера
Вывод Буфер содержит введенную строку

Для вызова этой функции надо подготовить буфер, первый байт которого содержит максимальное число символов для ввода (1 – 254), а содержимое, если оно задано, может использоваться как подсказка для ввода. При наборе строки обрабатываются клавиши Esc, F3, F5, BS, Ctrl-C/Ctrl-Break и т.д., как при наборе команд DOS (то есть Esc начинает ввод сначала, F3 восстанавливает подсказку для ввода, F5 запоминает текущую строку как подсказку, Backspace стирает предыдущий символ). После нажатия клавиши Enter строка (включая последний символ CR (0Dh)) записывается в буфер, начиная с третьего байта. Во второй байт записывается длина реально введенной строки без учета последнего CR.
Функция 0Ah предоставляет удобный, но ограниченный способ ввода данных. Чаще всего используют функции посимвольного ввода, позволяющие контролировать отображение символов на экране, реакцию программы на функциональные и управляющие клавиши и т.д.

Функция DOS 01h — Считать символ из STDIN с эхом, ожиданием и проверкой на Ctrl-Break

Ввод АН = 01h
Вывод AL = ASCII-код символа или 0. Если AL = 0, второй вызов этой функции возвратит в AL расширенный ASCII-код символа

При чтении с помощью этой функции введенный символ автоматически немедленно отображается на экране (посылается в устройство STDOUT — так что его можно перенаправить в файл). При нажатии Ctrl-C или Ctrl-Break выполняется команда INT 23h. Если нажата клавиша, не соответствующая какому-нибудь символу (стрелки, функциональные клавиши Ins, Del и т.д.), то в AL возвращается 0 и функцию надо вызвать еще один раз, чтобы получить расширенный ASCII-код.
В трех следующих вариантах этой функции код символа возвращается в AL по такому же принципу.

Функция DOS 08h — Считать символ из STDIN без эха, с ожиданием и проверкой на Ctrl-Break

Ввод АН = 08h
Вывод AL = код символа

Функция DOS 07h — Считать символ из STDIN без эха, с ожиданием и без проверки на Ctrl-Break

Ввод АН = 07h
Вывод AL = код символа

Функция DOS 06h — Считать символ из STDIN без эха, без ожидания и без проверки на Ctrl-Break

Ввод АН = 07h
DL = 0FFh
Вывод ZF = 1, если не была нажата клавиша, и AL = 00
ZF = 0, если клавиша была нажата. В этом случае AL = код символа

Кроме перечисленных функций могут потребоваться и некоторые служебные функции DOS для работы с клавиатурой.

Функция DOS 0Bh — Проверить состояние клавиатуры

Ввод АН = 0Bh
DL = 0FFh
Вывод AL = 0, если не была нажата клавиша
AL = 0FFh, если была нажата клавиша

Эту функцию удобно использовать перед функциями 01, 07 и 08, чтобы не ждать нажатия клавиши. Кроме того, вызов этой функции позволяет проверить, не считывая символ с клавиатуры, была ли нажата комбинация клавиш Ctrl-Break; если это произошло, выполнится прерывание 23h.

Функция DOS 0Ch — Очистить буфер и считать символ

Ввод АН = 0Сh
AL = Номер функции DOS (01, 06, 07, 08, 0Ah)
Вывод Зависит от вызванной функции

Функция 0Ch очищает буфер клавиатуры, так что следующая функция чтения символа будет ждать ввода с клавиатуры, а не использовать нажатый ранее и еще не обработанный символ. Например, именно эта функция используется для считывания ответа на вопрос «Уверен ли пользователь в том, что он хочет отформатировать диск?».

Собственный обработчик нажатия клавиши

02.03.2020, 20:49

Ожидание нажатия клавиши
У меня ниже представлен код. Как сделать что б на указанном участке прорамма приостановилась и.

Блокирование нажатия клавиши
Добрый день.Пытаюсь разобраться с блокированием нажатия определенных клавиш на клавиатуре.К.

Путь прохождения прерывания от нажатия клавиши до отображения на экране
Всем привет. Сижу читаю статьи про прерывания, так для общего просвещения. Так основные принципы.

переключить монитор компьютера в «спящий» режим до нажатия какой-либо клавиши на клавиатуре
Народ, пожалуйста, помогите, если не сложно, очень надо. Препод задал вот такую задачу .

Резидентный обработчик: перехват нажатия «F1» и после этого запись в буфер клавиатуры символа «о»
я пытаюсь разобраться с написанием обработчика и созданием резидентных программ на просторах сети.

03.03.2020, 11:08 2

Shura_deg, проверь статус [Ctrl+Break] функцией дос 33h. Может он сброшен?
Если не принципиальна именно [Ctrl+C], то вполне можно обойтись и комбинацией «расширенных клавиш».
Там намного проше.. После нажатия пимпы — проверяеш не AL, а AH и передаёш управление на нужную ветку:

Создаем вирус и антивирус (34 стр.)

При DL=0FFh выполняет ввод с консоли «Без ожидания», возвращая включенный флаг нуля ZF, если на консоли нет готового символа. Если символ готов, сбрасывает флаг ZF и возвращает считанный символ в AL. Если DL не равен 0FFh, то DL направляется на стандартный вывод.

DOS, функция 07h Нефильтрующий консольный ввод без эха

Выход: AL – символ, полученный через стандартный ввод

Описание. Считывает (ожидает) символ со стандартного входного устройства и возвращает этот символ в AL. Не проверяет на Ctrl-Break, BackSpace и другие.

Для ввода расширенного символа ASCII должна быть вызвана дважды. Для проверки статуса используется функция DOS 0Bh (чтобы не ожидать нажатия клавиши).

DOS, функция 08h Консольный ввод без эха

Выход: AL – символ, полученный через стандартный ввод


Описание. Считывает (ожидает) символ со стандартного входного устройства и возвращает этот символ в AL. При обнаружении Ctrl-Break выполняется прерывание INT 23h.

Для ввода расширенного символа ASCII должна быть вызвана дважды.

DOS, функция 09h Запись строки на стандартный вывод

DS:DX – адрес строки, заканчивающейся символом «$» (ASCII 24h)

Строка, исключая завершающий ее символ «$», посылается на стандартный вывод. Символы Backspace обрабатываются как в функции 02h (вывод на дисплей). Чтобы перейти на новую строку, обычно включают в текст пару CR/LF (ASCII 0Dh и ASCII 0Ah). Строки, содержащие «$», можно передать на стандартное устройство вывода с помощью функции 40h (BX=0).

DOS, функция 0Ah Ввод строки в буфер

DS:DX – адрес входного буфера (Таблица Б-1)

Таблица Б-1. Формат входного буфера

Буфер содержит введенные данные, в конце – символ CR (ASCII 0Dh)

DOS, функция 0Bh Проверка статуса ввода

Выход: AL=FFh, если символ доступен со стандартного ввода AL=00h, если нет доступного символа

Описание. Проверяет состояние стандартного ввода. При распознавании Ctrl-Break выполняется INT 23h.

Используется перед функциями 01h, 07h и 08h, чтобы избежать ожидания нажатия клавиши.

Эта функция дает простой неразрушающий способ проверки Ctrl-Break в процессе длинных вычислений или другой обработки, обычно не требующей ввода. Это позволяет снимать счет по нажатию Ctrl-Break.

DOS, функция 0Ch Ввод с очисткой

AL – номер функции ввода DOS:

AL=01h – ввод с клавиатуры

AL=06h – ввод с консоли

AL=07h – нефильтрующий без эха

AL=08h – ввод без эха

AL=0Ah – буферизованный ввод

Очищает буфер опережающего ввода стандартного ввода, а затем вызывает функцию ввода, указанную в AL. Это заставляет систему ожидать ввод очередного символа.

DOS, функция 0Dh Сброс диска

Сбрасывает диск (записывает на диск все файловые буферы). Файл, размер которого изменился, должен быть предварительно закрыт (при помощи функций 10h или 3Eh).

DOS, функция 0Eh Установить текущий диск DOS

DL – номер диска (0 – A, 1 – B и так далее), который становится текущим

Выход: AL – общее число дисководов в системе

Описание. Диск, указанный в DL, становится текущим. Проверка: используется функция 19h (дать текущий диск). В регистре AL возвращается число дисководов всех типов, включая жесткие диски и «логические» диски (как диск B: системе с одним гибким диском).

AL имеет то же значение, что и LASTDRIVE, указанное в файле CONFIG.SYS, и по умолчанию равно 5.

DOS, функция 0Fh Открыть файл через FCB

DS:DX – адрес неоткрытого FCB (Таблица Б-2)

Таблица Б-2. Формат FCB

AL=00h, если функция выполнена успешно (FCB заполнен)

AL=FFh, если файл не найден или доступ к файлу не разрешен

Файл, описываемый неоткрытым FCB, должен существовать в текущем оглавлении на диске, специфицированном в FCB (0 – текущий, 1 – A, 2 – B и так далее). Если файл не существует, возвращается AL=0FFh. Файл открывается в режиме совместимости. Если поле «Номер диска» в FCB равно нулю в момент вызова, то оно заполняется номером текущего дисковода (1 – A, 2 – B и так далее). Поле FCB «Номер текущего блока» устанавливается в ноль. Поле FCB «Размер логической записи» устанавливается в 80h. Поля даты и размера файла в FCB устанавливаются из оглавления.

DOS, функция 10h Закрыть файл через FCB

DS:DX – адрес открытого FCB (Таблица Б-2)


AL=00h, если функция выполнена успешно

AL=FFh, если файл не найден там, где он находился при открытии с помощью функции 0Fh

Закрывает файл, открытый функцией 0Fh. Файл должен находиться на своем первоначальном месте в текущем оглавлении диска, на котором он был открыт. Если файл найден, оглавление обновляется, файловые буфера сбрасываются и возвращается AL=00h. Если файл не найден, оглавление не обновляется и возвращается AL=FFh.

DOS, функция 11h Найти первый совпадающий файл через FCB

DS:DX – адрес неоткрытого FCB (Таблица Б-2)

AL=00h, если подходящее имя найдено

AL=FFh, если подходящего имени нет

В текущем оглавлении DOS происходит поиск файлов с именем, соответствующим заданному шаблону. При неудаче возвращается AL=0FFh. Если имя найдено, AL очищается, в первый байт DTA помещается номер дисковода (A – 1, B – 2 и так далее), а в следующие 32 байта помещается элемент оглавления для найденного файла.

Можно использовать при вызове расширенный FCB, чтобы выбирать файлы с указанными атрибутами. В этом случае в DTA помещаются: байт FFh, 7 байт нулей, номер диска и элемент оглавления.

DOS, функция 12h Найти следующий совпадающий файл через FCB

DS:DX – адрес неоткрытого FCB (Таблица Б-2)

AL=00h, если подходящее имя найдено

DTA заполнен AL=FFh, если подходящего имени нет

Используется после вызова функции 11h (Найти первый совпадающий файл через FCB) с обобщенным именем файла. Каждый последующий вызов заполняет DTA очередным подходящим элементом оглавления и возвращает AL=00h. Если подходящих имен больше нет, возвращается AL=FFh.

Резервируемая область в FCB сохраняет информацию, необходимую для продолжения поиска. Поэтому не стоит открывать и изменять FCB между вызовами.

DOS, функция 13h Удалить файл через FCB

DS:DX – адрес неоткрытого FCB (Таблица Б-2)

AL=00h, если функция выполнена успешно

AL=FFh, если файл не найден или доступ к файлу не разрешен

Эта функция удаляет все подходящие файлы в текущем оглавлении указанного диска согласно спецификации в FCB. Если подходящие файлы не найдены или если доступ отвергнут (как при попытке удалить файл с атрибутом Read-Only), функция возвращает в регистре AL значение FFh.

DOS, функция 14h Последовательное чтение из файла через FCB

DS:DX – адрес открытого FCB (Таблица Б-2)

AL=00h, если чтение было успешным и DTA содержит данные

AL=01h, если достигнут конец файла (EOF) и данные не считаны

AL=02h, если произошел выход за сегмент (чтения не было)

AL=03h, если EOF и считана усеченная запись (дополнена нулями)

Функция читает файл, специфицированный в FCB. Затем соответственно увеличивает значения полей в FCB.

Перед началом последовательной обработки файла нужно сбрасывать CurRec в ноль, так как функция 0Fh не инициализирует это поле.

DOS, функция 15h Последовательная запись в файл через FCB

DS:DX – адрес открытого FCB (Таблица Б-2)

AL=00h, если запись была успешной

AL=01h, если ошибка переполнения диска (данные не записаны)

AL=02h, если произошел выход за сегмент (записи не было)

Функция записывает файл, специфицированный в FCB. Затем соответственно увеличивает значения полей в FCB.

Перед началом последовательной обработки файла нужно сбрасывать «Номер текщей записи» в ноль, так как функция 0Fh не инициализирует это поле.

DOS буферизует данные, записывая полный сектор за один раз.

DOS, функция 16h Создание файла через FCB

DS:DX – адрес неоткрытого FCB (Таблица Б-2)


Системное программное обеспечение: Учебное пособие

Для того, чтобы оценить ресурс, необходимо авторизоваться.

Настоящее учебное пособие предназначено для подготовки студентов различных вычислительных специальностей, изучающих работу в среде MS-DOS. Для специальности 2201 эта работа может использоваться в курсах «Системное программное обеспечение», «Проектирование микропроцессорных систем», «Организация ввода-вывода». В пособии описано семейство микропроцессоров х86 с точки зрения программиста, рассмотрены регистры процессора, способы адресации и формирования исполнительного адреса. Даны основы программирования на ассемблере, приведены примеры программ, использующих ресурсы MS-DOS. Рассмотрены способы написания резидентных программ и драйверов. Рассмотрены соответствующие примеры.

Функции dos int 23h: адрес выхода по ctrl break

Плохо смотрел значит, там все что нужно есть, даже больше чем тебе сейчас нужно знать

Илон Маск рекомендует:  Абстрактный шаблон синего цвета HTML, CSS

═══════════════════════════════════ ════════════════════╡ Функции DOS │
DOS Fn 00H: Завершить программу
DOS Fn 01H: Ввод с клавиатуры
DOS Fn 02H: Вывод на дисплей
DOS Fn 03H: Ввод AUX
DOS Fn 04H: Вывод AUX
DOS Fn 05H: Вывод на принтер
DOS Fn 06H: Обмен с консолью
DOS Fn 07H: Нефильтрующий консольный ввод без эха
DOS Fn 08H: Консольный ввод без эха
DOS Fn 09H: Выдать строку
DOS Fn 0aH: Буферизованный ввод строки
DOS Fn 0bH: Проверить статус ввода
DOS Fn 0cH: Ввод с очисткой
DOS Fn 0dH: Сбросить диск
DOS Fn 0eH: Выбрать умалчиваемый диск DOS
DOS Fn 0fH: Открыть файл через FCB
DOS Fn 10H: Закрыть файл через FCB
DOS Fn 11H: Найти 1-й совпадающий файл через FCB
DOS Fn 12H: Найти следующий совпадающий файл через FCB
DOS Fn 13H: Удалить файл через FCB
DOS Fn 14H: Читать последовательный файл через FCB
DOS Fn 15H: Писать последовательный файл через FCB
DOS Fn 16H: Создать файл через FCB
DOS Fn 17H: Переименовать файл через FCB
DOS Fn 19H: Дать умалчиваемый диск DOS
DOS Fn 1aH: Установить адрес DTA
DOS Fn 1bH: Дать информацию FAT (текущий диск)
DOS Fn 1cH: Дать информацию FAT (любой диск)
DOS Fn 21H: Читать запись произвольного файла
DOS Fn 22H: Писать запись произвольного файла
DOS Fn 23H: Дать размер файла через FCB
DOS Fn 24H: Установить адрес блока произвольного файла
DOS Fn 25H: Установить вектор прерывания
DOS Fn 26H: Создать префикс программного сегмента
DOS Fn 27H: Читать блок произвольного файла
DOS Fn 28H: Писать блок произвольного файла
DOS Fn 29H: Разобрать имя файла
DOS Fn 2aH: Дать дату DOS
DOS Fn 2bH: Установить дату DOS
DOS Fn 2cH: Дать время DOS
DOS Fn 2dH: Установить время DOS
DOS Fn 2eH: Установить/сбросить переключатель верификации
DOS Fn 2fH: Дать текущий DTA
DOS Fn 30H: Дать номер версии DOS
DOS Fn 31H: Завершиться и остаться резидентным — KEEP
DOS Fn 32H: Дать дисковую информацию DOS (недокументировано)
DOS Fn 33H: Установить/опросить уровень контроля прерывания DOS
DOS Fn 34H: Адрес статуса реентерабельности DOS
DOS Fn 35H: Дать вектор прерывания
DOS Fn 36H: Дать свободную память диска
DOS Fn 37H: Установить/опросить символ-переключатель (недокументировано)
DOS Fn 38H: Дать/Установить информацию страны
DOS Fn 39H: Создать новое оглавление — MKDIR
DOS Fn 3aH: Удалить оглавление — RMDIR
DOS Fn 3bH: Установить умалчиваемое оглавление DOS — CHDIR
DOS Fn 3cH: Создать описатель файла
DOS Fn 3dH: Открыть описатель файла
DOS Fn 3eH: Закрыть описатель файла
DOS Fn 3fH: Читать файл через описатель
DOS Fn 40H: Писать в файл через описатель
DOS Fn 41H: Удалить файл
DOS Fn 42H: Установить указатель файла — LSEEK
DOS Fn 43H: Установить/опросить атрибут файла — CHMOD
DOS Fn 44H: Управление вводом-выводом устройства — IOCTL
DOS Fn 45H: Дублировать описатель файла — DUP
DOS Fn 46H: Переназначить описатель — FORCDUP
DOS Fn 47H: Дать умалчиваемое оглавление DOS
DOS Fn 48H: Распределить память (дать размер памяти)
DOS Fn 49H: Освободить блок распределенной памяти
DOS Fn 4aH: Сжать или расширить блок памяти
DOS Fn 4bH: Выполнить или загрузить программу — EXEC
DOS Fn 4cH: Завершить программу — EXIT
DOS Fn 4dH: Дать код выхода программы — WAIT
DOS Fn 4eH: Найти 1-й совпадающий файл
DOS Fn 4fH: Найти следующий совпадающий файл
DOS Fn 54H: Дать переключатель верификации DOS
DOS Fn 56H: Переименовать/переместить файл
DOS Fn 57H: Установить/опросить время/дату файла
DOS Fn 59H: Дать расширенную информацию об ошибке
DOS Fn 5aH: Создать уникальный временный файл
DOS Fn 5bH: Создать новый файл
DOS Fn 5cH: Блокировать/разблокировать доступ к файлу
DOS Fn 5eH: Различные сетевые функции
DOS Fn 5fH: Переназначение устройств в сети
DOS Fn 62H: Дать адрес префикса программного сегмента
═══════════════════════════════════ ════════════════════╡ Прерывания DOS
INT 20H: Завершить программу
INT 21H: Функции DOS
INT 22H: Адрес завершения
INT 23H: Адрес выхода по Ctrl-Break
INT 24H: Обработчик критических ошибок
INT 25H/26H: Прямые дисковые чтение/запись
INT 27H: Завершиться и остаться резидентным
INT 28H: Квант времени DOS (недокументировано)
INT 2eH: Выполнить команду DOS (недокументировано)
INT 2fH: Мультиплексное прерывание

DOS Fn 35H: дать вектор прерывания

Выход

Вход

DOS Fn 34H: адрес статуса реентерабельности DOS

Выход

Вход

  • AH = 33H
  • AL = 0 чтобы опросить текущий статус контроля Ctrl-Break
  • AL = 1 чтобы установить статус контроля Ctrl-Break
  • DL = требуемый статус (0=OFF, 1=ON) (только при AL=1)
  • DL = текущий статус (0=OFF, 1=ON)

Описание:

если AL=0, в DL возвращается текущий статус контроля Ctrl-Break. если AL=1, в DL возвращается новый текущий статус. когда статус ON, DOS проверяет на Ctrl-Break с консоли для большинства функций (исключая 06H и 07H). при обнаружении, выполняется INT 23H (если оно не перехватывется, то это снимает процесс). когда статус OFF, DOS проверяет на Ctrl-Break лишь при операциях стандартного в/в, стандартной печати и стандартных операциях AUX.

  • AH = 34H НЕТ В ДОКУМЕНТАЦИИ
  • ES:BX = адрес флага активности DOS

Описание:

Эту недокументированную функцию использует PRINT (фоновый процессор печатного спулинга) в момент его установки, так что он может позднее определить, можно ли использовать файловые функции DOS.

При возврате из этой функции ES:BX содержит адрес внутреннего флага DOS, указывающего, выполняется ли в данный момент какая-либо функция DOS. когда спулеру PRINT требуется открыть файл (или использовать какую-либо функцию DOS), он проверяет этот флаг. если ES:[BX] содержит не 0, фоновая программа (TSR, либо popup) НЕ ДОЛЖНА использовать никаких функций DOS.

Резидентные popup-программы часто активизируются по прерыванию от таймера или клавиатуры. так как это может произойти в любой момент, не исключено, что в этот момент будет выполняться какая-либо функция DOS. если теперь popup вызовет функцию DOS, это разрушит стек DOS и, вероятно, приведет к катастрофической ошибке. Путем проверки этого флага popup может определить, возможны ли вызовы функций DOS.

Это, однако, осложняется тем фактом, что COMMAND.COM и некоторые другие программы проводят большую часть времени, запросив ввод с клавиатуры через функцию 0aH (дать строку). таким образом, флаг почти всегда взведен, и на службу DOS наложено табу.

Вы можете выйти из положения, перехватывая INT 21H и отслеживая вызовы функции 0aH. когда приходит такой запрос, не выполняйте его немедленно. Вместо этого организуйте цикл, в котором с некоторой задержкой вызывайте функцию 0bH (дать статус ввода). Циклите, пока не заметите, что нажата клавиша. после этого можно выйти из цикла и вызвать функцию 0aH. Понятно, что при таком способе всегда существует окно времени, в котором проснувшийся popup может без боязни использовать функции DOS. можно также перехватывать INT 28H, если вы любите рисковать.

Предупреждение:

Эта функция не документирована, и опираться на нее рискованно. большинство popup-программ перехватывают INT 21H и отслеживают статус DOS индивидуально (ибо им и так приходится отслеживать 0aH).

Функция DOS 02h

1.1 Функция DOS 02h.

Функция DOS 02h — Записать символ в STDOUT с проверкой на Ctrl-Break

DL = ASCII-код символа

Вывод: Никакого, согласно документации, но на самом деле: AL = код последнего записанного символа (равен DL, кроме случая, когда DL = 09h (табуляция), тогда в AL возвращается 20h).


Эта функция при выводе на экран обрабатывает некоторые управляющие символы — вывод символа BEL (07h) приводит к звуковому сигналу, символ BS (08h) приводит к движению курсора влево на одну позицию, символ НТ (09h) заменяется на несколько пробелов, символ LF (0Ah) опускает курсор на одну позицию вниз, и CR (0Dh) приводит к переходу на начало текущей строки.

Если в ходе работы этой функции была нажата комбинация клавиш Ctrl-Break, вызывается прерывание 23h, которое по умолчанию осуществляет выход из программы.

Простой пример работы функции DOS 02h.

. model tiny ; модель памяти в которой сегменты кода, данных и стека объединены.
. code ; сегмент кода, который содержит данные.
org 100h ; начало СОМ-файла
begin: ; метка начала кода программы
mov dl, ; заносим в регистр dl — любой ASCII-код символа
mov ah,2 ; номер функции DOS «вывод символа»
int 21h ; вызов DOS
ret ; функция DOS «завершить программу»
end begin ; метка окончания кода программы

Эта программа, выводит на экран любой ASCII-символ, в установленную позицию курсора.

Все функции DOS вывода на экран используют устройство STDOUT, стандартный вывод. Это позволяет перенаправлять вывод программы в файл или на стандартный ввод другой программы. Например, если откомпилировать приведен пример (создать файл cod.com) и написать в командной строке

cod.com > cod. out

то на экран ничего выдано не будет, а в текущем каталоге появится файл cod. out, содержащий ASCII-код символа.

Функция DOS 06h.

Функция DOS 06h — Записать символ в STDOUT без проверки на Ctrl-Break

DL = ASCII-код символа (кроме FFh)

Вывод: Никакого, согласно документации, но на самом деле: AL = код записанного символа (копия DL)

Эта функция не обрабатывает управляющие символы (CR, LF, HT и BS выполняют свои функции при выводе на экран, но сохраняются при перенаправлении вывода в файл) и не проверяет нажатие Ctrl-Break.

Заменим в примере № 1.1 MOV АН,2 на MOV АН,6 и перекомпилируем этот пример. Работу откомпилированного примера смотрим в операционной системе MS-DOS.

Функция DOS 09h

Функция DOS 09h — Записать строку в STDOUT с проверкой на Ctrl-Break

Ввод: АН = 09h DS: DX = адрес строки, заканчивающейся символом $ (24h)
Вывод: Никакого, согласно документации, но на самом деле: AL = 24h (код последнего символа)

Действие этой функции полностью аналогично действию функции 02h, но выводится не один символ, а целая строка (смотри лабораторную работу №2).

1.4 Функция DOS 40h

Функция DOS 40h — Записать в файл или устройство

Ввод: АН = 40h ВХ = 1 для STDOUT или 2 для STDERR DS: DX = адрес начала строки СХ = длина строки
Вывод: CF = 0, АХ = число записанных байт

Эта функция предназначена для записи в файл, но, если в регистр ВХ поместить число 1, функция 40h будет выводить данные на STDOUT, а если ВХ = 2 — на устройство STDERR. STDERR всегда выводит данные на экран и не перенаправляется в файлы. На этой функции основаны используемые в С функции стандартного вывода — фактически функция С fputs () просто вызывает это прерывание, помещая свой первый аргумент в ВХ, адрес строки (второй аргумент) — в DS: DX и длину — в СХ.

Простой пример работы функции DOS 40h.

. model tiny ; модель памяти в которой сегменты кода, данных и стека объединены.
. code ; сегмент кода, который содержит данные.
org 100h ; начало СОМ-файла
begin: ; метка начала кода программы
mov ah,40h ; номер функции DOS
mov bx,2 ; указываем устройство STDERR
mov dx,offset message ; DS: DX — адрес строки
mov cx,25 ; CX — длина строки
int 21h ; вызов DOS
ret ; функция DOS «завершить программу»
message db «This function can print $» ; cтрока с содержащая выводимые данные.
end begin ; метка окончания кода программы

Если скомпилировать этот пример и запустить ее командой

dosout.com > dosout. out

то сообщение появится на экране, а файл dosout2. out окажется пустым.

Прерывание INT 29H

INT 29h: Быстрый вывод символа на экран

Ввод: AL = ASCII-код символа

Простой пример работы прерывания INT 29h.

. model tiny ; модель памяти в которой сегменты кода, данных и стека объединены.
. code ; сегмент кода, который содержит данные.
org 100h ; начало СОМ-файла
begin: ; метка начала кода программы
mov ax, ; заносим в регистр ax — любой ASCII-код символа
int 29h ; вызов прерывания DOS — вызов символа;
ret ; функция DOS «завершить программу»
end begin ; метка окончания кода программы

В большинстве случаев INT 29h просто немедленно вызывает функцию BIOS «вывод символа на экран в режиме телетайпа», так что никаких преимуществ, кроме экономии байт при написании как можно более коротких программ, она не имеет.

2. Средства BIOS

Функции DOS вывода на экран позволяют перенаправить вывод в файл, но не позволяют вывести текст в любую позицию экрана и не позволяют изменить цвет текста. DOS предполагает, что для более тонкой работы с экраном программы должны использоваться видеофункции BIOS. BIOS — обеспечивает доступ к некоторым устройствам, в частности к видеоадаптеру. Все функции видеосервиса BIOS вызываются через прерывание 10h.

Асемблер различия функции 4C и вызова прерывания 21h от прерывания 20h

Какие всё же различия функции 4C и вызова прерывания 21h от прерывания 20h, ведь и то, и другое вызывает завершение программы.

1 ответ 1

Можно же открыть документацию и посмотреть. Уделите внимание требованию равенства CS=PSP и выполнению этого правила в .EXE и .COM программах и различии в проверке этого равенства в этих прерываниях. При INT 20h соблюдение данного правила в файлах .EXE лежит на программисте.

INT 20H — Завершить программу

Это прерывание используется для выхода из программы и возврата управления родительскому процессу (обычно интерпретатору команд DOS — COMMAND.COM). Оно восстанавливает значения управляющих векторов INT 22H INT 23H INT 24H. Оно также сбрасывает все файловые буфера (если длина файла изменилась, то файл должен быть предварительно закрыт).

Важно: Регистр CS должен содержать значение PSP завершающегося процесса. Если ваш CS не равен PSP, вы можете выдать JMP или RET на PSP:0000.

Рекомендуется использовать функцию 4cH Terminate, чтобы избежать трудностей, связанных с неравенством CS и PSP. Она позволяет также задать код выхода. Программы COM-формата обычно выполняются при CS=PSP, так что им можно выдавать INT 20H в любой момент. EXE-программы могут выдавать FAR JMP или FAR RET, чтобы передать управление на PSP:0000, где содержится инструкция INT 20H.

INT 21H — Сервис DOS Fn 4cH — Завершить программу — EXIT

возвращает управление от порожденного процесса его родителю, устанавливая код выхода, который можно опросить функцией 4dH WAIT. Управление передается по адресу завершения в PSP завершающейся программы. векторы Ctrl-Break и Critical Error восстанавливаются к старым адресам, сохраненнмы в родительском PSP.

Замечание:
значение ERRORLEVEL (используемое в пакетных файлах DOS) можно использовать для проверки кода выхода самой последней программы.

Понравилась статья? Поделиться с друзьями:
Кодинг, CSS и SQL