![]() |
|
|
![]()
|
|
| Fantaz1 |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 44 Регистрация: 16.1.2009 Репутация: нет Всего: нет |
помогите разобраться с вводом в assembler'e.
Надо в 2 строки загнать по 5 символов Вот код:
Но у меня то в одну, то в другую строку загоняются левые символы (как я понял символы клавиши Enter). Подскажите как очистить буфер клавиатуры перед тем как вводить новые строки?? |
|||
|
||||
| iff |
|
||||
![]() Администратор ![]() ![]() Профиль Группа: Участник Сообщений: 949 Регистрация: 23.3.2007 Репутация: 4 Всего: 16 |
В общем случае функция 3f предназначена для чтения файлов. Перед вызовом в BX помещается дескриптор файла, в CX число байт, которые необходимо прочитать. После выполнения прерывания флаг CF равен 1, если произошла ошибка или 0 - если таковой нет. В случае ошибки AX будет содержать её код, а если ошибки нет, то AX содержит колличество реально прочитанных символов (оно может быть равно числу, ранее загреженному в CX или быть меньше него, в случае если файл закончился).
Но функцию 3Fh прерывания 21h можно также использовать и для работы с клавиатурой (со стандартным устройством ввода). В языках выского уровня используется такое понятие как, как STDIN - поток входных данных. Он может быть перенаправлен например такой командой:
В этом случае программа prog.exe получит данный не с клавиатуры, а из файла book.txt Функцию 3Fh можно применять для работы с клавиатурой, используя стандартный дескрипторы файлов: 0 - Стандартный ввод (клавиатура) 1 - Стандартный вывод (экран) 2 - Сообщения об ошибках (экран) 3 - Вспомогательное устройство (COM-порт) 4 - Принтер (LPT-порт) Т.е., считывая данные из файла, дескриптор которого равен 0, фактически осуществляется ввод с клавиатуры. Однако, т.к. функция 3Fh предназначена для работы с файлами, то и с клавиатурой она работает как с файлом. Это полезно, если программа воспринемает вводимые данные как простой поток байт. (Например стандартная DOS программа more.com, которая предназначена для вывода данных по частям такого размера, что-бы не было прокрутки экрана). Но в тоже время использование этой функции ведёт к неудобствам, в случае, если вводимые данные рассматриваются не как поток байт, а как отдельные строки (это мы наблюдаем в вашем случае). <... Если хотите знать, почему происходят те неудобства, которые вы описали в первом сообщении, напишите это в ответе и я тогда попытаюсь объяснить. ...> А в данный момент могу порекомендовать использование функции 0Ah прерывания 21h. Подробнее: http://www.codenet.ru/progr/dos/dos_0018.php Пример использования:
Данный код осуществляет ввод строки, длина которой ограничена пятью (в элементах данных указано число на 1 больше) символами. Это сообщение отредактировал(а) iff - 27.3.2011, 13:36 -------------------- DOS... Синей пеленой экран заполнил чистый DOS Мышь... Стала вдруг квадратной, потеряла форму мышь... Я разбил окно, девяностопятое мастдайное окно, И поставил DOS, и тогда увидел: Это счастье, — вот оно. |
||||
|
|||||
| 500mhz |
|
|||
![]() шайтан ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1017 Регистрация: 5.5.2008 Где: Киев / Italy Репутация: 1 Всего: 14 |
а еше можно через int 0x16 (bios)
-------------------- |
|||
|
||||
| iff |
|
|||
![]() Администратор ![]() ![]() Профиль Группа: Участник Сообщений: 949 Регистрация: 23.3.2007 Репутация: 4 Всего: 16 |
Да, но тогда придётся самим обрабатывать нажатия клавиши BackSpace, Enter (ввод по одному символу). Ну и не будет интеграции с операционной системой: например нельзя будет перенаправить ввод.
-------------------- DOS... Синей пеленой экран заполнил чистый DOS Мышь... Стала вдруг квадратной, потеряла форму мышь... Я разбил окно, девяностопятое мастдайное окно, И поставил DOS, и тогда увидел: Это счастье, — вот оно. |
|||
|
||||
| 500mhz |
|
|||
![]() шайтан ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1017 Регистрация: 5.5.2008 Где: Киев / Italy Репутация: 1 Всего: 14 |
ну это понятно.
кстате я не понимаю преподов которые досих пор задают студентам что то под мсдос и тасм ))) -------------------- |
|||
|
||||
| Fantaz1 |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 44 Регистрация: 16.1.2009 Репутация: нет Всего: нет |
iff спасибо большое!!! Разобрался!!
Насчет 3Fh, хотелось бы узнать почему такое твориться..) |
|||
|
||||
| iff |
|
||||||||||
![]() Администратор ![]() ![]() Профиль Группа: Участник Сообщений: 949 Регистрация: 23.3.2007 Репутация: 4 Всего: 16 |
1. представим что у нас есть текстовой файл, который содержит такие данные:
Представим теже данные в шестнадцатиричном формате: 73 74 72 31 0D 0A 71 77 0D 0A Теперь, предположим, что этот файл мы открыли, и DOS выдал его дескриптор, который равен 12. Вы запустили код:
Что получается в результате. После первого вызова в элемент данных strdat1 помещается значение 73 74, регистр AX становится равным 2 (прочитано 2 символа). После второго вызова в элемент данных strdat2 помещается значение 72 31 0D 0A 71 77 0D 0A, регистр AX становится равным 8 (а не 10, потому что файл закончился). 2. Аналогично работает и с клавиатурой. Например, вы запустили код
Рассмотрим, что происходит. При первом вызове программа ожидает того, что пользователь введёт строку и нажмёт Enter. Допустим пользователь ввёл:
В шестнадцытиричном представлении это будет: 74 65 73 74 21 21 0D 0A Именно эти данные и содержит буфер клавиатуры в этот момент. Посе выполнения прерывания строка str1 будет содержать 74 65 73 74 21 (или "test!" в ASCII-представлении), AX будет равен 5. Буфер клавиатуры теперь содержит такие данные: 21 0D 0A (или "!<перевод строки>" в ASCII-представлении). Далее происходит второй вызов. Программа опять ожидает ввода, и пользователь вводит:
После этого буфер клавиатуры будет содержать: 21 0D 0A 61 0D 0A (или "!<перевод строки>a<перевод строки>" в ASCII-представлении). Т.е. часть данных осталось от недопрочитанного прошлого ввода (пользователь ввёл не 5, а 6 символов), а другая часть уже новые данные, которые ввел пользователь. После выполнения прерывания строка str2 будет содержать 21 0D 0A 61 0D (или "!<перевод строки>a<перевод корретки вниз>" в ASCII-представлении), AX будет равен 5, буфер клавиатуры будет содержать 0A. Как видите в str2 записаны нежелательные данные: остаток от прошлого ввода (21 0D 0A). Если бы пользователь ввёл 5 символов, как задумывалось, то всёравно нежелаемый остаток бы был: 0D 0A (перевод строки). А если бы пользователь при первом вводе ввёл 20 символов? Тогда второй ввод даже бы и не вызывал ожиданеи ввода, остаток (17 символов) полностью бы заполнил str2. Т.е. тут работает как поток данных: при вводе в буфер символы добовляются, при считывании, они они из буфера удаляются. -------------------- DOS... Синей пеленой экран заполнил чистый DOS Мышь... Стала вдруг квадратной, потеряла форму мышь... Я разбил окно, девяностопятое мастдайное окно, И поставил DOS, и тогда увидел: Это счастье, — вот оно. |
||||||||||
|
|||||||||||
![]()
|
| Правила форума "Asm для начинающих" | |
|
|
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, MAKCim. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Asm для начинающих | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |