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

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


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

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

Выпуск № 389
от 12.10.2002, 13:10

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


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

Sensey
Статус: Профессиональный
Общий рейтинг: 125.43
URL: Страничка рассылки по Паскаля...
Телефон: +38 (0572) 41-76-04 дом.
[Подробней >>]
Beeblebrox
Статус: Профессиональный
Общий рейтинг: 114.22
URL: Beeblebrox / TMA HomePage
[Подробней >>]
Bob Johnson
Статус: Опытный
Общий рейтинг: 154
[Подробней >>]
 
ASMодей
Статус: Опытный
Общий рейтинг: 122.05
[Подробней >>]
Артём Шегеда
Статус: Профессиональный
Общий рейтинг: 116.65
URL: Пристанище неодинокого программиста
[Подробней >>]
Dark_Lord
Статус: Профессиональный
Общий рейтинг: 131.51
[Подробней >>]
 
St
Статус: Начальный
Общий рейтинг: 111.47
[Подробней >>]
Eugene
Статус: Начальный
Общий рейтинг: 123.91
[Подробней >>]
Gibbel
Статус: Профессиональный
Общий рейтинг: 108.22
URL: Страничка обо мне и моих друзьях
[Подробней >>]
 
Broken Sword
Статус: Профессиональный
Общий рейтинг: 132.56
URL: моя рассылка по Protected Mode
[Подробней >>]
masquer
Статус: Профессиональный
Общий рейтинг: 156.22
[Подробней >>]
DiGiT[old]
Статус: Доверительный
Общий рейтинг: 111.54
[Подробней >>]
 
Dron
Статус: Профессиональный
Общий рейтинг: 117.83
URL: Операционная система с нуля!
[Подробней >>]
LIFO
Статус: Опытный
Общий рейтинг: 131.59
Телефон: 8 01710 24758
[Подробней >>]


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

Вопрос № 1433. Доброе время суток уважаемые Эксперты! К сожалению на мой вопрос никто не ответил на данный момент. ... (ответов: 2)
Вопрос № 1434. Уважаемые эксперты! Что такое в Win32 селектор? Зачем он нужен? И как его использовать? Заранее спас... (ответов: 2)
Вопрос № 1435. Привет! Комментарий к моему вопросу 1421: Спасибо тем кто отослал меня к MSDN. Всё бы хорошо, но раз... (ответов: 1)
Вопрос № 1436. Привет еще раз! В добавление к моему предыдущему письму: Написал 2 программки выводящие текст c помо... (ответов: 1)
Вопрос № 1437. Привет всем надеюсь у всех все в порядке. У меня проблемка маленькая, мне нужно прогу написать чтоб ... (ответов: 8)
Вопрос № 1438. Привет всем. Я недавно начал учить Асм, и естественно появилась куча вопросов. Вот один из них: я на... (ответов: 5)
Вопрос № 1439. Уважаемые эксперты! Вот долгое время терзает вопрос. Вычитал в мануале про организацию памяти в NT, ... (ответов: 5)
Вопрос № 1440. Здравствуйте ув-ые эксперты! Во-первых - спасибо за ответы на предыдуший вопрос. Во-вторых у меня по... (ответов: 5)
Вопрос № 1441. Здравствуйте, уважаемые эксперты! Жаль, что на вопрос, как писать в флэш-биос никто не ответил. Знаю... (ответов: 1)
Вопрос № 1442. Привет Bob Johnson! Ответ на ваш ответ на письмо 1435 1) CompatibleBitmap создается (в 4 раза длинне... (ответов: 2)

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


 Вопрос № 1433

Доброе время суток уважаемые Эксперты!
К сожалению на мой вопрос никто не ответил на данный момент.
Ну да ладно.
Я понемногу локализовал проблему.
Я не могу понять, вроде во всех объявлениях функций я явно указываю тип переменной как unsigned short Data, а когда ставлю точьку прерывания на функцию, в которой у меня происходят проблемы и при этом проверяю регистр AL, то он содержит не число, а символ пробела или "!". До этого я помещаю туда unsigned short Status1=32 или unsigned short Status2=33. Хотя нигде явного Unsigned char Data нету.
Не могли бы Вы разобраться с этим уважаемые Эксперты, очень вас прошу. Сейчас я немогу послать исходник, я иду домой. Завтра я отправлю вам его.
Рифат.



Вопрос отправлен: 07.10.2002, 15:55
Отправитель: Рифат (orw@ngs.ru,abriofh@mail.ru)

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

Отвечает Sensey

Приветствую Вас, Рифат!
Да не нужен здесь исходник в принципе...
32 это код пробела, все верно...
short для С - это либо 1 байт, либо 2 (если int 4 байта)
Это в Паскале байт и char разное, а в С - одно и то же...


Ответ отправлен: 07.10.2002, 16:20
Отправитель: Sensey


Отвечает Beeblebrox

Доброе время суток, Рифат!
А что ж ты хотел, пробел и есть 20h=32, а "!" eсть 21h=33
:)))))

Ответ отправлен: 07.10.2002, 17:13
Отправитель: Beeblebrox


 Вопрос № 1434

Уважаемые эксперты!
Что такое в Win32 селектор? Зачем он нужен? И как его использовать?
Заранее спасибо.



Вопрос отправлен: 07.10.2002, 17:36
Отправитель: SonicX (asm86@mail.ru)

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

Отвечает Bob Johnson

Добрый день, SonicX!
Если ты про защищенный режим - то это сегмент памяти (число, которое загружается в сегментный регистр процессора). Он характеризуется базовым адресом, размером, привилегиями и еще некоторыми параметрами.
В Вин32 (если ты правильно программируешь) тебе никогда не надо задумываться, какие у тебя числа в сегментных регистрах - их туда помещает ОС и менять их тебе не надо. Все параметры сегмента задаются в таблице сегментов, которая может быть локальная или глобальная. Затем, непосредственно в сам регистр загружается только номер элемента таблицы. Сами таблицы ты под вин32 не можешь менять, да это и не надо - так значительно проще, т.к. нет необходимости задумываться об этих регистрах.


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


Отвечает ASMодей

Добрый день, SonicX!
Смотря что называть селектором, у меня, например, препод
так называл курсор в Listbox.
Вообще селектор существует независимо от Windows и используется
процессором для адресации к сегменту памяти. Он обычно
находится в сегментных регистрах (CS, DS, SS, FS, GS, ES).


Ответ отправлен: 08.10.2002, 21:50
Отправитель: ASMодей


 Вопрос № 1435

Привет!
Комментарий к моему вопросу 1421: Спасибо тем кто отослал меня к MSDN. Всё бы хорошо, но размер ~600 Мб!!! (это только основы, против 12 Мб в win32.hlp). Я пиши программы обычно на ноуте и у меня там столько просто нет :(. Отсюда и проблемы.
Тут возник еще один вопрос - я выводил текст на экран функцией ExtTextOut и пытался плавно его прокручивать. На мощной машине во весь экран или на не очень мощной c маленьком окне удавалось достигать ~95 строк/секунду. Однако изображение почти всегда дергалось. Я попытался выводить текст по другому - созданием CompatibleDC выводом туда нескольких экранов текста и затем копированием c помощью BitBlt уже на экран со сдвигом в один пиксел вниз в CompatibleDC. Однако даже если убрать таймер и выводить в отдельном потоке в непрерывном цикле удалось достичь только ~15 строк/секунду. Неужели BitBlt такая медленная функция? Программа тестировалась в Windows98, а в 2000 начала глючить и не удалось проверить скорость работы на другой машине.
St



Вопрос отправлен: 07.10.2002, 18:35
Отправитель: St (st23@yandex.ru)

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

Отвечает Bob Johnson

Добрый день, St!
Когда ты создаешь DC в памяти (CompatibleDC) в него надо обязательно создать CompatibleBitmap, иначе - возможная причина торможения, т.к. при осуществлении bitblt предется осуществлять перекодирование.
Когда я писал похожие программы, мне не казалось, что bitblt такая уж медленная. Попробуй убрать вывод текста и оставить только bitblt - посмотри тогда на скорость. Должно быть все ОК, т.к. так работают многие программы, которые помещают картинку в фон окна (на сообщении WM_ERASEBKGND они копируют в окно свою картинку). Но все может зависть от драйверов видеокарты (и ее типа, конечно). В общем, померяй, что тормозит больше всего и исходя из этого делай вывод.
На таймер и не рассчитывай - т.к. он под вин98 приходит не чаще (при нормальном приоритете), чем где-то 20 раз в секнду. Отдельный поток - это правильно, можешь добавить в его цикл еще и Sleep (1) или больше - потому что обычно такие функции с GDI оказываются достаточно быстрыми, а больше 85-100 раз в секунду обновлять просто не надо.
Возможно еще, что тормозит вывод текста - попробуй без Clip Rect и других наворотов, простой TextOut или для сдвига применяй BitBlt в своем DC в памяти (тогда он должен быть несколько больше, чтобы было дополнительное, не копируемое на экран, место для вывода новых символов).
P.S. Да, MSDN, конечно большой, но полезный... Тут уж решай сам.
P.P.S. Прочитал твой следующий вопрос:
Примеры посмотрю... Скорее всего завтра на работе (по интернетным причинам). На счет разных потоков - это ничего (насколько я знаю), все должно работать ОК.
Окончательный ответ напишу на тот вопрос.


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


 Вопрос № 1436

Привет еще раз!
В добавление к моему предыдущему письму: Написал 2 программки выводящие текст c помощью TextOut и BitBlt так вроде вторая выводит быстрее раза в полтора. Не пойму в чем проблема в моей программе! Может тормозить если bitmap для вывода создан в одном потоке, а выводится на экран в другом (а сама программа сидит в своем основном)?
Если кому интересно примеры выводящие текст c помощью TextOut и BitBlt лежат на st23.narod.ru/bitblt.zip
St



Вопрос отправлен: 07.10.2002, 20:25
Отправитель: St (st23@yandex.ru)

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

Отвечает Bob Johnson

Приветствую Вас, St!
Посмотрел... с bitblt дает больше 1500, с TextOut - больше 1300.
У меня Intel Celeron 1120 (140*8), Asus Ge Force 2MX-400.
Начал исправлять твою программу:
1. Третий параметр в функции InvalidateRect определяет перерисовку фона - зачем тебе его перерисовывать? Поставь FALSE... Тогда получается 2365 и 3000 (Text Out vs. BitBlt)
Еще есть одна проблема - когда создаешь CompatibleBitmap надо указывать Handle не на только что созданный CompatibleDC, а на исходный DC! Т.е. вызывай так:
CALL CreateCompatibleBitmap, [theDC],
500,
450
Иначе создается монохромная bitmap'а. Но вот тут я столкнулся с проблемой... После этого ... (кто бы мог подумать)... программа практически перестала реагировать на мое воздействие (как, впрочем и система вин98 в целом). Чего я только не делал - и GDIFlush ставил и GdiSetBatchLimit(1) - но не фига, тормозит все конкретно (даже часы отстают!) и функция GetTickCount начинает выдавать значения медленнее. Вывод только один - когда создалась по-настоящему compatible bitmap, вин заставило ВИДЕОКАРТУ копировать ее на экран из ОЗУ, минуя полностью процессор, что очень быстро. Переполнилась внутренняя очередь видеокарты на команды и весь комп стал тормозить. (т.к. драйвер наверняка в случае переполнения очереди заставляет процессор ждать, когда же видеокарта наконец освободится). Если добавить в цикл Sleep(1) - то все работает ок. Поэтому Compatible Bitmap - самые быстрые!
А когда была черно-белая (двуцветная) bitmap, то, скорее всего, для ее вывода на экран использовался процессор, поэтому очередь видеокарты не переполнялась.


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


 Вопрос № 1437

Привет всем надеюсь у всех все в порядке.
У меня проблемка маленькая, мне нужно прогу написать чтоб она игнорировала команду formal x: как моя прога должна действовать? перехватить прерывание(какой №?),или читать с командной строки, а если нужно как-то по другому, то как?. С ответами если можно детально обьясните как прогу написать.Заранее блогодарен



Вопрос отправлен: 07.10.2002, 20:34
Отправитель: mirik

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

Отвечает Артём Шегеда

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

Насколько я понимаю, программа под DOS?
В таком случае, стОит перехватить Int 21 fn 4B00h. В перехваченном прерывании нужно проверять строку DS:DX на наличие 'format' и если эта подстрока есть, завершать процедуру с признаком ошибки (CF=1, AX=5).

Ответ отправлен: 07.10.2002, 21:04
Отправитель: Артём Шегеда


Отвечает Dark_Lord

Здравствуйте, mirik!
Если под дос, то всё просто: Делаешь небольшую прогу, загружающую себя куда-нибудь в расширенную память. Прога проверяет введённую мняку на наличие нужной тебе строки, и, если не твоя строка, посылает её command.com - у, после чего возвращается в себя!

Ответ отправлен: 07.10.2002, 23:00
Отправитель: Dark_Lord


Отвечает St

Привет, mirik!
Я так понял вы имеете в виду команду форматирования в DOS.
Вы можете:
1) Отслеживать ввод с клавиатуры не набрал ли кто слово "Format", пробел и букву с двоеточием (Int 16h BIOS функции 10 и 11h, или 21h DOS функции 1h, Ah, может еще что-нибудь) - а если набрали неправильно часть слова от использовали Backspace (кроме 21h функция Ah - эта ждет нажатия Enter и получает всю строку)?
2) Перехватить и запретить функции форматирования BIOS (Int 13h функции 5h, 6h, 7h) - интересно что скажет на это DOS?!
А ведь кроме format есть наверное и другие программы для форматирования?
St

Ответ отправлен: 07.10.2002, 23:08
Отправитель: St


Отвечает Bob Johnson

Приветствую Вас, mirik!
Возможно перехватить прерывание 21h и функцию Exec (4bh) и проверять имя запускаемой программы на format. Можно даже проверять содержимое запускаемого файла, и если его начало совпадает с format, то не загружать прогу. Алгоритм простой - перехватываешь прерывание. В своем обработчике смотришь номер вызываемой функции - если не 4bh, то отдаешь управление старому. Дальше берешь имя файла для запуска, открываешь этот файл для чтения, загружаешь его начало в свой буфер, закрываешь файл, сравниваешь содержимое буфера с тем, что находится в format (com или exe) и если это не он, то передаешь управление старому обработчику. Если же он - выводишь сообщение пользователю и возвращаешь управление вызвавшей программе с сообщением об ошибке.


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


Отвечает Eugene

Приветствую Вас, mirik!
Советов несколько.
1) Самый невозможный. Напиши свой command.com.
2) Попроще. Напиши резидентную прожку, которая висит на клаве и проверяй, что набирается в коммандной строке.
3) Самый простой. Во время работы прожки переименуй format.com или format.exe (не знаю что там у тебя) в !.тмп и не парься.


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


Отвечает Gibbel

Приветствую Вас, mirik!
команды fromat нет, как таковой... Она вызывает исполнение файла format.com. Соответственно, замени этот файл на свой, и все будет работать...

Ответ отправлен: 08.10.2002, 10:32
Отправитель: Gibbel


Отвечает ASMодей

Здравствуйте, mirik!
Я тебе предложу другой способ.
Дело в том, что при исполнении команды format x: на самом
деле выполняется не команда, а программа format.exe в
каталоге DOS. Так что перемести ее в какой нибудь другой
каталог и DOS не сможет ее найти и выполнить.


Ответ отправлен: 08.10.2002, 21:51
Отправитель: ASMодей


Отвечает Broken Sword

Приветствую Вас, mirik!
Перехватываешь int 21h и отлавливаешь 4Bh функцию (загрузить программу). Как только она - сразу смотришь командную строку. Если там format - ругаешься.

Ответ отправлен: 08.10.2002, 19:57
Отправитель: Broken Sword


 Вопрос № 1438

Привет всем. Я недавно начал учить Асм, и естественно появилась куча вопросов. Вот один из них: я написал резидент, который при нажатии в другой моей проге на "1" выводит строку, на "2" - выгружается. Внимание, вопрос. Почему, если в одном FAR'е запустить обе проги, все работает на ура, если в разных (т.е. два раза фар запущен), вторая прога не видит резидента, а если в WIND'е, то та же история, что и с двумя фарами? Почему так происходит? Буду благодарен, если ответ скинете на мыло: msoft@skif.net



Вопрос отправлен: 07.10.2002, 21:51
Отправитель: MSoft (msoft@skif.net)

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

Отвечает Dark_Lord

Здравствуйте, MSoft!
far это приложение Windows, каждое приложение Windows загружается в отдельный блок памяти! Используй Нортон коммандер!

Ответ отправлен: 07.10.2002, 23:03
Отправитель: Dark_Lord


Отвечает masquer

Здравствуйте, MSoft!
Естественно, в винде каждая твоя программа для дос будет загружена в отдельное адресное пространство и взаимодействовать они ну никак не смогут.

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


Отвечает ASMодей

Здравствуйте, MSoft!
Что значит "если в WIND'е, то та же история"?
Ты FAR'ы разве не в винде запускал?
Тут дело в том, что несмотря на все свои недостатки, Windows
все же является многозадачной операционкой. Следовательно
каждая задача (FAR или еще что-то) запускается в отдельном
адресном пространстве и не в курсе какие еще задачи работают
по соседству. Так что резидент, запущенный в одной задаче
естественно не будет виден в других.
Выход: прописать резидент в autoexec.bat. Тогда он будет
виден всем DOS-приложениям.


