Dos fn 0ah ввод строки в буфер


Содержание

Ассемблер

Прерывание 21h: функции DOS для работы с буфером клавиатуры

Различные служебные функции DOS для работы с буфером клавиатуры (функции 01h, 06h, 07h, 08h, 0Ah, 0Bh и 0Ch) классифицируются прежде всего по трем критериям: ожидают ли они ввода или же, когда символ не получен, сообщают, что ввода нет; выдают ли они на экран дисплея эхо (введенный символ); и реагирует ли функция на ввод стандартного символа прерывания во время ее исполнения. (Напомним, что нажатие комбинации клавиш Ctrl-Break или Ctrl-C рассматривается как прерывание ограниченным числом стандартных функций DOS. Однако, начиная с версии 2.00, в DOS введена команда BREAK ON, которая дает указание DOS реагировать на ввод символа прерывания при всех обстоятельствах.)

Все функции ввода с клавиатуры получают введенный символ из буфера клавиатуры, размещенного в памяти компьютера, а не непосредственно из порта 60h интерфейса клавиатуры (из порта 60h скан-коды считываются прерыванием 09h, переводятся в коды символов и помещаются в буфер клавиатуры).

Функция 1 прерывания 21h: ввод символа с эхопечатью

Функция 01h ждет появления символа в буфере клавиатуры со стандартного устройства ввода и после приема символа помещает его в регистр AL. Другие функции, относящиеся к вводу символов с клавиатуры: 06h, 07h и 08h.

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

Работа функции 01h происходит следующим образом. Нажатие клавиши, соответствующей одному из символов кода ASCII, приводит к записи соответствующего байта в регистр AL и немедленной выдаче символа данной функцией на экран (в позицию курсора). Нажатие клавиши, формирующей сигнал, не относящийся к оду ASCII, приводит к формированию двух байтов, которые могут быть получены путем двух последовательных обращений к данной функции.

Обычно функция 01h применяется для проверки принадлежности символа, соответствующего нажатой клавише, коду ASCII. Для этого производится проверка регистра AL. Если AL не равно 00h, то это символ кода ASCII. Если же AL=00h, то вы имеете дело с символом, не относящимся к коду ASCII; в этом случае следует повторить обращение к данной функции для получения псевдокода, соответствующего специальному действию клавиши. Как и в случае применения других средств DOS, предназначенных для ввода символов с клавиатуры, при использовании данной функции развернутый код символов набора ASCII оказывается недоступным, даже если соответствующие средства обслуживания клавиатуры системы ROM BIOS позволяют осуществить доступ к нему.

Функция 6 прерывания 21h: непосредственный ввод

и вывод с консоли

Функция 06h — это универсальная функция, объединяющая операции ввода с клавиатуры и вывода на дисплей. В версиях DOS, начиная со второй и выше, эта функция, как и другие, действует по отношению уже не к клавиатуре и дисплею, а к стандартным устройствам ввода и вывода (в качестве которых по умолчанию принимаются клавиатура и дисплей).

При реализации данной функции регистр AL используется для ввода, а регистр DL — для вывода. Если при вызове функции 06h в регистре DL находится значение FFh (в десятичной нотации 255), то при нажатии какой-либо клавиши эта функция поместит соответствующий ASCII-код в регистр AL и сбросит нулевой флаг; при отсутствии нажатия клавиши она установит нулевой флаг.

Если же вызвать функцию 06h при любом другом значении регистра DL, то будет выполнен вывод символа, соответствующего данному значению, на стандартное устройство вывода.

Функция 06h не ожидает ввода символа с клавиатуры и не осуществляет его эхопечати на экране. Кроме того, функция 06h не воспринимает сочетание клавиш Ctrl-C как прерывание программы (при использовании данного сочетания она помещает в регистр AL значение 03h, т.е. соответствующий данному значению ASCII-код).

Функция 7 прерывания 21h: непосредственный ввод

с консоли без эхопечати

Функция 07h ожидает ввода символа со стандартного устройства ввода и после ввода символа помещает его в регистр AL. Она не осуществляет эхопечати символа на экране и не воспринимает сочетание клавиш Ctrl-C как прерывание программы.

Функция 07h действует точно так же, как функция 01h: нажатие клавиши, относящейся к коду ASCII, приводит к немедленному занесению в регистр AL соответствующего байта; нажатие клавиши, не относящейся к коду ASCII, приводит к формированию двух байтов, которые могут быть получены двумя последовательными обращениями к функции 07h.

Функция 8 прерывания 21h:

ввод с консоли без эхопечати

Функция 08h ожидает ввода символа, не осуществляя эхопечати и прерывает программу при нажатии Ctrl-C.

Эта функция идентична функции 01h, за исключением того, что она не выводит введенный символ на экран дисплея (или стандартное устройство вывода).

Для более полного понимания особенностей данной функции обратитесь к описанию функции 01h. Сравните данную функцию с функциями 01h, 06h и 07h. Если вы хотите использовать функцию 08h, но не желаете ждать ввода символа, изучите функцию 0Bh, которая сообщает о готовности ввода. Изучите также функцию 0Ch, которая является модификацией данной функции.

Dos fn 0ah: ввод строки в буфер

Как и в случае вывода на экран, 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-код (см. приложение 1).

В трех следующих вариантах этой функции код символа возвращается в 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
Вывод: AL = 0, если не была нажата клавиша
AL = 0FFh, если была нажата клавиша

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

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

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

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

Функции посимвольного ввода без эха можно использовать для интерактивного управления программой, как в следующем примере.

В этом примере для вывода на экран используется прямое копирование в видеопамять, так как вызов функции BIOS вывода строки (INT 10h, АН = 13h) прокручивает экран вверх на одну строку при выводе символа в нижнем правом углу экрана.

Функции ввода/вывода DOS.

Дата добавления: 2014-11-27 ; просмотров: 835 ; Нарушение авторских прав

Все функции DOS вызываются прерыванием 21h, при этом в AH содержится номер функции. Ниже везде, где есть слова «стандартный ввод», под ними подразумевается клавиатура, однако ввод может быть переопределен (например, из файла). Аналогично, «стандартный вывод» – экран, но вывод также может быть переопределен (например, в файл). ASCIIZ-строка (нуль-терминированная строка) – это строка символов, заканчивающаяся нулевым символом (код 00h).

1. Ввод символа с отображением. Прерывание 21h функция 01h. Вызов: AH=01h. Возвращает: AL=введенный символ. Действие: читает символ (возвращаемый в AL) со стандартного ввода (клавиатуры) и выводит его на стандартный вывод (экран). Если ввод был перенаправлен, то невозможно обнаружить EOF.

— если при вводе нажата Ctrl+C и BREAK=ON, то вызывается прерывание 23h;

— чтобы прочитать расширенные коды (например, клавиш F1-F12), надо вызвать функцию дважды. Первый раз возвращается 00h, затем – код клавиши.

2. Вывод символа. Прерывание 21h функция 02h. Вызов: AH=02h; DL=выводимый символ. Возвращает: ничего. Действие: выводит символ на стандартный вывод. Если вывод был перенаправлен, то невозможно обнаружить, что нет места на диске.

