Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Работа для программиста > Фриланс
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 13.11.2010, 11:15   #11
Tronix
Форумчанин
 
Аватар для Tronix
 
Регистрация: 15.06.2010
Сообщений: 740
По умолчанию

Мог бы взяться, но без самой железяки под рукой тестировать - не возможно. Вообще не такое сложное задание в целом. Сам "драйвер" (обычный резидент на самом то деле) запросто дизасемблируется старым добрым Sourcer'ом до вменяемого и читаемого вида. Тестовая прога содержит в себе отладочную информацию, поэтому имена процедур и функций все видны. Отлично дебажится старым добрым Turbo Debugger. Но тем не менее без железки переписать под винду я не смогу. Либо смогу, если вы будете постоянно тестировать, но это растянется до следующего года такими темпами.

На всякий случай прикреплю дизассемблерованный исходник "драйвера", вполне возможно что даже соберется TASM, если заголовок немного подправить (выкинуть инклюды и прочее).
Вложения
Тип файла: rar ACP3_DRV.rar (1.9 Кб, 13 просмотров)
Чтобы понять рекурсию, сперва нужно понять рекурсию.
Tronix вне форума Ответить с цитированием
Старый 15.11.2010, 01:47   #12
I-Gor
 
Регистрация: 08.11.2010
Сообщений: 6
Восклицание Уточнение темы

Прошу прощения за свой пост от 14.11.2010 01:28, где назвал экзешник com-файлом. Больно уж устал. Спать хотелось.

«Решил программист испечь блины. Первый блин, как водится, вышел комом. Второй – exe’шником» (Анекдот)

Tronix:
«Сам "драйвер" (обычный резидент на самом то деле) запросто дизасемблируется старым добрым Sourcer'ом до вменяемого и читаемого вида».

Вот что значит пословица: «Одна голова – хорошо, а две – лучше»! Хорошую Tronix подкинул мне идею! Я тоже, немного погуглив, скачал себе Sourcer (правда, довольно древний – v. 3.07) и получил сходные с Tronix'ом результаты. Правда, у Tronix’а комментарии в ASM файле более информативные. Просто у меня до этой задачи не было нужды в интеллектуальных дизассемблерах, вполне довольствовался hiew. Теперь буду копать.

А драйвер под винду писать и не нужно. Это будет иллюстрацией к пословице «Заставь дурака Богу молиться, он и лоб расшибет». Об этом я уже говорил в разделе http://programmersforum.ru/showthread.php?t=120790

Дело в том, что винда – не единственная многозадачка для DOS-приложений. Есть еще и многозадачные DOS, чаще всего основанные на ядре DR-DOS (собственно DR-DOS, Novell DOS, OpenDOS и им подобные). И механизм реализации многозадачности там принципиально другой, чем в Win95/98. Там реализована вытесняющая многозадачность, подобная той, что используется в NT-системах. Форумчан сбило с толку утверждение, что проверка второй части задания проводится под Windows 98 (кстати, высказывание не мое – я запостил сабж, как он был дан в универе). Позднее объясню, откуда оно взялось.

От себя добавлю, что на универовском компе есть еще и Caldera DR-DOS (с обновленным ядром от drdosprojects.de – там есть и встроенная поддержка FAT32, и прочие нужные в хозяйстве приблуды). Ну, так вот. При запусе acp3_drv и acp_test под DR-DOS происходит интересная вещь. Когда эти два процесса выполняются в гордом одиночестве (при включенном, естественно, DR-DOS’овском мультитаскере) - то все OK! Стоит только создать новое задание (например, Volkov Commander) и сделать его активным, как DR-DOS «замораживает» ранее запущенную связку acp3_drv + acp_test, вместо того, чтобы их в фоновом режиме квазипараллельно c VC выполнять. Точнее, тестовая программа выполняется, но не получает от резидента-драйвера значений. Значит, глохнет резидент. Но это еще не все. Если потом переключиться таскером на acp_test (т. е. снова сделать его активным), то, как по волшебству, он начинает работать нормально. Следовательно, резидент оживает. Смысл второй части задания – выяснить, почему происходят такие вещи и, по возможности, их побороть. По словам препода, будет достаточно, если найдется решение для многозадачной DR-DOS. Но он почему-то уверен, что если оно заработает под DR-DOS, то и под Win98 запашет за милую душу (что, собственно и выразилось в концовке второй части сабжа). Но к разработке Win32-драйвера это не имеет никакого отношения. То есть Win95/98-драйвер не следует из ТЗ. Именно это я имел в виду, когда говорил, что нужен мне Win-драйвер как собаке пятая нога.