Ответ отправлен: 08.10.2002, 21:52
Отправитель: ASMодей


Отвечает DiGiT[old]

Доброе время суток, MSoft!
:)) В общем то и весь ответ.
А на самом деле. Насколько я понял ты запускаешь в разных эмуляциях Дос. А это разные проги, если проще выражаться, которые между собой не связаны. И просто являются как бы досом.

Ответ отправлен: 08.10.2002, 02:12
Отправитель: DiGiT[old]


Отвечает Bob Johnson

Здравствуйте, MSoft!
Потому что Windows эмулирует многозадачность (т.е. позволяет запускать НЕСКОЛЬКО программ одновременно, причем так, чтобы, в общем случае, одна не знала, что запущена еще какая-то, а думала, что она единственная).
Кроме того, ФАР - консольное приложение виндов, лучше всего тестировать резиденты в дос-командере (т.е. Dos Navigator, Volcov, Norton).
P.S. А как ты запускаешь два фара НЕ ПОД ВИНДОЙ???


Ответ отправлен: 09.10.2002, 00:00
Отправитель: Bob Johnson


 Вопрос № 1439

Уважаемые эксперты! Вот долгое время терзает вопрос. Вычитал в мануале про организацию памяти в NT, что ядро системы грузится по адресу 80100000h, а например вот здесь - 80000000-9FFFFFFF распологается код системы. И т.д.
Далее. В официозных мануалах Интела написано, что при включении компа первая инструкция, которая выполняется - это инструкция по ФИЗИЧЕСКОМУ (!) адресу FFFFFFF0h.
Вообщем, все это понятно и хорошо, но дорогие эксперты! Вглядитесь пожалуйста в эти БЕЗУМНЫЕ адреса! Это ж все около 4Гб!!! У меня ФИЗИЧЕСКОЙ памяти 256 Мб, так куда ж на самом деле прыгнет???? Страничная адресация тут не при чем...



Вопрос отправлен: 08.10.2002, 00:17
Отправитель: ?

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

Отвечает ASMодей

Здравствуйте, ?!
Мануалы от Интела надо читать внимательнее: там черным по
белому написано, что при включении компьютера в регистре
CS содержится значение F000h, а в регистре EIP - 0000FFF0h.
Таким образом физический адрес = 0FFFF0h, то есть 1 Мб минус
16 байт, а мегабайт памяти у тебя на машине есть 100%.
Теперь насчет NT: с чего это ты взял, что страничная адресация
здесь не при чем. Очень даже при чем. Просто NT перед загрузкой
ядра инициализирует страничную адресацию и загружает (или
переносит) ядро почти в самый конец линейной памяти (наверное
чтобы не мешалось ;)


Ответ отправлен: 08.10.2002, 21:53
Отправитель: ASMодей


Отвечает Dron

Доброе время суток, ?!
В NT страничная адресация какраз очень при чем. именно за счет нее ядро размещается начиная с 0x80000000
А по поводу биоса...
при старте проца регистр eip содержит 0xfff0
а дескриптор cs (не важно в каком режиме проц, теневые регистры всеравно работают) содержит значение 0xf000, но при этом база дескриптора составляет 0xffff0000, и предел 0xffff, так что в итоге cs:ip дает линейный адрес 0xfffffff0. и на самом деле биос находится именно по этим адресам, но первой инструкцией, находящейся по указанному выше адресу является дальний переход на 0xffff0, не помню точно как биос отображается на эти адреса, как-то это прозрачно происходит. но инструкция перехода обеспечивает корректный переход к адресам реального режима.


Ответ отправлен: 08.10.2002, 11:22
Отправитель: Dron


Отвечает LIFO

Добрый день, ?!
Защищенный режим однако...(страничная организация памяти)


Ответ отправлен: 08.10.2002, 16:50
Отправитель: LIFO


Отвечает DiGiT[old]

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

Ответ отправлен: 08.10.2002, 02:10
Отправитель: DiGiT[old]


Отвечает Bob Johnson

