Delphi XE2, простой код:Почему Delphi «для» действует так?
function FastSwap(Value: uint16): uint16; register; overload;
asm
bswap eax
shr eax, 16
end;
...
type
PPicEleHdr = ^TPicEleHdr;
TPicEleHdr = packed record
zero, size, count: word;
end;
var
count: integer;
buf: TBytes;
begin
...
peh := @buf[offs];
count := integer(FastSwap(peh.count));
for i := 0 to count - 1 do begin
и здесь for
я вижу в окне CPU
UnitExtract.pas.279: for i := 0 to count - 1 do begin
0051E459 8B45DC mov eax,[ebp-$24]
0051E45C 48 dec eax
0051E45D 85C0 test eax,eax
0051E45F 0F82CD000000 jb $0051e532
0051E465 40 inc eax
0051E466 8945AC mov [ebp-$54],eax
0051E469 C745F400000000 mov [ebp-$0c],$00000000
так, когда счетчик не 0
ничего работает должным образом, test eax, eax
(EAX = $ FFFFFFFF после dec eax
) не затрагивающий флаг Carry, в то время как jb
действующий флаг Carry. Есть ли что-то, что я не понимаю об использовании for
?
FWIW этому вопросу было бы легче ответить, если бы вы предоставили полный код. В этом случае мы с Мэйсоном смогли сделать вывод из asm, что ваше целое не указано. Тем не менее, всегда лучше предоставлять полную программу, как можно короче. –
Весь источник довольно большой: извлечение бонусных данных из файлов 'tiff' из папки, но ответы ниже были полезны. – user2091150
Да, конечно, весь источник большой. Вот почему вы сократили его до полного компилируемого 10-ти линейного образца. Это все, что вам нужно, чтобы продемонстрировать эту проблему. Это всегда платит за это. –