— если Ctrl+C после вывода символа, то вызавается прерывание 23h;

— если стандартный вывод не был перенаправлен, то символ Backspace (08h) перемещает курсор влево на одну позицию.


3. Прямой консольный ввод/вывод. Прерывание 21h функция 06h. Вызов: AH=06h; DL=действие: если DL=00h-FEh, то вывод; если DL=FFh, то ввод. Возвращает:

если вызов с DL=00h-FEh, то ничего;

если вызов с DL=FFh, то: если есть символ – ZF=0, AL=введенный символ

если нет символа – ZF=1.

Действие: используется, если нужно прочитать или записать все возможные символы и управляющие коды без действий ОС. Читает символ со стандартного ввода или записывает символ на стандартный вывод. Если вывод был перенаправлен, то невозможно обнаружить EOF или что нет места на диске.

— Никакой реакции на Ctrl+C;

— чтобы прочитать расширенные коды (например, клавиш F1-F12), надо вызвать функцию дважды. Первый раз возвращается 00h, затем – код клавиши.

4. Ввод символа без отображения. Прерывание 21h функция 07h. Вызов: AH=07h. Возвращает: AL=введенный символ. Действие: читает символ (возвращаемый в AL) со стандартного ввода (клавиатуры) без отображения на стандартном выводе (экране). Если нет символа, то ждет его появления. Если ввод был перенаправлен, то невозможно обнаружить EOF.

— Никакой реакции на Ctrl+C. Нужно использовать функцию 08h, если реакция требуется;

— чтобы прочитать расширенные коды (например, клавиш F1-F12), надо вызвать функцию дважды. Первый раз возвращается 00h, затем – код клавиши.

5. Ввод символа без отображения. Прерывание 21h функция 08h. Вызов: AH=08h. Возвращает: AL=введенный символ. Действие: читает символ (возвращаемый в AL) со стандартного ввода (клавиатуры) без отображения на стандартном выводе (экране). Если нет символа, то ждет его появления. Если ввод был перенаправлен, то невозможно обнаружить EOF.

— если при вводе нажата Ctrl+C и BREAK=ON, то вызывается прерывание 23h. Нужно использовать функцию 08h, если реакции не требуется;

— чтобы прочитать расширенные коды (например, клавиш F1-F12), надо вызвать функцию дважды. Первый раз возвращается 00h, затем – код клавиши.

6. Вывод строки. Прерывание 21h функция 09h. Вызов: AH=09h, DS:DX=сегмент:смещение строки. Возвращает: ничего. Действие: посылает строку символов на стандартный вывод. Если вывод был перенаправлен, то невозможно обнаружить, что нет места на диске.

— Строка должна заканчиваться на символ $(код 24h), который не выводится. Любые другие символы ASCII, включая управляющие, могут содержаться в строке. Для перевода курсора на начало новой строки нужно вывести строку, содержащую символы «перевод строки»/»возврат каретки»:

string DB 10,13,’$’

или использовать прерывание 10h функцию 02h (см. 6.8.2.).

— Если Ctrl+C нажата на клавиатуре, то вызывается прерывание 23h.

7. Буферизованный ввод с клавиатуры. Прерывание 21h функция 0Ah. Вызов: AH=0Ah, DS:DX=сегмент:смещение буфера. Возвращает: ничего. Действие: читает строку символов со стандарного ввода, до появления символа возврата каретки (0Dh) и помещает в буфер (включая завершающий 0Dh). Символы отображаются на стандартном выводе. Если ввод был перенаправлен, то невозможно обнаружить EOF.

— Буфер, используемый этой функцией, имеет формат(см. табл. 6.4.):

Байт Описание
Максимальное количество символов (устанавливается перед вызовом)
Количество реально прочитанных символов (устанавливается функцией после ее вызова)
2 и след. Прочитанная строка, заканчивающаяся 0Dh

— Если буфер заполнился (больше символов, чем максимум), последующий ввод игнорируется и подается сигнал до тех пор, пока не нажата клавиша ENTER;

— Если при вводе нажата Ctrl+C и BREAK=ON, то вызывается прерывание 23h.

8. Проверка состояния ввода.Прерывание 21h функция 0Bh. Вызов: AH=0Bh. Возвращает: AL=00h, если нет символа; AL=FFh, если есть один или более символовhр. Действие: проверяет, есть ли в буфере стандартного ввода символ.

— Если при вводе нажата Ctrl+C и BREAK=ON, то вызывается прерывание 23h.

— Если есть символ, эта функция будет возвращать FFh, пока символ не считан функциями ввода (01h, 07h, и т.д.).

9. Очистка буфера и ввод. Прерывание 21h функция 0Ch. Вызов: AH=0Ch; AL=номер фунции, которая вызывается после очистки буфера; для AL=0Ah –DS:DX=сегмент:смещение буфера. Возвращает: если вызов с AL=01h, 07h, 08h то AL=прочитанный символ; если вызов с AL=0Ah, то ничего. Действие: очищает буфер стандартного ввода, затем вызывает одну из функций ввода (заданную в AL).

— Реакция на Ctrl+C (игнорирует или нет) зависит от вызываемой функции;

— Вызов с AL отличным от 01h, 06h, 07h, 08h, 0Ah просто очищает буфер.

10. Запись в файл или устройство. Прерывание 21h функция 40h. Действие: берет корректный дескриптор файла (от предыдущей операции создания или открытия файла), адрес буфера, длину в байтах, передает данные из буфера в файл и затем обновляет положение указателя в файле. Вызов: AH=40h; BX=дескриптор файла; CX=количество байт, которое надо записать; DS:DX=сегмент:смещение буфера. Возвращает: если нет ошибки: CF=0, AX=количество реально переданных байт; иначе – CF=1, AX=код ошибки.

Dos fn 0ah: ввод строки в буфер

Создание программ на языке Assembler.

[администратор рассылки: Лысков Игорь Витальевич (Старший модератор)]

Лучшие эксперты в этом разделе

Коцюрбенко Алексей Владимирович
Статус: Модератор
Рейтинг: 1154
Зенченко Константин Николаевич
Статус: Старший модератор
Рейтинг: 457
solowey
Статус: Бакалавр
Рейтинг: 235
Перейти к консультации №:

Здравствуйте.
Помогите, пожалуйста, разобраться. Я ввожу строку длиной в 58 символов в буфер, использую функцию Dos 0Ah. А для вывода этой строки применяю 10h прерывание BIOS и функцию 13h.
Ввод происходит нормально, а при выводе получаю какой-то мусор в нечитаемой кодировке.
Пожалуйста, подскажите, что я делаю не так и где ошибаюсь?

.model small
.stack 100h
.data
buf db 58
crlf db 0Dh, 0Ah, ‘$’
………………….
; Ввод
mov dx, offset buf
mov ah, 0Ah ; Функция Dos 0Ah
int 21h ; Считывание строки символов в буфер
mov dx, offset crlf ; Дополнение буфера

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

……………………..
; Вывод
mov bl, 06h ; 06 -> red
mov bp, offset dx
mov dx, 8*256+10 ; строка 8 столбец 10
mov cx, 58

mov al, 0
mov ah, 13h
int 10h

Состояние: Консультация закрыта

Здравствуйте, Martin!
Правильный код с комментариями в приложении

Отправлять сообщения
модераторам могут
только участники портала.
ВОЙТИ НА ПОРТАЛ »
регистрация »

неизвестный

Спасибо за помощь, я исправил, как Вы написали, но всё равно при выводе получаю что-то нечитаемое в непонятной кодировке (хотя уже число символов при выводе равно числу символов в строке). Подскажите, пожалуйста, как можно это исправить и почему так происходит? .model small .stack 100h .data buf db 58 ; максимальная длина буфера db 0 ; сюда запишется реальная длина введённой строки db 58 dup (0) ; сам буфер .code start: mov ax, @data mov ds, ax ;— ввод — mov dx, offset buf mov ah, 0Ah ; Функция Dos 0Ah int 21h ; Считывание строки символов в буфер ;mov dx, offset crlf ;— вывод — mov bl, 06h ; 06 -> red mov bp, offset buf+2 mov dx, 8*256+10 xor cx, cx mov cl, buf+1 ; реальная длина строки mov al, 0 mov ah, 13h int 10h mov ah, 4ch int 21h end start

ID: 7438

Дело в том, что функция 13h прерывания 10h ждет выводимую строку по адресу ES:BP В модели SMALL ES показывает на PSP, а не сегмент данных. А посему, необходимо написать следующее: mov ax, @data mov ds, ax mov es, ax Теперь и регистр ES будет адресовать сегмент данных И второе, перед выходом желательно добавить ожидание нажатия клавиши mov ah,0 int 16h Иначе, под Виндой окно слишком быстро закроется. Удачи!

=====
«Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться.» Марк Твен

неизвестный

Огромное спасибо за полный и грамотный ответ!

=====
«Если вы заметили, что вы на стороне большинства, —
это верный признак того, что пора меняться.» Марк Твен

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

Функции DOS и BIOS для ввода/вывода

Функция ДОС INT 21/01– ввод с клавиатуры (Стандартного входного потока) символа с повтором его на экране (эхо-повтор), возвращает ASCII-код символа в регистре AL.Если имеется старшая часть кода, то есть ASCII-код расширенный (extended ASCII), используется для клавиш, не являющихся алфавитно-цифровыми: F1…F12, комбинации с ALT, CTRL, SHIFT; требуется двойной вызов данной функции (первый раз возвращается ).

Функции 03-08 имеют аналогичный формат.

Функция ДОС INT 21/03 аналогичный формат, только ввод производится с последовательного порта (по умолчанию, COM1)

Функция ДОС INT 21/07 –ввод с клавиатуры (нефильтрованный, нажатие CTRL-BREAK не определяется), без эхо-повтора на экране.

Функция ДОС INT 21/08 –ввод с клавиатуры, без эхо-повтора на экране.

