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

RusFAQ.ru: программирование на языке Assembler


Информационный Канал Subscribe.Ru

RusFAQ.ru: программирование на языке Assembler

Выпуск № 411
от 08.11.2002, 10:30

Администратор:
Имя: Калашников О.А.
URL: Информационный ресурс
ICQ: 68951340
Россия, Москва
О рассылке:
Задано вопросов: 1735
Отправлено ответов: 5474
Активность: 315.5 %
[Задать вопрос >>][Регистрация эксперта >>]
[Поиск в базе][Обсудить на форуме]


 Список экспертов, ответы которых опубликованы в данном выпуске

Bob Johnson
Статус: Профессиональный
Общий рейтинг: 155.05
[Подробней >>]
kvINT
Статус: Профессиональный
Общий рейтинг: 107.9
Телефон: (34316)2-31-45
[Подробней >>]
masquer
Статус: Профессиональный
Общий рейтинг: 153.61
[Подробней >>]
 
St
Статус: Доверительный
Общий рейтинг: 117.01
[Подробней >>]
Maverick
Статус: Опытный
Общий рейтинг: 139.06
URL: Страница по асму и вирмейку
Телефон: 89039415024 (BiLine GSM)
[Подробней >>]
Atmion
Статус: Доверительный
Общий рейтинг: 125.58
[Подробней >>]
 
LIFO
Статус: Профессиональный
Общий рейтинг: 128.36
URL: наш сайт
Телефон: 8 01710 24758
[Подробней >>]
Portnov
Статус: Профессиональный
Общий рейтинг: 118.36
URL: Мой сайтик...
[Подробней >>]
Dark_Lord
Статус: Профессиональный
Общий рейтинг: 128.04
[Подробней >>]


 Краткий перечень вопросов

