Arioch1

Advanced Member | Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору Да, любопытно, но дело не в BL как таковом, а в несохранении переменной в память изх регистра. Как у меня было со строками, и как в упомянутом на SQL.ru потере Self Смотрим неоптимизированный код: TrueFalse.dpr.18: Begin 0041A3E8 55 push ebp 0041A3E9 8BEC mov ebp,esp 0041A3EB 83C4F8 add esp,-$08 0041A3EE 53 push ebx 0041A3EF 56 push esi 0041A3F0 57 push edi 0041A3F1 8845FF mov [ebp-$01],al ****************************************** TrueFalse.dpr.19: If ATestBoolParam Then Writeln('True') Else Writeln('False'); 0041A3F4 807DFF00 cmp byte ptr [ebp-$01],$00 0041A3F8 741B jz $0041a415 0041A3FA A120E64100 mov eax,[$0041e620] 0041A3FF BAC8A44100 mov edx,$0041a4c8 0041A404 E84BAAFEFF call @Write0UString ... TrueFalse.dpr.20: If ATestBoolParam Then Writeln('True') Else Writeln('False'); 0041A42E 807DFF00 cmp byte ptr [ebp-$01],$00 0041A432 741B jz $0041a44f 0041A434 A120E64100 mov eax,[$0041e620] 0041A439 BAC8A44100 mov edx,$0041a4c8 0041A43E E811AAFEFF call @Write0UString ... TrueFalse.dpr.19: Begin 0041A3C4 55 push ebp 0041A3C5 8BEC mov ebp,esp 0041A3C7 51 push ecx 0041A3C8 53 push ebx 0041A3C9 56 push esi 0041A3CA 57 push edi 0041A3CB 8BD8 mov ebx,eax ******** Параметр 0041A3CD 8D5DFC lea ebx,[ebp-$04] ******** WTF ??? Pointer to... WHAT ? TrueFalse.dpr.20: If ATestBoolParam Then Writeln('True') Else Writeln('False'); 0041A3D0 84DB test bl,bl 0041A3D2 741B jz $0041a3ef 0041A3D4 A120E64100 mov eax,[$0041e620] 0041A3D9 BA98A44100 mov edx,$0041a498 0041A3DE E871AAFEFF call @Write0UString ..... TrueFalse.dpr.21: If ATestBoolParam Then Writeln('True') Else Writeln('False'); 0041A408 84DB test bl,bl 0041A40A 741B jz $0041a427 0041A40C A120E64100 mov eax,[$0041e620] 0041A411 BA98A44100 mov edx,$0041a498 .... 0041A416 E839AAFEFF call @Write0UString Тоесть дело вовсе не в if'ах как таковых, а в том, что за каким-то чёртом лысым оптимизатор выдумывает, что у него есть локальная переменная (а её нет, если за неё не считать push ecx) и берёт на неё указатель (который никому не нужен), при этом разрушая параметр. | Всего записей: 904 | Зарегистр. 03-03-2010 | Отправлено: 13:39 08-11-2013 | Исправлено: Arioch1, 13:48 08-11-2013 |
|