Я извиняюсь перед теми форумчанами, кто по маразму препа и моей невнимательности вторую часть задания неправильно понял.

Последний раз редактировалось I-Gor; 15.11.2010 в 03:10.
I-Gor вне форума Ответить с цитированием
Старый 15.11.2010, 15:46   #13
mss
Заблокирован
 
Регистрация: 27.05.2010
Сообщений: 1,099
По умолчанию

> он почему-то уверен, что если оно заработает под DR-DOS

Не заработает. Так ему и скажи - пусть обломится)
Этот самый "резидент", насколько я понял из беглого просмотра листинга дизассемблирования, не использует аппаратные прерывания. В условиях вытесняющей многозадачности это решающий фактор, при котором задача пока она неактивна не получит ни единого кванта времени от планировщика.

> под Win98 запашет за милую душу

А вот это запросто.
Win9x/Me, реализуя пусть ущербную, но именно невытесняющую многозадачность, дает возможность настройки битовой карты портов и безо всяких драйверов.
В сочетании с грамотным конфигурированием ДОС-сеанса это позволяет стартовать в нем последовательно "резидента" и затем оболочку, взаимодействующую с резидентом.



> то и под Win98 запашет за милую душу
mss вне форума Ответить с цитированием
Старый 16.11.2010, 02:24   #14
I-Gor
 
Регистрация: 08.11.2010
Сообщений: 6
Хорошо

mss:
«Win9x/Me, реализуя пусть ущербную, но именно невытесняющую многозадачность, дает возможность настройки битовой карты портов и безо всяких драйверов.
В сочетании с грамотным конфигурированием ДОС-сеанса это позволяет стартовать в нем последовательно "резидента" и затем оболочку, взаимодействующую с резидентом.»

mss – единственный человек, кто меня правильно понял. Mikl___, например, дважды утверждал о необходимости Win32-драйвера. Вообще, вторая часть сабжа в вузовской формулировке, по-моему, больше напоминает анекдот про дурдом, где эффективность лечения проверяют, наполняя ванну водой, ставят ложку и кружку, и требуют от пациента эту ванну опорожнить. Идиот воспользуется ложкой, полоумный возьмет кружку, ну, а до конца вылеченный просто вынет пробку…

mss:
«Этот самый "резидент"… не использует аппаратные прерывания. В условиях вытесняющей многозадачности это решающий фактор, при котором задача пока она неактивна не получит ни единого кванта времени от планировщика»

Что ж… Осталось только обосновать это утверждение в своем курсовике ссылками.на серьезную литературу. Этим уж сам займусь.

Следовательно, вторую часть задания групповыми усилиями mss и Tronx’а я считаю в принципе выполненной. Осталось только навести марафет. Ну, это уж мои проблемы. Если возникнут какие-то вопросы, напишу.

Я-то думал - чтобы сделать вторую часть сабжа, нужно до конца выполнить первую. Вот уж воистину – одна голова – хорошо, а несколько – лучше.