Вопрос № 1691. Здравствуйте. У меня возникла следующая проблема . Имеется телевезионная карта ( PCI Stereo-TV/FM-R... (ответов: 1)
Вопрос № 1692. Здравствуйте уважаемые эксперты , Очень вас прошу помочь , у меня раньше стоял переводчик промт , но... (ответов: 1)
Вопрос № 1693. я только начал учиться асму у меня масм32 когда я в нем написав программу : CSEG segment org 100h Be... (ответов: 6)
Вопрос № 1694. Помогите найти что нибудь о программировании графики на ассемблере (в смысле адреса, где слить можно... (ответов: 2)
Вопрос № 1695. >Отвечает Rastenie >Ситуация простая по крайней мере для меня:-> >сначала загружается ntoskrnl.exe+h... (ответов: 1)
Вопрос № 1696. Добрый день ув. тов. эксперты! Цитата из Зубкова не дает покоя (глава про нереальный режим, описывае... (ответов: 1)
Вопрос № 1697. Дополнение к ответу на вопрос №1672 Следует читать не: call dword ptr cs:[old09h] popf А вот так:... (ответов: 2)
Вопрос № 1698. Прива. У меня такой вопрос как можно искать файлы точнее какими командами я знаю ну не работатет и в... (ответов: 2)
Вопрос № 1700. Вопрос к экспертам. Я вызываю функцию ReadProcessMemory и в качестве параметра надо указывать указат... (ответов: 3)
Вопрос № 1701. Уважаемые эксперты! Я ценю Вас только за то, что Вы есть и помогаете нам ламерам не заблудится в инф... (ответов: 8)

Вопросов: 10, ответов: 27


 Вопрос № 1691

Здравствуйте.
У меня возникла следующая проблема . Имеется телевезионная карта ( PCI Stereo-TV/FM-Radio-Tuner-Karte MD9717), а проблема в том , что не получается просмотривать телесигналы или прослушивать радиосигналы . Инсталяция драйвера проходит нормалбно , но после вызова тюнера , комп . требует установить драйвер . Очередная попытка и всё повторяется . Про Приём телесигналов вообще не может быть и речи .
Операционная система имеется и WinXP , и Win 98 , и мелениум , но ни в одной не хочет работать . Хотелось бы получить более полный ответ или может дадите ссылку на какой-нибудь сайт , где можно найти подробный ответ . За ранее благодарю .
Сергей



Вопрос отправлен: 02.11.2002, 17:56
Отправитель: Sergey

[Следующий вопрос >>] [Список вопросов]

Отвечает Bob Johnson

Здравствуйте, Sergey!
Ну а что тут - иди на сайт производителя своего изделия и скачивай оттуда более новые драйвера и пробуй. Если ничего не поможет - обращайся в контору, где брал свою карту. Если они не смогут ее настроить - требуй замену.


Ответ отправлен: 04.11.2002, 13:37
Отправитель: Bob Johnson


 Вопрос № 1692

Здравствуйте уважаемые эксперты ,
Очень вас прошу помочь , у меня раньше стоял переводчик промт , но диск с ним сломалься , искал в сети альтернативу для него , и нашёл такое чудо : Сократ персональный 4,1 .
Но это чудо стоит 40 зелёных :( , и перестанет работать уже через 20 дней .. Искал в инете кряки , нету !
Помагите если , кому не лень и распологает временем .
Пишите koltpiton@mail.ru .
демку можно взять здесь http://arsenal.cnt.ru/files/spers41.exe
Могу прислать на мыло ..
Заранее спасибо !


Приложение:


Вопрос отправлен: 02.11.2002, 19:49
Отправитель: piton

[Следующий вопрос >>] [Список вопросов]

Отвечает kvINT

Добрый день, piton!
Увы, помочь могу лишь советом купить диск за 2 - 3 зеленых. Пираты у нас вроде еще не вывелись.

Ответ отправлен: 04.11.2002, 00:12
Отправитель: kvINT


 Вопрос № 1693

я только начал учиться асму
у меня масм32
когда я в нем написав программу :
CSEG segment
org 100h
Begin:
mov ah,9
mov dx,offset Message
int 21h
Message db 'Hello, world!$'
CSEG ends
end Begin
пытаюсь ее слинковать оно говорит
fatal error LNK1190:invalid fixup founp, type 0x0001
то делать?



Вопрос отправлен: 02.11.2002, 23:50
Отправитель: Александр

[Следующий вопрос >>] [Список вопросов]

Отвечает masquer

Здравствуйте, Александр!
Что делать? Не писать программы для ДОС и компилировать их компилятором для виндов. Элементарно, не так ли?

Ответ отправлен: 03.11.2002, 14:02
Отправитель: masquer


Отвечает St

Привет, Александр!
Насколько я знаю у масм32 есть проблемы с созданием досовских программ, попробуйте масм или тасм
St

Ответ отправлен: 03.11.2002, 00:44
Отправитель: St


Отвечает Maverick

Здравствуйте, Александр!
Пользуйся tasm
Он для доса проще.


Ответ отправлен: 03.11.2002, 16:27
Отправитель: Maverick


Отвечает Atmion

Доброе время суток, Александр!
Ты пытаешься ассемблировать DOS'овскую прогу в Masm32, а он предназначен для создания Win32-программ! Используй другой ассемблер, например Masm 6.11, который позволяет создавать досовские проги.


Ответ отправлен: 03.11.2002, 03:02
Отправитель: Atmion


Отвечает --- Нет данных ---

Доброе время суток, Александр!
Используй для досовких программ линкер из пакета masm6.11 или 6.13 - и все будет нормально - а вообще под дос лучше тасм - но это ИМХО...

Ответ отправлен: 03.11.2002, 03:32
Отправитель: --- Нет данных ---


Отвечает Bob Johnson

Добрый день, Александр!

MASM32 предназначен для компилирования 32-разрядных программ под винды, а ты пишешь обычную 16-разрядную прогу под ДОС - используй TASM.


Ответ отправлен: 04.11.2002, 13:37
Отправитель: Bob Johnson


 Вопрос № 1694

Помогите найти что нибудь о программировании графики
на ассемблере (в смысле адреса, где слить можно)
Или пример какой -либо . Буду благодарен .



Вопрос отправлен: 03.11.2002, 02:36
Отправитель: Димон (sephiroth7@mail.ru)

[Следующий вопрос >>] [Список вопросов]

Отвечает LIFO

Добрый день, Димон!
Послал тебе письмецо с примером.
Удачного изучения!

Ответ отправлен: 03.11.2002, 19:07
Отправитель: LIFO


Отвечает --- Нет данных ---

Здравствуйте, Димон!
Напиши какой тебе нужен режим - dos opengl или directX и что-нить вышлю - у меня по всему имеется...


Ответ отправлен: 03.11.2002, 03:29
Отправитель: --- Нет данных ---


 Вопрос № 1695

>Отвечает Rastenie
>Ситуация простая по крайней мере для меня:->
>сначала загружается ntoskrnl.exe+hal.dll загрузчиком в boot...отседова вывод ядро(даже выдно из названия) и есть >ntoskrnl.exe...Ну и еще на такую мысль наводит команда mod в сайсе и весь Win2k DDK...конкретнее одна схемка на >Overview Windows 2000 Components...Ежели дюже нуна можу надислаты рысунки- прийдеться декомпилить chm...(если >этого нет в NT DDK)
>Дальше - это набор инструкций процессора, который декмопилируется и по возможности понимается...
>Если я правильно понял - то для Win2K: NTVDM - это просто процесс регулирумый, в первый раз security manager, а потом >уже всеми остальными managerами - как в жизни:) - а в DDK написано, что: "Вы можете использовать службы системные , >либо написать свои драйвера для специального оборудования":но Вам прийдет ваять VDD+32-bit Kernel Mode Device >Driver...так что это вопрос философии "а зачем?"

Угу, NTLDR загружает NTOSKRNL.EXE и HAL.DLL - но я же не про то спрашивал, какие файлы NT загружаются и в каком порядке (файл NTOSKRNL.EXE кстати содержит не только ядро NT, но и драйверы исполнительной системы NT (NT executive), такие как диспетчер объектов, диспетчер виртуальной памяти, диспетчер процессов и т.д.), про это то в NT DDK написано, и рисунки есть :) Я спрашивал, создается ли СИСТЕМНАЯ ВИРТУАЛЬНАЯ МАШИНА (или ее эквивалент) в процессе загрузки NT, подобно тому, как это происходит в Win9x. И я не собирался пока писать VDD и Kernel Mode Driver, мне это не нужно сейчас.
По виртуальным машинам в NT ситуация потихоньку проясняется. Похоже, что действительно в NT нет аналога Системной ВМ Win9x. Хотя бы потому, что VDM в NT - это спецпроцесс Win32. Значит, выполнение 16-разрядных Windows-программ и DOS-программ в VDM под Windows NT/2000, и выполнение DOS-программ в VDM под Windows 95/98 - это совсем по-разному реализованные фичи, и значит ТИПЫ виртуальных DOS-машин сильно отличаются в NT и Win9x. А ОТСЮДА СЛЕДУЕТ, что если в NT виртуальные DOS-машины реализованы ИНАЧЕ, чем в Win9x, то Системной виртуальной машины в NT на самом деле может НЕ СУЩЕСТВОВАТЬ, потому-то в NT DDK и в книге Inside W2k при описании процесса инициализации ядра и драйверов НЕ ГОВОРИТСЯ НИ СЛОВА о Системной ВМ. Я начинаю верить, что Системной ВМ (или ее эквивалента) в NT действительно нет. Впрочем, буду разбираться.
Снова спасибо masquer'у за сайт www.gloomy.cjb.net. Хоть там и немного инфы, но зато она для меня как минимум на 50% новая. А вот кстати, не подскажешь рабочую ссылку на IDA Pro 4.15 (или более новую версию) вместе с серийником или креком? Этот же вопрос к другим Экспертам. Черт, как-то так получилось, что у меня до сих пор нету IDA :( что то у меня не получается его найти, или ссылки нерабочие, или архив битый. Через filesearch.ru тоже не выходит. Мне нужна ЗАВЕДОМО рабочая ссылка на неповрежденный архив с серийником или креком. И еще, если кто знает, где можно скачать книгу Undocumented Windows 2000 Secrets (подойдет и на инглише, но лучше на русском), тоже плиз сообщите ссылочку (на reversing.net этой книги нету)



Вопрос отправлен: 03.11.2002, 16:34
Отправитель: Atmion

[Следующий вопрос >>] [Список вопросов]

Отвечает Bob Johnson

Здравствуйте, Atmion!
Извини, это не ответ, а больше похоже на вопрос (я не нашел твоего адреса). Где можно скачать в интернете Win2k (а лучше WinXP) DDK. И сколько это весит. Ответ можно прямо на адрес.
P.S. По поводу системной ВМ - да, я так и считаю, что ее нет под НТ - а зачем она там? А ДОС-эмуляция в вин98 и НТ действительно разная.


Ответ отправлен: 05.11.2002, 13:02
Отправитель: Bob Johnson


 Вопрос № 1696

Добрый день ув. тов. эксперты!
Цитата из Зубкова не дает покоя (глава про нереальный режим, описывается возможность установки лимитов в 4Гб и возврата в реальный режим с теми же лимитами, ну это вы все знаете): "...можно подумать, что первый же обработчки прерывания от таймера загрузит в CS обычное значение и все нормализуется, однако при создании дескриптора в скрытой части сегментного регистра в реальном режиме процессор не трогает поле лимита, а только изменяет базу: что бы мы ни записали в сегментный регистр, сегмент будет иметь размер 4Гб".
Вопросы:
1. Значит ли это, что инженеры глубокоуважаемого Интела "случайно забыли" упомянуть, что при формировании линейного адреса в реальном режиме происходит не только сдвиг содержимого сегм. регистра влево на 4 и + EIP, а еще и происходит ПРИБАВЛЕНИЕ базы из тени?
2. Почему об этом везде умалчивается ??? Почему идет насадка убеждения, что в реальном режиме знач. сегм. регистра сдвигается влево на 4, и почему не сказать как есть на самом деле - линейный адрес формируется путем сложения базы из тени (старшее слово которой = сегм. регистру, а младшее - ВСЕГДА НУЛЯМ!!!!) и регистра EIP?
3. Нахрена вообще тогда поле лимит?
4. Не находите ли вы странным, что НЕРЕАЛЬНЫЙ режим принято считать "багом" процессора? Не кажется ли вам, что багом было бы именно то обстоятельство, если бы при возврате в реальный режим проц сам, по волшебству, откуда то с потолка загружал бы лимит 64Кб в тени? Может, багом это считают именно те, кто не подозревает о существовании этой самой тени? Значит выходит, что поле лимит для чего то все же нужно в теневом регистре в РЕАЛЬНОМ РЕЖИМЕ, раз "в нереальном можно обращаться, а в реальном нельзя", отсюда вопрос - КАК ИМЕННО ОБРАБАТЫВАЕТСЯ ЭТО ПОЛЕ ЛИМИТА В ТЕНИ? Ведь ни о каких GPF не может идти и речи.
thx



Вопрос отправлен: 03.11.2002, 16:47
Отправитель: Broken Sword (brokensword@mail.ru)

[Следующий вопрос >>] [Список вопросов]

Отвечает Atmion

Доброе время суток, Broken Sword!
Значит, имеем ситуацию: проц переключился обратно из защищенного режима в реальный. Лимиты в тени всех сегментных регистров равны 4 Гб. А базы в тенях равны 0. Теперь DOS-программы могут обращаться по любому адресу в пределах 4 Гб. Но ведь НЕЗАВИСИМО от того, произошло ли включение питания и проц работает в обычном реальном режиме или же проц вернулся в реальный режим из защищенного (т.е. в нашем случае проц вернулся в
нереальный режим, потому что лимиты в тенях равны 4 Гб), ВСЕ РАВНО при любой
перезагрузке сегментного регистра проц автоматически занесет в поле базы в тени ТО ЖЕ
САМОЕ ЗНАЧЕНИЕ, что и в сам сегментный регистр! Если бы проц сейчас работал в реальном
режиме после включения питания, то лимит в тени был бы равен 64 Кб, и все было бы ОК,
НО проц сейчас в нереальном режиме (лимит в тени 4 Гб), а значит база в тени (когда
проц продублирует в нее новое значение сегментного регистра) ТЕПЕРЬ станет отлична от
нуля, но лимит-то останется 4 Гб! Возникнет непонятная ситуация: ведь лимит может быть
4 Гб ТОГДА И ТОЛЬКО ТОГДА, когда база 0! Потому что лимит складывается с базой, и их
сумма НЕ ДОЛЖНА выходить за предел линейного адресного пространства 4 Гб. А в случае,
когда лимит 4 Гб, а база - из-за перезагрузки сегментного регистра в реальном режиме -
станет не 0, их сумма ВЫЙДЕТ за предел 4 Гб! Но DOS-программа будет продолжать
работать, и сможет все равно обращаться по адресам в пределах 4 Гб. Что же это
получается? Получается, что в нереальном режиме лимит 4 Гб в тени - это уже не лимит,
а максимально возможный адрес линейного пространства! И сегментный адрес может меняться в сегментном регистре, а значит и в поле базы в теневом регистре как угодно, но лимит остается 4 Гб, и процессор уже не складывает лимит с базой, чтобы
определить, может ли прога обращаться по такому-то адресу, а ИНТЕРПРЕТИРУЕТ лимит как
верхнюю границу допустимых адресов, т.е. в данном случае лимит равен концу линейного адресного пространства 4 Гб.
У меня есть гипотеза:
1) если проц видит, что в тени лимит равен 64 Кб, то это значит, что проц знает, что
он работает в обычном реальном режиме, и интерпретирует лимит собственно КАК ЛИМИТ, и не позволяет досовским прогам обращаться по линейным адресам за пределом 1 Мб
(т.е. если досовская прога попытается обратиться по адресу за пределом 1 Мб, проц просто выдаст на шину МЛАДШИЕ 20 бит такого адреса, а все остальные СТАРШИЕ биты
сформированного прогой адреса - обнулит)
2) а если проц видит что в тени лимит БОЛЬШЕ чем 64 Кб, то проц знает, что он работает
в нереальном режиме (вернулся из защищенного режима), и интерпретирует лимит УЖЕ НЕ
КАК ЛИМИТ, а как МАКСИМАЛЬНО возможный адрес для обращения, и ПОЗВОЛЯЕТ досовским
прогам обращаться по любому линейному адресу в пространстве 4 Гб)
Еще раз подчеркну: если лимит в тени 4 Гб, а база БЫЛА 0, но ИЗМЕНИЛАСЬ, и стала
отлична от 0, А ЛИМИТ НЕ ИЗМЕНИЛСЯ, то лимит УЖЕ НЕ ЛИМИТ, потому что лимит может
иметь значение 4 Гб ТОЛЬКО В ТОМ СЛУЧАЕ, если база 0. Ведь тут действует общее
правило: база + лимит НЕ ДОЛЖНЫ превышать максимально возможный линейный адрес 4 Гб. А
получается, что сумма базы и лимита ТЕПЕРЬ БУДЕТ превышать 4 Гб. Значит лимит - больше
не лимит, а только доступный для обращения максимальный адрес в линейном адресном
пространстве. И ПРОЦЕССОР будет так считать (что лимит уже не лимит), если увидит, что
лимит в тени БОЛЬШЕ чем 64 Кб, ведь именно лимит 64 Кб процессор автоматом
устанавливает в процессе своей инициализации в реальном режиме, и потом при работе в
реальном режиме проц НИ РАЗУ не меняет лимит 64 Кб, а меняет только базу в тени при
перезагрузке сегментных регистров!
НО ЕСЛИ ТАК (хе хе :)), возникает еще один интересный случай. Мы вот считали, что
нереальный режим, это когда программа начнет выполнение в реальном режиме, а затем
переключится в защищенный режим, загрузит во все сегментные регистры селекторы,
указывающие на дескрипторы с базой 0 и лимитом 4 Гб, а после этого программа
немедленно переключится обратно в реальный режим, и в лимите в тени всех сегментных
регистров будет значение 4 Гб. НО ПОЧЕМУ прога в защищенном режиме ДОЛЖНА установить
лимит ИМЕННО в 4 Гб? А не в 15 Мб Гб или 3 Гб? Допустим, в защищенном режиме прога
установила лимит 384 Мб ИЛИ 2 Гб (ну в общем любой лимит, который БОЛЬШЕ 64 Кб), установила базу в 0, и вернулась в реальный режим. Наступает момент, когда происходит перезагрузка сегментного регистра, а значит и корректируется база в тени. Лимит по-прежнему нетронут и равен 384 Мб или 2 Гб. Поскольку НОВАЯ база будет находится где-то в пределах адресного пространства 1 Мб, то СУММА новой базы и лимита 384 Мб или 2 Гб НЕ ВЫЙДЕТ за предел линейного адресного пространства 4 Гб, НО ТУТ УЖЕ ВСЕ РАВНО, пусть даже главное правило соблюдается (что сумма лимит + база НЕ БОЛЬШЕ 4 Гб), ПОТОМУ ЧТО лимит в тени БОЛЬШЕ 64 Кб, а значит проц считает что лимит это не лимит, а макс. доступный для обращения адрес. Значит, получается так, что ЕСЛИ лимит не 4 Гб, а 384 Мб или 2 Гб, то досовская прога может обращаться ТОЛЬКО по адресам в пределах первых 384 Мб или 2 Гб из общего линейного пространства 4 Гб, а все ее обращения по адресам ВЫШЕ 384 Мб или 2 Гб, процессор пресекает. Но тогда сразу вопрос: а как собственно процессор может ПРЕСЕЧЬ попытку обращения по адресу выше 384 Мб или 2 Гб? В случае с первым мегабайтом, проц просто обнуляет все старшие биты адреса, и выставляет на шину младшие 20 бит адреса. А как быть в том случае, если лимит в тени 384 Мб или 2 Гб? Или вообще любой лимит, который БОЛЬШЕ 64 Кб? Например, лимит 18 Мб, или 193 Мб, или 3 Гб. Ведь проц в этом случае НЕ СМОЖЕТ просто обнулить старшие биты адреса, а будет вынужден СЛЕДИТЬ за конкретным адресом, ПРЕВЫШАТЬ который НЕЛЬЗЯ, т.е. для досовской проги это адрес будет последним МАКСИМАЛЬНО возможным адресом в линейном пространстве, по которому она еще может обратиться. Но если прога все-таки обратится по адресу, ПРЕВЫШАЮЩЕМУ лимит в тени, ТО КАКИМ ИМЕННО способом проц сможет пресечь это обращение? Что будет в этом случае? Ведь обработчика GPF нету. И кроме того, еще хорошо будет, если по адресу, превышающему лимит, НЕ БУДЕТ физической памяти (ну вот пример: лимит 32 Мб, и в компе тоже 32 Мб ОЗУ, и прога обращается по адресу 35 Мб), тогда хоть чипсет сможет послать RESET в проц, А ЕСЛИ по адресу, превышающему лимит, ОКАЖЕТСЯ ОЗУ? (снова пример: лимит 32 Мб, ОЗУ 64 МБ, и прога обращается по адресу 35 Мб, т.е. по такому адресу, КОТОРЫЙ ВЫХОДИТ за лимит (который уже не лимит, а макс. допустимый адрес) но НЕ ВЫХОДИТ за ПРЕДЕЛ ОЗУ). Что произойдет в этом случае?
А может, дело обстоит еще интереснее? То есть, я выдвигаю новую гипотезу:
1) если проц видит, что в тени лимит равен 64 Кб, то это значит, что проц знает, что он работает в обычном реальном режиме, и интерпретирует лимит собственно КАК ЛИМИТ,
и не позволяет досовским прогам обращаться по линейным адресам за пределом 1 Мб
(т.е. если досовская прога попытается обратиться по адресу за пределом 1 Мб, проц просто выдаст на шину МЛАДШИЕ 20 бит такого адреса, а все остальные СТАРШИЕ биты сформированного прогой адреса - обнулит)
2) если проц видит что в тени лимит БОЛЬШЕ чем 64 Кб, то проц знает, что он работает
в нереальном режиме (вернулся из защищенного режима), и интерпретирует лимит УЖЕ НЕ
КАК ЛИМИТ, а просто ВООБЩЕ НЕ ОБРАЩАЕТ ВНИМАНИЯ на лимит, и ПОЗВОЛЯЕТ досовским
прогам обращаться по ЛЮБЫМ линейным адресам в пределах 4 Гб! И неважно, какой
конкретно лимит в тени - хоть 12 Мб, хоть 3 Гб - если лимит НЕ равен 64 Кб, значит проц уверен, что это не обычный реальный режим, в котором он начал работать при
включении питания (и автоматом занес в лимиты в тенях 64 Кб, и НИ РАЗУ не менял, а менял только базы), а значит это нереальный режим, и проц не только игнорирует
лимит, НО ТАКЖЕ и не обнуляет старшие биты адресов, которые формируют досовские
проги. Т.е. по какому адресу в пределах 4 Гб досовская прога обратилась, именно этот адрес проц и выставляет на шину (а не младшие 20 бит адреса, как в обычном реальном режиме).
P.S. Откуда проц при формировании адреса в реальном (или нереальном) режиме берет базу сегмента - неважно. Можно взять из сегментного регистра, можно - из поля базы из тени сегментного регистра. Но только из одного места из двух возможных! И потом прибавляет смещение.
P.P.S. Это еще не все про нереальный режим :)