Функция ДОС INT 21/0C –ввод с очисткой буфера (в AL – номер функции (01,06,07,08,0A)

Функции BIOS INT 16/00– возвращает в AL– ASCII код, в AH– Scan Code (аппаратный шестнадцатеричный код нажатой клавиши), однако если нажата клавиша, использующая расширенный ASCII-код, то AL=0,AH=Расширенный ASCII-код.


Функция BIOS INT 16/01 –устанавливает флаг ZF, если есть символ во входном потоке; в остальном аналогична функции 00.

Может еще понадобиться функция 05– поместить символ во входной поток (символ в CL)

Функция ДОС INT 21/02 — вывод символа на экран (стандартный выходной поток), символ задается в DL, интерпретируются управляющие символы (08 – возврат курсора на одну позицию, 0А – переход на строку вниз и т.п.)

Функция ДОС INT 21/04 –аналогичный формат, только вывод в последовательный порт.

Функция ДОС INT 21/05 —тоже, стандартный вывод на принтер (в порт LPT).

Функция BIOS INT10/0E – AL– выводимый символ, интерпретируются управляющие символы. (BL– цвет фона для графических режимов)

Функция BIOS INT10/0A –тоже, но BH=0 (страница видеопамяти, основная), в CXможно задать количество повторений, управляющие символы не интерпретируются

Функция BIOS INT 10/09 –тоже, но в BLзадаются атрибуты (цвет) символа.

Функция в/в ДОС INT 21/06 –если DL = FF — то выполняется ввод, иначе вывод символа. Введенный символ возвращается в AL – как и в функциях 01,07,08; однако в отличие от них ДОС НЕ ОЖИДАЕТ, пока символ появится (будет нажата клавиша), если символа не появится, то на выходе будет установлен флаг ZF.

Цикл «пока не будет нажата какая-либо клавиша, продолжать действия»

Jnz Symbol_Ready ;Переход, если клавиша нажата

Функции BIOS и DOS для ввода/вывода строки символов:

В ряде случаев целесообразно организовать ввод строки символов как последовательный ввод символов по отдельности (например, если строка может состоять только из определенных символов):

Функция ДОС INT 21/09 –вывод строки, DS:DX – адрес строки, должна заканчиваться символом ‘$

Функция ДОС INT 21/0A –ввод строки, DS:DX буфер, организованный след. Образом – первый байт – максимальное количество символов в строке, во втором байте возвращается реальное количество введенных символов, начиная с третьего байта расположена сама строка, заканчивающаяся кодом «Enter»-а – 0Dh

H E L ODh

Функции BIOS ввода строки с клавиатуры отсутствуют. Функции вывода есть, но достаточны громоздки (рекомендуется использовать посимвольный вывод)

Функция BIOS INT 10/13 –вывод строки ES:Bp, длиной в CX,

AL=0, — строка символов, курсор не двигается

AL=1, — строка символов, курсор передвигается в конец строки

AL=2, — последовательность симв., атриб., симв., атриб, курсор не двигается

AL=3, — последовательность симв., атриб., симв., атриб, курсор передвигается в конец строки

Пример – ввод строки, состоящей только из числовых символов

Mov bx,offset string ;адрес начала

Nov_vvod:

Mov ah,01

Int 21h ; ввод

Cmp al,’0’

Jl nov_vvod

Cmp al,’9’

Jg nov_vvod

Mov [bx],al

Inc bx

Jmp nov_vvod

String db 10 dup (?)

Помимо ввода/вывода с клавиатуры программа также может получать данные с командной строки. То, что указывается после имени программы при её запуске, называется параметрами командной строки (они разделяются пробелами). В частности, при использовании нами Tlink.exe параметры командной строки – lab3.obj и /t. Командная строка при запуске программы расположена по адресу DS:0080h в формате Длина строки, строка, заканчивающаяся кодом 0Dh.

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

Print macro x

Mov dx,offset x

Mov ah,09

Int 21h

Endm

Описание макрокоманды делается вначале (после org 100h и перед start: ).

Тогда, если приходится выводить в программе много разных сообщений, можно каждый раз писать одну команду вместо трех:

Mov ah,09h Mov dx,offset msg1 -> Int 21h Print msg1

Сам машинный код от этого не изменится, просто сократится время набирания программы. Компилятор ассемблера, встретив в тексте Print заменит его на последовательность 3-х команд, описанных в макросе, а «х» (параметр макрокоманды в описании) заменит на msg1.

Работа с экраном.

Экран (дисплей) с точки зрения программиста на ассемблере – тоже массив цифровой информации. Этот массив хранится в специальной области памяти, называемой видеопамять. Содержимое «текстовой» видеопамяти (то есть отображение экрана в текстовом режиме) начинается с адреса B800:0000,графической A000:0000.Видеоадаптер считывает данные области памяти и отображает на экране информацию в соответствии с режимом работы (текстовым или графическим).

Экран для программиста как бы состоит из отдельных ячеек, которые имеют свои координаты, отсчитываемые по горизонтали и вертикали (столбцы и строки). Координаты начинаются с 0. В текстовом режиме в ячейке может быть записан какой-либо символ, всего таких ячеек в зависимости от режима либо 80х25, либо 40х25 (столбцов х строк) в зависимости от режима экрана. В графическом режиме – точка (пиксель), которых опять же в зависимости от режима может быть от 320х200 до 1024х768 и более (по горизонтали х по вертикали).

В текстовой видеопамяти за каждую «ячейку» отвечают 2 байта – в первом содержится ASCII-код символа, во второй – байт атрибутов.Байт атрибутов определяет цвет символа и фона. Соответственно по адресу B800:0000 находится ASCII-код первого символа (в верхнем левом углу), B800:0001 – цвет его и фона, B800:0002 – второй символ и т.д.

Байт атрибутов организован следующим образом –

Бит интенсивности отвечает за яркость символа (1 – яркий), признак мерцания (1 – символ мерцает на экране). Биты R – red – красный, G – green – зеленый, B – blue – синий отвечают за соответствующие цвета. С помощью их комбинаций (как и в фотографии, где изображение формируется из трех основных цветов) и определяется цвета символа и фона. Например, 001 –синий , 010 – зеленый, 100 – красный, 011 – желтый и т.п.

В графической видеопамяти каждый байт (для режимов с количеством цветов до 16, иначе используются несколько байт) отвечает за отдельный пиксель и обозначает его цвет – адресу A000:0000 соответствует цвет точки с координатами (0,0) – левый верхний угол экрана, A000:0001 – точке с координатами (0,1) и т.д.

Последнее изменение этой страницы: 2020-12-17; Нарушение авторского права страницы

Dos fn 0ah: ввод строки в буфер

Способы ввода данных с клавиатуры

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

Ввод с клавиатуры.

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


Описание: Считывает (ожидает) символ со стандартного входного устройства. Отображает этот символ на стандартное выходное устройство (эхо). Ввод расширенных клавиш ASCII (F1-F12, PgUp, курсор и т.п.) требует двух обращений к этой функции. Первый вызов возвращает AL=0. Второй вызов возвращает в AL расширенный код ASCII.

Нефильтрующий консольный ввод без эха.

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

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

Консольный ввод без эха.

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

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

Буферизированный ввод строки.

DS:DX=адрес входного буфера (смотри ниже)

Выход: буфер содержит ввод, заканчивающийся символом CR (ASCII 0dH)

Описание: При входе буфер по адресу DS:DX должен быть оформлен следующим образом:

MAX — максимально допустимая длина ввода (от 1 до 254) При выходе буфер заполнен данными следующим образом:

max len T E X T … 0dh

LEN — действительная длина данных без завершающего CR (здесь – 0dH). Символы считываются со стандартного ввода вплоть до CR (ASCII 0dH) или до достижения длины MAX-1. Если достигнут MAX-1, включается консольный звонок для каждого очередного символа, пока не будет введен возврат каретки CR (нажатие Enter). Второй байт буфера заполняется действительной длиной введенной строки, не считая завершающего CR. Последний символ в буфере -всегда CR (который не засчитан в байте длины). Символы в буфере (включая LEN) в момент вызова используются как «шаблон». В процессе ввода действительны обычные клавиши редактирования: Esc выдает «\» и начинает с начала, F3 выдает буфер до конца шаблона, F5 выдает «@» и сохраняет текущую строку как шаблон, и т.д. Большинство расширенных кодов ASCII игнорируются. При распознавании Ctrl-Break выполняется прерывание INT 23H (буфер остается неизменным).

Ввод с очисткой

AL= номер функции ввода DOS (01H, 06H, 07H, 08H или 0aH)

Описание: Очищает буфер опережающего ввода стандартного ввода, а затем вызывает функцию ввода, указанную в AL. Это заставляет систему ожидать ввод очередного символа. Следующие значения допустимы в AL: 01H Ввод с клавиатуры; 06H Ввод с консоли; 07H Нефильтрующий без эха; 08H Ввод без эха; 0aH Буферизованный ввод.

Далее программы будут оформляться в виде COM.

Рассмотрим программу которая осуществляет ввод строки с клавиатуры и заменяет все буквы «а» на заглавные, причем пробелы удаляются.

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 ; Просмотров: 398 ; Нарушение авторских прав? ;

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

Лабораторная работа №2. Системные функции dos ввода-вывода символьной информации и ее обработка в компьютере

ЛАБОРАТОРНАЯ РАБОТА №2

СИСТЕМНЫЕ ФУНКЦИИ DOS ВВОДА-ВЫВОДА СИМВОЛЬНОЙ ИНФОРМАЦИИ И ЕЕ ОБРАБОТКА В КОМПЬЮТЕРЕ

­ Освоение стандартных способов ввода-вывода DOS.

­ Разработка программ по обработке символьной информации с использованием строковых команд.

1.2 Стандартные способы ввода-вывода DOS

Для того чтобы написать простую, но законченную программу, необходимо знать три вещи — как вводить данные, как выводить результат и как остановить выполнение программы. В языках высокого уровня имеются специальные операторы ввода/вывода, которые позволяют в удобной форме реализовать эти функции. В системе команд процессора ix86 также имеются команды ввода/вывода, но они реализуют эти операции на самом низком, физическом уровне, т. е. обеспечивают обращение к портам ввода/вывода по конкретным адресам. Для обеспечения ввода/вывода информации на этом уровне программист должен знать номера портов каждого устройства, а также протоколы или алгоритмы обслуживания этих устройств. Операционная система MS DOS реализует ряд сервисных функций ввода/вывода на логическом уровне, которые выступают как пронумерованные функции прерывания Int 21h. При этом прикладная программа пользователя должна сообщить необходимые для данной функции параметры и передать управление DOS, которая и осуществит все необходимые операции по управлению устройством на физическом уровне, а затем вернёт управление прикладной задаче, сообщив, успешно ли завершилась операция, или же была допущена ошибка.

Функции информационного обмена MS DOS в своём развитии изменялись от специализированных программ обмена для каждого типа устройства на основе блока управления файлами FCB, до унификации обмена на основе мощной файловой системы (начиная с DOS 3.0) через описатель (дескриптор). Описатель или логический номер файла идентифицирует файл или устройство, с которым должна работать прикладная программа. Это упрощает программирование операций ввода/вывода, т. к. позволяет осуществлять обмен информации независимо от природы файла (устройства). Существует пять стандартных описателей файлов, которые предоставляются прикладной программе:

– 0 – стандартное устройство ввода (CON — клавиатура);


– 1 — стандартное устройство вывода (CON — монитор);

– 2 — стандартное устройство ошибок (всегда CON – монитор, для сообщений);

– 3 — стандартное вспомогательное устройство;

– 4 — стандартное печатающее устройство;

При вызове любой функции DOS код функции помещается в регистр AH, дополнительные параметры располагаются в других регистрах РОН. Возвращаемая информация содержится в регистре AL или AX, если флаг CF=0. Флаг CF устанавливается в 1, если произошла какая-либо ошибка, код которой заносится в регистр AX (так называемый код возврата ошибки).

Стандартный ввод (как и стандартный вывод) можно перенаправить средствами DOS на любое устройство или в файл, а стандартная ошибка всегда связана с экраном (обычно дескриптор 2 используют для вывода диагностических сообщений).

Перенаправление ввода или вывода программы осуществляет командный процессор . Если, допустим, в программе PROG предусмотрен ввод данных через дескриптор стандартного ввода ²0² , а вывод данных через дескриптор вывода ²1² , то при обычном запуске программы командой

программа будет требовать входные данные с клавиатуры, и выводить результаты своей работы на экран. Если, однако, при запуске программы использовать символ перенаправления

PROG. EXE > FILE. TXT

система сама создаст файл FILE. TXT, и весь вывод программы будет записан в этот файл. Ввод по-прежнему будет осуществляться с клавиатуры. Запуск программы командой

PROG. EXE FILE. TXT

заставит программу выполняться в режиме ввода информации из файла FILE. DAT и вывода в файл FILE. TXT. Ни экран, ни клавиатура использоваться не будут. Сама программа ничего не знает об этих перенаправлениях — она во всех случаях обращается к стандартному устройству ввода для ввода данных и к стандартному устройству вывода для её вывода.

Просто DOS как бы подставляет ей на входе и выходе другие устройства.

1.3 Ввод с клавиатуры символьной информации

Буфер ввода данных с клавиатуры.

Нажатие любой клавиши клавиатуры вызывает сигнал аппаратного прерывания (прерывания с типом 09h), заставляющий процессор прервать исполняемую программу и перейти на подпрограмму обработки прерывания от клавиатуры. Обработчик прерывания формирует двухбайтовый код с последующей засылкой его в кольцевой буфер ввода данных с клавиатуры, располагающийся по адресу 0040h:001Eh в системной области оперативной памяти. Для алфавитно-цифровых клавиш старший байт этого кода представляет scan— код клавиши (условный номер клавиши на клавиатуре), а младший — ASCII-код клавиши, т. е. 8- битовый код закреплённого за этой клавишей символа.

Заполнение буфера клавиатуры, рассчитанного на 15 слов или ударов по клавишам, происходит по мере нажатия клавиш и не связано с выполнением текущей программы. Если программе требуется ввести с клавиатуры определённый символ (или строку), она с помощью соответствующей системной функции DOS обращается к буферу ввода и, при наличии в нём данных, передаёт первый из поступивших в этот буфер символов в программу. Дело в том, что запись и считывание кодовых слов в буфер клавиатуры соответствует принципу FIFO (first in — first out, первым вошёл — первым вышел), поэтому считывание символа из буфера освобождает место для ввода последующих.

Если к моменту вызова функции DOS буфер ввода оказывается пуст, DOS будет непрерывно опрашивать его состояние, ожидая появления в буфере очередного кода, а исполнение программы приостанавливается до нажатия клавиши.

Процесс считывания кодов с буфера ввода может дать непредсказуемый эффект, если перед вызовом функции DOS этот буфер не был пуст. Программа не желающая вводить набранные досрочно коды, должна очистить клавиатурный буфер с помощью специальной функцией 0Ch прерывания 21h (при al=0).

Системные функции DOS ввода данных с клавиатуры.

DOS предоставляет несколько способов ввода данных с клавиатуры:

­ использование группы функций Int 21h (01h, 06h, 08h, 0Ah¸ 0Ch), обеспечивающих посимвольный ввод с клавиатуры в разных режимах;

­ обращение к клавиатуре, как к файлу, с помощью функции 3Fh.

Все функции DOS, считывающие данные с клавиатуры, передают в программу только ASCII — код (младший байт кодового слова клавиши), оставляя scan — код (старший байт) без внимания. Правда это относится только к алфавитно-цифровым клавишам, т. е. клавишам, за которыми закреплены отображаемые на экране символы (94 символа со значениями ASCII — кода от 32 до 126). Особенности считывания информационных кодов с других, так называемых функциональных и управляющих клавиш, будет рассмотрено дальше в разделе ² Расширенные коды ASCII² .

­ Функция 01h — ввод одиночного символа с эхом.

Вводит символ из стандартного устройства ввода и отображает его на устройстве стандартного вывода. Ввод каждого символа сопровождается изменением координат. При отсутствии символа ждёт ввода. При наборе строки обрабатываются управляющие клавиши: BS (шаг назад), TAB (табуляция), ENTER (переход на начало текущей строки). Допустимо перенаправление ввода. Если ввод не перенаправлен, выполняет обработку (нажатие данной комбинации клавиш вызывает обработчик прерывания int 23h, завершающий текущую программу с выходом в DOS). Для чтения расширенного кода ASCII требует повторного выполнения функции.

Вызов: AH=01, Int 21h.

Выход: AL= код символа.

Для приобретения практических знаний для работы с этой, а также некоторыми другими функциями DOS, предназначен демонстрационный файл-программа Demon. asm, приведённый в Приложении 1 к данной работе.

­ Функция 06h — ввод одиночных символов из стандартного устройства ввода и вывод одиночных символов на стандартное устройство вывода.

Режим работы определяется содержанием регистра DL в момент вызова функции: DL= FF — режим ввода, DL= <0h - 0feh>— режим вывода соответствующего этому коду символа. В режиме вывода коды ASCII: 07h — звонок, 0Dh — возврат каретки, 0Ah — перевод строки, рассматриваются как управляющие и выполняются соответствующие им действия.

Если вводимый символ в устройстве ввода присутствует, то он помещается в AL (без эха) с установкой флага ZF=0, иначе ZF=1. Отличительным качеством функции 06h является то обстоятельство, что она, просматривая устройство ввода, не останавливает программы, если не обнаруживает в нём символа, а просто устанавливает флаг ZF=1 (обнаружено 0- символов). Допускает перенаправление ввода — вывода. Для чтения расширенного кода ASCII требуется повторное выполнение функции.

Вызов: AH=06h, Int 21h.

Ввод (без эха): DL=FF. Выход: ZF=0, AL= код символа;

ZF=1 — устройство ввода пустое.

Вывод: DL=FEh¸ 00h. Код в регистре DL является одновременно и кодом выводимо символа.

­ Функция 08h — ввод символа без эха.

Вводит символ из стандартного устройства ввода. При отсутствии символа ждёт его ввода. Допустимо перенаправление ввода. Для чтения расширенного кода ASCII требует повторное выполнение функции. Если ввод не перенаправлен, выполняет отработку (иначе надо предварительно включить режим BREAK).

Функция, как правило, используется для ввода пароля для защиты программы от несанкционированного запуска. Пример использования данной функции будет рассмотрен в одной из программ этой работы.

Вызов: AH=08h, Int 21h.

Вывод: AL= код символа.

­ Функция 0Ah — буферизованный ввод с клавиатуры.

Вводит строку байт из устройства стандартного ввода в буфер пользователя по адресу DS:DX, с отображением на устройстве стандартного вывода. Допустимо перенаправление ввода. Если ввод не перенаправлен, выполняет отработку (иначе надо предварительно включить режим BREAK).

Функция допускает редактирование данных при их вводе клавишами: Backspace (отмена последнего символа), Esc (отмена всего набранного текста), F5 (запоминает текущую строку как подсказку), F3 (восстанавливает подсказку для ввода). Ввод символов строки заканчивается нажатием клавиши , код которой (0Dh), вводится в качестве последнего символа в отведённый буфер.

Структура буфера (резервируется в сегменте данных): байт 0- назначаемая пользователем максимальная длина строкис учётом символа CR (0Dh), байт 1- число реально введённых символов без учёта символа CR, байт 2 и далее — строка. В следующем примере приведена процедура In_string ввода строки в буфер, емкостью 50 символов. Она возвращает адрес первого символа строки в регистре DX, а число символов в регистре CX.

;Адрес буфера пользователя

;запрос функции 0Ah

;Поместить счётчик символов в cx

;Сделать dx указателем строки

­ Функция 0Ch — вызов служебной функции DOS для ввода данных с предварительной очисткой буфера клавиатуры. Допускает переопределение ввода.

Вызов: AH= 0Ch, Int 21h,

AL= номер функции ввода: 01, 07, 08, 0Ah (если AL=0, то только очистка),

DS:DX = адрес буфера, если AL=0Ah.

Выход: AL = байт входных данных (если при вызове Al=0Ah, данные помещаются в буфер).

­ Функция 3Fh — ввод данных из файла или устройства.

Универсальная функция ввода данных в буфер с указателем DS:DX из источника, определённого дескриптором в регистре BX.. Допускает переопределение ввода. В регистре CX указывается число байтов, которое необходимо ввести. Пример использования:

;Дескриптор ввода (клавиатуры)

;Число пересылаемых байт


;Адрес буфера ввода

;Вызов функции DOS

;Вызов функции DOS

Команда Int ожидает окончание ввода символов, которое фиксируется нажатием клавиши Enter. После ввода текста и нажатия клавиши Enter в буфер In_Aria автоматически вводится два управляющих символа: CR(код 0Dh) и LF(код 0Ah). Вследствие данной особенности, максимальное число символов и размер буфера ввода должны содержать место для двух дополнительных символов. При успешном завершении операции флаг CF=0, а в регистре AX устанавливается число байтов, введённых с клавиатуры (плюс два дополнительных символа). Если CF=1, то в регистре AX содержится возвратный код ошибки. Это либо 5 (отказ в доступе), либо 6 (неверный дескриптор).

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

1.4 Функции DOS вывода данных на экран

DOS предоставляет следующие способы вывода данных на экран:

— использование функций Int 21h (02h, 06h, 09h), обеспечивающих посимвольный ввод с клавиатуры в разных режимах;

— обращение к экрану, как к файлу, с помощью функции 40h.

· Функция 02h — вывод одиночного символа.

Выводит символ, находящийся в регистре DL на экран, после чего курсор сдвигается на одну позицию вправо. Для вывода строки функцию следует использовать в цикле. Допустимо перенаправление вывода. Выполняет обработку при вводе этой комбинации с клавиатуры перед выводом каждого 64-го символа. Эта функция выводит и управляющие ASCII — символы с кодами 7, 8, 9, 0Ah, 0Dh. Символ с кодом 7 (bell, звонок) вызывает звуковой сигнал, с кодом 8 (backspace, забой)- возвращает курсор на одну позицию влево, с кодом 9 (tab, табуляция) — смещает курсор на одну позицию вправо, кратную 8. Действия управляющих клавиш с кодами 0Ah и 0Dh рассматривались ранее.

Вызов: AH=02h, Int 21h

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

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

Использование данной функции рассмотрим на примере процедуры перехода на новую строку.

;Запрос функции 02h

;Второй вызов DOS

· Функция 09h — вывод строки.

Выводит строку символов на устройство стандартного вывода (используется в системных программах для вывода на экран информационных сообщений). Строка должна заканчиваться символом $ (код 24h), который служит признаком конца строки, и сам не выводится. Допустимо перенаправление вывода. В сообщение могут быть включены и управляющие коды (7, 8, 9, 0Ah, 0Dh), которые вызывают соответствующие им действия (см. функцию 02h). Допустимо использование Exc- последовательностей. Функция выполняет обработку при вводе этой комбинации с клавиатуры перед выводом каждого 64-го символа.

;Адрес строки Promt: DS:DX

;Запрос функции 09h

· Функция 40h — вывод данных в файл или в устройство.

Универсальная функция вывода данных из буфера пользователя в сегменте данных в файл или на устройство, дескриптор которого указывается в регистре BX. Дескриптор 1, закреплённый за стандартным устройством вывода, обеспечивает перенаправление вывода. Значение регистра CX определяет число байтов, которые должны быть выведены, а пара регистров DS:DX указывает адрес выводимых данных. Управляющие коды 08h, 0Ah, 0Dh и некоторые другие приводят к выполнению соответствующих им действий. После завершения вывода при CF=0 регистр AX содержит число действительно выведенных байтов, а при CF=1 — возвратный код ошибки. Как и при использовании функции 3Fh, это коды ошибок 5 или 6.

;Запрос функции 40h

;Число пересылаемых байт

;Адрес буфера для выводимого сообщения

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

Как уже отмечалось в п.1.2, рассмотренный процесс считывания ASCII — кодов клавиш клавиатуры с помощью системных функций DOS относится к алфавитно-цифровым клавишам, за которыми закреплены ASCII — таблицей отображаемые символы (буквы, цифры, знаки препинания и др.). Кроме них, на клавиатуре персонального компьютера имеется ряд клавиш, которым не назначены какие-либо отображаемые символы. Это, например, функциональные клавиши . , клавиши управления курсором , , . , , , специальные клавиши , , а также использующие на практике различные сочетания клавиш с , и . В этом случае, в качестве scan— кода клавиши или какой-либо комбинации из них, выступает также старший байт кодового слова, но уже при нулевом младшем байте (нулевом коде ASCII). Например, при нажатии клавиши в кольцевой буфер ввода клавиатуры поступает код 3B00h, а клавиши — 4700h.

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

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

Обратим здесь внимание на важный момент! Расширенный код ASCII можно считать, если программа будет настроена на проверку нулевого значения младшего байта для каждого нажатия клавиши.

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

;Ожидаем нажатия клавиши

;Функция ввода одиночного символа без эха

;Первый вызов DOS

;Расширенный ASCII код?

;Да, введём старший байт

;Повторный вызов DOS

;Вывод сообщения mes1

;Вывод сообщения mes2

;Вывод сообщения mes3

1.6 Строковые команды. Общая характеристика

Строкой или литералом в языке ассемблера называется последовательность букв, цифр и др. символов, заключённых в кавычки или апострофы, (двойные кавычки). Следует отметить, что иногда понятие строки трактуется в расширительном смысле, а именно, как последовательность байтов, которые могут либо представлять, либо не представлять ASCII — символы.

Строковые команды, несмотря на синонимичное название со строковыми переменными, предназначены для обработки не только ASCII — строк, но и вообще блоков байтов, одинарных или двойных слов, каждое из которых хранится в памяти в двоичном коде.

Строковые команды представлены в табл. 1.1 и по своему назначению делятся на две группы:

— команды перемещения данных (Lods, Stos, Movs),

— команды для поиска и сравнения данных (Scas, Cmps).

Любая строковая команда может оперировать как байтами, так и словами, что отражается в мнемокоде команды (например: movsb, movsw, movsd). Все строковые команды, в отличие от других команд процессора ix86, используют для выполнения своих функций одни и те же регистры: ds:si(esi)- регистры строки — источника,

es:di(edi)- регистры строки — приёмника.

При этом индексные регистры si(esi) и di(edi) определяют смещения элементов строк в сегментах данных, определяемых регистрами ds и es соответственно. Установите es=ds, если это не противоречит другим условиям реализации программы, что позволит вам не беспокоится о корректной адресации сегментов памяти. Необходимо помнить, что в строковых инструкциях приёмник — строка es:di(edi) не допускает переопределение, а источник — строка ds:si(esi), допускает переопределение на es:si(esi).

Каждая из строковых команд выполняет операцию только над парой элементов двух строк (или над одним для команд Lods, Stos, Scas) и автоматически настраивается на обработку соседних элементов, обеспечивая продвижение по строке в нужном направлении, а именно:

Здесь величина d определяется согласно правилу:

Таблица 1.1 — Команды обработки строк

Название команды и её мнемокод в TASM

Lods src-Загрузка Acc из строки

src=byte ds:si Lodsb

src=word ds:si Lodsw

src=dword ds:si Lodsd

Stos dst — Сохранение Acc в строке


dst=byte es:di Stosb

dst=word es:di Stosw

dst=dword es:di Stosd

Movs dst, src — Пересылка элемента строки

dst=byte es:di, src=byte ds:si Movsb

dst=word es:di, src=word ds:si Movsw

dst=dword es:di, src=dword ds:si Movsd

Scas dst — Поиск элемента в строке

dst=byte es:di Scasb

dst=word es:di Scasw

dst=dword es:di Scasd

Все флаги операции сравнения

Cmps dst, src — Сравнение элементов строк

src=byte ds:si, dst=byte es:di Cmpsb

src=word ds:si, dst=word es:di Cmpsw

src=dword ds:si, dst=dword es:di Cmpsd

Все флаги операции сравнения

Префикс повторения, помещённый непосредственно перед строковой командой, заставляет её циклически выполняться определённое число раз до реализации заданного условия.

Существуют три командных префикса:

— REP (repeat, повторять) — повторять, пока cx¹ 0,

— REPE/REPZ — повторять, пока (cx¹ 0)& (zf=1),

— REPNE/REPNZ — повторять, пока (cx¹ 0)& (zf=0).

Префиксы, используют регистр CX как счётчик числа циклов (беззнаковое число), которое должно быть записано в cx до начала выполнения строковой команды. Счётчик cx декрементируется на 1 после выполнения строковой команды, но проверяется перед её выполнением. Если cx=0, то строковая команда не выполняется ни разу. Префиксы REPE и REPNE дополнительно выставляют флаг нуля zf после выполнения строковой операции.

Идея простейшей защиты программы от несанкционированного запуска заключается в том, что где-то в программе записывается ключевое слово-пароль, и программа, начав работать, требует ввода этого слова с клавиатуры. Если пользователь ввёл пароль правильно, программа продолжит свою работу, иначе попросит ввести его заново или завершится. Ввод пароля обычно осуществляется функцией DOS не отображающей вводимые символы на экране и заканчивается нажатием клавиши (обычно 08h).

Password DB ‘camel’ ;Пароль

String DB 80 DUP(?)

Promt DB 13,10,’Введите пароль: $’

OK DB 13,10,’Работаем!$’

Start: mov ax,@data

;Вывод запроса на ввод пароля

Begin: mov ah,09h

mov dx, offset promt ;Адрес запроса

mov bx,0 ;Инициализация индексирования ввода

Pass: mov ah,08h ;Функция ввода символа в AL без эха

je compare ;Да, на сравнение

mov [string+bx],al ;Нет, сохраним символ

mov ah,02 ;Запишем на экран *

jmp pass ;Повторять

;Сравнение введённого пароля с действительным (сравнение строк)

Compare: push ds ;Установить ES на сегмент данных

mov si, offset string ;DS:SI- начало string

mov di, оffset password ;ES:DI — начало password

cld ;DF=0- просмотр вперёд

mov cx, bx ;Установить счётчик сравнения

Repe cmpsb ;Сравнивать, пока или повторять, пока символы двух строк ;совпадают, но не более CX раз

jne begin ;Строки не равны

;Вывод сообщения ОК, подтверждающего правильность пароля

mov dx, offset OK

Exit: mov ax,4C00h ;Ввод функции 4С для завершения программы

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

– Ознакомиться с содержанием материала лабораторной работы и соответствующими тематическими разделами в рекомендуемой литературе.

– Получить исполняемый EXE — файл для программы Demon. asm (Распечатка. ASM — файла приведена в Приложении 1) и выполнить действия с операторами перенаправления ввода-вывода данных, а именно:

– Разработка программы в соответствии с индивидуальным заданием.

– Демонстрация основной программы с возможным использованием операторов перенаправления ввода-вывода.

– Основная программа должна обеспечивать интерактивный режим и удобный интерфейс с пользователем.

1.8 Варианты индивидуальных заданий

1. Ввести строку из произвольных ASCII — символов и произвести её сортировку под управлением функциональных клавиш: F1- по возрастанию; F2- по убыванию; F10- завершение программы. Работу программы отобразить на экране.

2. Ввести строку из произвольного числа символов и произвести в ней поиск подстроки SYMBOL. Если подстрока найдена, то её необходимо удалить. Вновь полученную строку вывести на экран. Если подстрока не найдена, вывести сообщение NOT_FOUND. Программу защитить паролем.

3. Ввести строку из произвольного числа символов. Выполнить преобразование символьной строки в её цифровой аналог на основе ASCII — кодов, поле чего произвести поиск максимального кода. Работу программы отобразить на экране и защитить паролем.


4. Ввести строку из произвольных ASCII — символов и произвести её сортировку к виду, включающему четыре части разделённые пробелами: цифры, буквы прописные, буквы строчные, все другие символы. Работу программы отобразить на экране и защитить паролем.

5. Ввести строку из нескольких слов, разделённых пробелами. Слова включают в произвольном порядке цифры, строчные и прописные латинские буквы. Отредактированная строка включает слова, начинающиеся с прописной буквы (остальные строчные). Цифры из слов должны быть удалены. Программу защитить паролем.

6. Ввести строку из произвольных ASCII — символов и выполнить с ней преобразования, задаваемые нажатием функциональных клавиш: — изменение порядка следования символов исходной строки на обратный, — замена строчной буквы на прописную и обратно, — завершение программы.

7. Ввести строку из произвольного числа символов и произвести в ней поиск подстроки COMPUTER. Если такой подстроки нет, то данную подстроку ввести в начало исходной строки и вывести на экран. В противном случае дать сообщение There is. Программу защитить паролем.

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

9. Ввести строку из произвольного числа символов. Выполнить преобразование символьной строки в её цифровой аналог на основе ASCII — кодов, поле чего произвести поиск минимального кода. Работу программы отобразить на экране и защитить паролем.

10. Ввод с клавиатуры на экран произвольный текста с одновременной записью в буфер. Реализовать элементы редактирования: стирание последних символов клавишей «», контроль над прописной буквой первого слова нового предложения. При ошибке строчная буква заменяется прописной. Переход на новую строку осуществляется кл. . Управление: — вывод копии отредактированного текста из буфера, — выход из программы.

11. Ввод с клавиатуры на экран произвольного текста с одновременной записью в буфер. Программа демонстрирует переход на новую строку одним из двух способов:

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

12. Ввести строку из произвольного числа символов и произвести в ней поиск подстроки AUTOMATON. Если такой подстроки нет, то в начало исходной строки поместить символ @, а в её конец дописать подстроку и вывести на экран. В противном случае дать сообщение: There is. Программу защитить паролем.

Отчёт по лабораторной работе должен содержать программы п. 1.7, а т

акже разработанные программы индивидуального задания из п. 1.8.

1.9 Контрольные вопросы к лабораторной работе №1

1. Что такое описатель (дескриптор)? Сколько описателей определено в DOS и как ими пользоваться?

2. Какие три функции DOS можно использовать для ввода символов с клавиатуры в регистр AL процессора?

3. Назовите функции DOS, осуществляющие ввод строки символов с клавиатуры в память данных.

4. Какие функции DOS осуществляют операцию вывода на экран:

– одиночных символов из регистра DL процессора,

– строки символов из памяти данных?

5. Напишите процедуру перевода курсора на новую строку с помощью DOS-функции 02.

6. Что такое скан — код клавиши и чем он отличается от расширенного кода ASCII? Как нужно организовать вызовы соответствующей функции DOS для получения расширенного ASCII-кода?

7. Каким сегментным регистром должен адресоваться сегмент данных, в котором располагается:

8. Какие строковые команды влияют на флаги, а какие нет?

9. Что нужно предпринять при написании программы, если строки — операнды команды должны располагаться в одном сегменте?

10. Перечислите префиксы повторения строковых команд и их возможные сочетания друг с другом.

11. В какой фазе исполнения команды происходит проверка счётчика на равенство нулю при выполнении:

– строковой команды с префиксом повторения,

– команды управления циклом Loop ?

12. Что происходит с исполнением этих команд, если счётчик СХ инициализирован нулём?

Файл Demon. asm для изучения поведения универсальных функций ввода-вывода DOS (38h и 40h) при использовании операторов переназначения ввода-вывода данных.

%TITLE «Исследование операторов перенаправления ввода вывода. Demon. asm»

;Дескриптор стандартного ввода

;Дескриптор стандартного вывода

;Дескриптор стандартной ошибки (экрана)

Db ‘Введите строку!’

;Установка в ds адреса

;Вывод служебного сообщения msg

mov bx, descrip_err

mov dx, offset msg

;Ввод строки с клавиатуры в буфер Buf

mov bx, descrip_in

;Ввод максимум 80 байт

mov dx, offset Buf

;Преобразование строчных латинских букв в прописные

;Счётчик элементов строки

;Инициализация указателя элементов строки

;Да, не преобразовывать

;Да, не преобразовывать

;Преобразуем в прописную

mov bx, descrip_out

mov dx, offset Buf

;Функция DOS 4Сh: выход из программы

;Возврат кода ошибки

;Вызов DOS. Останов

;Конец программы/точка входа

В таблицах П.1 и П.2 приводятся информационные байты некоторых расширенных кодов для функциональных клавиш и их сочетаний.

1 — Расширенные коды для функциональных клавиш

Аппаратное обеспечение IBM PC

2.5. Средства MS-DOS для работы с клавиатурой


К сожалению, MS-DOS не предоставляет программам каких-либо существенных дополнительных возможностей по сравнению с функциями прерывания BIOS INT 16h. Поэтому многие программы работают с клавиатурой через BIOS.

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

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

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

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

Приведем подробное описание клавиатурных функций прерывания MS-DOS INT 21h.

2.5.1. Буферизованный ввод с эхо-выводом

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

Введенный символ выводится на стандартное устройство вывода.

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

2.5.2. Буферизованный ввод без эхо-вывода

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

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

2.5.3. Нефильтрованный ввод без эхо-вывода

Если буфер клавиатуры пуст, выполнение программы задерживается до нажатия на любую клавишу.

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

2.5.4. Ввод/вывод на консоль

Функция 06h может использоваться как для ввода с консоли, так и для вывода символов на консоль. Режим работы функции зависит от содержимого регистра DL при вызове функции. Если этот регистр содержит значение 0FFh, функция выполняет ввод с консоли, в противном случае символ, код которого записан в этот регистр, выводится на консоль.

Очевидно, что с помощью этой функции нельзя вывести на консоль символ с кодом 0FFh.

Основное отличие функции 06h от всех описанных ранее заключается в том, что эта функция не ожидает, пока оператор нажмет на клавишу. Если буфер клавиатуры пуст, функция просто устанавливает флаг процессора ZF в 1.

Если в буфере клавиатуры имеются символы, флаг ZF сбрасывается и в регистр AL функция записывает ASCII-код символа.

2.5.5. Ввод строки символов

Функция предназначена для ввода с клавиатуры строки символов. Перед вызовом функции необходимо специальным образом подготовить буфер, адрес которого передается в регистрах DS:DX — в первый байт буфера следует записать максимальную длину вводимой строки (в диапазоне от 1 до 244):

После возврата из функции буфер будет иметь следующий формат:

Ввод осуществляется до тех пор, пока либо количество введенных символов не достигнет max-1, либо пока не будет нажата клавиша Enter (код 0Dh). Если оператор уже ввел max-1 символ и продолжает вводить символы дальше, функция выдает звуковой сигнал на каждое нажатие и игнорирует вводимые символы до тех пор, пока не будет нажата клавиша Enter.

При вводе строки можно использовать стандартные средства редактирования MS-DOS, используемые при вводе команд в режиме командной строки.

2.5.6. Проверка состояния стандартного ввода

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

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

2.5.7. Сброс буфера клавиатуры

Функция очищает клавиатурный буфер, затем вызывает клавиатурную функцию MS-DOS, номер которой определяется содержимым регистра AL. Если же регистр AL содержит другое значение, кроме приведенных выше, функция просто сбрасывает содержимое буфера и не выполняет никаких других действий.

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

Иллюстрированный самоучитель по задачам и примерам 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.

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