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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 11.07.2010, 17:14   #1
Beermonza
Инженер ИС
Старожил
 
Аватар для Beermonza
 
Регистрация: 13.12.2006
Сообщений: 2,671
По умолчанию Пытаюсь понять код user32.dll и gdi32.dll

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

Интересует такая команда в Delphi:

Код:
GetDC(0);
Она возвращает контекст рабочего стола. В user32.dll у нее код такой:

Код:
GetDC:
  mov	eax,0000119Fh
  mov	edx,7FFE0300h
  call	[edx]
  retn	0004h
Так вот, ...результат значение содержит eax? ...а остальное зачем? ...может нужна только первая строчка?

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

По аддресу 7FFE0300h находится команда sysenter, которая передает управление в ring0(в ядро ОС). В eax содержится # функции, которая должна выполнится.
Какой вопрос - такой ответ. Не забываем пользоваться поиском, гуглом.
Помощь в выполнении работ по ассемблеру ICQ:2725322O4
Goodwin98 вне форума Ответить с цитированием
Старый 11.07.2010, 17:39   #3
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

возвращает результат не она сама, а процедура указатель на которую находится в 7FFE0300h(вроде так расшифровывается call [edx]?)

упростить можно разве что, сразу вызывать sysenter...
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.

Последний раз редактировалось Пепел Феникса; 11.07.2010 в 17:42.
Пепел Феникса вне форума Ответить с цитированием
Старый 11.07.2010, 18:42   #4
Beermonza
Инженер ИС
Старожил
 
Аватар для Beermonza
 
Регистрация: 13.12.2006
Сообщений: 2,671
По умолчанию

Можно как для барана, на примере?

Вот допустим есть команды:

Код:
DCs := GetDC(0);
BitBlt(DCs,0,0,10,10,Buf.Canvas.Handle,0,0,SRCCOPY);
Все аргументы в скобках в какие-то регистры идут? ...в какие? ...или это тупой вопрос и все не так просто?

Что, собственно, нужно?
Нужно перекинуть код на ассемблере из библиотеки в проект, ...фиг с ней с GetDC, но BitBlt мне нужен более упрощенный и на ассемблере в проекте, где значение флага только SRCCOPY, ...этим убирается куча скачков и проверок я так думаю. Есть дизасемблированные библиотеки. Так же смотрю в сторону SetDIBitsToDevice, возможно, она проще чем BitBlt.

Зачем все это? ...я думаю есть возможность воспользоваться, при копировании данных, MMX-регистрами.

Вот пример, зачем все это мне нужно. Это простое копирование участка памяти с одного места в другое, по известным указателям, так как это делается в библиотеках:

Код:
asm
    mov   eax, Scr2       //Запись в регистр указателя на источник  (Pointer)
    mov   edx, Scr        //Запись в регистр указателя на приемник  (Pointer)
    mov   ecx, BufLength  //Запись в регистр размера участка данных (DWORD)

    push  esi
    push  edi

    mov   esi, eax
    mov   edi edx
    mov   eax, ecx

    lea   esi, [esi+ecx-4] // point ESI to last dword of source
    lea   edi, [edi+ecx-4] // point EDI to last dword of dest

    sar   ecx, 2           // copy count DIV 4 dwords
    js    @@exit

    std
    rep   movsd

    mov   ecx, eax
    and   ecx, 03H         // copy count MOD 4 bytes
    add   esi, 4-1         // point to last byte of rest
    add   edi, 4-1
    rep   movsb
    cld

  @@exit:
    pop   edi
    pop   esi
  end;
Работает быстрее любых команд Delphi, поскольку она и есть содержимое многочисленных оберток. Теперь что получается с упрощением. Это работает в разы быстрее:

Код:
asm
    push esi
    push edx

    mov ecx, BufLength (div 8)
    mov esi, Scr2
    mov edx, Scr

  @@mix:
    movq      xmm0, [esi]     // -> в регистр
    movq      [edx], xmm0     // <- из регистра

    add esi, 8
    add edx, 8

    loop @@mix

    pop edx
    pop esi

    emms
  end;
Вот этого результат и добиваюсь. Если кто поможет, буду весьма благодарен, даже за пояснения.
Руководитель проекта MMO 2D RPG: Настоящее имя Денис Стрижак (10.05.1981-6.02.2019) Мир духу его

Последний раз редактировалось Stilet; 12.07.2010 в 16:13.
Beermonza вне форума Ответить с цитированием
Старый 11.07.2010, 19:13   #5
Goodwin98
equ asm
Участник клуба
 
Аватар для Goodwin98
 
Регистрация: 02.05.2009
Сообщений: 1,605
По умолчанию

Код:
mov edi, offset Distantion ; куда копировать
mov esi, offset Source ; откуда копировать
mov ecx, lenght /4 ; количество двойных слов для копирования
rep movsd ; копирование
Какой вопрос - такой ответ. Не забываем пользоваться поиском, гуглом.
Помощь в выполнении работ по ассемблеру ICQ:2725322O4
Goodwin98 вне форума Ответить с цитированием
Старый 11.07.2010, 19:16   #6
Beermonza
Инженер ИС
Старожил
 
Аватар для Beermonza
 
Регистрация: 13.12.2006
Сообщений: 2,671
По умолчанию

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

В вашем случае, кроме пересылок между регистрами идут 2 команды сложения, если на то пошло, то лучше задействовать 4 или 8 xmm регистра, чтобы совпадало с размером линии кэша и реже приходилось складывать.
Какой вопрос - такой ответ. Не забываем пользоваться поиском, гуглом.
Помощь в выполнении работ по ассемблеру ICQ:2725322O4

Последний раз редактировалось Goodwin98; 11.07.2010 в 19:21.
Goodwin98 вне форума Ответить с цитированием
Старый 11.07.2010, 19:24   #8
Beermonza
Инженер ИС
Старожил
 
Аватар для Beermonza
 
Регистрация: 13.12.2006
Сообщений: 2,671
По умолчанию

Пост #5 я привел в качестве примера, с этим проблем никаких. Меня интересует пост #4.
Руководитель проекта MMO 2D RPG: Настоящее имя Денис Стрижак (10.05.1981-6.02.2019) Мир духу его
Beermonza вне форума Ответить с цитированием
Старый 11.07.2010, 19:35   #9
Ulex
Непрофессионал
Участник клуба
 
Аватар для Ulex
 
Регистрация: 01.01.2008
Сообщений: 1,432
По умолчанию

По поводу команды loop.

Цитата:
---------------------------------------------------------------------------
instruction_____CPU's____or action________description/notes
---------------------------------------------------------------------------
loop <dest>:___386+ ____dec cx__________LOOP is faster and
______________________jnz <dest>:______smaller on 8088-286.
___________________________________ ___on 386+ DEC/JNZ is
___________________________________ ___much faster. On the Pentium
___________________________________ ___the DEC/JNZ instructions
___________________________________ ___pair taking only 1 cycle.
На некоторых процессорах реально помогает, если заменить loop на две команды.
И чем больше я узнавал людей, тем больше мне нравились компьютеры.
------------------------------------
Страничка с моими программками http://ulex-masm.ru
Ulex вне форума Ответить с цитированием
Старый 11.07.2010, 20:14   #10
Beermonza
Инженер ИС
Старожил
 
Аватар для Beermonza
 
Регистрация: 13.12.2006
Сообщений: 2,671
По умолчанию

Хорошо, задам вопрос прямо:

Код:
// BitBlt(DCs,dispX,dispY,W,H,Buf.Canvas.Handle,0,0,Rop);

  mov	регистр?, DCs	// HDC
  mov	регистр?, dispX	// Integer
  mov	регистр?, dispY	// Integer
  mov	регистр?, W	// Integer
  mov	регистр?, H	// Integer
  mov	регистр?, Buf.Canvas.Handle	// HDC
  mov	регистр?, XSrc	// Integer
  mov	регистр?, YSrc	// Integer
  mov	регистр?, Rop	// Cardinal (SRCCOPY = $00CC0020 {dest = source})

  mov	edi,edi
  push	ebp
  mov	ebp,esp
  push	ecx
  mov	eax,[ebp+28h]
  mov	ecx,eax
  shl	ecx,02h
  xor	ecx,eax
  test	ecx,00CC0000h
  jz 	L77B813AB
  push	ebx
  mov	ebx,[ebp+08h]
  push	esi
  xor	esi,esi
  cmp	[L77BB7064],esi
  push	edi
  mov	edi,00010000h
  jnz	L77B9668B

  L77B76AEC:
  mov	eax,ebx
  and	eax,007F0000h
  cmp	eax,edi
  jnz	L77B9677D

  L77B76AFB:
  push	esi
  push	FFFFFFFFh
  push	[ebp+28h]
  mov	eax,fs:[00000018h]
  push	[ebp+24h]
  mov	[eax+000006D0h],esi
  push	[ebp+20h]
  push	[ebp+1Ch]
  push	[ebp+18h]
  push	[ebp+14h]
  push	[ebp+10h]
  push	[ebp+0Ch]
  push	ebx
  call	SUB_L77B76B34

  L77B76B28:
  pop	edi
  pop	esi
  pop	ebx

  L77B76B2B:
  leave
  retn	0024h
Со всеми прыжками я разберусь, думаю, ...интересует сбор данных в регистры, ...где, чего, как?
Руководитель проекта 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