Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Прерывания DOS. Строка с консоли. 
:(
    Опции темы
I_Am_Rock
Дата 7.2.2009, 00:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Всем привет!

Вот такой код:
Код

mov  ah,009
mov  dx,0010D
int  021
mov  ah,010
int  016
int  020
; Дальше сразу идет "Privet!$"


С этим кодом все норм - т.е. строка выводится на консоль и ждет клавишу.

Но вот я изменил его.
Код

mov  ah,00A
mov  dx,00114
int  021
mov  ah,009
mov  dx,00114
int  021
mov  ah,010
int  016
int  020
; Дальше сразу идет "Privet!$"


Я хочу, чтобы я ввел текст, он занимал бы место вот этого "Привета", и тут же выводился вместо него.
Но это почему-то не происходит. Точнее происходит - но если введено больше 1 символа и меньше 5 и причем выводится вместе с какими-то др. символами (непонятно откуда).

Кто знает - поясните, пожалуйста, что тут не так.  smile 
PM MAIL WWW   Вверх
dumb
Дата 7.2.2009, 13:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


sceloglauxalbifacies
****


Профиль
Группа: Экс. модератор
Сообщений: 2929
Регистрация: 16.6.2006

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



функция 0ah ввода строки использует специальный формат данных. (найти пример работы можно найти в соседних темах)
функция 09h вывода строки конец строки определяет по байту со значением 24h('$')
PM MAIL   Вверх
ФедосеевПавел
Дата 7.2.2009, 14:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Привет, I_Am_Rock

Лишние символы оттого, что после ввода строки функцией 0a int 21h ты не ставишь признак конца строки для функции 09 int 21h - '$', а кроме того почитай о формате буфера ввода строки функции 0a int 21h.
Вот пример работы этих функций в паре
Код

.MODEL TINY
.CODE
    ORG    100h
Main:
    jmp    @@Start

asCR_LF    db    0dh, 0ah, '$'

kbMax    db    8
kbLen    db    ?
asStr    db    'Privet!$'

@@Start:
    ;Печать строки 'Privet!'
    mov    ah, 09h
    mov    dx, offset asStr
    int    21h
    ;Ожидание любой клавиши
    mov    ah, 10h
    int    16h
    ;Переход к новой строке
    mov    ah, 09h
    mov    dx, offset asCR_LF
    int    21h

    ;Ввод строки
    mov    ah, 0ah
    mov    dx, offset kbMax
    int    21h
    ;Переход к новой строке
    mov    ah, 09h
    mov    dx, offset asCR_LF
    int    21h
    ;добавление в конец строки символа конца для функции 09 int 21h - '$'
    mov    si, offset asStr
    mov    bx, 0
    mov    bl, kbLen
    mov    BYTE PTR [si+bx], '$'

    ;Печать новой строки    
    mov    ah, 09
    mov    dx, offset asStr
    int    21h
    ;Ожидание любой клавиши
    mov    ah, 10h
    int    16h

    mov    ax, 4c00h
    int    21h
END Main

PM   Вверх
I_Am_Rock
Дата 7.2.2009, 14:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(ФедосеевПавел @  7.2.2009,  14:05 Найти цитируемый пост)
Привет

Привет. smile

Цитата(dumb @  7.2.2009,  13:55 Найти цитируемый пост)
функция 09h вывода строки конец строки определяет по байту со значением 24h('$')

Я в курсе - я ж написал ; Дальше сразу идет "Privet!$" С этим норм.

Цитата(dumb @  7.2.2009,  13:55 Найти цитируемый пост)
функция 0ah ввода строки использует специальный формат данных. (найти пример работы можно найти в соседних темах)

Цитата(ФедосеевПавел @  7.2.2009,  14:05 Найти цитируемый пост)
Вот пример работы этих функций в паре

Спасибо. smile
PM MAIL WWW   Вверх
I_Am_Rock
Дата 7.2.2009, 16:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Вобщем, я почти разобрался. Только не могу понять одного - как определить размер строки, введенной с помощью 0A int 21h? (с тем, чтоб добавить после строки знак $).

Чтобы лучше понять принцип - программир-ую, редактируя пустой com-файл в HVIEW'е. Как там это сделать?

Это сообщение отредактировал(а) I_Am_Rock - 7.2.2009, 16:38
PM MAIL WWW   Вверх
ФедосеевПавел
Дата 7.2.2009, 22:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата

как определить размер строки, введенной с помощью 0A int 21h? (с тем, чтоб добавить после строки знак $).

Для ввода строки функцией 0ah int 21h определяется не просто строка, а структура
Код

kbMax    db    8                ; максимальная длина вводимой строки
kbLen    db    ?                ; после выполнения прерывания здесь будет реальная длина введенной строки
asStr    db    'Privet!$'    ; место для строки - буфер длиной kbMax  плюс один - для символа 0dh


После вызова Fn 0ah int 21h нужно заменить символ 0dh на '$'
Код

   mov    si, offset asStr
    mov    bx, 0
    mov    bl, kbLen
    mov    BYTE PTR [si+bx], '$'


Ну а в Hiew'е - сам балуйся
PM   Вверх
I_Am_Rock
Дата 8.2.2009, 01:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



ФедосеевПавел

Спасибо за ответ. Но как программа понимает, что в kbLen находится длина? В представленном тобой коде (большом) есть 

Код

mov    bl, kbLen


,т.е. содержимое kbLen записывается в bl. Но я не понимаю - как оно, содержимое, вообще изначально попадает в kbLen? Ведь во всей программе больше нет ни одного упоминания kbLen.

Наверное, для знающего асм это кажется смешным.  smile smile
PM MAIL WWW   Вверх
ФедосеевПавел
Дата 8.2.2009, 02:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Подпрограмма обработки прерывания (Fn 0ah int 21h) записывает туда значение (одновременно с символами вводимой строкои asStr).

Т.е. вызывая эту функцию, программа передаёт ей в ds:dx адрес структуры, в которой заполнен только один байт - kbMax. После нажатия на Enter, функция заполняет другие поля структуры - kbLen и asStr - и возвращает управление программе. Так программа приобретает введённую с клавиатуры строку и длину этой строки (как в рекламе - купите левый ботинок и правый получите бесплатно).

PM   Вверх
I_Am_Rock
Дата 8.2.2009, 12:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



А если я во всех (абсолютно во всех) местах программы kbLen заменю на bkLen, она туда запишит то, что нужно? И как программа догадывается что именно сюда надо записать длину? Почему, например, не наоборот - в kbMax реальную длину, а в kbLen максимальную? А если у меня еще 10 переменных?..

smile

Это сообщение отредактировал(а) I_Am_Rock - 8.2.2009, 12:59
PM MAIL WWW   Вверх
ФедосеевПавел
Дата 8.2.2009, 23:42 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(I_Am_Rock @  8.2.2009,  12:58 Найти цитируемый пост)
А если я во всех (абсолютно во всех) местах программы kbLen заменю на bkLen, она туда запишит то, что нужно? И как программа догадывается что именно сюда надо записать длину? Почему, например, не наоборот - в kbMax реальную длину, а в kbLen максимальную? А если у меня еще 10 переменных?..


Прости, мне очень лень набирать ручками справку по функции ДОС из TechHelp'а или любой книги по Assembler'у. Но вкратце, для Fn 0ah требуется передать в ds:dx адрес буфера (структуры) со следующим форматом:
0-й байт - максимально возможная длина строки (1-254),
1-й байт - здесь после выполнения преравания будет находиться реальная длина введённой строки,
2-й байт - начало строки.
Поэтому переменные в программе определяются в строго определённом порядке
Код

kbMax    db    8
kbLen    db    ?
asStr    db    'Privet!$'[/quote]

При вызове Fn 0ah в ds:dx помещается адрес этой структуры (т.е. адрес kbMax, а не asStr - как это делалось в твоей программе)
Код

    ;Ввод строки
    mov    ah, 0ah
    mov    dx, offset kbMax
    int    21h

А для вывода строки на экран используется уже адрес самой строки asStr
Код

    ;Печать новой строки    
    mov    ah, 09
    mov    dx, offset asStr
    int    21h


Твоё начальное желание
Цитата(I_Am_Rock @  7.2.2009,  00:02 Найти цитируемый пост)
Я хочу, чтобы я ввел текст, он занимал бы место вот этого "Привета", и тут же выводился вместо него.

неосуществимо, по причине необходимости двух дополнительных байтов kbMax и kbLen.

Пожалуйста, для изучения языка, перейди на нормальные компиляторы TASM или MASM, также можно изучать Assembler, встроенный в компиляторы других языков (Delphi, Pascal, C/C++).
Так ты сможешь избежать неразберихи в адресах переменных.


PM   Вверх
I_Am_Rock
Дата 9.2.2009, 14:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(ФедосеевПавел @  8.2.2009,  23:42 Найти цитируемый пост)
0-й байт - максимально возможная длина строки (1-254),1-й байт - здесь после выполнения преравания будет находиться реальная длина введённой строки,2-й байт - начало строки.Поэтому переменные в программе определяются в строго определённом порядке

Ааа... Теперь я кажется понял. 


Цитата(ФедосеевПавел @  8.2.2009,  23:42 Найти цитируемый пост)
Пожалуйста, для изучения языка, перейди на нормальные компиляторы TASM или MASM, также можно изучать Assembler, встроенный в компиляторы других языков (Delphi, Pascal, C/C++).Так ты сможешь избежать неразберихи в адресах переменных.

У меня MASM. И так-то я в нем уже чуть научился работать - понял как использовать в нем API-функции (я их давно изучил еще на др. языках) и сделал свой калькулятор. Да и дальше в MASM собираюсь учиться. Просто чтобы быстрее понять суть на этом этапе поигрался с чистым ассемблером (где прямо при создании проги я вижу байты которые ввожу и кроме которых ничего не будет).

Большое спасибо. smile
PM MAIL WWW   Вверх
I_Am_Rock
Дата 9.2.2009, 15:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Все, написал программку. Спасибо, Павел. smile

И даже получилось лучше, чем ожидал. Удивила меня одна вещь. Записав строку с помощью Fn 0ah, строка пошла не поверх имеющихся данных, а как бы сместив их вправо. Знак доллара находился на месте для строки, она его отодвинула и получается - строка оканчивается долларом, как и надо. Не ожидал такого "сервиса". smile
PM MAIL WWW   Вверх
ФедосеевПавел
Дата 9.2.2009, 21:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Ой, а я не все понял. Можно программу посмотреть, хоть одним глазком... Из чистого любопытства...
PM   Вверх
I_Am_Rock
Дата 9.2.2009, 23:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Скриншот в файле. А что именно не понятно?

У меня у самого тут сейчас вопрос возник.((( Я делал этот файл - он находился прямо на диске (т.е. E:\art1.com), скопировал на Рабочий стол - ведет себя по другому, не дает ввести больше 3 символов! Хотя во всем остальном как тот, что на прямо на диске. Вот уже вообще ничего не понимаю....(((

Присоединённый файл ( Кол-во скачиваний: 6 )
Присоединённый файл  proga.rar 8,56 Kb
PM MAIL WWW   Вверх
ФедосеевПавел
Дата 10.2.2009, 00:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Три символа оттого. что значение в ячейке [011a] не задаётся в программе, а заполняется мусором (вернее, там ещё перед запуском программы был какой-то мусор)
Код

  mov  ah, 00a
  mov  dx, 0011a
  int  021
  mov  w, [0011c], 00024 ;" $"
  mov  ah, 009
  mov  dx, 0011c
  int  21
  mov  ah, 010
  int  016
  int  020

Добавление "$" в конец строки
Код

    ;добавление в конец строки символа конца для функции 09 int 21h - '$'
    mov    si, offset asStr
    mov    bx, 0
    mov    bl, kbLen
    mov    BYTE PTR [si+bx], '$'

или
Код

  mov  si, 0011c
  mov  bx, 0
  mov  bl, [0011b]
  mov  b, [si+bx], 024 ;"$"

PM   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Asm для начинающих"
MAKCim
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • Не забывайте пользоваться кнопкой КОД.
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к разделу форума. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

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

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


 




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


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

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