In den
Kommentaren verweist Peter Cordes auf einen Trick, der ermöglicht, direkt in eax zu laden und benötigt nicht das wiederholte nullen.
Ich war auch mal so frei, die non-volatilen Register korrekt zu sichern:
Code:
procedure TestCMov_Better;
asm
push esi
push edi
xor edx, edx
mov esi, 255 // High Limit
mov ecx, Count
@1: mov edi, 0
@2: mov eax, dword[Data + edi * 4]
cmp eax, esi // compare v (eax) with high value
cmovae eax, edx // if negative (unsigned check) or 255 we fill 0 (edx)
cmovge eax, esi // if greater (signed check) or 255 we fill 255 (esi)
mov Byte[CData + edi], al
inc edi
cmp edi, DATA_LEN
jl @2
dec ecx
jne @1
pop edi
pop esi
end;
Wenn nicht genügend Register zur Verfügung sind, können wir auch das hier (nur die Stelle mit dem Vergleich) machen - ist ein kleines bisschen langsamer aber immernoch schneller als alles andere:
Code:
xor edx, edx
cmp eax, 255 // compare v (eax) with high value
cmovae eax, edx // if negative or 255 we fill 0 (edx)
mov edx, 255
cmovge eax, edx // if greater or 255 we fill 255 (edx)