|
|
| Посл.отвђт | Сообщен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 |