Ответ отправлен: 05.11.2002, 06:18
Отправитель: Atmion


 Вопрос № 1697

Дополнение к ответу на вопрос №1672
Следует читать не:
call dword ptr cs:[old09h]
popf
А вот так:
popf
call dword ptr cs:[old09h]
Ну ошибся я, не пинайте ногами.
Ответьте кто-нибудь, чтоб в рассылу попало, а то меня тухлыми яйцами закидают.



Вопрос отправлен: 03.11.2002, 17:43
Отправитель: Maverick (Maverick@nightmail.ru)

[Следующий вопрос >>] [Список вопросов]

Отвечает Atmion

Здравствуйте, Maverick!
Да уж, тухлые яйца это не дело :) Вот, ответил.


Ответ отправлен: 03.11.2002, 18:16
Отправитель: Atmion


Отвечает Bob Johnson

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


Ответ отправлен: 05.11.2002, 13:03
Отправитель: Bob Johnson


 Вопрос № 1698

Прива.
У меня такой вопрос как можно искать файлы точнее какими командами я знаю ну не работатет и все может кто вышлет понятный исходничеек который бы просто выводил на эран все файлв которые находятся на диске С:.
Зраранее спаисбо.



Вопрос отправлен: 03.11.2002, 18:47
Отправитель: Buggy