Здравствуйте, ?!
Физически процессору доступно 4гб памяти для адресации (более новым - больше, но это реального значения не имеет). Это вовсе не означает, что все это адресное пространство действительно адресует ОЗУ. Есть некоторые адреса в физическом адресном пространстве, которым соответствует ПЗУ BIOS'а - вот как раз оно и находится по адресу, где происходит начальный старт процессора (не уверен, что это 0FFFFFFF0h, а не что-то типа 0FFFF0h, но не настаиваю, т.к. не уверен).
Теперь далее. У процессора есть замечательная возможность - страничное преобразование. Его необходимость - так же как и FAT на диске. Страничное преобразование позволяет подключать в любое место логического адресного пространства любое место физического адресного пространства с точностью до размера страницы - 4 кб. Поясню: пусть есть команда mov eax, [1234h]. Т.е. она должна считывать двойное слово по адресу 1234h и передавать его в eax. Но мы можем указать (с помощью таблицы страниц), что с логического (т.е. для команд) адреса 1000h до 1FFFh будет находиться физические адреса, например, 2000h - 2FFFh. Это значит, что когда будет выполняться наша команда, процессор обратится к ячейке оперативной памяти по адресу 2234h (это адрес будет выведен на шину адреса и передан контроллеру ОЗУ). Так же можно в любом месте логического адресного пространства.
В общем, изучай архитектуру процессоров (начиная с 386) - тогда сам будешь себе отлично представлять, как это происходит.


Ответ отправлен: 09.10.2002, 00:00
Отправитель: Bob Johnson


 Вопрос № 1440

Здравствуйте ув-ые эксперты!
Во-первых - спасибо за ответы на предыдуший вопрос.
Во-вторых у меня появились новые вопросы :). Если они уже обсуждались сорри, можете меня послать... к ним.
1) Как работать с числами с запятой. Сложение и вычитание - тоже, что и для обычных. А умножение и деление?
2) SSE что это? И где про это прочитать?
3) Это, наверно, не в тему, но... Bob Johnson сказал, что проецирование можно производить при помощи умножения на матрицу. Как? Где про это можно почитать?
4) LFB опять :). В приложении программа... которая ничего не делает. Я не понимаю что мне делать. :) Вот получил я 4 байта - Физический Адрес LFB, чего с ними дальше то делать?
P.S. Чем больше знаешь, тем больше впечатление, что ничего незнаешь.


Приложение:


Вопрос отправлен: 08.10.2002, 00:28
Отправитель: Dron Gus (dron_gus_asm@pochtamt.ru)

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

Отвечает Dron

Приветствую Вас, Dron Gus!
1. насчет первого не понял... если ты собираешься использовать числа с запятой (дробные) то тебе надо или использовать сопроцессор (где другие команды собственно) или пользоваться целочисленным форматом (фиксированная точка, или как это называется). то есть предполагается что один байт - целая часть, другой байт дробная (к примеру). сложение и вычитание в этом случае действительно происходят так же как и с простыми числами. а для умножения надо или сдвиги применять (если умножаешь на целое) или специальную функцию делать. иначе помоему никак.
2. В интелевских мануалах например.
про третье ничего не скажу. :)
4. чтобы воспользоваться LFB - тебе необходимо находиться в защищенном режиме. в реальном режиме это достаточно сложно, хотя помоему тоже возможно.


Ответ отправлен: 08.10.2002, 11:28
Отправитель: Dron


Отвечает masquer

Здравствуйте, Dron Gus!
1. fdiv, fmul
2. Набор инструкций - имеется только в P4, P3, Athlon XP. Аналог MMX, только для чисел с плавающей запятой.
3. Здесь можно было бы и поподробнее. На ММХ умножение элементарно реализуется.

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


Отвечает DiGiT[old]

Доброе время суток, Dron Gus!
1. Использый операции сопроцессора. fadd и другие, начинающиеся на f.
2. набор инструкций для обработки нескольких вещественный и целых чисел одновременно. Есть в Зубкове, в книге второй от интела, ну и где нить еще.
3. В любой книге по линейной алгебре, а также в книге по проективной геометрии, ну в общем математика.


Ответ отправлен: 08.10.2002, 02:08
Отправитель: DiGiT[old]


Отвечает ASMодей

Добрый день, Dron Gus!
1. Числа с запятой тоже разделяются на числа с фиксированной
запятой и числа с плавающей запятой. Для первых есть
алгоритмы арифметических действий, для вторых лучше
использовать арифметический сопроцессор.
2. SSE - это дополнительный набор инструкций процессора.
Появился у Pentium-III и предназначен для ускорения работы
с потоковыми данными (музыка, видео, ...).
3. Как, как... берешь координаты точки, умножаешь их на
матрицу, получаешь новые координаты и выводишь там точку.
Подробнее смотри литературу по компьютерной графике.
4. Чего же с ним еще делать? Рисуешь в нем ;)


