Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: TD и прерывания DOS.  (Прочитано 10622 раз)
0 Пользователей и 3 Гостей смотрят эту тему.
Xapuyc
Гость
« : 13-10-2009 15:36 » 

Здравы будьте, товарищи эксперты.
Поясните ламеру, пожалуйста, один большой вопрос.

begin:
   mov ax,data
   mov ds,ax
   mov ax,3h
   int 10h
   and bx,0   
   mov ah,9   
   mov dx,offset spam   
   int 21h      
   mov cx,10      
   mov dx,3      
   
      mov ah,0Ah
      int 21h

Вот начало программы. (пишется все под 086, честь ему и хвала =)). Когда открываю я TD, он как-то проскакивает процесс ввода информации. То есть, хочу ввести некое число (в данном случае), а в результате этот шаг пропускается, и в al помещается ноль как последний символ ничего не введенного.

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

Заранее огромное спасибо!  Улыбаюсь
« Последнее редактирование: 15-10-2009 05:06 от Sel » Записан
RXL
Технический
Администратор

Offline Offline
Пол: Мужской

WWW
« Ответ #1 : 14-10-2009 06:42 » 

Рекомендую свериться с документацией.
Например здесь можно взять "Tech Help! 4.0" - подробное описание множества функций DOS и BIOS.
https://club.shelek.ru/viewfiles.php?id=3
К сожалению, на XP64 оно не запускается - подсказать не могу.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Serg79
Команда клуба

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #2 : 14-10-2009 18:09 » 

Xapuyc, про ассемблер я слышу не в первый раз, но смысл твоих слов я не понимаю:
Когда открываю я TD, он как-то проскакивает процесс ввода инф-ции. То есть хочу ввести некое число (в данном случае), а в результате этот шаг проскакивается и в al помещается ноль как последний символ ничего не введенного.
Ты постарайся грамотно сформулировать свои мысли и четко сказать, что ты делаешь и что у тебя не получается.

ИМХО, твой топик не несет никакой смысловой нагрузки. Он только бесполезно занимает место жесткого диска на сервере.
Записан
Xapuyc
Гость
« Ответ #3 : 14-10-2009 19:07 » 

Ок, шеф.
1) Запускаю Turbo Debugger и запускаю пошаговую отладку.
2) Дохожу до DOS-прерывания ввода строки
mov ah,0ah
int 21h
3) По идее прерывание 21h в данном случае должно считать данные с клавиатуры, а потом завершиться, но оно спокойно выполняется без запроса на считывание, и далее указатель ставится на следующую команду. Код выполняется дальше.

Если запускаю сам экзешник - таких проблем нет. Все нормально считывается, но так как мне нужно это добро не работает. Хочу отладить, а отладчик такие финты выдает...
Записан
Serg79
Команда клуба

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #4 : 16-10-2009 05:54 » 

Xapuyc, Ты пытаешься считать строку (0Ah) с помощью функции DOS, а буфер для полученных данных ты правильный передаешь?
Записан
sss
Специалист

ru
Offline Offline

« Ответ #5 : 16-10-2009 06:00 » 

Xapuyc, ты хочешь отладить код обработчика что-ли?
Записан

while (8==8)
Xapuyc
Гость
« Ответ #6 : 16-10-2009 08:56 » new

2 sss
Нет. Про какой обработчик ты имел в виду, не понял? =)
2 Serg79
Каюсь, коряво мысль изложил.


В буфере и была вся проблема.

1) Я считал, что для строки необходимо выделить 3 байта параметров: один на макс. длину строки, другие 2 на кол-во вводимой строки. Отсюда и была проблема.
+Забыл выложить сюда фрагмент дата сегмента с переменными, из-за чего заставил вас головы поломать  Краснею

buffer db 3 dup (255)
string db 255 dup(?)

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

Далее, как видно из куска дата сегмента, я присвоил всем трем байтам значение 255 =) ЕСТЕСТВЕННО, что ни о каком корректном буфере не может быть и речи => косяки с вводом, которые я никак понять не мог.

Еще препод посоветовал заменить mov dx,3 на mov dx,offset buffer, но это высокий уровень. А как это реализовать на уровне памяти видеоадаптера? Просто адреса вводить? И вообще, как offset <строка> реализуется на низком уровне? Это необязательно, мне просто интересно... Ага
Записан
Serg79
Команда клуба

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #7 : 16-10-2009 12:04 » 

Еще препод посоветовал заменить mov dx,3 на mov dx,offset buffer, но это высокий уровень.
Правильно преподаватель посоветовал. Если не видишь разницы между mov dx, 3 и mov dx, offset buffer то учи матчасть.

А как это реализовать на уровне памяти видеоадаптера? Просто адреса вводить?
С видеопамятью все немного сложнее, там символ представляется двумя байтами, первый байт ASCII код символа, второй его атрибуты (цвет, фон и может быть еще мигание).
Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines