|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
||||
|
||||
Как сравнить 2 числа (равны или нет)
Я всё так же не силён в ассемблере, но пытаюсь. Проблема тупейшая, но голова в асме не хочет работать.
Есть вот такая функция: Код:
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 Хорошо написанная программа не требует документации ICQ 9-184-668. |
#3
|
||||
|
||||
Вычесть одно из другого и проверить на нуль.
— Как тебя понимать? — Понимать меня не обязательно. Обязательно меня любить и кормить вовремя. На Delphi, увы, больше не программирую. Рекомендуемая литература по программированию |
#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-что-нибудь. jmp $ ; Happy End! The Cake Is A Lie. Последний раз редактировалось Bargest, 05.08.2015 в 23:20. |
#5
|
||||
|
||||
А что мешает свой макрос запилить, который будет две ячейки памяти сравнивать, через регистры, например?
— Как тебя понимать? — Понимать меня не обязательно. Обязательно меня любить и кормить вовремя. На Delphi, увы, больше не программирую. Рекомендуемая литература по программированию |
#6
|
||||
|
||||
Можно сделать любой макрос, хоть "сделать_все_хорошо". Только тот же макрос для двух ячеек будет, очевидно, портить регистры, а значит иметь сторонние эффекты, или же работать очень медленно (каждый раз сохранять/загружать один и тот же регистр, даже когда это не надо). Это ж не ЯВУ, который все лишнее соптимизирует потом.
jmp $ ; Happy End! The Cake Is A Lie. Последний раз редактировалось Bargest, 07.08.2015 в 20:36. |