![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
#1
|
||||
|
||||
|
Я всё так же не силён в ассемблере, но пытаюсь. Проблема тупейшая, но голова в асме не хочет работать.
Есть вот такая функция: Код:
GetFocusedWindow proc uses ebx LOCAL CurrThID, ThID : DWORD mov ebx, rv(GetForegroundWindow) .if ebx != 0 mov CurrThID, rv(GetCurrentThreadId) mov ThID, rv(GetWindowThreadProcessId, ebx, NULL) mov ebx, 0 .if CurrThID == ThID mov ebx, rv(GetFocus) .else .if rv(AttachThreadInput, CurrThID, ThID, TRUE) mov ebx, rv(GetFocus) invoke AttachThreadInput, CurrThID, ThID, FALSE .endif .endif .endif ret GetFocusedWindow endp Код:
.if CurrThID == ThID |
|
#2
|
||||
|
||||
|
Вся проблема в том, что нельзя сравнивать переменные. Только регистры.
Код:
mov CurrThID, rv(GetCurrentThreadId)
mov ThID, rv(GetWindowThreadProcessId, ebx, NULL)
mov ebx, 0
push eax
push ecx
mov eax, CurrThID
mov ecx, ThID
.if CurrThID == ThID
mov ebx, rv(GetFocus)
pop ecx
pop eax
.else
pop eax
pop ecx
.if rv(AttachThreadInput, CurrThID, ThID, TRUE)
mov ebx, rv(GetFocus)
invoke AttachThreadInput, CurrThID, ThID, FALSE
.endif
.endif
.endif
ret
GetFocusedWindow endp |
|
#3
|
||||
|
||||
|
Вычесть одно из другого и проверить на нуль.
|
|
#4
|
||||
|
||||
|
Эээ....
Код:
.if CurrThID == ThID Для сравнения есть cmp + флаговые переходы jz/jnz/jb/ja/jc/je - тысячи их, и на каждый еще по несколько псевдонимов. cmp eax, ebx вычитает ebx из eax и выставляет флаги в соответствии с результатом, после чего на основании этих флагов можно сделать или не сделать переход. je/jz - переход на метку если есть флаг нуля, т.е. если результат предыдущей арифм. операции нулевой (eax = ebx в описываемом случае), jne/jnz - наоборот. При сравнении как минимум один аргумент должен быть регистром или константой, при этом первый аргумент константой быть не может. Можно сравнить регистр с числом, регистр с регистром, регистр с памятью, память с числом, память с регистрм. Любые локальные переменные находятся в памяти (и разработчикам MASM, да и не только, надо сказать отдельное "спасибо" за то, что в синтаксисе никак явно не указывается, что это обращение к памяти; только FASM в этом плане додумался логично сделать). .IF-макрос транслируется в тот же cmp +j-что-нибудь. Последний раз редактировалось Bargest, 05.08.2015 в 23:20. |
|
#5
|
||||
|
||||
|
А что мешает свой макрос запилить, который будет две ячейки памяти сравнивать, через регистры, например?
|
|
#6
|
||||
|
||||
|
Можно сделать любой макрос, хоть "сделать_все_хорошо". Только тот же макрос для двух ячеек будет, очевидно, портить регистры, а значит иметь сторонние эффекты, или же работать очень медленно (каждый раз сохранять/загружать один и тот же регистр, даже когда это не надо). Это ж не ЯВУ, который все лишнее соптимизирует потом.
Последний раз редактировалось Bargest, 07.08.2015 в 20:36. |