или не long, но вроде как в msdn по всякому уже попробовал вывести разрешение экрана , и сичего не пойму, или потомучто не докурил самые основы , или это и точно не так просто как из простого INT Код (Text): ;fasm format PE GUI 4.0 entry start include "win32a.inc" client RECT temp db 32 dup (0) xBparam db 32 dup (0) ; code section ;--------------------------- section '.code' code readable executable start: invoke GetClientRect,0,client ; окно mov eax, client.right lea edi , [temp] mov ebx, 10 call NumToASCII ;;;;;;;;;;;;; mov dword[xBparam], client.bottom invoke MessageBox,0,temp,xBparam,MB_OK STOP: invoke ExitProcess, 0 ;========================== NumToASCII: pushad xor esi,esi convert_loop: xor edx,edx div ebx add dl , 30h push edx inc esi test eax,eax jnz convert_loop ;eld write_loop: pop eax ; цифрa из стека stosb ; AL по адресу в EDI, EDI +1 dec esi test esi,esi jnz write_loop mov byte [edi],0 popad ret ;====================================== section '.idata' import data readable library kernel32,"KERNEL32.DLL",\ user32,"USER32.DLL" include "api/kernel32.inc" include "api/user32.inc" несколько описаний преобразования числа в строку находил , впринципе таким-же путёm деления на 10 и преобразования остатков , подскажите почему не могу вывести эти цифры
xx7 У меня работает. 1) В функции GetClientRect 1-й параметр укажи. Нужен хэндл окна. 2) В функции MessageBox 2-й и 3-й параметры должны быть адресами переменных. Хотя может быть в Fasm-е разрешена и такая запись как у тебя?
Это фасм. mov eax,client.right положит в eax адрес соответствующего элемента структуры. И, кстати, поэтому зря lea ниже. Это Windows. GetClientRect(NULL, ...), естественно, не работает. Код (Text): invoke GetDesktopWindow invoke GetClientRect,eax,client ; окно mov eax, [client.right] mov edi ,temp С xBparam сам. ЗЫ: обычно делают GetSystemMetrics с SM_CXSCREEN и SM_CYSCREEN. Тебе ведь это надо?
Большое спасибо, заработало,, и за GetSystemMetrics тоже. Нужно сразу всё ,) Хотелось понять синтаксис, а тут ещё и WinApi тоже не знаю
и ещё одно непойму теперь, например я хочу задать размеры окну исходя из этих RECT..... значит нужно примерно так вычислять? Код (Text): mov eax, [client.right] xor edx,edx div ebx mov [client.right], eax mov eax, [client.bottom] xor edx,edx div ebx mov [client.bottom], eax invoke CreateWindowEx, WS_EX_CLIENTEDGE,szClass,szTitle,\ WS_CAPTION+WS_VISIBLE+WS_POPUP+\ WS_SYSMENU+WS_MAXIMIZEBOX+WS_MINIMIZEBOX,\ [client.right],\ [client.bottom],\ [client.right],\ [client.bottom],\ 0,[hMenu],[hInstance],\ 0 что-то читал-читал про операторы /*-+, и ничего не понял)(в справке по фасму), как-то можно их использовать ? или так тоже пойдёт
Я не понял, почему ты дважды написал [client.right] и [client.bottom]? Хочешь, чтобы окно размещалось относительно вершины десктопа на расстоянии, равном размеру окна? И что ты хочешь вычислить? Размер окна, в десять раз меньший размеру десктопа (по обеим осям)? Если так, тогда ты сделал все правильно. Причем здесь операторы fasm'а, я тоже так и не понял.
забыл вначале написать mov ebx, 2 хотел упростить и получилось что-то типа Код (Text): .... <.right = .right/2>,\ <.bottom = .bottom/2>,\ .right,\ .bottom,\ .... а так , сначало было 400,400,400,200 (для 800x600 экрана), просто лениво далеко тянуться мышкой ,) а там ещё на notifyicon кой чего навесил. вобще хотел с высотой поделить на три , и сделать в нижней третьей части, но вычислений тогда ещё больше. Думал что может как в сях можно чего записать , типа ((600/3)*2)
Операторы можно использовать только в выражениях, содержащих одни константы. Вычислить 1/3 и 2/3 на ассемблере элементарно. Код (Text): mov ebx, 3 ; ecx <-- y, edi <-- height mov eax, [.bottom] xor edx, edx div ebx mov edi, eax shl eax, 1 mov ecx, eax ; eax <-- x, esi <-- width mov eax, [.right] xor edx, edx div ebx mov esi, eax shl eax, 1 stdcall CreateWindowEx, ..., eax, ecx, esi, edi, ...
Совсем так не получилось , пока на таком остановился mov eax, [client.bottom] mov ebx, 3 Код (Text): xor edx,edx div ebx mov esi, eax ; height -> esi mov ebx, eax ; y -> ebx sal ebx, 1 mov eax, [client.right] sar eax, 1 ;x,width -> eax CreateWindowEx, ... eax,ebx,eax,esi,... насчёт логического сдвига и правда забыл что-то
Теперь совсем запутался со стеком например просто чтобы посмотреть какое-то значение сделал такую функцию например stdcall numtest esp посмотреть Код (Text): proc numtest num push eax ebx edi ;сохранение mov eax,[num] mov ebx, 16 lea edi, [stest] call NumToASCII invoke MessageBox, 0, stest,'numtest',MB_OK pop edi ebx eax ;возврат значений ret endp ;======================================================= stest db 32 dup(0) но "stest" ненужна как глобальная переменная. никакие local или locals-endl непомогают, наверное нужно динамически выделить место под строку, но никак не пойму как делается. Как-нибудь можно сделать чтобы edi указывало на место в стеке, и чтобы потом ещё передать оттуда в MessageBox ?