Форум по Delphi программированию

 



Вернуться   Форум по Delphi программированию > Прочие языки программирования > Assembler
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 14.06.2015, 01:13
Аватар для SCrat.ORS
SCrat.ORS SCrat.ORS вне форума
Активный
 
Регистрация: 20.02.2007
Адрес: Мой адрес не дом и не улица, мой адрес 0x7С00
Сообщения: 208
Версия Delphi: 2006
Репутация: 884
По умолчанию Как сравнить 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  
Старый 05.08.2015, 16:49
Аватар для Thrasher
Thrasher Thrasher вне форума
Illuminati
 
Регистрация: 06.03.2008
Адрес: Крым, г. Симферополь
Сообщения: 348
Репутация: 8808
По умолчанию

Вся проблема в том, что нельзя сравнивать переменные. Только регистры.

Код:
    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  
Старый 05.08.2015, 17:43
Аватар для M.A.D.M.A.N.
M.A.D.M.A.N. M.A.D.M.A.N. вне форума
Sir Richard Abramson
 
Регистрация: 05.04.2008
Сообщения: 5,503
Версия Delphi: XE10
Репутация: выкл
По умолчанию

Вычесть одно из другого и проверить на нуль.
__________________
— Как тебя понимать?
— Понимать меня не обязательно. Обязательно меня любить и кормить вовремя.


На Delphi, увы, больше не программирую.
Рекомендуемая литература по программированию
Ответить с цитированием
  #4  
Старый 05.08.2015, 23:17
Аватар для Bargest
Bargest Bargest вне форума
Профессионал
 
Регистрация: 19.10.2010
Адрес: Москва
Сообщения: 2,390
Версия Delphi: XE3/VS12/FASM
Репутация: 14665
По умолчанию

Эээ....
Код:
.if CurrThID == ThID
За использование .IF макроса вообще руки отрывать надо, ну да ладно.
Для сравнения есть 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  
Старый 06.08.2015, 09:02
Аватар для M.A.D.M.A.N.
M.A.D.M.A.N. M.A.D.M.A.N. вне форума
Sir Richard Abramson
 
Регистрация: 05.04.2008
Сообщения: 5,503
Версия Delphi: XE10
Репутация: выкл
По умолчанию

А что мешает свой макрос запилить, который будет две ячейки памяти сравнивать, через регистры, например?
__________________
— Как тебя понимать?
— Понимать меня не обязательно. Обязательно меня любить и кормить вовремя.


На Delphi, увы, больше не программирую.
Рекомендуемая литература по программированию
Ответить с цитированием
  #6  
Старый 06.08.2015, 22:10
Аватар для Bargest
Bargest Bargest вне форума
Профессионал
 
Регистрация: 19.10.2010
Адрес: Москва
Сообщения: 2,390
Версия Delphi: XE3/VS12/FASM
Репутация: 14665
По умолчанию

Можно сделать любой макрос, хоть "сделать_все_хорошо". Только тот же макрос для двух ячеек будет, очевидно, портить регистры, а значит иметь сторонние эффекты, или же работать очень медленно (каждый раз сохранять/загружать один и тот же регистр, даже когда это не надо). Это ж не ЯВУ, который все лишнее соптимизирует потом.
__________________
jmp $ ; Happy End!
The Cake Is A Lie.

Последний раз редактировалось Bargest, 07.08.2015 в 20:36.
Ответить с цитированием
Ответ



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

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 18:48.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2020

ВКонтакте   Facebook   Twitter