[Следующий вопрос >>] [Список вопросов]

Отвечает St

Привет, Buggy!
Сорри не понятно, вам нужны файлы в текущем каталоге (C:), или вообще все файлы на диске? Программа под DOS или Windows? Как выводить: в DOS на экран все не поместятся (или с пренаправлением в файл), в Windows - в виде списка или в обычном окне с возможностью прокрутки? Пишите задачу понятнее пожалуйста!
St

Ответ отправлен: 04.11.2002, 17:24
Отправитель: St


Отвечает Maverick

Здравствуйте, Buggy!
В приложении рабочий код.
Сразу говорю, это не мое.
Когда то я задавал тоже этот вопрос, и кто то из экспертов прислал мне код, кто не помню.

Приложение:

Ответ отправлен: 04.11.2002, 09:17
Отправитель: Maverick


 Вопрос № 1700

Вопрос к экспертам. Я вызываю функцию ReadProcessMemory и в качестве параметра надо указывать указатель на начало памяти,
которую нужно прочитать у другого процесса и длину. По логике вещей, чтобы прочитать память процесса от начала и до конца, этот
параметр нужно приравнять к нулю, т.е. читать с нулевого адреса процесса. Но при 0 память не читает. И при <10000h тоже.
10000 - это я взял из winhex. Сделал указатель= 10000h - память читает и результаты с winhex сходятся. Так вот, почему
именно 10000h? Откуда эта цифра? Или это просто условно так сделано? или до 10000h находится то, что нам читать не дают?
Спасибо за ответы.



