Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Ввод строки 
:(
    Опции темы
Fantaz1
Дата 26.3.2011, 16:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 44
Регистрация: 16.1.2009

Репутация: нет
Всего: нет



помогите разобраться с вводом в assembler'e.
Надо в 2 строки загнать по 5 символов
Вот код:
Код

model small
stack 256
 
.data
        str1 db 5 dup(?)
        str2 db 5 dup(?)
.code
        mov ax,@data
        mov ds,ax
        
        ;вводим первую строку
        mov ah,3Fh
        mov cx,5
        mov bx,0
        mov dx, offset str1
        int 21h
 
        ;вводим вторую строку
        mov ah,3Fh
        mov cx,5
        mov bx,0
        mov dx, offset str2
        int 21h
mov ax,4C00h
int 21h
end

Но у меня то в одну, то в другую строку загоняются левые символы (как я понял символы клавиши Enter).
Подскажите как очистить буфер клавиатуры перед тем как вводить новые строки??
PM MAIL   Вверх
iff
Дата 26.3.2011, 19:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Администратор
**


Профиль
Группа: Участник
Сообщений: 949
Регистрация: 23.3.2007

Репутация: 4
Всего: 16



В общем случае функция 3f предназначена для чтения файлов. Перед вызовом в BX помещается дескриптор файла, в CX число байт, которые необходимо прочитать. После выполнения прерывания флаг CF равен 1, если произошла ошибка или 0 - если таковой нет. В случае ошибки AX будет содержать её код, а если ошибки нет, то AX содержит колличество реально прочитанных символов (оно может быть равно числу, ранее загреженному в CX или быть меньше него, в случае если файл закончился).
Но функцию 3Fh прерывания 21h можно также использовать и для работы с клавиатурой (со стандартным устройством ввода). В языках выского уровня используется такое понятие как, как STDIN - поток входных данных. Он может быть перенаправлен например такой командой: 
Код

C:\>prog.exe < book.txt

В этом случае программа 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
Пример использования:
Код

.data
inputbufer label byte
maxlen db 6
reallen db ?
strinp db 6 dup(?)

.code
mov ah,0ah
lea dx,inputbufer
int 21h

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

Это сообщение отредактировал(а) iff - 27.3.2011, 13:36


--------------------
DOS... Синей пеленой экран заполнил чистый DOS 
Мышь... Стала вдруг квадратной, потеряла форму мышь... 
Я разбил окно, девяностопятое мастдайное окно, 
И поставил DOS, и тогда увидел: Это счастье, — вот оно.  
PM MAIL WWW   Вверх
500mhz
Дата 26.3.2011, 19:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


шайтан
***


Профиль
Группа: Завсегдатай
Сообщений: 1017
Регистрация: 5.5.2008
Где: Киев / Italy

Репутация: 1
Всего: 14



а еше можно через int 0x16 (bios)


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

PM MAIL ICQ   Вверх
iff
Дата 26.3.2011, 20:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Администратор
**


Профиль
Группа: Участник
Сообщений: 949
Регистрация: 23.3.2007

Репутация: 4
Всего: 16



Да, но тогда придётся самим обрабатывать нажатия клавиши BackSpace, Enter (ввод по одному символу). Ну и не будет интеграции с операционной системой: например нельзя будет перенаправить ввод.


--------------------
DOS... Синей пеленой экран заполнил чистый DOS 
Мышь... Стала вдруг квадратной, потеряла форму мышь... 
Я разбил окно, девяностопятое мастдайное окно, 
И поставил DOS, и тогда увидел: Это счастье, — вот оно.  
PM MAIL WWW   Вверх
500mhz
Дата 26.3.2011, 20:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


шайтан
***


Профиль
Группа: Завсегдатай
Сообщений: 1017
Регистрация: 5.5.2008
Где: Киев / Italy

Репутация: 1
Всего: 14



ну это понятно.

кстате я не понимаю преподов которые досих пор задают студентам что то под мсдос и тасм )))


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

PM MAIL ICQ   Вверх
Fantaz1
Дата 26.3.2011, 23:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 44
Регистрация: 16.1.2009

Репутация: нет
Всего: нет



iff спасибо большое!!! Разобрался!!
Насчет 3Fh, хотелось бы узнать почему такое твориться..)
PM MAIL   Вверх
iff
Дата 27.3.2011, 14:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Администратор
**


Профиль
Группа: Участник
Сообщений: 949
Регистрация: 23.3.2007

Репутация: 4
Всего: 16



Цитата(Fantaz1 @  26.3.2011,  23:15 Найти цитируемый пост)
Насчет 3Fh, хотелось бы узнать почему такое твориться..) 

1. представим что у нас есть текстовой файл, который содержит такие данные:
Код

str1
qw


Представим теже данные в шестнадцатиричном формате:
73 74 72 31 0D 0A 71 77 0D 0A
Теперь, предположим, что этот файл мы открыли, и DOS выдал его дескриптор, который равен 12.
Вы запустили код:
Код

        mov ah,3Fh
        mov cx,2
        mov bx,12
        mov dx, offset strdat1
        int 21h

        mov ah,3Fh
        mov cx,10
        mov bx,12
        mov dx, offset strdat2
        int 21h

Что получается в результате. После первого вызова в элемент данных strdat1 помещается значение 73 74, регистр AX становится равным 2 (прочитано 2 символа).
После второго вызова в элемент данных strdat2 помещается значение 72 31 0D 0A 71 77 0D 0A, регистр AX становится равным 8 (а не 10, потому что файл закончился).
2. Аналогично работает и с клавиатурой. Например, вы запустили код
Код

        ;вводим первую строку
        mov ah,3Fh
        mov cx,5
        mov bx,0
        mov dx, offset str1
        int 21h
 
        ;вводим вторую строку
        mov ah,3Fh
        mov cx,5
        mov bx,0
        mov dx, offset str2
        int 21h

Рассмотрим, что происходит. При первом вызове программа ожидает того, что пользователь введёт строку и нажмёт Enter. Допустим пользователь ввёл:
Код

test!!


В шестнадцытиричном представлении это будет:
74 65 73 74 21 21 0D 0A
Именно эти данные и содержит буфер клавиатуры в этот момент.
Посе выполнения прерывания строка str1 будет содержать 74 65 73 74 21 (или "test!" в ASCII-представлении), AX будет равен 5. Буфер клавиатуры теперь содержит такие данные: 21 0D 0A (или "!<перевод строки>" в ASCII-представлении).
Далее происходит второй вызов. Программа опять ожидает ввода, и пользователь вводит:
Код

a


После этого буфер клавиатуры будет содержать:
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, и тогда увидел: Это счастье, — вот оно.  
PM MAIL WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Asm для начинающих"
MAKCim
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • Не забывайте пользоваться кнопкой КОД.
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к разделу форума. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, MAKCim.

 
 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Asm для начинающих | Следующая тема »


 




[ Время генерации скрипта: 0.2351 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.