Ответ отправлен: 08.10.2002, 21:54
Отправитель: ASMодей


Отвечает Bob Johnson

Доброе время суток, Dron Gus!
1. Для работы с нецелыми числами существует два способа:
а) масштабирование;
б) использование FPU или его эмуляции.
При первом варианте ты перед тем как занести число в регистр или ячейку памяти умножаешь его на некоторый масштаб. Далее обрабатываешь его обычным способом, только зная, что оно в _масштаб_ раз больше действительного. Например, если ты умножишь исходное число на 256 (2^8), то сможешь сохранить его с точностью до 1/256 (т.к. это будет соответствовать физической единице в регистре или памяти).
Второй подход - проще, т.к. там уже поработали специалисты из Intel и сделали прекрасный блок в процессоре, который обрабатывает нецелые числа. Все команды FPU начинаются на F, так что смотри описание команд. FPU встраивается внутрь процессора начиная с 486DX.
2. SSE (или XMM) - это продолжение совершенствования MMX. Оно ориентировано СПЕЦИАЛЬНО на 3Д графику, т.е. один регистр SSE имеет разрядность 128 бит (16 байт!), всего их - 8. При этом, обычно, данные в SSE-регистре представляют собой 4 независимых 32-разрядных числа с плавающей точкой одинарной точности (формат float в С++). Соответственно, над 4-мя числами выполняется одинаковая операция, например умножение - как сам видишь умножать матрицы 4*4 становится в 4 раза быстрее. SSE-это круто! SSE поддерживается ТОЛЬКО пнем 3 и выше (или athlon XP и выше) (все селероны от п-3 также поддерживают SSE). Далее - SSE требует определенной поддержки со стороны операционной системы - не ниже Windows 98 (4.10.1998). Под Windows 95 SSE не работает. Это связано с тем, что ОС должна сохранять регистры SSE при переключении задач, а когда создавалось Win95, про SSE еще никто не знал. У меня реально включение SSE дало двукратный прирост FPS в Quake3 (я поставил новый процессор (с SSE), а у меня был Windows 95, посмотрел FPS, затем поставил сверху Windows 98 и, ничего больше не меняя, снова посмотрел FPS - получил в 2 раза больше. Видео тогда было - Riva TNT 2).
3. Посмотри книги по высшей математике (чтобы разобраться с проецированием вообще), FAQ по 3D программированию и DirectX8 SDK. В последнем есть правило построения проецирующей матрицы.
4. Могу сейчас сказать только вот что: LFB - Linear Frame Buffer. Позволяет адресовать весь экран не страницами (как в DOS), а одним куском в памяти при работе проца в защищенном режиме. Пусть у тебя есть режим 800*600*256. Нетрудно посчитать, что один буфер экрана будет занимать 480000 байт. Вот по адресу LFB и будет расположены эти 480000 байт. Слева направо, сверху вниз (как правило). Заноси туда то, что тебе нужно.
А вот как использовать LFB из 16-разрядных приложений, я не знаю (да и вообще, возможно ли это?).


Ответ отправлен: 09.10.2002, 00:01
Отправитель: Bob Johnson


 Вопрос № 1441

Здравствуйте, уважаемые эксперты!
Жаль, что на вопрос, как писать в флэш-биос никто не ответил.
Знающие люди посоветовали покопаться в wincih95, ну я покопался...сложно вобщем.
Мож кто поможет, и попробует объяснить?
Исходник wincih вышлю если надо будет.
Не дайте погибнуть заблудшей душе в это нелегкое время! :)
Мильон благодарностей всем кто откликнется.
Maverick@nightmail.ru



Вопрос отправлен: 08.10.2002, 09:21
Отправитель: Maverick (Maverick@nightmail.ru)

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

Отвечает LIFO

Приветствую Вас, Maverick!
Высылаю на мыл инфу про запись.
P.S. Ты имеешь в виду вирь Wincih95 ?

Ответ отправлен: 08.10.2002, 17:00
Отправитель: LIFO


 Вопрос № 1442