Вопрос отправлен: 04.11.2002, 04:59
Отправитель: Вася (amx@ezmail.ru)

[Следующий вопрос >>] [Список вопросов]

Отвечает masquer

Приветствую Вас, Вася!
По вопросу не совсем понятно что это за величина 10000. Если тебе нужно считать имидж с начала, брать нужно 0400000h, все остальное рассчитывается (или если знаешь - прописыватся) внутри программы. Исходник приводи, так понятнее будет для всех...

Ответ отправлен: 04.11.2002, 18:14
Отправитель: masquer


Отвечает Bob Johnson

Приветствую Вас, Вася!
Позволю себе заметить, что вы невнимательно читаете рассылку, молодой человек! Чтобы узнать, какие области адресного пространства процесса можно читать, нужно вызывать функцию VirtualQueryEx. Это делается в цикле, до тех пор, пока все адресное пространство процесса не будет поделено на блоки (доступные, недоступные, свободные). После можно читать.
Откуда у тебя цифра 10000h - не знаю. Это - 2^16, а обычно код программы начинается с 400000h (т.е. код начинается с 401000h, но читать можно уже с 400000h). Откуда берется эта цифра - из параметров запускаемого файла (Image Base, кажется). А вообще это соответствует одному элементу каталога страниц PDE, т.е. 1024*4096 = 4мб. Почему именно 4 мб? Чтобы удобнее было строить таблицы страниц, т.к. в этом случае можно уже у первого PDE указать недоступность памяти и не делать для него 1024 PTE. Почему бы не загружать программу в 0 - скорее всего для того, чтобы указатель NULL при попытке обращения к нему всегда выдавал бы ошибку.