Mikl___ (http://programmersforum.ru/showthread.php?t=120790):
«Что-то я не вижу... работы которую проделал ты сам...»

Я начинал выполнять сабж с конца (с третьего пункта) его первой части. Собственно программа взаимодействия с пользователем там до неприличия проста. Это будет бесконечный цикл, выводящий на экран некую последовательность целых чисел (значение функции опроса). Потребуется также обработка нажатия какой-либо клавиши для выхода из этого бесконечного цикла, когда надоест. Возможно, нужна будет пара-тройка операторов для организации паузы внутри цикла, чтобы выводимая инфа не мельтешила на экране слишком часто. Для такой фигни, по-моему, достаточно и QBasic’а. Например:

DECLARE FUNCTION ACPquery ()

DO
PRINT ACPquery
IF INKEY$ = CHR$(27) THEN EXIT DO
LOOP

FUNCTION ACPquery

END FUNCTION

Можно, конечно, разукрасить экран, сделать более удобочитаемым вывод, однако особого смысла нет. «Соль» задачи не в этом: необходимо прописать функцию опроса (ACPquery в данном примере). А для этого необходимо знать, как вышеупомянутый резидент может передавать данные внешней программе (пункт 2 первой части сабжа). У кого какие будут соображения?

В последнем посте раздела http://programmersforum.ru/showthread.php?t=120790 я просил, чтобы мне дали «точку опоры». Точку опоры мне дали. Для второй части – mss, для первой – Tronix. Но все равно в логике работы резидента у меня много неясностей. Что, например, в его листинге значат команды вида

out dx,al ; port 2, DMA-1 bas&add ch 1
in al,dx ; port 2, DMA-1 bas&add ch 1

в том смысле, что для каких целей проге понадобился ПДП? Уж, не для организации ли экспорта данных «налево»? Вопрос ко всем, кто в таких вещах «рубит».

«А все, что понято с трудом, то мне дороже» (Юрий Антонов)

Последний раз редактировалось I-Gor; 16.11.2010 в 04:29.
I-Gor вне форума Ответить с цитированием
Старый 16.11.2010, 09:35   #15
mss
Заблокирован
 
Регистрация: 27.05.2010
Сообщений: 1,099
По умолчанию

> для каких целей проге понадобился ПДП?

Вероятно, для "мгновенной" перегонки в ОЗУ очередного готового блока данных, подготовленного железкой.
Если железка достаточно высокоскоростная, то ЦП может попросту не успеть перегнать этот блок до момента готовности следующего, что приведет к потере данных. На то собственно ПДП и существует.
mss вне форума Ответить с цитированием
Старый 16.11.2010, 14:48   #16
Mikl___
Участник клуба
 
Регистрация: 11.01.2010
Сообщений: 1,139
По умолчанию

Там прямой вывод в видеобуфер -- где вы там ПДП нашли? Sourcer сгенерировал комментарии, там нет ни одного комментария добавленного Tronix'ом
Mikl___ вне форума Ответить с цитированием
Старый 16.11.2010, 19:55   #17
I-Gor
 
Регистрация: 08.11.2010
Сообщений: 6
Сообщение

mss:
«> для каких целей проге понадобился ПДП?

Вероятно, для "мгновенной" перегонки в ОЗУ очередного готового блока данных, подготовленного железкой».

Собственно, это я и предполагал. См. мой вопрос «Уж, не для организации ли экспорта данных «налево»?» на два поста выше.

Mikl___:
«Там прямой вывод в видеобуфер -- где вы там ПДП нашли?»

То, что резидент не использует вывод на экран – это я могу заявить точно. Другое дело, что он может употребить неактивную страницу видеопамяти для каких-то своих целей… Ну, так это уж вообще хулиганское поведение. В приличных домах так не делают. Хотя все может быть.
А что Tronix не писал комментарии к листингу, - здесь Mikl___ абсолютно прав. Да, и незачем ему это было. У меня тоже Sourcer выводит точно такие же сообщения об использовании DMA.

И все же – куда именно в ОЗУ резидент может кидать данные?
I-Gor вне форума Ответить с цитированием
Старый 17.11.2010, 05:01   #18
Mikl___
Участник клуба
 
Регистрация: 11.01.2010
Сообщений: 1,139
По умолчанию

[цитата I-Gor]То, что резидент не использует вывод на экран – это я могу заявить точно[конец цитаты]
I-Gor иногда лучше молчать, или бородатый анекдот рассказать не в тему...
берем листинг присланный Tronix
;================================== ==========
sub_5 proc near
and ax,0F0Fh <-- выделение младших 4 бит в байте
add ax,3030h <-- получаем ASCII код цифр
mov es:[bx],ah <-- вывод старшей цифры
inc bx <-- перешли на следующий байт текстового видеобуфера
mov byte ptr es:[bx],0Fh <-- атрибут цифры белый цвет на черном фоне
inc bx <-- перешли на следующий байт текстового видеобуфера
mov es:[bx],al <-- вывод младшей цифры
inc bx <-- перешли на следующий байт текстового видеобуфера
mov byte ptr es:[bx],0Fh <-- атрибут цифры белый цвет на черном фоне
inc bx <-- перешли на следующий байт текстового видеобуфера
retn
sub_5 endp
;================================== ======================
ищем по тексту где происходит вызов sub_5
;================================== ========================
sub_4 proc near
push ax
push cx
push bx
push es
mov bx,data_19e
mov es,bx <-- вот здесь нечто помещается в ES
xor bx,bx <-- вывод цифр произойдет в левый верхний угол экрана
mov ch,4
push ax <-- первоначально в АХ 4 цифры в формате BCD
mov cl,ch
shr ax,cl ; Shift w/zeros fill
mov cl,ch
shr al,cl ; Shift w/zeros fill
call sub_5 <-- вот наша процедура для вывода двух первых цифр
pop ax
mov cl,ch
shl ax,cl ; Shift w/zeros fill
mov cl,ch
shr al,cl ; Shift w/zeros fill
call sub_5<-- вот наша процедура для вывода двух оставшихся цифр
pop es
pop bx
pop cx
pop ax
retn
sub_4 endp
;================================== ===========
ищем в тексте data_19e
;================================== =========
data_19e equ 0B800h <-- адрес текстового видеобуфера
;================================== ============
Еще есть вопросы?
[цитата I-Gor]Что ж… Осталось только обосновать это утверждение в своем курсовике ссылками.на серьезную литературу. Этим уж сам займусь.[конец цитаты]Значит курсовую пишем чужими руками... Ну-ну...

Последний раз редактировалось Mikl___; 17.11.2010 в 09:52.
Mikl___ вне форума Ответить с цитированием
Старый 18.11.2010, 04:30   #19
I-Gor
 
Регистрация: 08.11.2010
Сообщений: 6
Восклицание

Извиняюсь за свой предыдущий пост. Там я хотел сказать, что резидент (acp3_drv), БУДУЧИ РЕЗИДЕНТНЫМ (простите за каламбур), не использует вывод на экран. Об этом я буду утверждать, даже взойдя на плаху. Именно резидентное состояние «драйвера» меня и интересует. Ну, не досказал два слова… Так что простите, господа. Херню сморозил-с.

Как верно сказал Mikl___, прога действительно выводит в левом верхнем углу экрана четыре ярко-белые цифры на черном фоне. Но происходит это, когда она после запуска ЗАКАНЧИВАЕТ СВОЮ РАБОТУ, передавая управление DOS. А «голый» DOS, в свою очередь, тут же сдвигает экран на одну строку вверх. И что там до этого было написано, конечно, не углядишь. Под Win98, где резидент запускается, но не работает, он при подключенной железке, выводит число 1311 (иногда 1310). В «голом» DOS’е под Turbo Debugger’ом – (тоже в присутствии железки) - сообщение «5?77». Что он пишет в реальной ситуации – одному Богу известно. Дело в другом. Если процедуры выводят на экран то, что «честным» путем нельзя увидеть, то стоило ли так подробно описывать их работу? Не спорю, Mikl___ закомментировал sub_4 и sub_5 образцово-показательно. А смысл? Я в своем курсовке вообще не стал их описывать (как к теме работы не относящиеся, это допустимо). И не только назло Mikl___’у. Если прога делает то, отчего ей (как и ее рядовому пользователю) ни холодно, ни жарко, то стоит ли подробно вникать в такие вещи? Не проще ли оставить их на совести разработчика?

В посте #12 я уже приводил пословицу про дурака, который расшибет лоб, если его заставить молиться Богу. Я ни коим образом не сомневаюсь в компетенции Mikl___’а как технического специалиста. Но вот его организационный подход…

Сначала он с пеной у рта доказывал необходимость Win32-драйвера. Mss ответил на этот счет несколькими конкретными фразами (см. пост #13). А теперь посмотрите скриншот во вложении, сделанный в универе вечером. Кто из них оказался прав? И ведь работает прога под виндой! Причем в настройке портов в самой системе не было и необходимости. Достаточно было по рекомендации mss’а грамотно сконфигурировать DOS-сеанс. И ведь mss подробно не объяснял мне, как именно это сделать. Сам додумался. Оказалось, достаточно вставить строку запуска acp3_drv в autoexec.bat, то есть запустить резидента до того, как придет отец Виндоус со своим хозяйством. А уж тестовая программа запускается под виндой обычным порядком. И нужен мне после этого win-драйвер, как щуке презерватив…

Теперь Mikl___ проделал бессмысленную работу. Мой вопрос-то ведь был в чем? Конкретно - объяснить назначение команд типа
out dx,al ; port 2, DMA-1 bas&add ch 1
in al,dx ; port 2, DMA-1 bas&add ch 1
на предмет их причастности к ПДП (это процедуры: loc_11, sub_2 и sub_3). А вообще – предположить (не выяснить, а только предположить!) механизм передачи данных резидентом. Вместо этого Mikl___ под английский орех разделал процедуры sub_4 и sub_5, где упомянутыми командами даже и не пахнет. И я не собираюсь такие вещи оплачивать. Не потому, что мне денег жалко. Просто, это уход от темы. Вот если бы Mikl___ точно также закомментировал часть проги, где по его мнению, «резидент» передает данные (а это ключевой вопрос!), то, как я уже говорил в http://programmersforum.ru/showthread.php?t=120790, честь бы ему была за это и похвала. И о денежной премии бы договорились. Так, что напрасно Mikl___ возмущается, что я пишу курсовик чужими руками. Его руками я уж точно не напишу.
Изображения
Тип файла: jpg acp_win9x.jpg (54.6 Кб, 159 просмотров)

Последний раз редактировалось I-Gor; 18.11.2010 в 07:07.
I-Gor вне форума Ответить с цитированием
Старый 18.11.2010, 05:22   #20
Mikl___
Участник клуба
 
Регистрация: 11.01.2010
Сообщений: 1,139
По умолчанию

I-Gor
Из задания на твою курсовую следует, что прежде всего нужно разбираться с тем, что делает твой драйвер-резидент, а этого у тебя не получится пока досконально не разберешься со всеми процедурами и переменными, с каждой командой. Комментарии Soucer генерирует автоматически и если в процедуре sub_2 Soucer не знает какое число находится в DX поэтому он предполагает что DX равен 0 и в комментарии пишет про port 0
;================================
sub_2 proc near
and al,27h ; '''
out dx,al ; port 0, DMA-1 bas&add ch 0
or al,8
out dx,al ; port 0, DMA-1 bas&add ch 0
retn
sub_2 endp
;================================== =========================
смотрим sub_3
;================================== =======================

sub_3 proc near
and al,27h ; '''
out dx,al ; port 0, DMA-1 bas&add ch 0
in al,dx ; port 0, DMA-1 bas&add ch 0
mov ah,al
inc dx
in al,dx ; port 1, DMA-1 bas&cnt ch 0
xchg al,ah
dec dx
push ax
mov al,10h
out dx,al ; port 0, DMA-1 bas&add ch 0
pop ax
retn
sub_3 endp
;================================== ===========================
опять не известно значение в DX и комментарии о port 0, после команды INC DX
появляется комментарии о port 1, после команды DEC DX комментарии снова о port 0
Mikl___ вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Драйвер ISA устройства для DOS I-Gor Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 6 12.11.2010 06:49
Драйвер для hp laserjet 1010 для windows 7 Юзер7 Общие вопросы C/C++ 6 04.08.2010 09:17
драйвер мыши для C++3.0 for dos masta777 Общие вопросы C/C++ 3 20.06.2009 17:31
Разработка драйвер USB-HID устройства _dx Win Api 5 10.06.2009 18:34
Для кадого ли устройства есть свой контроллер? Elm0 Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 6 21.06.2007 20:42