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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 12.07.2010, 19:42   #31
Goodwin98
equ asm
Участник клуба
 
Аватар для Goodwin98
 
Регистрация: 02.05.2009
Сообщений: 1,605
По умолчанию

Код:
   asm
    push   0
    push   -1
    push   00CC0020h	//[ebp+28h] = SRCCOPY
    push   YSrc		//[ebp+24h] = YSrc: Integer
    push   XSrc		//[ebp+20h] = XSrc: Integer
    push   BufHandle	//[ebp+1Ch] = BufHandle: HDC
    push   H		//[ebp+18h] = H: Integer
    push   W		//[ebp+14h] = W: Integer
    push   dispY	//[ebp+10h] = dispY: Integer
    push   dispX	//[ebp+0Ch] = dispX: Integer
    push   DCs		//[ebp+08h] = DCs: HDC
    call @func
; <- в этом месте нужно поместить jmp или какой-то выход, иначе func выполнится еще раз.
  @func:
    mov   eax,0000100dh
    mov   edx,7FFE0300h
    call  [edx]
  end;
Какой вопрос - такой ответ. Не забываем пользоваться поиском, гуглом.
Помощь в выполнении работ по ассемблеру ICQ:2725322O4
Goodwin98 вне форума Ответить с цитированием
Старый 12.07.2010, 20:10   #32
Beermonza
Инженер ИС
Старожил
 
Аватар для Beermonza
 
Регистрация: 13.12.2006
Сообщений: 2,671
По умолчанию

Можно прыгнуть в конец через jmp, а там нужно прописать pop для регистров eax и edx?
Руководитель проекта MMO 2D RPG: Настоящее имя Денис Стрижак (10.05.1981-6.02.2019) Мир духу его
Beermonza вне форума Ответить с цитированием
Старый 12.07.2010, 20:12   #33
Goodwin98
equ asm
Участник клуба
 
Аватар для Goodwin98
 
Регистрация: 02.05.2009
Сообщений: 1,605
По умолчанию

Вы можете оформить func как отдельную процедуру или просто разместить ее в другом месте.
Какой вопрос - такой ответ. Не забываем пользоваться поиском, гуглом.
Помощь в выполнении работ по ассемблеру ICQ:2725322O4
Goodwin98 вне форума Ответить с цитированием
Старый 12.07.2010, 20:21   #34
Beermonza
Инженер ИС
Старожил
 
Аватар для Beermonza
 
Регистрация: 13.12.2006
Сообщений: 2,671
По умолчанию

Толку никакого, этот код только в одном месте, используется только там и нигде более, посему это будет лишнее.
Руководитель проекта MMO 2D RPG: Настоящее имя Денис Стрижак (10.05.1981-6.02.2019) Мир духу его
Beermonza вне форума Ответить с цитированием
Старый 12.07.2010, 20:22   #35
Goodwin98
equ asm
Участник клуба
 
Аватар для Goodwin98
 
Регистрация: 02.05.2009
Сообщений: 1,605
По умолчанию

Я описал, что именно не так, а что вам исправить, решайте, конечно, сами
Какой вопрос - такой ответ. Не забываем пользоваться поиском, гуглом.
Помощь в выполнении работ по ассемблеру ICQ:2725322O4
Goodwin98 вне форума Ответить с цитированием
Старый 12.07.2010, 20:48   #36
Beermonza
Инженер ИС
Старожил
 
Аватар для Beermonza
 
Регистрация: 13.12.2006
Сообщений: 2,671
По умолчанию

Цитата:
Сообщение от Goodwin98
Цитата:
Сообщение от Beermonza
Хм, ...вообще, мне бы знать от контекста, или от самой формы область ее графических данных, указатель и размер, ...что-то сообразить можно будет.
Не очень понял
Ну, знаете, ...если есть указатель на область памяти, то с ней можно работать. Например, у меня есть указатели на массивы PChar, я беру указатели и с помощью MMX регистров быстренько перекидываю нужные участки, по 8 байт за такт. Таким же образом я могу в объект типа TBitmap закинуть графические данные. Теперь проблема с таким же перекидыванием в форму. У нее указателя на участок графических данных просто нет (или я его не нашел), а есть только контекст, ...приходится использовать BitBlt, однократно, при выводе готового кадра в форму.

Собственно, в этой теме я, с вашей помощью, пытался упростить BitBlt. Вроде вышло, но работает не всегда. В таймере пока отказывается, ...сейчас только это обнаружил (ошибка по адресу FE011870h).
Руководитель проекта MMO 2D RPG: Настоящее имя Денис Стрижак (10.05.1981-6.02.2019) Мир духу его
Beermonza вне форума Ответить с цитированием
Старый 12.07.2010, 21:01   #37
Goodwin98
equ asm
Участник клуба
 
Аватар для Goodwin98
 
Регистрация: 02.05.2009
Сообщений: 1,605
По умолчанию

Теперь понял, но такой указатель врядли можно получить, наверное, только при работе с Direct Draw...

А насчет ошибки трудно сказать, т.к. в моем тестовом проекте код работает. Попробуйте вставить такой код перед вызовом func. ( я просто незнаю что эта за переменная)
Цитата:
mov eax, fs:[18h]
mov [eax+6d0h],edi ; в edi ноль
Какой вопрос - такой ответ. Не забываем пользоваться поиском, гуглом.
Помощь в выполнении работ по ассемблеру ICQ:2725322O4
Goodwin98 вне форума Ответить с цитированием
Старый 12.07.2010, 21:13   #38
Ulex
Непрофессионал
Участник клуба
 
Аватар для Ulex
 
Регистрация: 01.01.2008
Сообщений: 1,405
По умолчанию

Но быстрей же ведь не стало?
И чем больше я узнавал людей, тем больше мне нравились компьютеры.
------------------------------------
Страничка с моими программками http://ulex-masm.ru
Ulex вне форума Ответить с цитированием
Старый 12.07.2010, 21:40   #39
Beermonza
Инженер ИС
Старожил
 
Аватар для Beermonza
 
Регистрация: 13.12.2006
Сообщений: 2,671
По умолчанию

Вот такая получилась процедура для Delphi, она четко работает:

Код:
procedure DrawScreen(DCs: HDC; DispX, DispY, W, H: Integer; BufHDC: HDC);
begin

  asm
    push	0
    push	-1
    push	00CC0020h
    push	00000000h
    push	00000000h
    push	BufHDC
    push	H
    push	W
    push	DispY
    push	DispX
    push	DCs
    call  @func
    jmp @end

  @func:
    mov   eax,0000100dh
    mov   edx,7FFE0300h
    call dword ptr [edx]
    ret 2ch
  @end:

  end;
end;
...не понял только чем отличается call dword ptr [edx] от просто call [edx].

Теперь результаты по загрузке CPU:
BitBlt - 19-25%
SetDIBitsToDevice - 17-25%
DrawScreen - 5-16%

Вуаля!
Руководитель проекта MMO 2D RPG: Настоящее имя Денис Стрижак (10.05.1981-6.02.2019) Мир духу его
Beermonza вне форума Ответить с цитированием
Старый 12.07.2010, 22:16   #40
Ulex
Непрофессионал
Участник клуба
 
Аватар для Ulex
 
Регистрация: 01.01.2008
Сообщений: 1,405
По умолчанию

А как таймер победили?
У меня моя погремушка только один раз отрисовывает и всё.

Вообще странно такое повышение производительности.
Ну мы убрали 20-30 команд (вполне возможно в ущерб стабильности, не зря же там всё-таки перед вызовом какие-то cmp идут).
Это ничтожно по сравнению с копированием массива (примерно 1024*768).

И ещё. Так как это системный вызов, то он недокументирован (это такая типа политика MS). Т.е. не факт, что то что работает на одной системе, будет работать на другой (или даже на той же + SP_x).
И чем больше я узнавал людей, тем больше мне нравились компьютеры.
------------------------------------
Страничка с моими программками http://ulex-masm.ru
Ulex вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 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