Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 12.07.2010, 22:36   #41
Beermonza
Инженер ИС
Старожил
 
Аватар для Beermonza
 
Регистрация: 13.12.2006
Сообщений: 2,671
По умолчанию

Дело в том, что эта gdi32.dll - одна большая портянка со скачками, чтобы выполнить что-то приходится скакать по всему коду библиотеки. Так от того, что эта штука универсальная, и должна предоставлять пользователю всё разнообразие результатов, от тех параметров, что он вводит. Мне же не требуется проверок на выводимый результат. Нужно передать данные 1 в 1, ...отпадает пара-тройка скачков. Далее, мне не нужно проверять правильно ли я взял контекст, поскольку я его взял правильным образом из той же GetDC, она берется один раз в начале работы с окном, и потом с закрытием контекст освобождается, это прописано в документации, ...следовательно, еще парочка прыжков убирается. Но прыжки не простые, в их частях еще проверки и прыжки на все случаи жизни "если то, да сё", ...а если уже один с флагом SRCCOPY отпал, то и ч по ссылке ниже и следующие прыжки тоже, а их там 23 штуки, ...и дальше я сбился со счета. Так же по любой проверке на 1М писанины, и в конце только выполнение в 3 строки. Убираем лишнее - вот он и прирост производительности.

И как он может работать не корректно, если это часть истинной библиотеки, а не самоделка?

Цитата:
Сообщение от Ulex
А как таймер победили?
У меня моя погремушка только один раз отрисовывает и всё.
Сидит код в таймере стандартном TTimer (есть такой в Delphi). На него много нареканий, типа "медленный и быстрее 50 мс ворочиться не желает". Друзья мои, все зависит от быстроты внутреннего кода, если код успевает выполниться за 10 мс, то таймер будет выдавать результат как положено каждые 10 мс. Если код выполняется только за 100 мс, то как не ставь интервал 10 мс, таймер его оттянет до времени, когда внутренний код завершится, ...в том и его плюс, сбоя не будет как с точным таймером.
Руководитель проекта MMO 2D RPG: Настоящее имя Денис Стрижак (10.05.1981-6.02.2019) Мир духу его
Beermonza вне форума Ответить с цитированием
Старый 12.07.2010, 23:01   #42
Ulex
Непрофессионал
Участник клуба
 
Аватар для Ulex
 
Регистрация: 01.01.2008
Сообщений: 1,432
По умолчанию

А, ну вот, у меня такой вариант заработал:

Код:
	xor	eax, eax
	push	eax
	push	-1
	push	00CC0020h
	push	eax
	push	eax
	push	[hCpbltDCTempLOC]
	push	[sizeYclient]
	push	[sizeXclient]
	push	eax
	push	eax
	push	[hDC]
	call	to_sysenter
	jmp	end_sysenter
to_sysenter:
	mov	eax,100Dh          
	mov	edx,7FFE0300h      
	call	dword ptr [edx]    
end_sysenter:
Особенного роста производительности не заметил. Почему то загрузка проца болтается сильно. Сейчас потестил ещё, нет у меня никакой разницы против SetDIBitsToDevice. И в том и в другом случае где-то от 8-20 процентов.

Цитата:
И как он может работать не корректно, если это часть истинной библиотеки, а не самоделка?
Да очень запросто, сам вывод на экран выполняет системный вызов, вот этот:
Цитата:
mov eax,100Dh
mov edx,7FFE0300h
call dword ptr [edx]
и он не документирован. Товарищи из MS могут его запросто менять в любой удобный для себя момент (собственно это ядро системы). При этом они вам ничего не должны. Есть документированная функция BitBlt - вот результат её работы документирован и поэтому предсказуем. То что вы взяли gdi32 и повторили её код, означает только лишь то, что вы повторили его для ОС WinXP SP3 (в моём случае). Но это совершенно не означает, что код библиотеки не меняется от версии к версии ОС Win.
Вобщем - это уже самоделка.
И чем больше я узнавал людей, тем больше мне нравились компьютеры.
------------------------------------
Страничка с моими программками http://ulex-masm.ru
Ulex вне форума Ответить с цитированием
Старый 13.07.2010, 11:34   #43
JTG
я получил эту роль
Старожил
 
Аватар для JTG
 
Регистрация: 25.05.2007
Сообщений: 3,694
По умолчанию

Вот-вот. Номера системных вызовов отличаются даже в разных билдах одной версии ОС, не говоря уже о разных версиях.

0x119f
Windows XP SP1/2/3 - NtUserGetKeyNameText
Windows Server 2003 SP1/2 - NtUserGetKeyState
Windows Vista SP1/2 - NtUserGetDC
Windows 7 - NtUserGetControlBrush

0x100D
Windows 2000 SP2 ~ Windows Server 2008 SP1 - NtGdiBitBlt
Windows 7 - NtGdiBeginPath

http://j00ru.vexillium.org/win32k_syscalls/
пыщь
JTG вне форума Ответить с цитированием
Старый 13.07.2010, 15:09   #44
Beermonza
Инженер ИС
Старожил
 
Аватар для Beermonza
 
Регистрация: 13.12.2006
Сообщений: 2,671
По умолчанию

Я этого просто не знал. Могу сделать пример и отправить всем на проверку.
Руководитель проекта MMO 2D RPG: Настоящее имя Денис Стрижак (10.05.1981-6.02.2019) Мир духу его
Beermonza вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Windows I/o без Kernel32.dll и Advapi32.dll coinkrsk Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 31 27.06.2010 08:52
ошибка программы internal error in user32.dll??? grammaton Помощь студентам 3 23.01.2010 10:07
Ошибка при выхове функций Bass.dll из другой DLL SalasAndriy Общие вопросы Delphi 7 21.10.2009 23:36
Война Авиры и User32.dll Google[Bot] Безопасность, Шифрование 2 13.01.2009 18:40
Пытаюсь создать Dll для своей проги Parcenson Общие вопросы Delphi 6 30.09.2008 20:36