Ответ отправлен: 05.11.2002, 13:03
Отправитель: Bob Johnson


Отвечает Atmion

Здравствуйте, Вася!
Хм, значит тут два варианта: 1) ты вызываешь ReadProcessMemory под WinNT. В NT адресное пространство процесса составляет формально 4 Гб, а фактически можно использовать только нижние 2 Гб, а верхние 2 Гб недоступны (там система). Но кроме того, в нижних 2 Гб также заблокированы для обращения первые 64 Кб, и последние 64 Кб. 2) ты вызываешь ReadProcessMemory под Win9x. В Win9x адресное пространство процесса составляет формально 4 Гб, а фактически можно использовать нижние 3 Гб, а верхниq 1 Гб недоступен (там тоже система). И кроме того, в нижних 3 Гб первые 64 Кб тоже недоступны (чтоб выявлять NULL-указатели).


Ответ отправлен: 06.11.2002, 02:48
Отправитель: Atmion


 Вопрос № 1701

Уважаемые эксперты!
Я ценю Вас только за то, что Вы есть и помогаете нам ламерам не заблудится в информационном потоке. У меня к вам давно наболел вопрос все не как не мог его задать. Мне хотелось бы узнать различие в программирование под дос и винду. Я так понимаю в досе используешь прерывания, а в винде функции апишных бибилиотек. А сами функции в свою очередь это тоже кусок программы, а как написаны они и можно ли их изменять? А если у меня линух там другие функции или нет?
Зараннее благодарю Вас за ответы.