Привет Bob Johnson!
Ответ на ваш ответ на письмо 1435
1) CompatibleBitmap создается (в 4 раза длиннее чем реальное окно).
2) Функция Sleep используется (без нее загрузка процессора 100%). Но возник вопрос: действительно ли точность GetTickCount и Sleep ~1 миллисекунда? (есть еще QueryPerformanceCounter?).
3) ExtTextOut используется вместо TextOut из-за возможности создания в ней кернинга и возможностью использования его для вывода текстов c самодельной табуляцией и растяжкой по обоим краям экрана (justification). Как я понял в Win32 нет функций которые выводят строку c обоими этими возможностями одновременно: TabbedTextOut выводит табуляцию, а SetTextJustification работает только с TextOut и ExtTextOut.
4) А вот насчет "для сдвига применяй BitBlt в своем DC в памяти (тогда он должен быть несколько больше, чтобы было дополнительное, не копируемое на экран, место для вывода новых символов)." если можно поподробнее, что вы имели в виду.
5) Пытался на работе поставить MSDN от июля 2002 (он лежит у нас в сети, выборочно (на 600 Мб :) ) так он где-то на трети установки заявил что не может найти каких-то файлов (игнорирование не помогало я проигнорировал несколько десятков и дошел только до буквы B (видимо они были по алфавиту)). Не связано ли это с тем что файлы лежат в 3-х каталогах и инсталлятор не знает где искать второй диск?
St



Вопрос отправлен: 08.10.2002, 13:01
Отправитель: St (st23@yandex.ru)

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

Отвечает masquer

Доброе время суток, St!
По поводу MSDN - ее инсталлировать вовсе не обязательно. Для того, чтобы она по F1 в IDE всплывала в реестре просто поковырятся нужно. Недавно я кидал в рассылку необходимые ключи.

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


Отвечает Bob Johnson

Добрый день, St!
2. Нет, точность Sleep составляет около 5 мс и может бытьниже на медленных компьютерах. У меня когда я ставил в твоей программе sleep (1) было около 230 fps. (т.е. 4 мс на кадр).
Есть функция timeGetTime, которая полностью аналогична GetTickCount, но чуть более точная. Она используется многими играми (Quake 3). QueryPerfCounter возвращает (как я понял) значение из МС таймера (8252), т.е. ее точность должна составлять около 1 мкс. Работает неплохо - можешь использовать (тоже используется некоторыми играми - Dark Reing 2).
Самый точный метод - это rdtsc процессора. Вначале только надо будет определить частоту процессора - это можно сделать, измерив, на сколько увеличится значение, возвращаемое этой командой за определенный интервал времени и поделить.
Но НИЧЕМ кроме Sleep ты так просто не "заснешь" - остальные функции предназначены лишь для получения информации о текущем времени. Если на их основе сделаешь задержку - все равно получишь 100% занятость процессора.
3. Если так, то тогда придется мириться с тем, что ExtTextOut медленнее (но ведь и не намного!)
4. Да, конечно. Пусть тебе нужно сделать вертикальный scroll текста в окне по одной точке. Размер окна - Ш*В, высота одной строчки текста - А. Тогда ты создаешь в памяти DC, в который выбираешь битмап размером Ш*(В + А).
В начале цикла ты функцией bitblt поднимаешь изображение в памяти вверх на одну точку (имеется ввиду всю высоту битмапа в памяти - т.е. В + А - 1) и копируешь изображение из первых В строк контекста на экран. Так ты делаешь А раз. Затем выводишь в нижние А строк контекста новою строку текста и переходишь к предыдущему пункту. Это, естественно, выполняет в дополнительном потоке. Здесь же и может происходить копирование: GetDC, BitBlt, ReleaseDC. Основной поток просто обрабатывает сообщения в обычном MessageLoop. Не забудь в доп потоке поставить что-то вроде Sleep (5).
5. Да - конечно связано! MSDN копирует файлы в том порядке, как они находятся на исходных дисках, т.е. вначале с первого, потом (когда не может найти на первом диске файл, который должен быть на втором) - просит вставить следующий диск и т.д. При установки с винта (или по сети) все надо переписать в один каталог! Тогда будет все ОК.


Ответ отправлен: 09.10.2002, 00:01
Отправитель: Bob Johnson



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

Внимание!
Форма может работать некорректно в почтовых программах "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 (40)
C / C++ (31)
Perl (5)
Delphi (18)
Pascal (22)
Basic / VBA (9)
Java / JavaScript (10)
PHP (9)
MySQL / MSSQL (11)
Пользователю
Windows 95/98/Me (36)
Windows NT/2000/XP (26)
"Железо" (32)
Поиск информации (13)
Администратору
Windows NT/2000/XP (12)
Linux / Unix (16)
Юристу
Гражданское право (7)
Семейное право (4)
Трудовое право (4)
КоАП (5)

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




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

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


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

В избранное