· Начало · Отвђтить · Статистика · Поиск · FAQ · Правила · Установки · Язык · Выход · WASM.RU · Noir.Ru ·

 WASM Phorum —› WASM.WIN32 —› Помогите!!!!!!!!!!!!!!!!!!!!!

Посл.отвђт Сообщенiе


Дата: Янв 22, 2004 16:11:28 · Поправил: Gromozeka

Есть вот такая процедура
WndProc proc hWnd:HWND, uMsg:UINT, wParam:WPARAM, lParam:LPARAM
	LOCAL hdc:HDC
	LOCAL ps:PAINTSTRUCT
	LOCAL  sum:dword;
	LOCAL  raz:dword;
	LOCAL  buff:dword;




	.IF uMsg==WM_DESTROY
		invoke PostQuitMessage,NULL

	.ELSEIF uMsg==WM_LBUTTONDOWN
			mov  kol,0
			push ecx
		        mov ecx,eax
                        mov ecx,lParam
			and ecx,0ffffh
			mov hitpoint.x,ecx
			sub hitpoint.x,144
			shr hitpoint.x,6
			shl hitpoint.x,6
			add hitpoint.x,144
			mov ecx,lParam
			shr ecx,16
			mov hitpoint.y,ecx
			sub hitpoint.y,24
			shr hitpoint.y,6
			shl hitpoint.y,6
			add hitpoint.y,24
			add hitpoint.x,32
			add hitpoint.y,32
			mov ecx ,hitpoint.y
			mov hitpoint2.y,ecx
			sub hitpoint.y,32
			add hitpoint2.y,32
			
			mov ecx ,hitpoint.x
			mov hitpoint2.x,ecx
			sub hitpoint.x,32
			add hitpoint2.x,32
			pop ecx

			mov eax,lParam
			shr eax,16
			sub eax, 24
			jl @@bad
			shr eax, 6
			cmp eax, 8
			jae @@bad
			mov tgt_row, al
			mov ebx, offset mmmm
			add ebx, eax

			mov eax,lParam
			and eax,0ffffh
			sub eax, 144
			jl @@bad
			shr eax, 6
			cmp eax, 8
			jae @@bad
			mov tgt_col, al
			mov [ebx], al
 			
			call find
			invoke InvalidateRect,hWnd,NULL,TRUE
		@@bad:

	.ELSEIF uMsg==WM_PAINT

		invoke BeginPaint,hWnd, ADDR ps
		mov    hdc,eax	

		RGB    0,0,255
		invoke CreatePen,PS_SOLID,7,eax ; Solid and 8 pixels wide
		invoke SelectObject,hdc,eax
		invoke Rectangle,hdc,140,20,660,540
		RGB    155,111,11
		invoke CreateSolidBrush,eax
                mov hBrush, eax
		mov rct.left, 144
		mov rct.top, 24
		mov rct.right, 656
		mov rct.bottom, 536
		invoke FillRect, hdc, ADDR rct, hBrush
		invoke DeleteObject, hBrush

		RGB    0,0,0
		invoke CreateSolidBrush,eax
                mov hBrush, eax
		mov rct.left, 144
		mov rct.top, 24
		mov rct.right,208 
		mov rct.bottom,88

		mov rc.left, 208
		mov rc.top, 88
		mov rc.right,272 
		mov rc.bottom,152

@@l3:
		mov rct.left, 144
		mov rct.right,208
		mov rc.left, 208
		mov rc.right,272
 
		RGB    0,0,0
		invoke CreateSolidBrush,eax
		mov hBrush, eax
		cmp rct.top,440
		jnl @@l4
		invoke FillRect, hdc, ADDR rct, hBrush
		invoke FillRect, hdc, ADDR rc, hBrush
		invoke DeleteObject, hBrush
		
		

@@l2:		
		RGB    0,0,0
		invoke CreateSolidBrush,eax
		mov hBrush, eax
		cmp rct.left,590
		jnl @@l1
		invoke FillRect, hdc, ADDR rct, hBrush
		invoke FillRect, hdc, ADDR rc, hBrush
		invoke DeleteObject, hBrush
		add rct.left,128
		add rct.right,128
		add rc.left,128
		add rc.right,128
		 
		
		jmp @@l2

@@l1:		
		add rct.top,128
		add rct.bottom,128
		add rc.top,128
		add rc.bottom,128
		jmp @@l3


@@l4:  		

		RGB    255,0,0
		invoke CreatePen,PS_SOLID,4,eax ; Solid and 8 pixels wide
		invoke SelectObject,hdc,eax
		push esi
		mov esi, offset mmmm
		mov ecx, 8
		mov out_y1, 24
		mov out_y2, 24+64
	@@l100:
                
		push ecx
		mov out_x1, 144
		mov out_x2, 144+64
		xor eax, eax
		lodsb
		cmp al, -1
		je @@l200
		shl eax, 6
		add out_x1, eax
		add out_x2, eax
		mov ebx,eax
		mov edx,out_x1
		mov kol,0
		mov  edi,offset [kol]
		
		invoke Ellipse, hdc,out_x1,out_y1,out_x2,out_y2
		mov mas2[edi],ebx
		
		mov flag5,0
		add kol,1
		
	@@l200:
		add out_y1, 64
		add out_y2, 64
		pop ecx
		loop @@l100
		pop esi

		
		RGB    125,10,255
		invoke CreatePen,PS_SOLID,4,eax ; Solid and 8 pixels wide
		invoke SelectObject,hdc,eax
		invoke Ellipse, hdc,hitpoint.x,hitpoint.y,hitpoint2.x,hitpoint2.y

		 .ELSEIF uMsg==WM_CREATE
		
		invoke CreateWindowEx,NULL, ADDR ButtonClassName,ADDR ButtonText,\
                        WS_CHILD or WS_VISIBLE or BS_DEFPUSHBUTTON,\
                        20,10,100,30,hWnd,ButtonID,hInstance,NULL
		mov  hwndButton,eax

                invoke CreateWindowEx,NULL, ADDR ButtonClassName1,ADDR ButtonText1,\
                        WS_CHILD or WS_VISIBLE or BS_DEFPUSHBUTTON,\
                        680,10,100,30,hWnd,ButtonID1,hInstance1,NULL
		mov  hwndButton1,eax

		invoke  ValidateRect,hWnd,NULL
		invoke EndPaint,hWnd, ADDR ps
	.ELSE
		invoke DefWindowProc,hWnd,uMsg,wParam,lParam
		ret
	.ENDIF
@@exit1:
		xor    eax,eax
	
	ret
WndProc endp 

Что я сделал не так? В этоq строчке:
mov mas2[edi],ebx
выдает ошибку "invalid instruction operands". Массив состоит из 7 елементом,описан глобальнно и забит нулями.


Заранее спасибо!!!


Дата: Янв 22, 2004 16:23:02

вместо всего этого кода можно было написать сам вопрос про mov... а главное, надо было написать, как описан массив. Если он описан как db, то ничего удивительного...
mov mas2[edi],ebx означает, что массив mas2 должен быть описан как dd...


Дата: Янв 22, 2004 20:03:25

Спасибо!!! Это исправил, но теперь вылезла новая ошибка "jump destination too far " в строчке pop esi. Что это за ошибка? Из-за чевого она возникает? И как ее исправить?


Дата: Янв 22, 2004 20:17:57

это значит что нужно написать не loop @@l100, а
dec ecx
jnz @@l100


Дата: Янв 23, 2004 18:31:04

Кстати, недавно, я взялся 'вылизывать' мой STRING CLASS для AsmDev32. С удивлением, обнаружил, что DEC/JNZ быстрее чем LOOP (!). Странно... одна инструкция против двух?!


Дата: Янв 23, 2004 18:51:21

AsmGuru62

Разумеется. Читаем Фога. :)


Дата: Янв 23, 2004 20:36:30

AsmGuru62
...насколько я помню, enter тоже выполянеться медленнее, чем push ebp/mov ebp,esp :) но - удобнее, черт возьми!


Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.076