Вопрос отправлен: 04.11.2002, 10:21
Отправитель: yuran (yuran@male.ru)

[Следующий вопрос >>] [Список вопросов]

Отвечает Bob Johnson

Здравствуйте, yuran!
Интерсное начало :-)
Различий программирование очень много. Скорее можно сказать, что сходств при программировании под ДОС и Винды нет. Потому что под дос используется 16-разрядный реальный режим, под Винды - 32-разрядный защищенный.
Фунции - это тоже кусок программы. В винде они находятся в DLL, например Kernel32.dll или User32.dll. Они написаны производителем ОС (т.е. микрософтом) на VC++ и менять их официально нельзя (этим ты даже нарушаешь лицензионное соглашение!). Но, как говорят - если очень захотеть... Под Вин98, например, это вполне можно сделать.
В любой другой ОС функции свои, потому что они составляют основу ОС. Поэтому программа, написанная под одну ОС не пойдет без переделки под другой.


Ответ отправлен: 05.11.2002, 13:04
Отправитель: Bob Johnson


Отвечает St

Привет, yuran!
Прерывания и функции виндов - это близкие вещи. И там и там некие подпрограммы, которые за вас уже написали и их можно использовать не думая как они устроены. Только под Windows их больше и возможности шире. Все системы являются программами. Менять прерывания под DOS можно - перехватывая вектора прерываний и меняя обработчики; под Windows всё значительно сложнее.
В Linux по другому.
St

Ответ отправлен: 04.11.2002, 17:45
Отправитель: St


Отвечает Portnov

Приветствую Вас, yuran!
Основных различий два: то, которое вы указали (прерывания versus WinAPI) и реальный (в Дос) или защищенный (в винде) режим. По порядку:
Вообще, есть понятие, общее для всех операционок: API - Application Programmer's interface, интерфейс прикладного программиста, набор постоянно используемых функций. В Досе API реализован через прерывания (в осн. 21h, есть и другие), в Винде - через функции. В никс-системах (в частности, линукс), есть свой стандарт API, называется POSIX.
В досе процессор работает в так наз. реальном режиме: вам доступно 640 Кб осноовной памяти, возможно, HighMemory, EMS и XMS, все смещения в сегментах 16-ти битные, так что сегменты не могут быть больше 64Кб, ну и так далее, сами знаете, если в досе программили. При этом любая программа может обратиться к любому существующему участку памяти. Винда же (и никс-системы тоже) при своем запуске переводит проц в защищенный режим. Это означает введение 32-битных смещений и, следовательно сегментов до 4Гб, привелегий, так что некоторые участки памяти (системные, сегменты кода и пр.) защищены от записи, дргие - от чтения, и т.д., введение системы исключений (особых ситуаций) и почти аппаратно реализованную многозадачность. Еще одной особенностью винды является механизм сообщений: все процессы обмениваются друг с другом и с осью сообщениями, и, соответственно, могут на них по своему желанию реагировать, например, по сообщению WM_CLOSE закрывать окно, WM_QUIT - выполнять необходимые действия по подготовке к выходу из программы и так далее.
Для более подробных сведений см. бумажную литературу, а также MSDN (msdn.microsoft.com) и Win32.Hlp.
С уважением, Portnov.

