Thx, und man sollte die Register, welche nicht sowieso von der Funktion als Parameter belegt werden, vorher noch mit Push bzw. am Ende mit Pop retten... So:
Delphi-Quellcode:
function Length(Menge: TMySet): Byte;
overload;
function CountBits(C: Byte; P: Pointer): Byte;
asm
PUSH EBX
PUSH ECX
MOV CL, AL
// Byteanzahl nach CL
MOV EAX, 0
// Bitzähler EAX initialisieren
@loop1:
MOV EBX, [EDX]
// Bits nach EBX laden
MOV CH, 8
// Bitanzahl nach CH
@loop2:
ROR EBX, 1
// Niedrigstes Bit von EBX nach CF schieben
ADC EAX, 0
// CF zu EAX addieren
DEC CH
JNZ @loop2
ADD EDX, 1
// nächstes Bit adressieren
DEC CL
JNZ @loop1
POP ECX
POP EBX
end;
begin
Result := CountBits(SizeOf(Menge), @Menge);
end;