Как сложить два LONG на FASM? У меня такая проблема (в доке по фасме и в форуме ничего не нашел), есть фунция в Windows GetWindowLong (user32.dll), которая возвращает тип LONG, но ведь в eax он не поместится по идее потому что он 8 байт а в еах помещается только 4, значит после вызова функции в еах будет указатель на LONG а не его непосредственное значение. Мне нужно получилв этот LONG добавить ему еще одно значение и сумму послать при помощи SetWindowLong. Вот так: Код (Text): format PE GUI 4.0 entry start include '%fasminc%\win32a.inc' sbBuffer db 128 dup (?) section '.data' data readable writeable hwnd dd 0 sNoWindow db 'No foreground window found!', 0 sTitle db 'Title', 0 dqWindowLong dq 0 section '.code' code readable executable start: invoke GetForegroundWindow cmp eax, NULL je noWindow mov [hwnd], eax ; хэндл нужного окна invoke GetWindowLong, [hwnd], GWL_EXSTYLE ;получаю его LONG значение mov [dqWindowLong], [eax] ;здесь проблема, не понятно почему, но если поставить eax тоже не компилируется add [dqWindowLong], WS_EX_LAYERED ;сложение.. invoke SetWindowLong, [hwnd], [dqWindowLong] ;отправка результата jmp exit noWindow: invoke MessageBox, NULL, sNoWindow, sTitle, MB_OK exit: invoke ExitProcess, NULL section '.idata' import data readable writeable library kernel,'KERNEL32.DLL',\ user32,'USER32.DLL' import kernel,\ ExitProcess,'ExitProcess' import user32,\ MessageBox,'MessageBoxA',\ GetForegroundWindow, 'GetForegroundWindow',\ SetWindowLong, 'SetWindowLongA',\ GetWindowLong, 'GetWindowLongA',\ Но это не компилируется поскольку не хочет работать с типом dq - ведь он 8 байт, как переделать код, кто знает??
еси я правильно понял то надо сложить я 64х битных числа на 32х битном камне?? ну сложить 2 64-битных числа этож самое простое в длинной арифметике... используем команду сложения с учётом переноса..
Верно, у меня win32, только как это сделать? Речь идет о сишном LONG, что в документации platform SDK указан в качестве возврата фунции GetWindowLong (user32.dll), если я не ошибаюсь он 8 байт, ведь если 4 то тогда сколько будет INT?.. Help!
xlinuks Давай, так, Q: че у нас скаладывает ? - answer: add а если ты скажим сложишь и произойдет переполнение на пример: unsigned 0xFFFFFFFF + 0xA80 ? А учесть ты это должен! Значит надо учесть перенос, что складывает с переносом? answer - adc. Думай и читай Питера Абеля!
Спасибо за ответ, моя проблема еще в том что я не знаю как получить значение, скомпилировать строку не удается, компилятор постоянно матерится что invalid operand, я и так и так переставлял "[]".. Код (Text): mov [dqWindowLong], [eax] ; Вы можете скомпилировать код?
Код (Text): invoke GetWindowLong, [hwnd], GWL_EXSTYLE ;получаю его LONG значение or eax, WS_EX_LAYERED ;сложение.. invoke SetWindowLong, [hwnd], eax ;отправка результата
Адресом может быть только один из операндов p.s. sizeof(LONG) == sizeof(UINT) == sizeof(DWORD) == sizeof(INT) == 4
CrazyFun [eax] - это квадратные скобки! )) А то бишь со времен давным давно, обращение к памяти! Следовательно: Код (Text): mov [dqWindowLong], [eax] Теперь спроси, память в память процессор умеет?
rmn спасибо, CrazyFun - [eax] - значение адрес которого указывает eax, а просто eax - число что в нем. после кода rmn код компилируется, то к сожалению не делает то что должен, установить альфу окна на 50 (когда 255 то окно полностью НЕпрозначное, а 0 полностью прозрачно). В Си это делается так и работает: Код (Text): // Set WS_EX_LAYERED on it SetWindowLong(hActiveWindow, GWL_EXSTYLE, GetWindowLong(hActiveWindow, GWL_EXSTYLE) | WS_EX_LAYERED); // Set the alpha value on it SetLayeredWindowAttributes(hActiveWindow, 0, (BYTE)(((float)iTenths/10)*255), LWA_ALPHA); А код на ассемблере ничего не делает, наверное я так и не догадаюсь в чем дело.. Код (Text): invoke GetWindowLong, [hwnd], GWL_EXSTYLE or eax, WS_EX_LAYERED invoke SetWindowLong, [hwnd], eax invoke SetLayeredWindowAttributes, 0, 50, LWA_ALPHA Если когото интересует вот полный ассемблерный код: Код (Text): format PE GUI 4.0 entry start include '%fasminc%\win32a.inc' sbBuffer db 128 dup (?) section '.data' data readable writeable hwnd dd 0 sNoWindow db 'No foreground window found!', 0 sTitle db 'Title', 0 dqWindowLong dq 0 btByte db 50 section '.code' code readable executable start: invoke GetForegroundWindow cmp eax, NULL je noWindow mov [hwnd], eax ; õýíäë íóæíîãî îêíà invoke GetWindowLong, [hwnd], GWL_EXSTYLE ;ïîëó÷àþ åãî LONG çíà÷åíèå or eax, WS_EX_LAYERED ;ñëîæåíèå.. invoke SetWindowLong, [hwnd], eax ;îòïðàâêà ðåçóëüòàòà invoke SetLayeredWindowAttributes, 0, 50, LWA_ALPHA jmp exit noWindow: invoke MessageBox, NULL, sNoWindow, sTitle, MB_OK exit: invoke ExitProcess, NULL section '.idata' import data readable writeable library kernel,'KERNEL32.DLL',\ user32,'USER32.DLL' import kernel,\ ExitProcess,'ExitProcess' import user32,\ MessageBox,'MessageBoxA',\ GetForegroundWindow, 'GetForegroundWindow',\ SetWindowLong, 'SetWindowLongA',\ GetWindowLong, 'GetWindowLongA',\ SetLayeredWindowAttributes, 'SetLayeredWindowAttributes'
EvilsInterrupt ну грюж что гдето читал про фасмовский синтаксис что там типа скобки иначе употребляются.. но не спорю с фасмомо не работал)) а вот это: Код (Text): add [dqWindowLong], WS_EX_LAYERED приемник адресуется по ссылке, лежащей в памяти, к нему пребавляется непосредственный операнд?
Вот что говорят доки по фасме: Код (Text): mov bx,ax ; general register to general register mov [char],al ; general register to memory mov bl,[char] ; memory to general register mov dl,32 ; immediate value to general register mov [char],32 ; immediate value to memory mov ax,ds ; segment register to general register mov [bx],ds ; segment register to memory mov ds,ax ; general register to segment register mov ds,[bx] ; memory to segment register mov eax,cr0 ; control register to general register mov cr3,ebx ; general register to control register Ладно.. поробую разобратся что не так..
Вообщето забыл, но переделал и все равно не работает, очень странно.. Код (Text): invoke SetLayeredWindowAttributes,[hwnd], 0, 50, LWA_ALPHA
ты эта посмотри как это сделает компилятор)) можно же получить у сишного компилятора ассемблерный листинг)
Если кому интересно сама прога (два исходника (не я писал прогу) в общем около 10 кб, + экзешка, а также все файлы которые генерирует при этом VC++ ) находится на http://www.geocities.com/xlinuks/vitrite_source_and_exe.zip 147 КБ. Буду признателен за любые идеи как сделать ассемблеровскую версию которая бы устанавливала прозрачность окна.. В этой проге один из способов, может есть еще - который будет работать если сделать на ассемблере.. Ну да ладно, надо отдохнуть, на уставшую голову не думается Всем спасибо
ррррааааботает!! )) Она поставит прозрачность окна в котором запущена примерно на 5%. Теперь можно работать дальше над ней!! (поэтому если скомпилируете не запускайте с рабочего стола ато он станет почти невидимым хехе, лучше из какойто папки чтобы ее (папку-окно) можно было закрыть и дело с концом) Код (Text): format PE GUI 4.0 entry start include '%fasminc%\win32a.inc' section '.data' data readable writeable hwnd dd 0 sNoWindow db 'No foreground window found!', 0 sTitle db 'Title', 0 section '.code' code readable executable start: invoke GetForegroundWindow cmp eax, NULL je .noWindow mov [hwnd], eax invoke GetWindowLong, [hwnd], GWL_EXSTYLE add eax, WS_EX_LAYERED invoke SetWindowLong, [hwnd], GWL_EXSTYLE, eax invoke SetLayeredWindowAttributes,[hwnd], 0, 100, LWA_ALPHA jmp .exit .noWindow: invoke MessageBox, NULL, sNoWindow, sTitle, MB_OK .exit: invoke ExitProcess, NULL section '.idata' import data readable writeable library kernel,'KERNEL32.DLL',\ user32,'USER32.DLL' import kernel,\ ExitProcess,'ExitProcess' import user32,\ MessageBox,'MessageBoxA',\ GetForegroundWindow, 'GetForegroundWindow',\ SetWindowLong, 'SetWindowLongA',\ GetWindowLong, 'GetWindowLongA',\ SetLayeredWindowAttributes, 'SetLayeredWindowAttributes' FASM рулит!