Ответ отправлен: 04.11.2002, 16:25
Отправитель: Portnov


Отвечает Dark_Lord

Приветствую Вас, yuran!
Пойдём попорядку, программирование под Windows и дос, а темболее под *nix это абсолютно разные вещи, если дос и Windows используют тот-же синтаксис, то в *nix системах принята другая система. В принципе в Windows можно перепрограммировать основные библтотеки, но зачем!? Windows итак не является эталоном стабильности, а кривые руки всяких продвинутых юзверей просто угробят его! Будут ещё вопросы, пиши.

Ответ отправлен: 04.11.2002, 18:38
Отправитель: Dark_Lord


Отвечает masquer

Здравствуйте, yuran!
Правильно понимаешь. Функции написаны тоже без прерываний, уже потом они опускаються до драйверов. Изменять можно, только незачем. А в линухе архитектура другая, и функции в принципе свои должны быть, хотя все это на С пишеться... А зечем тебе все это?

Ответ отправлен: 04.11.2002, 11:10
Отправитель: masquer


Отвечает Maverick

Приветствую Вас, yuran!
Да, ты правильно понимаешь различия.
В линуксе другие функции естественно, ведь это совсем другая операционка. Она отличается от винды, даже сильней, чем винда от доса.
Про программирование под линукс можно почитать у Зубкова.
Изменить функции, думаю можно, но гиморно.


Ответ отправлен: 04.11.2002, 11:23
Отправитель: Maverick


Отвечает LIFO

Доброе время суток, yuran!
Там защищенный режим, а в винде реальный. В этом и различие. А прерывания - это все процедуры.

Ответ отправлен: 04.11.2002, 11:45
Отправитель: LIFO


Отвечает Atmion

Приветствую Вас, yuran!
Ну что тут сказать... Различия в программинге под ДОС и винду большие... в ДОСе сегментная модель памяти, в винде - плоская. ДОС работает в реальном режиме, винда - в защищенном. Функции в ДОСе вызывается через программное прерывание int 21h, и параметры передаются через регистры, а под виндой функции вызываются через CALL, и принимают параметры из стека (хотя и регистры тоже используются). Да, функция - просто кусок кода, который выполняет некоторую работу и возвращает результат. В общем, про ДОС пора уже забыть, и юзать только винду, а если тебе нравятся окна ДОСа, то пиши консольные Win32-приложения.


Ответ отправлен: 06.11.2002, 02:49
Отправитель: Atmion



Форма отправки вопроса

Внимание!
Форма может работать некорректно в почтовых программах "Microsoft Outlook" и "Microsoft Outlook Express". В программе The Bat! подобные формы не работают вообще!
После нажатия на кнопку "Отправить", будет открыто второе окно. Заметьте, что в некоторых браузерах могут стоять запреты на открытие других окон, а также "чрезмерное" кэширование данных, при этом факт отправки Вашего вопроса стоит под сомнением.
Мы рекомендуем открывать рассылку в программе Internet Explorer 5.0+ или отправлять вопросы с сайта по адресу: http://rusfaq.ru/cgi-bin/Message.cgi.

© 2002 Команда RusFAQ.ru.

 Персональные данные

Ваше имя:

Ваш e-mail:

Опубликовать мой e-mail в рассылке


 Вопрос и дополнение

Ваш вопрос:


Приложение (если необходимо):


Получить ответов:


 Выбор рассылки

Программисту
Assembler (39)
C / C++ (25)
Perl (5)
Delphi (13)
Pascal (20)
Basic / VBA (8)
Java / JavaScript (9)
PHP (7)
MySQL / MSSQL (7)
Пользователю
Windows 95/98/Me (27)
Windows NT/2000/XP (16)
"Железо" (26)
Поиск информации (10)
Администратору
Windows NT/2000/XP (9)
Linux / Unix (13)
Юристу
Гражданское право (9)
Семейное право (6)
Трудовое право (5)
КоАП (6)

Отправить вопрос всем экспертам выбранной рассылки.




Яндекс цитирования

© 2002 Россия, Москва. Авторское право: RusFAQ.ru


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

В избранное