Сложение типов LONG

Тема в разделе "WASM.BEGINNERS", создана пользователем xlinuks, 25 авг 2006.

  1. xlinuks

    xlinuks New Member

    Публикаций:
    0
    Регистрация:
    25 май 2006
    Сообщения:
    181
    Как сложить два LONG на FASM?
    У меня такая проблема (в доке по фасме и в форуме ничего не нашел), есть фунция в Windows GetWindowLong (user32.dll), которая возвращает тип LONG, но ведь в eax он не поместится по идее потому что он 8 байт а в еах помещается только 4, значит после вызова функции в еах будет указатель на LONG а не его непосредственное значение.
    Мне нужно получилв этот LONG добавить ему еще одно значение и сумму послать при помощи SetWindowLong. Вот так:
    Код (Text):
    1. format PE GUI 4.0
    2. entry start
    3. include  '%fasminc%\win32a.inc'
    4.  
    5. sbBuffer db 128 dup (?)
    6.  
    7. section '.data' data readable writeable
    8.    hwnd dd 0
    9.    sNoWindow db 'No foreground window found!', 0
    10.    sTitle  db 'Title', 0
    11.    dqWindowLong dq 0
    12.  
    13. section '.code' code readable executable
    14.  
    15.    start:
    16.    invoke GetForegroundWindow
    17.    cmp eax, NULL
    18.    je noWindow
    19.  
    20.    mov [hwnd], eax  ; хэндл нужного окна
    21.    invoke GetWindowLong, [hwnd], GWL_EXSTYLE  ;получаю его LONG значение
    22.    mov [dqWindowLong], [eax]  ;здесь проблема, не понятно почему, но если поставить eax тоже не компилируется
    23.    add [dqWindowLong], WS_EX_LAYERED  ;сложение..
    24.    invoke SetWindowLong, [hwnd], [dqWindowLong] ;отправка результата
    25.    jmp exit
    26.  
    27.    noWindow:
    28.    invoke MessageBox, NULL, sNoWindow, sTitle, MB_OK
    29.  
    30.    exit:
    31.   invoke ExitProcess, NULL
    32.  
    33.  
    34. section '.idata' import data readable writeable
    35.  
    36.   library kernel,'KERNEL32.DLL',\
    37.           user32,'USER32.DLL'
    38.  
    39.   import kernel,\
    40.          ExitProcess,'ExitProcess'
    41.  
    42.   import user32,\
    43.          MessageBox,'MessageBoxA',\
    44.          GetForegroundWindow, 'GetForegroundWindow',\
    45.          SetWindowLong, 'SetWindowLongA',\
    46.          GetWindowLong, 'GetWindowLongA',\
    Но это не компилируется поскольку не хочет работать с типом dq - ведь он 8 байт, как переделать код, кто знает??
     
  2. censored

    censored New Member

    Публикаций:
    0
    Регистрация:
    5 июл 2005
    Сообщения:
    1.615
    Адрес:
    деревня "Анонимные Прокси"
    если речь не идет о 64 (там не знаю), то LONG это 4 байт (32 бита). в еах его и делов-то.
     
  3. CrazyFun

    CrazyFun New Member

    Публикаций:
    0
    Регистрация:
    26 сен 2005
    Сообщения:
    129
    еси я правильно понял то надо сложить я 64х битных числа на 32х битном камне?? ну сложить 2 64-битных числа этож самое простое в длинной арифметике... используем команду сложения с учётом переноса..
     
  4. xlinuks

    xlinuks New Member

    Публикаций:
    0
    Регистрация:
    25 май 2006
    Сообщения:
    181
    Верно, у меня win32, только как это сделать?
    Речь идет о сишном LONG, что в документации platform SDK указан в качестве возврата фунции GetWindowLong (user32.dll), если я не ошибаюсь он 8 байт, ведь если 4 то тогда сколько будет INT?..
    Help!
     
  5. EvilsInterrupt

    EvilsInterrupt Постигающий азы дзена

    Публикаций:
    0
    Регистрация:
    28 окт 2003
    Сообщения:
    2.428
    Адрес:
    Russia
    xlinuks
    Давай, так, Q: че у нас скаладывает ? - answer: add
    а если ты скажим сложишь и произойдет переполнение на пример:
    unsigned 0xFFFFFFFF + 0xA80 ? А учесть ты это должен! Значит надо учесть перенос, что складывает с переносом? answer - adc.

    Думай и читай Питера Абеля!
     
  6. CrazyFun

    CrazyFun New Member

    Публикаций:
    0
    Регистрация:
    26 сен 2005
    Сообщения:
    129
    есть мнение что long в длину 32бита
     
  7. xlinuks

    xlinuks New Member

    Публикаций:
    0
    Регистрация:
    25 май 2006
    Сообщения:
    181
    Спасибо за ответ,
    моя проблема еще в том что я не знаю как получить значение, скомпилировать строку не удается, компилятор постоянно матерится что invalid operand, я и так и так переставлял "[]"..
    Код (Text):
    1. mov [dqWindowLong], [eax]  ;
    Вы можете скомпилировать код?
     
  8. rmn

    rmn Well-Known Member

    Публикаций:
    0
    Регистрация:
    23 ноя 2004
    Сообщения:
    2.347
    Код (Text):
    1. invoke GetWindowLong, [hwnd], GWL_EXSTYLE  ;получаю его LONG значение
    2. or eax, WS_EX_LAYERED  ;сложение..
    3. invoke SetWindowLong, [hwnd], eax ;отправка результата
     
  9. rmn

    rmn Well-Known Member

    Публикаций:
    0
    Регистрация:
    23 ноя 2004
    Сообщения:
    2.347
    Адресом может быть только один из операндов

    p.s. sizeof(LONG) == sizeof(UINT) == sizeof(DWORD) == sizeof(INT) == 4
     
  10. CrazyFun

    CrazyFun New Member

    Публикаций:
    0
    Регистрация:
    26 сен 2005
    Сообщения:
    129
    дак в фасем вроде синтаксис такой что [eax] - это зачение в eax? или я не прав?
     
  11. Quantum

    Quantum Паладин дзена

    Публикаций:
    0
    Регистрация:
    6 янв 2003
    Сообщения:
    3.143
    Адрес:
    Ukraine
    rmn
    В частности, GetCommandLine возвращает адрес.
     
  12. EvilsInterrupt

    EvilsInterrupt Постигающий азы дзена

    Публикаций:
    0
    Регистрация:
    28 окт 2003
    Сообщения:
    2.428
    Адрес:
    Russia
    CrazyFun
    [eax] - это квадратные скобки! :))) А то бишь со времен давным давно, обращение к памяти!
    Следовательно:
    Код (Text):
    1. mov [dqWindowLong], [eax]
    Теперь спроси, память в память процессор умеет?
     
  13. xlinuks

    xlinuks New Member

    Публикаций:
    0
    Регистрация:
    25 май 2006
    Сообщения:
    181
    rmn спасибо,
    CrazyFun - [eax] - значение адрес которого указывает eax, а просто eax - число что в нем.
    после кода rmn код компилируется, то к сожалению не делает то что должен, установить альфу окна на 50 (когда 255 то окно полностью НЕпрозначное, а 0 полностью прозрачно).
    В Си это делается так и работает:
    Код (Text):
    1. // Set WS_EX_LAYERED on it
    2. SetWindowLong(hActiveWindow, GWL_EXSTYLE, GetWindowLong(hActiveWindow, GWL_EXSTYLE) | WS_EX_LAYERED);
    3. // Set the alpha value on it
    4. SetLayeredWindowAttributes(hActiveWindow, 0, (BYTE)(((float)iTenths/10)*255), LWA_ALPHA);
    А код на ассемблере ничего не делает, наверное я так и не догадаюсь в чем дело..
    Код (Text):
    1.    invoke GetWindowLong, [hwnd], GWL_EXSTYLE
    2.    or eax, WS_EX_LAYERED  
    3.    invoke SetWindowLong, [hwnd], eax
    4.    invoke SetLayeredWindowAttributes, 0, 50, LWA_ALPHA
    Если когото интересует вот полный ассемблерный код:
    Код (Text):
    1. format PE GUI 4.0
    2. entry start
    3. include  '%fasminc%\win32a.inc'
    4.  
    5. sbBuffer db 128 dup (?)
    6.  
    7. section '.data' data readable writeable
    8.    hwnd dd 0
    9.    sNoWindow db 'No foreground window found!', 0
    10.    sTitle  db 'Title', 0
    11.    dqWindowLong dq 0
    12.    btByte db 50
    13.  
    14. section '.code' code readable executable
    15.  
    16.    start:
    17.    invoke GetForegroundWindow
    18.    cmp eax, NULL
    19.    je noWindow
    20.  
    21.    mov [hwnd], eax  ; õýíäë íóæíîãî îêíà
    22.    invoke GetWindowLong, [hwnd], GWL_EXSTYLE  ;ïîëó÷àþ åãî LONG çíà÷åíèå
    23.    or eax, WS_EX_LAYERED  ;ñëîæåíèå..
    24.    invoke SetWindowLong, [hwnd], eax ;îòïðàâêà ðåçóëüòàòà
    25.    invoke SetLayeredWindowAttributes, 0, 50, LWA_ALPHA
    26.  
    27.    jmp exit
    28.  
    29.    noWindow:
    30.    invoke MessageBox, NULL, sNoWindow, sTitle, MB_OK
    31.  
    32.    exit:
    33.   invoke ExitProcess, NULL
    34.  
    35.  
    36. section '.idata' import data readable writeable
    37.  
    38.   library kernel,'KERNEL32.DLL',\
    39.           user32,'USER32.DLL'
    40.  
    41.   import kernel,\
    42.          ExitProcess,'ExitProcess'
    43.  
    44.   import user32,\
    45.          MessageBox,'MessageBoxA',\
    46.          GetForegroundWindow, 'GetForegroundWindow',\
    47.          SetWindowLong, 'SetWindowLongA',\
    48.          GetWindowLong, 'GetWindowLongA',\
    49.          SetLayeredWindowAttributes, 'SetLayeredWindowAttributes'
     
  14. CrazyFun

    CrazyFun New Member

    Публикаций:
    0
    Регистрация:
    26 сен 2005
    Сообщения:
    129
    EvilsInterrupt
    ну грюж что гдето читал про фасмовский синтаксис что там типа скобки иначе употребляются..
    но не спорю с фасмомо не работал))

    а вот это:
    Код (Text):
    1. add [dqWindowLong], WS_EX_LAYERED
    приемник адресуется по ссылке, лежащей в памяти, к нему пребавляется непосредственный операнд?
     
  15. CrazyFun

    CrazyFun New Member

    Публикаций:
    0
    Регистрация:
    26 сен 2005
    Сообщения:
    129
    xlinuks

    эта
    invoke SetLayeredWindowAttributes, 0, 50, LWA_ALPHA - хендл передать не забыл?
     
  16. xlinuks

    xlinuks New Member

    Публикаций:
    0
    Регистрация:
    25 май 2006
    Сообщения:
    181
    Вот что говорят доки по фасме:
    Код (Text):
    1. mov bx,ax ; general register to general register
    2. mov [char],al ; general register to memory
    3. mov bl,[char] ; memory to general register
    4. mov dl,32 ; immediate value to general register
    5. mov [char],32 ; immediate value to memory
    6. mov ax,ds ; segment register to general register
    7. mov [bx],ds ; segment register to memory
    8. mov ds,ax ; general register to segment register
    9. mov ds,[bx] ; memory to segment register
    10. mov eax,cr0 ; control register to general register
    11. mov cr3,ebx ; general register to control register
    Ладно.. поробую разобратся что не так..
     
  17. xlinuks

    xlinuks New Member

    Публикаций:
    0
    Регистрация:
    25 май 2006
    Сообщения:
    181
    Вообщето забыл, но переделал и все равно не работает, очень странно..
    Код (Text):
    1. invoke SetLayeredWindowAttributes,[hwnd], 0, 50, LWA_ALPHA
     
  18. CrazyFun

    CrazyFun New Member

    Публикаций:
    0
    Регистрация:
    26 сен 2005
    Сообщения:
    129
    ты эта посмотри как это сделает компилятор)) можно же получить у сишного компилятора ассемблерный листинг)
     
  19. xlinuks

    xlinuks New Member

    Публикаций:
    0
    Регистрация:
    25 май 2006
    Сообщения:
    181
    Если кому интересно сама прога (два исходника (не я писал прогу) в общем около 10 кб, + экзешка, а также все файлы которые генерирует при этом VC++ ) находится на
    http://www.geocities.com/xlinuks/vitrite_source_and_exe.zip
    147 КБ.
    Буду признателен за любые идеи как сделать ассемблеровскую версию которая бы устанавливала прозрачность окна..
    В этой проге один из способов, может есть еще - который будет работать если сделать на ассемблере..
    Ну да ладно, надо отдохнуть, на уставшую голову не думается
    Всем спасибо
     
  20. xlinuks

    xlinuks New Member

    Публикаций:
    0
    Регистрация:
    25 май 2006
    Сообщения:
    181
    ррррааааботает!! :)))
    Она поставит прозрачность окна в котором запущена примерно на 5%. Теперь можно работать дальше над ней!!
    (поэтому если скомпилируете не запускайте с рабочего стола ато он станет почти невидимым хехе, лучше из какойто папки чтобы ее (папку-окно) можно было закрыть и дело с концом)
    Код (Text):
    1. format PE GUI 4.0
    2. entry start
    3. include  '%fasminc%\win32a.inc'
    4.  
    5. section '.data' data readable writeable
    6.    hwnd dd 0
    7.    sNoWindow db 'No foreground window found!', 0
    8.    sTitle  db 'Title', 0
    9.  
    10. section '.code' code readable executable
    11.  
    12.    start:
    13.    invoke GetForegroundWindow
    14.    cmp eax, NULL
    15.    je .noWindow
    16.  
    17.    mov [hwnd], eax
    18.    invoke GetWindowLong, [hwnd], GWL_EXSTYLE
    19.    add eax, WS_EX_LAYERED
    20.    invoke SetWindowLong, [hwnd], GWL_EXSTYLE, eax
    21.    invoke SetLayeredWindowAttributes,[hwnd], 0, 100, LWA_ALPHA
    22.  
    23.    jmp .exit
    24.  
    25.    .noWindow:
    26.    invoke MessageBox, NULL, sNoWindow, sTitle, MB_OK
    27.  
    28.    .exit:
    29.   invoke ExitProcess, NULL
    30.  
    31. section '.idata' import data readable writeable
    32.  
    33.   library kernel,'KERNEL32.DLL',\
    34.           user32,'USER32.DLL'
    35.  
    36.   import kernel,\
    37.          ExitProcess,'ExitProcess'
    38.  
    39.   import user32,\
    40.          MessageBox,'MessageBoxA',\
    41.          GetForegroundWindow, 'GetForegroundWindow',\
    42.          SetWindowLong, 'SetWindowLongA',\
    43.          GetWindowLong, 'GetWindowLongA',\
    44.          SetLayeredWindowAttributes, 'SetLayeredWindowAttributes'
    FASM рулит! :)