|
|
| Посл.отвђт | Сообщенiе |
|
|
Дата: Янв 15, 2004 16:20:57 Edmond В описании блока предсказания переходов для Pentium-ов говорится, что безусловный переход (jmp) считается, как выполняемый и кэш предвыборки команд заполняется, начиная с адреса перехода. Тоже самое и для условного перехода вверх. Если выполняется неверно предсказанная ветвь - условный переход вниз, то процессор сбрасывает очередь предвыборки и заполняет ее заново. Потеря ~20 тактов. Говоря С-ишным языком, наиболее вероятная ветвь должна лежать между if и else. А что касается приведенного тобой кода, то все зависит от того, где расположены метки exit и code. |
|
|
Дата: Янв 15, 2004 16:42:49 sd2000 Я хочу заметить, что это верно для Пентиум, а не для PII/PPro |
|
|
Дата: Янв 15, 2004 16:59:48 Я посмотрю. |
|
|
Дата: Янв 15, 2004 18:28:14
Copy2CB proc pszStr:DWORD,hWnd:HWND
LOCAL dwStrLen:DWORD
LOCAL hMemm:DWORD
LOCAL pMemm:DWORD
invoke lstrlen,pszStr ; посчитаем длину нашей строки
mov dwStrLen,eax
inc dwStrLen ; нужно учесть завершающий ноль... кажется нужно :)
invoke GlobalAlloc,GMEM_MOVEABLE,dwStrLen ; выделим память
mov hMemm,eax
invoke GlobalLock,hMemm ; заблокируем и получим на нее указатель
mov pMemm,eax
invoke lstrcpy,pMemm,pszStr ; скопируем в эту память нашу строку
invoke GlobalUnlock,hMemm ; разблокируем нашу память
invoke OpenClipboard,hWnd ; откроем Клипбоард
invoke EmptyClipboard ; почистим его
invoke SetClipboardData,CF_TEXT,hMemm ; установим нашу строку
invoke CloseClipboard ; закроем Клипбоард
; --- Нельзя! --- invoke GlobalFree,hMemm ; освободим память, любезно
; предоставленную нам Windows :)
ret
Copy2CB endp
|
|
|
Дата: Янв 15, 2004 18:57:52 [ Edmond: test eax,eax jnz --> code jmp --> exit] А где ты такое увидел? Мой исходник будет ассемблирован в такой код: 00401000 /$ 55 PUSH EBP 00401001 |. 8BEC MOV EBP,ESP 00401003 |. 83C4 EC ADD ESP,-14 00401006 |. 8365 EC 00 AND DWORD PTR SS:[EBP-14],0 0040100A |. 6A 01 PUSH 1 ; /Format = CF_TEXT 0040100C |. FF15 2C204000 CALL DWORD PTR DS:[<&user32.IsClipboardF>; \IsClipboardFormatAvailable 00401012 |. 0BC0 OR EAX,EAX 00401014 |. 0F84 95000000 JE CLIPBO~1.004010AF 0040101A |. 6A 00 PUSH 0 ; /hWnd = NULL 0040101C |. FF15 24204000 CALL DWORD PTR DS:[<&user32.OpenClipboar>; \OpenClipboard 00401022 |. 0BC0 OR EAX,EAX 00401024 |. 0F84 85000000 JE CLIPBO~1.004010AF 0040102A |. 6A 01 PUSH 1 ; /Format = CF_TEXT 0040102C |. FF15 30204000 CALL DWORD PTR DS:[<&user32.GetClipboard>; \GetClipboardData 00401032 |. 0BC0 OR EAX,EAX 00401034 |. 74 71 JE SHORT CLIPBO~1.004010A7 00401036 |. 8945 FC MOV DWORD PTR SS:[EBP-4],EAX 00401039 |. FF75 FC PUSH DWORD PTR SS:[EBP-4] ; /hMem 0040103C |. FF15 10204000 CALL DWORD PTR DS:[<&kernel32.GlobalSize>; \GlobalSize 00401042 |. 0BC0 OR EAX,EAX 00401044 |. 74 61 JE SHORT CLIPBO~1.004010A7 00401046 |. 8945 F8 MOV DWORD PTR SS:[EBP-8],EAX 00401049 |. FF15 18204000 CALL DWORD PTR DS:[<&kernel32.GetProcess>; [GetProcessHeap 0040104F |. 0BC0 OR EAX,EAX 00401051 |. 74 54 JE SHORT CLIPBO~1.004010A7 00401053 |. FF75 F8 PUSH DWORD PTR SS:[EBP-8] ; /HeapSize 00401056 |. 6A 08 PUSH 8 ; |Flags = HEAP_ZERO_MEMORY 00401058 |. 50 PUSH EAX ; |hHeap 00401059 |. FF15 08204000 CALL DWORD PTR DS:[<&kernel32.HeapAlloc>>; \HeapAlloc 0040105F |. 0BC0 OR EAX,EAX 00401061 |. 74 44 JE SHORT CLIPBO~1.004010A7 00401063 |. 8945 F4 MOV DWORD PTR SS:[EBP-C],EAX 00401066 |. FF75 FC PUSH DWORD PTR SS:[EBP-4] ; /hMem 00401069 |. FF15 14204000 CALL DWORD PTR DS:[<&kernel32.GlobalLock>; \GlobalLock 0040106F |. 0BC0 OR EAX,EAX 00401071 |. 74 34 JE SHORT CLIPBO~1.004010A7 00401073 |. 8945 F0 MOV DWORD PTR SS:[EBP-10],EAX 00401076 |. FF75 F0 PUSH DWORD PTR SS:[EBP-10] ; /String2 00401079 |. FF75 F4 PUSH DWORD PTR SS:[EBP-C] ; |String1 0040107C |. FF15 04204000 CALL DWORD PTR DS:[<&kernel32.lstrcpyA>] ; \lstrcpyA 00401082 |. 0BC0 OR EAX,EAX 00401084 |. 74 03 JE SHORT CLIPBO~1.00401089 00401086 |. FF45 EC INC DWORD PTR SS:[EBP-14] 00401089 |> FF75 FC PUSH DWORD PTR SS:[EBP-4] ; /hMem 0040108C |. FF15 0C204000 CALL DWORD PTR DS:[<&kernel32.GlobalUnlo>; \GlobalUnlock 00401092 |. FF15 38204000 CALL DWORD PTR DS:[<&user32.CloseClipboa>; [CloseClipboard 00401098 |. 837D EC 01 CMP DWORD PTR SS:[EBP-14],1 0040109C |. 75 05 JNZ SHORT CLIPBO~1.004010A3 0040109E |. 8B45 F4 MOV EAX,DWORD PTR SS:[EBP-C] 004010A1 |. C9 LEAVE 004010A2 |. C3 RETN 004010A3 |> 33C0 XOR EAX,EAX 004010A5 |. C9 LEAVE 004010A6 |. C3 RETN 004010A7 |> FF15 38204000 CALL DWORD PTR DS:[<&user32.CloseClipboa>; [CloseClipboard 004010AD |. 33C0 XOR EAX,EAX 004010AF |> C9 LEAVE 004010B0 \. C3 RETN [ S_T_A_S_: .if eax != 0 - а зачем здесь лишние символы "!= 0" ? ;)] Для наглядности ;-) |
|
Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.059 |