Рассылка закрыта
При закрытии подписчики были переданы в рассылку "RFpro.ru: Ассемблер? Это просто! Учимся программировать" на которую и рекомендуем вам подписаться.
Вы можете найти рассылки сходной тематики в Каталоге рассылок.
Ассемблер? Это просто! Учимся программировать (FAQ)
Ассемблер? Это просто! Учимся программировать (FAQ)
Выпуск N 123 |
Вопросы, которые поступили от подписчиков рассылки
"Ассемблер? Это просто! Учимся программировать"
Дата выхода: 2001-10-29
Приветствую вас, уважаемые читатели!
Я очень рад, что без меня рассылка жила и продолжает существовать по сей день! Благодарю всех подписчиков и экспертов за поддержку!
Ну, а в свою очередь я сообщаю вам, что у меня дома наконец-таки появился доступ в Интернет!!! Так что я буду теперь также принимать некторое участие в рассылке.
Также продолжу дорабатывать сайт и новую более совершенную программу по управлению экспертными группами. Я же теперь жду от вас писем, на которые буду отвечать!!!
Вопрос №1303
Приветствую вас, господа эксперты.
У меня тут накопилось несколько вопросиков.
Если не сильно влом, помогите.
1. Почему в сеансе DOS (под NT) строчки
0100 cli
jmp 100
вешают только DOS, в то время как под Вынь95 эти же строчки вешают всю систему.
2. Может кто-нить объяснит, почему
mov ax,1010h
out 70h,ax
нарушает контрольную сумму CMOS.
3. Ну и последний: может есть у кого описание алгоритмов архивации (любых) - пропейте, плз.
Благодарствую.
Ответ
Доброе время суток, Эйч"R!
Я касательно второго пункта.
Ну дык тут всё очень даже просто...
mov ax,1010h - тут всё понятно :-)
out 70h,ax - а вот тут происходит следующее... В 70h порт кидается 10h из регистра AL, а вот оставшаяся часть (регистр AX) уходит в 71h порт (!). И тут следует обратить внимание что контрольная сумма в CMOS-е защищает регистры от 10h до 2Dh. А ты их поменял :-). Ессно BIOS при загрузке станет орать что КС накрылась медным тазом.
Отправил эксперт: Night
Эксперт отправил ответов (всего): 23
Экспертная группа: Общие вопросы по программированию на Ассемблере под DOS
Вопрос №1306
Может я спишу в изучении асмы т.к. за 2 дня изучил 6 уроков и всё было понятно,но в домашнем задании 6 урока и его обЪяснении начала 7 урока я так не разобрался! Как взаимосвязаны стек и преывания если NOP в стеке затерает 20h прерывание?
Ответ
Здравствуйте, Михаил!
Стек и прерывания, вообще-то, взаимосвязаны очень слабо. То есть, вообще никак не связаны (если не считать сохранение регистра флагов и точки возврата из прерывания в стеке). Да и речь там идет совсем о другом.
Int 20h - это ВЫЗОВ прерывания с номером 20h. Это прерывание MS DOS, которое выполняет завершение нерезидентной программы. Поэтому в приведенной программе помещение двух команд в стек затирает только вызов прерывания в нашей программе. И не происходит завершения программы, а просто выполняется вывод сообщения на экран.
Отправил эксперт: Ayl
Эксперт отправил ответов (всего): 47
Экспертная группа: Общие вопросы по программированию на Ассемблере под DOS
Вопрос №1308
Сейчас ответил на вопрос Михаила по поводу программы из урока 6 (разбор в уроке 7). Только я задумался - и перестал вообще что-то понимать. Насколько я помню, процессоры x86 при выполнении программы используют конвейер команд. Который имеет объем от 6-ти байт в 8088 до 10-ти (кажется)... И везде написано, что когда команда помещена в конвейер, то никакие изменения в коде уже ничего изменить не могут. На чем, собственно, и основаны методы защиты от отладчиков... Причем конвейер сбрасывается только при выполнении команд передачи управления (jmp, call, int, ret и т.п.).
Тогда что происходит в нашем примере? По всему вышесказанному команда int 20h уже должна быть в конвейере ДО выполнения команды push ax! И должно происходить завершение программы. А она все равно выводит сообщение.
Может кто-нибудь это объяснить?
Ответ
Здравствуйте, Ayl!
Если ты трассируешь программу в отладчике - то после каждой команды вызывается прерывание, следовательно перед каждой командой происходит выход из прерывания, соответственно конвейер перечитывается и отражает текущее состояние сегмента кода.
Если же программу запустить просто так, то сообщение не выведется, поскольку содержимое конвейера не будет соответствовать сегменту кода. и выполнится int 20h.
Отправил эксперт: Dron (http://spawnhole.narod.ru/asmos/asmos.html - Операционная система с нуля!)
Эксперт отправил ответов (всего): 177
Экспертная группа: Общие вопросы по программированию на Ассемблере под DOS
Вопрос №1305
Здравствуйте, Эксперты!
У меня к вам возник вопрос:
Предисловие:
Если сложить 8+8 получится 16(старая), а если сложить 8+8 получится ли 24(новая). Ответ... у меня с паматью получается! Теперь еще один вопрос если к 24+16 получится 40! Нет... у меня получается 32!
Память старая. На всех 4 платках нет никого упоминания о EDO или чем либо подобном! Если поставить одну старую(которая стояла раньше) и одну новую (которую только принесли) то мы вновь получаем 16 метров. Вся система работает почти стабильно!(Ни одна тест прога не дает никаких сбоев), но вот Photoshop иногда бесится(24 метра из 32 видит). Про чипсеты много сказать не могу... знаю только, что камень 90Mz(Socket 5) и все!
Теперь собственно говоря Вопрос:
Мне стоит избавиться от новой памяти? Жалко...
Ответ
Здравствуйте, freeseacher!
Смутно как то написано...
Лучший вариант-избавится от матери с процом, и взять с Димами, если на твоей их нету. У меня была мама с 1 дим-слотом.
64 метра дим можно взять за 5-6 убитых енотов:), а 32 симов стоит около 25:(((
Отправил эксперт: Sensey
Эксперт отправил ответов (всего): 184
Экспертная группа: Модели, виды и типы компьютеров (hard)
Вопрос №1313
Привет всем экспертам. У меня к вам такой вопросик. Короче имеется компьютерный класс из 12 машин, а случилось вот что в одно прекрасное время, если его можно назвать прекрасным, перестала работать сеть, точнее иногда работает, как повезет и то на половину или еще хуже. Не одни компы
себя не находят. Работают они на Windows 95. Плиз кто чем может помогите восстановить эту задрипанную сеть очень нужна!!!
Ответ
Здравствуйте, Алексей!
В том случае
если у вас сеть на BNC (коаксиальный кабель) и ни один компьютер не видит
даже самого себя, то скорее всего где-то
оплетка кабеля закорочена на сигнальную жилу. Причиной может быть
механическое повреждение кабеля, терминатора
или выход из строя одной из сетевых плат.
Проверить легко. На любом компьютере отстыковать от сетевой платы Т-коннектор и не отсоединяя кабели, тестером замерять омическое сопротивление между центральным контактом и корпусом. Должно
получиться 25Ом(плюс-минус несколько Ом). В
том случае, если результат радикально отличается от указанного, предстоит нудная, но несложная
работа по поиску поврежденного отрезка кабеля, плохо посаженного коннектора
или убитой сетевой платы.
Если же сеть на витой паре, то проблема в хабе.
Отправил эксперт: ESE
Эксперт отправил ответов (всего): 5
Экспертная группа: Модели, виды и типы компьютеров (hard)
Вопрос №1313
Привет всем экспертам. У меня к вам такой вопросик. Короче имеется компьютерный класс из 12 машин, а случилось вот что в одно прекрасное время, если его можно назвать прекрасным, перестала работать сеть, точнее иногда работает, как повезет и то на половину или еще хуже. Не одни компы
себя не находят. Работают они на Windows 95. Плиз кто чем может помогите восстановить эту задрипанную сеть очень нужна!!!
Ответ
Здравствуйте, Алексей!
На чем у тя сеть
Отправил эксперт: DiGiT
Эксперт отправил ответов (всего): 50
Экспертная группа: Модели, виды и типы компьютеров (hard)
Вопрос №1298
Есть модем без драйверов, н есть компьютер где был устанвлен
такой же модем.
Осуществлимо ли "перенести " драйвера на другой копьютер?
Спасибо
Ответ
Здравствуйте, oleg!
Дрова для модема как правило лежат в файлаx с расширением "INI" и "INF". Также при переносе стоит посмотреть используются ли какие-нибудь Dll (в случае продвинутого softa).
Отправил эксперт: HuK (http://simtshyk.narod.ru - My home page)
Эксперт отправил ответов (всего): 1
Экспертная группа: Пользовательская работа с Windows
Вопрос №1313
Привет всем экспертам. У меня к вам такой вопросик. Короче имеется компьютерный класс из 12 машин, а случилось вот что в одно прекрасное время, если его можно назвать прекрасным, перестала работать сеть, точнее иногда работает, как повезет и то на половину или еще хуже. Не одни компы
себя не находят. Работают они на Windows 95. Плиз кто чем может помогите восстановить эту задрипанную сеть очень нужна!!!
Ответ
Здравствуйте, Алексей!
Во-первых: разберись с железом (особенно если у тебя шинная топология)
Во-вторых: посмотри как идут протоколы, проверь IP адреса и маску сети!
Отправил эксперт: HuK (http://simtshyk.narod.ru - My home page)
Эксперт отправил ответов (всего): 2
Экспертная группа: Модели, виды и типы компьютеров (hard)
Вопрос №1312
Дарова все!
Вопрос про настройку видеорежима SoftIce.
У меня видеокарточка S3 Trio 3D и Wiknows NT4, SP6.
После установки DriverStudio v.2.5 RC1 как обычно настроил видео на оконный SoftIce и протестировал (нажал кнопочку Test). Все без замечаний.
Когда взлетает SI - на экране чернота, по F5 взвращаюсь в винду.
Устанавливаю полноэкранный режим SI, эффект один и для "Standard VGA" и для моей видеокарточки - рассинхронизация, косые полосы по всему экрану, нихрена не видно, по Ф5 опять-таки возвращаюсь в винду и пишу эту мессагу!
Кто знает как помирить этих двух перцев?
Ответ
Здравствуйте, Catterpillar!
Ненадо ставить SoftIce в полноэкранный режим..
Дальше в файле winice.dat найти такую строку:
INIT="wl; color f a 4f 1f e; code on; lines 60; wc 40; wd 2;
wr; faults on; X;" (если у тебя init=x; то поменя на вышеуказуную)
поменяй параметр faults on на faults off
Отправил эксперт: змей
Эксперт отправил ответов (всего): 79
Экспертная группа: Модели, виды и типы компьютеров (hard)
Вопрос №1317
Добрый день, уважаемые эксперты!
У меня к Вам следующий вопрос: поставлена задача перехвата клавиши Pause в C++, чтобы при нажатии она игнорировалась.
При решении мне кажется, что только при написании резидентной асм-вставки мы сможем перехватить клавишу, но также возникает другой вопрос: нет ли у клавиши Pause какого-нибудь отдельного флага, как, скажем, у Caps Lock, чтобы постоянно флаг просто возвращать в 0?
Также я был бы очень благодарен, если кто-нибудь посоветовал, действително, грамотную книжку или доки по тому, что возвращают клавиши, желательно с таблицей.
Большое спасибо. Всего Вам самого наилучшего.
Ответ
Здравствуйте, Questman!
РЕЗИДЕНТ ПИСАТЬ НЕ НАДО!!! просто напиши свой обработчик IRQ 1 (INT 9h или INT 16h).
Отправил эксперт: Painbringer (http://limanski.narod.ru - нечто наподобие домашней страницы)
Эксперт отправил ответов (всего): 205
Экспертная группа: Общие вопросы по программированию на Ассемблере под DOS
Вопрос №1318
Здравствуйте.
Уважаемые эксперты, не могли бы вы объяснить как можно вывести число из регистра на экран в шестнадцатиричном виде
только pls поподробнее.
ЗЫ: Не пинайте, если этот вопрос уже задавался, для меня важнее понять как это работает, чем получить кусок кода без коментариев, в котором и сам автор через неделю не разберётся...
Заранее благодарен Semmy
Ответ
Здравствуйте, Semmy!
Ну мона написать например таку процедурку:
.386 ; для shld
; eax - chislo
h2s proc near
push eax; сохреняем все чем пользуемся
push cx
push edx
push di
mov cx,8; типа у нас двойное слово - 8 тетрад (4 бита) + выводим суффикс h
@@1: xor dx,dx
shld edx,eax,4; берем 4 старших бита
shl eax,4; килаем их нафиг
mov di,dx; помещаем это в ди шоб адресовать мона было
push ax ; сохраним ax
mov ah,6 ; функция дос для вывода символа
mov dl,byte ptr hs[di] ; помещаем символ в dl
int 21h
pop ax ; восстанавливаем ax
loop @@1
push ax ; сохранив ax, выводим h
mov dl,'h'
mov ah,6
int 21h
pop ax ; восстанавливаем усё
pop di
pop edx
pop cx
pop eax
ret
hs db "0123456789ABCDEF"
endp h2s
ну типа соптимизируешь.
Отправил эксперт: Painbringer (http://limanski.narod.ru - нечто наподобие домашней страницы)
Эксперт отправил ответов (всего): 206
Экспертная группа: Общие вопросы по программированию на Ассемблере под DOS
Вопрос №1317
Добрый день, уважаемые эксперты!
У меня к Вам следующий вопрос: поставлена задача перехвата клавиши Pause в C++, чтобы при нажатии она игнорировалась.
При решении мне кажется, что только при написании резидентной асм-вставки мы сможем перехватить клавишу, но также возникает другой вопрос: нет ли у клавиши Pause какого-нибудь отдельного флага, как, скажем, у Caps Lock, чтобы постоянно флаг просто возвращать в 0?
Также я был бы очень благодарен, если кто-нибудь посоветовал, действително, грамотную книжку или доки по тому, что возвращают клавиши, желательно с таблицей.
Большое спасибо. Всего Вам самого наилучшего.
Ответ
Здравствуйте, Questman!
Насколько я помню, никаких флагов клавиша Pause не выставляет. Для решения твоей задачи нужно перехватить прерывание 9 и отслеживать нажатие этой замечательной клавиши... Нажали - проигнорировали. И так до завершения программы. Не забудь в конце восстановить 9-е прерывание.
Отправил эксперт: Ayl
Эксперт отправил ответов (всего): 48
Экспертная группа: Общие вопросы по программированию на Ассемблере под DOS
Вопрос №1319
Здравствуйте.
Уважаемые эксперты, не могли бы вы объяснить как можно вывести число из регистра на экран в шестнадцатиричном виде
только pls поподробнее.
ЗЫ: Не пинайте, если этот вопрос уже задавался, для меня важнее понять как это работает, чем получить кусок кода без коментариев, в котором и сам автор через неделю не разберётся...
Заранее благодарен Semmy
Ответ
Здравствуйте, Semmy!
Ну что тут сказать. Предлагаю вот такой алгоритм:
1. Определяю таблицу из 16-ти символов ('0' - '9', 'a' - 'z')
2. Сохраняю число, которое хочу вывести (16-ти разрядное) в регистре dx
3. Выделяю из dx 4 старших разряда и преобразую с помощью команды xlat в символ для вывода (сохраняется в al)
4. Вывожу очередной символ и перехожу к следующему (всего повторяется 4 раза)
Вот и все.
P.S. Кстати, доверяй, но проверяй! В моем любимом справочнике Tech Help 6.0 для команды xlat описание дано с ошибкой:
XLAT translate AL into a value in a translation table at BX
AL <- ES:[BX+(AL)]
На самом деле сегментный регистр - DS (что вполне логично).
Будьте бдительны! :)
Приложение:
Отправил эксперт: Ayl
Эксперт отправил ответов (всего): 49
Экспертная группа: Общие вопросы по программированию на Ассемблере под DOS
Вопрос №1322
Несколько вопросов, пожалуйста.
1. при дизассемблировании в w32dis нахожу строки:
*Referenced by a CALL at addresess
ниже идут восьмибитовые числа
Что это такое ?
2. Где можно найти описание функций системных dll ( какие параметры и как им передавать, что и где они возвращают ), лучше на русском.
3. При дизассемблировании некоторых программ ничего не выводится ( w32dis пишет, что есть три листа текста, но они пустые ). Слышал, что исполняемые файлы могут быть упакованы. Как можно узнать чем они упакованы и как распокавать
Спасибо заранее.
Ответ
Здравствуйте, Илья!
1. Это значит, что на эту точку ссылается команда CALL, "восьмибитовые" числа это адрес этой CALL
2. Функции системных dll (kernel32, user32 итд) описаны в справочниках, параметры (как правило) передаются через стек, возвращаемые значения (как правило) в регистрах, получить список экспортируемых функций можно дизассемблировав dll.
3. Один раз сталкивался с программой которая не дизассемблировалась.
Отправил эксперт: df
Эксперт отправил ответов (всего): 1
Экспертная группа: Общие вопросы по программированию на Ассемблере под Win32
Вопрос №1323
Попробовал использовать DOS Fn 4eH: Найти 1-й совпадающий файл. И след файл.
Такое описание (со входом разобрался):
Выход AX код ошибки если CF установлен
DTA заполнена данными (если не было ошибки)
Так вот, где лежит DTA? Вычитал: При запуске программы ее DTA устанавливается по смещению 80H относительно PSP. А вот с ней и не разобрался:( Про PSP чего-то написано, таблица и смещения. Выводил всё до кучи на экран и не нашёл нигде имени файла.
Вложил программку, которая всё выводит с моими комментариями. Занимаюсь асмом 3 дня, поэтому не судите строго:)
И ещё, где-то экспертам ответившим на мой вопрос надо чего-то ставить. Киньте в ответ ссылку где и чего. А то вы мне поможете, а я вам... тоже хочу:)
Ответ
Здравствуйте, DmitryK1!
Какие проблемы?
1. вызываешь функцию с именем файла (возможно с wild chars)(ds:dx) сперва 4eh
2. имя файла лежит по адресу DTA + 1eh
3. Обрабатываешь
4. потом адрес DTA засылаешь в ds:dx
5. потом следующие файл ищешь функцией 4fh
6. jnc 2
Вот весь алгоритм...
Если нужно искать по подкаталогам.
То лучше определить свою DTA, (ну так делал я) имея позади нее достаточных размеров буфер
ищешь с текущего подкаталога (к примеру) аттрибутами разрешаешь все файлы.
если файл есть каталог, то берешь адрес DTA
прибавляешь к нему 15h
ставишь с этого адреса новое DTA
начинаешь поиск по вложенному подкаталогу.
Когда подкаталог заканчивается,
берешь DTA
отнимаешь 15h
ставишь снова
продолжаешь поиск по предыдущему каталогу (не начинаешь снова а продолжаешь)
Вот вроде так.
Отправил эксперт: Dron (http://spawnhole.narod.ru/asmos/asmos.html - Операционная система с нуля!)
Эксперт отправил ответов (всего): 178
Экспертная группа: Общие вопросы по программированию на Ассемблере под DOS
Форма подачи вопроса
ВНИМАНИЕ!!! Пожалуйста, НЕ высылайте один вопрос сразу нескольким подгруппам! Дополнения к вопросам, на которые эксперт уже ответил НЕ следует направлять ведущему рассылки (я не успеваю!). Просто скомбинируйте первый вопрос и дополнение к нему, а затем заново отправьте его, используя приведенную ниже форму!Нажимайте кнопку "Отправить" только ОДИН раз и дождитесь полной загрузки страницы, иначе вопрос будет продублирован!
Регистрация в качестве эксперта
Архив выпусков
Управляющий рассылкой,
Калашников Олег:
Assembler@Kalashnikoff.ru
ICQ No.: 68951340
URL сайта подписчиков:
http://www.Kalashnikoff.ru
(C) Москва, 2001. Авторское право принадлежит Калашникову О.А. Публичное размещение материала из рассылки, а также его использование полностью или частично в коммерческих или иных подобных целях без письменного согласия автора влечет ответственность за нарушение авторских прав. |
Реклама на сайте Kalashnikoff.ru
http://subscribe.ru/
E-mail: ask@subscribe.ru |
Отписаться
Убрать рекламу | Рейтингуется SpyLog |
В избранное | ||