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

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


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

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

Выпуск № 702
от 04.03.2004, 11:50

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


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

Ayl
Статус: Профессиональный
Общий рейтинг: 116.54
[Подробней >>]
Евгений Иванов
Статус: Профессиональный
Общий рейтинг: 134.23
URL: Super Assembler Software
Телефон: Пчёлка +7 905 6601206
[Подробней >>]
Foamplast
Статус: Опытный
Общий рейтинг: 167.22
URL: мой личный сайт
Телефон: (121) - 1121212121111212221212
[Подробней >>]
 
SedHg
Статус: Опытный
Общий рейтинг: 112.83
[Подробней >>]
_vt
Статус: Профессиональный
Общий рейтинг: 117.86
[Подробней >>]
Bob Johnson
Статус: Профессиональный
Общий рейтинг: 143.98
URL: Программирование
[Подробней >>]
 
St
Статус: Профессиональный
Общий рейтинг: 105.3
[Подробней >>]
Snowm@n
Статус: Доверительный
Общий рейтинг: 125.74
[Подробней >>]
vitya
Статус: Профессиональный
Общий рейтинг: 108.68
[Подробней >>]


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

Вопрос № 5000. в продолжение прошлого вопроса: я может чего недопонял но я ведь это не сам придумал так в книжке Ро... (ответов: 3)
Вопрос № 5001. никак немогу уяснить вопрос связанный с сегментирование памяти (пытаюсь освоить ассемблер по книге О... (ответов: 3)
Вопрос № 5004. Здравствуйте! Вопрос канешно из рядо вон элементарных. Но не могли бы вы подсказать как сделать чтом... (ответов: 3)
Вопрос № 5005. Уважаемые эксперты.Плиз подскажите кто может.У меня вот какой трабл - есть скринсейвер т.е. написал ... (ответов: 3)
Вопрос № 5006. >>>Здравствуйте, ПАПА! >>>1. "Вот я в VC6 сделал DLL (Release), она не имеет фиксапа" - та... (ответов: 1)
Вопрос № 5008. Необходимо написать программу на ассемблере, которая размещалась бы в первом секторе нулевой дорожки... (ответов: 1)
Вопрос № 5009. Здравствуйте! По прерыванию 11h получаю в ax объем памяти. Как мне перевести его в десятичный вид дл... (ответов: 3)
Вопрос № 5010. Добрый день, уважаемые эксперты! Подскажите как в Windows 2000, Windows XP обращаться к портам ввода... (ответов: 4)
Вопрос № 5011. Здравствуйте! Меня интересует графика на ассемблере. 1. Как рисовать прямую или окружность? 2. Можно... (ответов: 2)
Вопрос № 5012. Здраствуйте. При компиляции программы у меня выскакивает ошибка: Приложению не удалось запуститься, ... (ответов: 1)
Вопрос № 5015. Здравствуйте, уважаемые эксперты! Я не могу понять, как перехватывать функции API. Обязательно ли ус... (ответов: 1)

Вопросов: 11, ответов: 25


 Вопрос № 5000

в продолжение прошлого вопроса:
я может чего недопонял но я ведь это не сам придумал так в книжке Роберта Жордейна написано: (прил.)
обьясните мне дураку :o
спасибо


Приложение:


Вопрос отправлен: 26.02.2004, 11:25
Отправитель: очень хочу научиться

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

Отвечает Ayl

Добрый день, очень хочу научиться!
Ну так у Джордейна все правильно - он сначала берет сегментный адрес последнего сегмента (пустого) программы и вычитает из него сегментный адрес начала программы. А у тебя что?
Начнем с того, что у Джордейна исходник компилируется в EXE-формат (многосегментная программа), а у тебя - в COM. А COM-формат вообще подразумевает один сегмент. Так что тут такая фишка не прокатит (тебе не удастся "присобачить" еще один сегмент.
Во-вторых, у Джордейна ZSEG - это имя сегмента, по умолчанию команда mov bx, ZSEG компилируется в mov bx, SEG ZSEG, т.е. в регистр bx заносится сегментный адрес последнего сегмента программы. У тебя же написано mov bx, word ptr end_p, причем end_p - это просто метка в программе. Твоя команда загружает в регистр bx значение (2 байта) по адресу ds:end_p. Чувствуешь разницу? Причем это значение неинициализированное, так что предсказать, что именно будет загружено в регистр невозможно.
Такие вот дела. Читай внимательно комментарии к программе.

P.S. Поправка к моему ответу на твой предыдущий вопрос. В оьвеье я написал, что полученное смещение метки конца программы нужно разделить на 16 и прибавить 1, а в коде забыл. Т.е. перед вызовом функции 4Ah нужно еще добавить команды:
shr bx, 4
inc bx
Вроде теперь все.


Ответ отправлен: 26.02.2004, 12:27
Отправитель: Ayl


Отвечает Евгений Иванов

Добрый день, очень хочу научиться!
освобождение памяти - это 49h!
а 4Ah - изменение размера!
* EMan: -=- Любовь существует! =-=


Ответ отправлен: 29.02.2004, 18:11
Отправитель: Евгений Иванов


Отвечает Foamplast

Добрый день, очень хочу научиться!
Вроде правильно у него написано.
Просто ZSEG располагается после кода, таким образом есть
два последовательных сегмента: сегмент кода и ZSEG.
А в сегментном регистре скорее всего хранится адрес
начала сегмента в параграфах. Таким образом, вычитая ES из
ZSEG получаем разницу в параграфах, что и требовалось.


Ответ отправлен: 28.02.2004, 02:40
Отправитель: Foamplast


 Вопрос № 5001

никак немогу уяснить вопрос связанный с сегментирование памяти (пытаюсь освоить ассемблер по книге Олега Калашникова) дошел до главы 3-и ... начал разбираться с памятью и запутался возникло куча непонимания. Где можно получить более подробное описание работы памяти (желательно на русском) или можете ли вы мне рассказать данную тему.



Вопрос отправлен: 26.02.2004, 12:54
Отправитель: Сергей

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

Отвечает Ayl

Доброе время суток, Сергей!
А что именно непонятно?
В реальном режиме работы процессора Intel x86 (а судя по всему именно с этим режимом ты и разбираешься, потому что ДОС как раз и работает в нем) максимально адресуемая память составляет 1Мб + еще немного (почему - объясню позже). Зависит это от того, что разрядность шины данных составляет 20 бит. Но так как разрядность регистров процессора всего 16 бит, то полный 20-разрядный адрес в регистр не запихать. Поэтому при разработке процессора для адресации памяти была применена сегментная модель. Что она из себя представляет?
Договорились, что вся память разбивается на 65536 областей, называемых параграфом. Каждый параграф равен 16 байтам. В результате получаем 65536*16 = 1Мб, то есть вся адресуемая память.
Адрес параграфа кратен 16, то есть в 16-ричном виде он выглядит так: xxxx0. Внутри параграфа для адресации байта как раз хватает одной 16-ричной цифры, т.е адресация памяти будет осуществляться непрерывно.
Теперь, если занести адрес параграфа (старшие 16 бит адреса) в какой-либо регистр (им присваивается наименование "сегментные"), то, зная, что младшие 4 бита адреса всегда нули, мы может легко (на уровне схем процессора) вычислить полный адрес параграфа.
Осталось научиться адресовать байты внутри параграфа. Для этого возьмем другой регистр и запишем туда смещение байта внутри параграфа. Ура! У нас есть сегментный адрес и смещение внутри параграфа, начинающегося по этому адресу.
Теперь внимание! Регистр, в который мы записали смещение, у нас тоже 16-тиразрядный! То есть, нам ничто не мешает записать в него не число от 0 до 15 (смещение в указанном параграфе), а любое число вплоть до 65535. В результате получается, что указав адрес одного параграфа, мы можем, не меняя базы, адресовать 65536 байт или 4096 параграфов.
Отсюда мы приходим к понятию сегмента. Сегмент - это область памяти, занимающая 65536 байт и начинающаяся с какого-либо параграфа.
В результате получается, что один и тот же байт в памяти может адресоваться несколькими способами, например:
00417 = 0000:0417 = 0001:00407 = ... = 0040:0017 = 0041:0007
Теперь о том, почему я написал, что максимально адресуемая память составляет 1Мб + еще немного. В процессорах 8086/8088 и 80186 адресная шина ФИЗИЧЕСКИ составляла 20 бит. Поэтому адресовать более 1Мб памяти нельзя было никак. Но уже начиная с процессора 80286 адресная шина была как минимум 24-разрядной, что давало возможность адресации до 16Мб. Правда, память выше 1Мб в реальном режиме была недоступна как раз из-за ограничения сегментной можели адресации (адресовать больше 65536 параграфов нельзя из-за ограниченности разрядов сегментного регистра (16 бит!). Но тут сработал сам механизм сегментной адресации, который позволяет получить дополнительно почти 64К памяти выше 1Мб. Смотри. Возьмем сегмент, равный FFFF. Если взять смещение от 0 до 15, то мы не выйдем за пределы 1Мб:
FFFF:000x = FFFFx < 100000 = 1Мб.
Но давай возьмем смещение, скажем, 0010. Получаем:
FFFF:0010 = FFFF0 + 0010 = 100000! В процесорах до 80286 старшая единица должна было бы попасть на линию A20 адресной шины, но там ее не было (как обычно, нумерация происходит с нуля и в ранних процессорах адресных шин было всего 20 - от A0 (младший разряд адреса) до A19 (старший разряд))! А в процессоре 80286 она есть! И при некоторых установках режимов процессора ее можно разрешить и получить доступ к памяти свыше 1Мб!
Т.о. на процессорах 8086/8088 и 80186 FFFF:0010 = 0000:0000.
На процессорах 80286+ при закрытой линии A20 - то же самое.
Но при открытой линии A20 получаем FFFF:0010 = 100000!
Максимальный адрес, адресуемый процессорами 80286+ в реальном режиме равен FFFF:FFFF = 10FFEF, что составляет на 16 байт меньше 64К выше 1Мб.


Ответ отправлен: 26.02.2004, 14:13
Отправитель: Ayl


Отвечает SedHg

Здравствуйте, Сергей!
Скажи, что тебя конкретно интересует. И пришли свое мыло, я чего-нибудь тебе вышлю по этому вопросу.


Ответ отправлен: 26.02.2004, 20:48
Отправитель: SedHg


Отвечает Foamplast

Добрый день, Сергей!
Я тебе расскажу, только, пожалуйста, задавай конкретные вопросы. Тебя интересует сегментирование памяти в реальном режиме, защищённом режиме, нереальном режиме или 64-разрядном режиме? И вообще мы про процессоры, совместимые с Intel, говорим?
Описание первых 3-х режимов можно также найти в книге Зубкова "Assembler для DOS, Windows и UNIX". Однако, я не думаю, что это будет значительно отличаться от книги Калашникова (к сожалению, её не читал).


Ответ отправлен: 28.02.2004, 02:40
Отправитель: Foamplast


 Вопрос № 5004

Здравствуйте! Вопрос канешно из рядо вон элементарных. Но не могли бы вы подсказать как сделать чтом откомпилированный файл на масаме помещался не в корневой католог масма а мной лично определенную отдельную папку.



Вопрос отправлен: 26.02.2004, 17:32
Отправитель: 3D Bob (me@bobmax3d.br.urbannet.ru)

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

Отвечает _vt

Приветствую Вас, 3D Bob!
Так создай эту "лично определённую папку" и складируй файлы туда. А путь к компилятору MASM пропиши в системной переменной %PATH%. Есть вопросы ? Пиши!
--- E-Man 1.5+ : Sorry for terrible english. My native language is C++


Ответ отправлен: 27.02.2004, 04:51
Отправитель: _vt


Отвечает SedHg

Приветствую Вас, 3D Bob!
Такую возможность предоставляет любое IDE, начиная от какого-нибудь AsmEdit. Я использую последнее время
Assembly Studio 2.0, от Negatory, чего и тебе советую.


Ответ отправлен: 26.02.2004, 20:47
Отправитель: SedHg


Отвечает Foamplast

Здравствуйте, 3D Bob!
Напиши bat-файл для компиляции и настрой свой редактор, чтобы он по F5 его запускал и передавал ему параметр - имя текущего файла. А батник сам уже будет всё копировать куда надо. Это самый приятный способ компиляции. Посмотри мой батник в приложении.


Приложение:

Ответ отправлен: 28.02.2004, 02:40
Отправитель: Foamplast


 Вопрос № 5005

Уважаемые эксперты.Плиз подскажите кто может.У меня вот какой трабл - есть скринсейвер т.е. написал прогу основу составляет
перемещение блоков картинки по таймеру, т.к меня не устроил
апишный SetTimer (из-за медлительности,блоков много) -
использовал мультимедийный timeSetEvent imeKillEvent.
Программа моя иногда виснет (не отвечает на события мыши)
движения замедляются, особенно когда значения задержки маленькие (быстрое перемещение), можно снять только через три клавишы и то с большими задержками.
Описания, нормального я на эти функции не нашел, но нашел пример,
где это используется(кажется змейка) так вот в этом примере
для выхода из вызываемой процедуры используется ret 14h.
Что это такое? Как можно реализвать маленькую задержку без
глюков? Спасибо.


Приложение:


Вопрос отправлен: 26.02.2004, 23:45
Отправитель: Arthur (arthy_k@fromru.com)

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

Отвечает Bob Johnson

Доброе время суток, Arthur!
Ret 14h - это возврат из п/п и извлечение из стека 14h байт (т.е. 5 параметров типа dword). Так должны возвращаться процедуры, вызываемые по соглашению stdcall.
Что касается твоей проблемы, то лучшим ее решением будет создание дополнительного потока, который будет только и делать, что отрисовывать то, что тебе нужно. Задержку вставь функцией sleep, а главный поток при этом будет обрабатывать сообщения, чтобы программа не "зависала".

* EMan1.5: ---===*** The game we play ***===---


Ответ отправлен: 28.02.2004, 23:34
Отправитель: Bob Johnson


Отвечает St

Привет, Arthur!
Я сам перепробовал разные варианты достаточно точных таймеров, и сейчас остановился на том же, что и вы, как наиболее удобный. Однако я не пытался сделать задержку меньше 10 миллисекунд (мне и этого было достаточно), нужнее было сделать изменение скорости вывода более равномерным (вот это проблема!). Думаю что на слишком высоких скоростях (если я правильно понял от 2 мс) система просто не успевает.
Нормальное описания, то что в MSDN работает, за исключением флага TIME_KILL_SYNCHRONOUS (по крайней мере на WIN98), который ДОЛЖЕН прекращать вызов Callback функции после timeKillEvent, но не делает этого. Приходится извращаться.
Знаю что в программе ICE Book Reader заявлена скорость вывода до 500 кадров в секунду и точностью изменения 1 кадр. Правда насколько я понял даже на самом современном компьютере достичь 500 кадров не удается (на 1 ГГц проце выше 100 кадров не получается), так что это скорее теоретическое число, но то что они сделали точность 1 кадр говорит о том, что они используют какой-то свой способ, так как timeSetEvent не способен дать такой точности даже теоретически. Значит есть какой-то способ, но мне он пока не знаком :(.
Кстати, а вы уверены что вам нужны такие скорости вывода (с задержками менее 10 мс), ведь монитор все равно не способен дать больше 100-120 кадров, так что часть кадров будет теряться?
St

Ответ отправлен: 27.02.2004, 12:42
Отправитель: St


Отвечает Foamplast

Здравствуйте, Arthur!
Я скринсэйверы не писал, но думаю, что можно попробовать узнать скорость процессора с помощью функций из раздела System Information, а затем читать такты c помошью RDTSC.
То есть, когда будет известно, сколько тактов в заданном временном интервале, можно будет отсчитывать это количество и получать задержку.
Точнее, наверное, невозможно.

Ответ отправлен: 28.02.2004, 03:01
Отправитель: Foamplast


 Вопрос № 5006

>>>Здравствуйте, ПАПА!
>>>1. "Вот я в VC6 сделал DLL (Release), она не имеет фиксапа" - такого вообще быть не
>>>может, поэтому вопрос у тебя справедливый. У DLL таблица перемещений должна
>>>быть ВСЕГДА.
Блин, извеняюсь. Бес попутал. Фиксап есть. У меня уже на уровне слюноотделения если выравнивание секций в файле и в памяти одинаковое, то я не парюсь над РВА (Какое РВА, такое и смещение в файле). Просто такое западло там:
Секция | РВА | Физ. смещ.| Физ. размер |
.data | 13000 | 13000 | 4000 |
.rsrc | 19000 | 17000 | 3000 |
.reloc | 1C000 | 1A000 | 3000 | Вот здесь искал фиксап по 1C000:).
Вот спрашивается, какого фига РВА ресурсов на 2000 больше, чем нужно?
>>>2. Б-р-р-р! А для чего это всё вообще надо? Ты расскажи про основное задание, может
>>>ты способ не совсем эффективный выбрал.
Ну, если не вдаваться в подробности, сейчас уже не важно эффективно это или нет, задание поставлено и я его должен сделать. Суть в том, что я делаю систему, которая позволяет "вставлять" юзерам(программерам) в исполняемый файл конкретные функции из библиотеки (DLL), написанной этим же юзером. Ну то есть юзер может до посинения писать ДЛЛ-ки с разнообразными функциями а потом по своему усмотрению вставлять экспортируемые из них функции в ЕХЕшники. Для этого юзеру предлагается определённые правила написания этих функций, соглашение о параметрах. Ну, напрмер, можно, написать функцию упаковки-распаковки, вживить её в ЕХЕшник, и ЕХЕшник станет типа самораспаковывающимся. Идея ясна, надеюсь.
>>>По логике, по понятиям да и по тому же ООП, метод - это свойство класса, а не его
>>>экземпляра. И, дизассемблируя DLL, написанные с использованием ООП, можно это
>>>увидеть. То, что ты пишешь, говорит о том, что кто-то сильно заблуждается, либо ты,
>>>либо создатели VC.
Я извеняюсь, конечно, за не к месту употреблённое слово экземпляр в предыдущем письме. Я его употребил не всмысле экземпляр класса, а ПРОСТО экземпляр, типа один, а не много. Вопрос в том что, когда существуют много переменных (экземпляров класса), код методов этого класса существует только в одном экзем.... ну то есть один. Членов-данных столько же копий, сколько и переменных, а код метода только один. И вот типа где он, этот код обитает в памяти.
------прошли часы-------------
я уже разобрался, где обитают методы. Они обитают там, где компилятору заблагорассудится.
Отсюда вывод: при написании функций для ДЛЛ нельзя юзать методы классов, так как для "вырезания" функции из ДЛЛ нужно знать размеры кода методов, а вычислить их вообще не реально.
Ура! Мне меньше работы:)
>>>И вообще, давай с тобой по почте свяжемся, ты пришлёшь мне свои загадочные
>>>файлы, и я на них погляжу.
Ну... какие файлы?:) Если все исходники слать, то ты в них не разберёшься до второго пришествия. Я сам уже забыл половину (шутка). Проблема щас не на уровне программирования, а на уровне понимания структуры ДЛЛ и того, что происходит при загрузке ДЛЛ.
Короче, вопрос у меня сейчас только один:
моя ДЛЛ грузиться в память совершенно непонятным образом.
Сам файл имеет размер 116Kb. После загрузки в памяти 1,3Mb.
Например, таблица экспорта по смещению (и RVA) 0х12BA0, а после загрузки в память экспорт я нахожу по аресу 0х10127D30. Чё за фигня? И главно-дело в памяти изменяется описание секций в PE-заголовке. Появляется секция ".idata", хотя её не было....
Аут, короче, полный.
---------прошло 5 минут------------
Написал в Borland C++5.02 такой код
"main(){LoadLibrary("mydll.dll");}".
Запустил в отладчике - ДЛЛка грузится НОРМАЛЬНО (дамп нормальный).
Неужели с VC что-то случилось? (ведь всё тоже самое делаю...)
--------прошла ночь----------------
Если запускать Releas\'ную версию моей проги, то дамп ДЛЛ-ки нормальный.
Вобщем поперебирал различные варианты загрузки. Оказалось следующее.
Воркспэйс у меня содержит два проекта "моя_длл" и "моя_прога". Так вот, если я гружу LoadLibrary("моя_длл"), то лажа, а если LoadLibrary("переименнованый_файл_моей_длл"), то всё круто. То есть VC отслеживает тот случай, когда я гружу ДЛЛку с именем, входящим в воркспейс.
-----------рошло 10 секунд---------------
Выводы: проблема вобщем-то решена. переименую файлик и буду спокойно дебажить...
Однако всё равно не понятно, что собственно происходит в VC....
Мыло то у тебя есть?



Вопрос отправлен: 27.02.2004, 01:17
Отправитель: ПАПА

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

Отвечает Foamplast

Приветствую Вас, ПАПА!
Совсем ты меня запутал.
1. А как ты размер кода "обычных" функций определяешь?
2. Если ты функцию добавляешь в exeшник, то как она оттуда вызовется, это ведь надо заранее прописать вызов в коде. А тогда не проще функцию прямо из Dllки вызывать?
В общем, пиши на foamplast@hexx.ru.
А то мы всю рассылку так этой темой займём.

Ответ отправлен: 28.02.2004, 02:40
Отправитель: Foamplast


 Вопрос № 5008

Необходимо написать программу на ассемблере, которая размещалась бы в первом секторе нулевой дорожки нудевой головки до таблицы Patishon и запрашивала бы пароль.
Подскажите пожалуйсто документацию или пример кода.



Вопрос отправлен: 27.02.2004, 18:29
Отправитель: Владимир

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

Отвечает _vt

Приветствую Вас, Владимир!
Больше некуда пароль засадить? Не место ему там! Ну а документация - введи в поисковик строку "Формат FAT" и получишь кучу ссылок.
--- E-Man 1.5+ : Sorry for terrible english. My native language is C++


Ответ отправлен: 29.02.2004, 00:04
Отправитель: _vt


 Вопрос № 5009

Здравствуйте!
По прерыванию 11h получаю в ax объем памяти. Как мне перевести его в десятичный вид для вывода на экран.
Спасибо.



Вопрос отправлен: 27.02.2004, 19:27
Отправитель: Alex

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

Отвечает Snowm@n

Добрый день, Alex!
Пока делится делишь на 10 и выписываешь остатки в обратном порядке на экран.


Ответ отправлен: 29.02.2004, 19:02
Отправитель: Snowm@n


Отвечает Bob Johnson

Приветствую Вас, Alex!
Тебе нужна процедура перевода числа в строку. Посмотри архив рассылки - она неоднократно была. Принцип простой - последовательно делить на 10 и печатать остаток. Правда получается справа налево...

* EMan1.5: ---===*** The game we play ***===---


Ответ отправлен: 28.02.2004, 23:34
Отправитель: Bob Johnson


Отвечает Foamplast

Добрый день, Alex!
Общий алгоритм такой:
1.
Исходное число делишь на 10, записываешь остаток.
Частное делишь на 10, записываешь остаток.
Новое частное делишь на 10, записываешь остаток.
И так пока частное не станет равно 0.
2.
Записываешь остатки в обратном порядке.
3.
Переводишь эти цифры в соответствующие символы (если кодировка ASCII,то просто прибавляешь к ним 30h).
4.
Записываешь после последнего символ конца строки.
5.
Вызываешь функцию вывода строки на экран.


Ответ отправлен: 28.02.2004, 02:41
Отправитель: Foamplast


 Вопрос № 5010

Добрый день, уважаемые эксперты!
Подскажите как в Windows 2000, Windows XP обращаться к портам ввода/вывода на ассемблера. В частности, как можно считать и изменить CMOS?
С уважением, Александр



Вопрос отправлен: 27.02.2004, 23:10
Отправитель: Dyx (lingway@krm.net.ua)

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

Отвечает Snowm@n

Добрый день, Dyx!
В Win2K и WinXP это невозможно.


Ответ отправлен: 29.02.2004, 19:04
Отправитель: Snowm@n


Отвечает vitya

Здравствуйте, Dyx!
Вам придется написать драйвер.

Ответ отправлен: 28.02.2004, 11:03
Отправитель: vitya


Отвечает Foamplast

Здравствуйте, Dyx!
Также, как и из любого другого языка.
Пишешь драйвер, который при вызове DeviceIoControl()
с определённым тобой параметром ищет TSS вызвавшей задачи
и открывает соответствующие биты в карте ввода-вывода.
Твоя программа при запуске проверяет, установлен ли драйвер.
Если нет, то устанавливает его.
Загружает драйвер.
Затем вызывает DeviceIoControl() и выгружает драйвер.
Делает с портами что хочет.
(В том числе, меняет содержимое CMOS).
Подробнее смотри статью "Драйверы режима ядра: Часть 3: Простейшие драйверы"
http://wasm.ru/print.php?article=drvw2k03

Приложение:

Ответ отправлен: 28.02.2004, 02:41
Отправитель: Foamplast


Отвечает Bob Johnson

Добрый день, Dyx!
Драйвер видимо.

* EMan1.5: ---===*** The game we play ***===---


Ответ отправлен: 28.02.2004, 23:34
Отправитель: Bob Johnson


 Вопрос № 5011

Здравствуйте!
Меня интересует графика на ассемблере.
1. Как рисовать прямую или окружность?
2. Можно ли использовать opengl или directx библиотеки в dos'е?
3. Можно ли подключать библиотеки паскаля в ассемблер например построения окружности?
4. Не посоветуете вы мне какой-нибудь материал про граФику в ассемблере?
Спасибо!
с Уважением АЛЕША



Вопрос отправлен: 28.02.2004, 12:07
Отправитель: Алеша

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

Отвечает Ayl

Доброе время суток, Алеша!
1. Ручками по точкам. Есть множество алгоритмов построения прямых и окружностей. Самый простой способ - по уравнению линии. Но он и самый медленный. Из быстрых - например, целочисленные алгоритмы Брезенхема для прямой и эллипса. Можешь поискать в инете или в книжках по графике.

2. Если не ошибаюсь, в ранних версиях этих библиотек была поддержка ДОСа.

3. Можно, но зачем тебе тогда ассемблер? Лучше уж тогда в Паскале использовать ассемблерные вставки.

4. Могу порекомендовать следующие книжки:
А.Фролов, Г.Фролов. Библиотека системного программиста. Выпуск 21.
В.Л.Григорьев. Видеосистемы ПК фирмы IBM. М.:Радио и связь, 1993
Р.Уилтон. Видеосистемы персональных компьютеров IBM PC и PS/2. М.:Радио и связь, 1994. В этой книжке также приведены алгоритмы построения прямых, эллипсов, заполнения областей, вывод текста
М.Арсак. Таинства программирования графики. Великолепная книга, советую всем интересующимся графикой. Куча примеров, прекрасные объяснения, множество полезной информации. Алгоритмы двумерной и трехмерной графики, анимация, работа с недокументированным режимом X, работающем на любом видеоадаптере VGA (360*480, 256 цветов).


Ответ отправлен: 28.02.2004, 17:54
Отправитель: Ayl


Отвечает Bob Johnson

Приветствую Вас, Алеша!
1. Если под винды - там есть соотв. функция, напрмер, LineTo. Если под дос - то самому или использовать чьи-либо библиотеки.
2. Нет.
3. В принципе, это возможно. Но на практике будет проще написать прогу на паскале с ассемблерными вставками :)
4. Смотря чем ты займешься - если начнешь изучать directx или ogl под винды - то тогда тебе лучше всего читать соотв. описания, а потом уже переносить примеры на асм.

* EMan1.5: ---===*** The game we play ***===---


Ответ отправлен: 28.02.2004, 23:34
Отправитель: Bob Johnson


 Вопрос № 5012

Здраствуйте.
При компиляции программы у меня выскакивает ошибка:
Приложению не удалось запуститься, поскольку mspdb50.dll не был найден.Повторная установка приложения может исправить эту проблему.
Компилю masm32, но в консольке почему-то пишется masm 6.14.8444



Вопрос отправлен: 28.02.2004, 15:54
Отправитель: Семен

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

Отвечает _vt

Здравствуйте, Семен!
Всё правильно пишется - ты, наверное, с отладочной информацией компилишь, а каталог masm\bin не прописан в PATH?
--- E-Man 1.5+ : Sorry for terrible english. My native language is C++


Ответ отправлен: 29.02.2004, 00:04
Отправитель: _vt


 Вопрос № 5015

Здравствуйте, уважаемые эксперты! Я не могу понять, как перехватывать функции API. Обязательно ли устанаваливать обработчики SEH? Если можно, приведите пример процедуры по перехвату.



Вопрос отправлен: 29.02.2004, 11:40
Отправитель: PRO

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

Отвечает Foamplast

Здравствуйте, PRO!
Что именно ты хочешь перехватывать?
Для перехвата вызовов WindowsAPI-функций запущенными программами и направоления вызовов в свою программу есть такой метод:
1. Ставишь глобальный hook. Таким образом, твоя библиотека оказывается спроецированной в адресное пространство каждого процесса.
2. При инициализации библиотеки сканируешь таблицы импорта и заменяешь какие надо адреса на свои собственные.


Ответ отправлен: 04.03.2004, 01:16
Отправитель: Foamplast



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

Внимание!
Мы рекомендуем открывать рассылку в программе Internet Explorer 5.0+ или отправлять вопросы с сайта по адресу: http://rusfaq.ru/cgi-bin/Message.cgi.

(C) 2002-2003 Команда RusFAQ.ru.

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

Ваше имя:

Ваш e-mail:

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


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

Ваш вопрос:


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


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


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

Программисту
Assembler (28)
C / C++ (20)
Perl (1)
Builder / Delphi (17)
Pascal (20)
Basic / VBA (9)
Java / JavaScript (3)
PHP (11)
Криптография (7)
WinAPI (15)
Радиоэлектроника (9)
Пользователю
Windows 95/98/Me (36)
Windows NT/2000/XP (57)
"Железо" (31)
Поиск информации (15)
Администратору
Windows NT/2000/XP (28)
Linux / Unix (11)
Юристу
Гражданское право (15)
Семейное право (12)
Трудовое право (12)
КоАП (10)

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




Задать вопрос | Регистрация эксперта | Поиск в базе | Чат | Форумы | Новости
Проект экспертов RusFAQ.ru | Фотоальбом | Virus.RusFAQ.ru | Администрирование
Профессиональная WEB-Студия B.I.T.


Яндекс цитирования
© 2001-2004 Россия, Москва. Авторское право: Калашников О.А.


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

В избранное