Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

Ассемблер? Это просто! Учимся программировать (FAQ)


Служба Рассылок Subscribe.Ru

Ассемблер? Это просто! Учимся программировать (FAQ)
______________________________________

Выпуск N 124

Вопросы, которые поступили от подписчиков рассылки
"Ассемблер? Это просто! Учимся программировать"

Дата выхода: 2001-10-31


Вопрос №1323

Попробовал использовать DOS Fn 4eH: Найти 1-й совпадающий файл. И след файл.

Такое описание (со входом разобрался):
Выход AX код ошибки если CF установлен
DTA заполнена данными (если не было ошибки)

Так вот, где лежит DTA? Вычитал: При запуске программы ее DTA устанавливается по смещению 80H относительно PSP. А вот с ней и не разобрался:( Про PSP чего-то написано, таблица и смещения. Выводил всё до кучи на экран и не нашёл нигде имени файла.
Вложил программку, которая всё выводит с моими комментариями. Занимаюсь асмом 3 дня, поэтому не судите строго:)

И ещё, где-то экспертам ответившим на мой вопрос надо чего-то ставить. Киньте в ответ ссылку где и чего. А то вы мне поможете, а я вам... тоже хочу:)

Ответ

Здравствуйте, DmitryK1!

Ну ты что-то тут намудрил! Зачем какие-то манипуляции с сегментом???
Как DTA начиналось по адресу cs:80h, так и работай с этим адресом!
И вообще, прежде чем вызывать функцию 4fh, неплохо бы сначала вызвать 4eh.

В общем, смотри программу для вывода имен файлов.

Приложение:


Отправил эксперт: Ayl
Эксперт отправил ответов (всего): 50

Экспертная группа: Общие вопросы по программированию на Ассемблере под DOS

Вопрос №1324

Здравствуйте! 13 октября 2001 года, в магазине "Мир обуви" я купила осенние ботинки. 29 октября на них сломался каблук. В починку не берут. Могу ли я их вернуть в магазин. Чек сохранен. На нем написано: "гарантия на обувь 30 дней". Спасибо!

Ответ

Здравствуйте, Алина!
А вы их переформатируйте.


Отправил эксперт: Painbringer (http://limanski.narod.ru - нечто наподобие домашней страницы)
Эксперт отправил ответов (всего): 207

Экспертная группа: Пользовательская работа c DOS

Вопрос №1323

Попробовал использовать DOS Fn 4eH: Найти 1-й совпадающий файл. И след файл.

Такое описание (со входом разобрался):
Выход AX код ошибки если CF установлен
DTA заполнена данными (если не было ошибки)

Так вот, где лежит DTA? Вычитал: При запуске программы ее DTA устанавливается по смещению 80H относительно PSP. А вот с ней и не разобрался:( Про PSP чего-то написано, таблица и смещения. Выводил всё до кучи на экран и не нашёл нигде имени файла.
Вложил программку, которая всё выводит с моими комментариями. Занимаюсь асмом 3 дня, поэтому не судите строго:)

И ещё, где-то экспертам ответившим на мой вопрос надо чего-то ставить. Киньте в ответ ссылку где и чего. А то вы мне поможете, а я вам... тоже хочу:)

Ответ

Здравствуйте, DmitryK1!
Вот так оно и пишется.
Как я понял, techhelp у тя есть, и там посмотришь формат, в котором уся эта бадяга хранится (размер, атрибуты и т.п.).
З.Ы. только не надо говорить:"а она у меня точку рисует" - типа так надо. В смысле что какалог твой (если ты конечно не в корне ее запустишь) выглядит как то так
.
..
catalog1
catalog2
file1
и т.д.

Приложение:


Отправил эксперт: Painbringer (http://limanski.narod.ru - нечто наподобие домашней страницы)
Эксперт отправил ответов (всего): 208

Экспертная группа: Общие вопросы по программированию на Ассемблере под DOS

Вопрос №1308

Сейчас ответил на вопрос Михаила по поводу программы из урока 6 (разбор в уроке 7). Только я задумался - и перестал вообще что-то понимать. Насколько я помню, процессоры x86 при выполнении программ ы используют конвейер команд. Который имеет объем от 6-ти байт в 8088 до 10-ти (кажется)... И везде написано, что когда команда помещена в конвейер, то никакие изменения в коде уже ничего изменить не могут. На чем, собственно, и основаны методы защиты от отладчиков... Причем конвейер сбрасывается только при выполнении команд передачи управления (jmp, call, int, ret и т.п.).
Тогда что происходит в нашем примере? По всему вышесказанному команда int 20h уже должна быть в конвейере ДО выполнения команды push ax! И должно происходить завершение программы. А она все равно выводит сообщение.
Может кто-нибудь это объяснить?

Ответ

Здравствуйте, Ayl!
Во первых, я бы Вам довольно сильно рекомендовал пользоваться 4Ch-функцией
21h-прерывания для завершения программы или хотя-бы ret-ом что-ли. 20h-прерывание
оставлено лишь для совместимости и никто не поручится, что в следующей версии
DOS она все еще будет...
А насчет сообщения... Мне кажется, что Ваша программа все-таки завершается
после первого int 20h... Но Вы пихаете в стек 9090h. Я не знаю,конечно, зачем...
У меня есть подозрение, что после завершения верхней части передается управление и
на вторую. То есть обе команды int 20h выполняются. И конвейер тут не виноват!
З.Ы. Где Вы нашли этот кусок кода??


Отправил эксперт: baldr (http://www.dospage.fromru.com - Сайт об ОС DOS. Всем, кто любит эту ОС!)
Эксперт отправил ответов (всего): 4

Экспертная группа: Общие вопросы по программированию на Ассемблере под DOS

Вопрос №1317

Добрый день, уважаемые эксперты!
У меня к Вам следующий вопрос: поставлена задача перехвата клавиши Pause в C++, чтобы при нажатии она игнорировалась.
При решении мне кажется, что только при написании резидентной асм-вставки мы сможем перехватить клавишу, но также возникает другой вопрос: нет ли у клавиши Pause какого-нибудь отдельного флага, как, скажем, у Caps Lock, чтобы постоянно флаг просто возвра щать в 0?
Также я был бы очень благодарен, если кто-нибудь посоветовал, действително, грамотную книжку или доки по тому, что возвращают клавиши, желательно с таблицей.
Большое спасибо. Всего Вам самого наилучшего.

Ответ

Здравствуйте, Questman!
Нет, Вы не правы... Вставка не обязательно должна быть на асме.
В Си есть ключевое слово interrupt, которое автоматически выполняет
все действия, которые делаются вручную на ассемблере при вызове и завершении
прерывания. То есть, если мы напишем примерно так:

void interrupt (*oldvect)(...); //Объявляем переменную-функцию :)

void interrupt int9(...) //Точки должны быть!
{ //Все регистры сохраняются автоматически...

А здесь у нас обработчик!

} //iret вставляется автоматически

void main(int argc, char *argv[])
{
oldvect=getvect(0x9);
setvect(0x9, int9); //А теперь у нас клавиатурка-то перехвачена!
Программа
setvect(0x9, oldvect); //Домой.
}

...то int9() будет вызываться при каждом нажатии почти любой
клавиши. Кроме: PrScr (прерывание 05h), Ctrl-Break или Ctrl-C (прерывание 1Bh),
и еще каких-то. Клавиша Pause, кажется, тоже не таким способом ловится... Но
это уже мелочи... А насчет флага - то это, извините, абсурд. Кто же Вам все
это дело возвратит, когда Ваша, да и все, практически, программы по нажатию
этой клавиши немножко... того ...замерзают? А вообще-то, если перепрограммировать
контроллер прерываний, то можно перехватить нажатие практически любой клавиши.
Правда, вот, я этого делать пока не умею. А хотелось бы. может кто научит, а?
Кстати, по клавишам рекомендую поискать на http://www.Kalashnikoff.ru .
Кажется там есть ссылка на программу techHelp, в которой вообще много всего
полезного. Если там нет - извините...


Отправил эксперт: baldr (http://www.dospage.fromru.com - Сайт об ОС DOS. Всем, кто любит эту ОС!)
Эксперт отправил ответов (всего): 5

Экспертная группа: Общие вопросы по программированию на Ассемблере под DOS

Вопрос №1299

Здравствуйте уважаемые эксперты!
Недавно один человек спрашивал о редакторе для Asm и ему посоветовали Tasmed. Я ради интереса его тоже скачал(версия 1.98с), вот только одна проблема, загружаясь в Command Promt Only(Win98se). Он при попытке запустить из под него tasm,tlink,td или afdpro каждый раз вешает систему. Выходя из программы, он тоже каждый раз вешает систему.:(
Если данный редактор запустить из Win в режиме эмуляции MS-DOS, то все запускается, но при выходе постоянно возникают ошибки, либо окошко зависнет, либо получу сообщение об ошибке, типа:
-
"В процессе работы программы возникла нестандартная ситуация"
Если использую 16-bit DPMI: "Место ошибки 19F8:178C"
Если использую 32-bit DPMI: "Место ошибки 07B5:0A31"
В обои случаях пишет: "Прерывания нет".
-
Все советы автора программы по устранению ошибок пробовал, использование 16/32 DPMI, тоже совет по решению проблем с зависанием программы, тоже не помогает.:(
Может хоть вы можете помочь!!!
Заранее спасибо!

Ответ

Здравствуйте, Ilya!
А можете кинуть ссылку на новый TasmED??? baldr@pisem.net - это я!
А вообще, я давно уже не рискую что-либо компилить под него... Он у меня как
редактор стоит. А для компиляции и компоновки я написал крутой bat-файл, который
все, что надо спросит и сделает. Если надо - пишите, пришлю.
Кстати, если уж все сильно достало, но позарез это надо, то очень полезно
иногда связаться с автором и ласково его поругать... Совет.


Отправил эксперт: baldr (http://www.dospage.fromru.com - Сайт об ОС DOS. Всем, кто любит эту ОС!)
Эксперт отправил ответов (всего): 6

Экспертная группа: Пользовательская работа c DOS

Вопрос №1324

Здравствуйте! 13 октября 2001 года, в магазине "Мир обуви" я купила осенние ботинки. 29 октября на них сломался каблук. В починку не берут. Могу ли я их вернуть в магазин. Чек сохранен. На нем написано: "гарантия на обувь 30 дней". Спасибо!

Ответ

Здравствуйте, Алина!
А Вы хоть знаете, ЧТО такое DOS? И при чем тут пользовательская работа с ним?
Давайте не будем засорять рассылку ботинками и каблуками... Пишите в соответствующие органы,
сходите к адвокату и т.п.


Отправил эксперт: baldr (http://www.dospage.fromru.com - Сайт об ОС DOS. Всем, кто любит эту ОС!)
Эксперт отправил ответов (всего): 8

Экспертная группа: Пользовательская работа c DOS

Вопрос №1326

Повторение вопроса 1308. Что-то все промолчали (кроме эксперта Dron'а, но и он не в тему ответил)...

Напоминаю: программа из 6-го урока (разбор в 7-ом). Типа создает стек внутри себя и пишет туда 2 раза nop. После этого идет код вывода строки. Под отладчиком - есс-но все глючит. Вопрос не в этом. Почему строка выводится, когда прога запускается БЕЗ ОТЛАДЧИКА!? Просто из командной строки? Причем я пробовал и вариант без стека, а команду изменял обычным mov. Во всех книжкам по защите от НСД написано, что без отладчика прога должна выполнить команду, которая была раньше (в нашем случае int 20h - завершение работы). В чем здесь собака порылась? Может, там какое-нибудь прерывание отрабатывает, поэтому и конвеер сбасывается? Или винда свинью подкладывает? Или просто проц слишком умный?

Ответ

Здравствуйте, Ayl!
Кстати, верно озадачил. Действительно выводит строку. Но я читал документацию ДОС 3.3 правда в оригинале и на английском так вот начиная с этой версии там просят настоятельно для завершения процесса пользоваться функцией 4ch. А для прерывания 20 там написано "CS must contain the segment address of the PSP". Но и это не важно там написано, что оно совместимо с версией младше 2.0. Так что делай вывод. А с 4сh все работает исправно.


Отправил эксперт: DiGiT
Эксперт отправил ответов (всего): 51

Экспертная группа: Общие вопросы по программированию на Ассемблере под DOS

Вопрос №1324

Здравствуйте! 13 октября 2001 года, в магазине "Мир обуви" я купила осенние ботинки. 29 октября на них сломался каблук. В починку не берут. Могу ли я их вернуть в магазин. Чек сохранен. На нем написано: "гарантия на обувь 30 дней". Спасибо!

Ответ

Moderatorial

[!] Offtopic


Отправил эксперт: DiGiT
Эксперт отправил ответов (всего): 52

Экспертная группа: Пользовательская работа c DOS

Вопрос №1325

Всем привет!
После дикого вечера между прочим неплохо варит башка, поэтому хотел бы обсудить с Вами давно наболевший вопрос, тем более что рассылка что-то захирела и не показывается... Понимаю, что на ниженаписанное так в двух словах не ответить, но все же прошу пораскинуть мозгами.
Речь пойдет об этой самой пресловутой нереентерабельности DOS и нереентерабельности другой хренотени под нее написанной.
Рассмотрим типичный пример борьбы с нереентерабельностью при перехвате прерывания таймера и подмене его обработчика своим (ну, в смысле, я имею в виду пользовательскую процедуру 01Сh). Классикой в данном случае может служить способ, используемый Т.Сваном:
В начале обработчика прерывания объявляем переменную:
InProg DB 0
и потом используем ее как флаг, который будет показывать были ли предыдущие копии обработчика запущены. В общем структура такая:
XXXX: cmp [byte cs:InProg],0 ;начало обработчика, проверяем флаг
jne Exit ;если установлен, знач процедура выполняется - выходим
inc [byte cs:InProg] ;если нет, устанавливаем и выполняем
…..; выполняем всякую каку, а в конце
dec [byte cs:InProg] ;снимаем флаг
pop ds
pop ax
Exit: iret ;выход
Вот тут-то Сван и лоханулся :((( Не мог он предусмотреть, что появятся гигагерцовые телеги. Во-первых, прерывание может произойти между decом и iretом (на рорах). Во-вторых, даже если роры убрать за dec (чего Сван делать не рекомендует), прерывание МОЖЕТ произойти даже между выполнением decа и iret. (У меня, например, на четырехпроцессорной рабочей станции происходит. Я, конечно, понимаю что только идиот использует DOS на таких мощностях, но в данном случае эту тему желательно все-таки прояснить).
Теперь собственно вопрос или , точнее, просьба: Во многих досовских программах имеются методы борьбы с нереентерабельностью. (Хотя бы даже обработка кнопалки PrnScreen). Почти все они базируются в той или иной степени на вышеописанном алгоритме и почти все они дают сбои на высоких частотах. В общем-то всем начихать, так как DOS умирает. Но иногда возникают проблемы…. В связи с этим не может ли кто-то предложить какие-нибудь экзотические методы борьбы с ентой нереентерабельностью? В более ширшем (ширейшем) смысле – как с ней вообще все-таки бороться? Часы в PC-то борются! Принимается ВСЕ – вплоть до аппаратных реализаций.
С уважением Вал.Ик.
P.S. Извините, если сильно грузанул вас такой рухлядью….
P.P.S. Индивидуальное обращение: Dron!!!!! А че рассылка-то по операционке не выходит? Весьма поучительное было чтиво, и вдруг заглохло.. Жалкоо-о-о-о…….



Ответ

Здравствуйте, Вал.Ик.!
Так я не понял проблемы или она решается расстановкой cls sti, где нужно. Я с этим однажды долго парился, но в конце-то концов все работает... (С большим непониманием)


Отправил эксперт: DiGiT
Эксперт отправил ответов (всего): 53

Экспертная группа: Общие вопросы по программированию на Ассемблере под DOS

Вопрос №1326

Повторение вопроса 1308. Что-то все промолчали (кроме эксперта Dron'а, но и он не в тему ответил)...

Напоминаю: программа из 6-го урока (разбор в 7-ом). Типа создает стек внутри себя и пишет туда 2 раза nop. После этого идет код вывода строки. Под отладчиком - есс-но все глючит. Вопрос не в этом. Почему строка выводится, когда прога запускается БЕЗ ОТЛАДЧИКА!? Просто из командной строки? Причем я пробовал и вариант без стека, а команду изменял обычным mov. Во всех книжкам по защите от НСД написано, что без отладчика прога должна выполнить команду, которая была раньше (в нашем случае int 20h - завершение работы). В чем здесь собака порылась? Может, там какое-нибудь прерывание отрабатывает, поэтому и конвеер сбасывается? Или винда свинью подкладывает? Или просто проц слишком умный?

Ответ

Здравствуйте, Ayl!
Последнее-проц слишком умный, гад!:)
Это сработает только до 386 включительно.
Пеньки уже отслеживают попытку записи и сбрасывают конвеер.
На четверке не проверил-нет в наличии:(
Кто-нить-проверте, плз...


Отправил эксперт: Sensey
Эксперт отправил ответов (всего): 185

Экспертная группа: Общие вопросы по программированию на Ассемблере под DOS

Вопрос №1332

Здравствуйте!

У меня такой вопросик:
У меня монитор 15" NEC MultiSync и видеокарта S3 Virge DX и возникает такая проблемка: при попытке перевода там FAR или еще чего Досовского в полноэкранный режим монитор ни чего некажет( и темнота). Лампочка на нем становится желтой. Что делать не подскажете?

Заранее благодарен, Антон.

Ответ

Здравствуйте, Антон!
Несколько советов
1) Проверь параметры установленные для Dos программ!
2) Перезагрузись в режими эмуляции MSDos если все будет работать переставь систему


Отправил эксперт: Viktor
Эксперт отправил ответов (всего): 10

Экспертная группа: Модели, виды и типы компьютеров (hard)

Вопрос №1334

Здравствуйте.
У меня проблемы с настройкой Apache, a
именно: не запускаются cgi скрипты. Может кто то
может мне помочь?
Настройку апача производил как написано здесь:
http://www.xakep.ru/post/13484/default.asp?flash=1
версия: apache 1.3.12
ос: windows 98 se
файл httpd.conf прилагаю.
Спасибо.

Ответ

Здравствуйте, Алексей!
Я конечно не знаю,но у меня в настройках правда под линух есть после строк
ScriptAlias /cgi-bin/ "/var/www/cgi-bin"
следующее попробуй..

AllowOverride None
Options None
Order allow,deny
Allow from all



Отправил эксперт: DiGiT
Эксперт отправил ответов (всего): 54

Экспертная группа: Пользовательская работа с Windows

Вопрос №1338

Можно ли подключить внутренний винт, не разбирая компа?

Ответ

Здравствуйте, Дмитрий!
Ну если только шлейф EIDE устройства торчит через заднюю стенку:(
А так крышку по любому снять надо


Отправил эксперт: Sensey
Эксперт отправил ответов (всего): 186

Экспертная группа: Модели, виды и типы компьютеров (hard)

Вопрос №1337

Извините, может не по теме, но можно ли каким-либо образом подключить внутренний винчестер, не разбирая компа?

Ответ

Здравствуйте, Дмитрий!
А почему бы и нет? Есть Mobile Rack(и)работают через USB или LPT порты, только тормозные они. Есть Rack для IDE - они самые дешевые и скоростные, но для того чтоб его подключить все равно разок придется комп разобрать.


Отправил эксперт: UFO
Эксперт отправил ответов (всего): 31

Экспертная группа: Модели, виды и типы компьютеров (hard)

Форма подачи вопроса

ВНИМАНИЕ!!! Пожалуйста, НЕ высылайте один вопрос сразу нескольким подгруппам! Дополнения к вопросам, на которые эксперт уже ответил НЕ следует направлять ведущему рассылки (я не успеваю!). Просто скомбинируйте первый вопрос и дополнение к нему, а затем заново отправьте его, используя приведенную ниже форму!

Нажимайте кнопку "Отправить" только ОДИН раз и дождитесь полной загрузки страницы, иначе вопрос будет продублирован!


Ваше имя *:

Ваш e-mail *:

Подгруппы:

Вопрос *:

Прилагаемая программа (если необходимо):


Регистрация в качестве эксперта

Архив выпусков


Управляющий рассылкой,

Калашников Олег: Assembler@Kalashnikoff.ru
ICQ No.:
68951340
URL сайта подписчиков: http://www.Kalashnikoff.ru

Рассылка 'Ассемблер? Это просто! Учимся программировать (FAQ)' Рассылка 'Ассемблер? Это просто! Учимся программировать'


(C) Москва, 2001. Авторское право принадлежит Калашникову О.А. Публичное размещение материала из рассылки, а также его использование полностью или частично в коммерческих или иных подобных целях без письменного согласия автора влечет ответственность за нарушение авторских прав.


http://subscribe.ru/
E-mail: ask@subscribe.ru
Отписаться
Убрать рекламу
Рейтингуется SpyLog

В избранное