Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Абель.docx
Скачиваний:
13
Добавлен:
26.11.2018
Размер:
569.84 Кб
Скачать

100 Для ввода ассемблерных команд (не машинных команд) по адpесу 100. Не

забудьте, что DEBUG предполагает, что все числа вводятся в

шестнадцатиричном формате:

100 MOV AH,40

102 MOV BX,01

105 Mov cx,хх (введите длину вашего имени)

108 MOV DX,10E

10B INT 21

10D RET

10E db 'Ваше имя'

Программа устанавливает в регистре AH запрос на вывод и устанавливает

шест. значение 10F в регистре DX - адрес DB, содержащей ваше имя в конце

программы.

Когда вы наберете все команды, нажмите еще раз Return. С помощью

команды U (U 100,10D) дисассемблируйте программу для проверки. Затем

используйте команды R и T для трассировки выполнения. При выполнении

команды INT 21H отладчик перейдет в BIOS, поэтому при достижении адреса

10B введите команду GO (G 10D) для перехода к команде RET. Ваше имя будет

выведено на экран. С помощью команды Q вернитесь в DOS.

ВВОД С КЛАВИАТУРЫ: РАСШИРЕННЫЙ DOS

________________________________________________________________

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

клавиатуры в расширенной версии DOS:

INAREA DB 20 DUP (' ') ;Область ввода

MOV AH,3FH ;Запрос на ввод

MOV BX,00 ;Номер для клавиатуры

MOV CX,20 ;Максимум байт для ввода

LEA DX,INAREA ;Адрес области ввода

INT 21H ;Вызов DOS

Команда LEA загружает относительный адрес INAREA в регистр DX.

Команда INT ожидает, пока пользователь не введет cимволы с клавиатуры, но

не проверяет превышает ли число введенных символов максимальное значение в

регистре CX (20 в приведенном примере). Нажатие клавиши Return (код шест.

0D) указывает на завершение ввода. Например, после ввода текста "PC Users

Group" INAREA будет содержать:

PC Users Group, шест.0D, шест.0A

После введенного текста непосредственно следует символ возврата

каретки (шест.0D), который был введен, и символ конца строки (шест.0A),

который не был введен. В силу данной особенности максимальное число

символов и размер области ввода должны предусматpивать место для двух

символов. Если будет введено cимволов меньше максимального значения, то

область памяти за введенными символами сохранит прежнее значение.

В результате успешной операции будет очищен флаг CF (что можно

проверить) и в регистре AX будет установлено число байт, введенных с

клавиатуры. В предыдущем примере это число будет равно 14 плюс 2 для

перевода каретки и конца строки, т.е. 16. Соответствующим образом

программа может определить действительное число введенных символов. Хотя

данное свойство весьма тривиально для ответов типа YES или NO, оно может

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

Ошибка ввода может возникнуть, если определен неправильный номер

файла. В этом случае будет установлен флаг CF и в регистр AX будет помещен

код ошибки (6 в данном случае). Так как регистр AX может содержать или

длину введенных данных, или код ошибки, то единственный способ определения

наличия ошибки - проверка флага CF.

Если вводить текст, который превышает максимальную длину,

yстановленную в регистре CX, то будут приниматься все символы. Рассмотрим

ситуацию, когда регистр CX содержит 08,а пользователь введет символы "PC

Exchange". В результате первые восемь символов "PC Excha" попадут в

область ввода без кодов возврата каретки и конца строки. В регистре AX

будет установлена длина 08. Следующая команда INT будет принимать данные

не с клавиатуры, а из собственного буфера, поскольку там еще остались

предыдущие данные. Таким образом, в область ввода будут приняты символы

"ngе", символ перевода каретки и символ новой строки, в регистре AX будет

установлено значение 05. Обе операции ввода являются вполне нормальными и

флаг CF будет очищен.

Первый INT: PC Excha AX = 08

Второй INT: ngе,0D,0A AX = 05

Программа может определить факт ввода законченного текста, если а) в

регистре AX получится значение меньше, чем в регистре CX или б) если

содержимые AX и CX равны, но последние два символа в области ввода - 0D и

0A.

Встроенные в DOS проверки по функции 0AH для ввода с клавиатуры имеют

более мощные средства. Их выбор для использования в программах является

предпочтительным.

Упражнение: Ввод данных

-------------------------

Выполним упражнение в котором можно проследить операцию ввода c

клавиатуры с помощью отладчика DEBUG. Предполагаемая программа позволяет

вводить до 12 символов, включая символы конца каретки и конца строки.

Загрузите DEBUG и после вывода на экран приглашения введите A 100 для

ввода ассемблерных команд, начиная c адреса 100. Не забудьте, что DEBUG

предполагает, что все числа вводятся в шестнадцатиричном формате.

100 MOV AH,3F

102 MOV BX,00

105 MOV CX,0C

108 MOV DX,10F

10B INT 21

10D JMP 100

10F DB ' '

Программа устанавливает регистры AH и BX для запроса на ввод c

клавиатуры, заносит максимальную длину ввода в регистр CX и загружает в

регистр DX значение 10F - область DB в конце программы. В эту область

будут помещаться вводимые символы.

Когда вы наберете все команды, нажмите еще раз Return. С помощью

команды U 100,108 выполните дисассемблирование программы для проверки.

Затем используйте команды R и T для трассировки четырех команд MOV.

Остановившись по адресу 10B, введите G 10D для выполнения команды INT

(входить в BIOS не следует). Теперь отладчик позволит ввести данные,

завершаемые клавишей Return. Проверьте содержимое регистра AX, состояние

флага CF и используя команду D 10F, просмотрите введенные данные в памяти.

Для завершения работы введите команду Q.

ИСПОЛЬЗОВАНИЕ СИМВОЛОВ ВОЗВРАТА КАРЕТКИ,

КОНЦА СТРОКИ И ТАБУЛЯЦИИ ДЛЯ ВЫВОДА НА ЭКРАН

________________________________________________________________

Один из способов получения более эффективного выводе на экран -

использование управляющих символов возврата каретки, перевода строки и

табуляции:

Десятичные ASCII Шестнадцатиричные

CR 13 0DH

LF 10 0AH

TAB 09 09H

Эти символы при операциях ввода-вывода выполняют одинаковые действия

как в базовой, так и в расширенной версиях DOS. Например:

MESSAGE DB 09,'PC Users Group Annual Report',13,10

MOV AH,40H ;Запрос на вывод

MOV BX,01 ;Номер файла

MOV CX,31 ;Длина текста

LEA DX,MESSAGE ;Адрес текста