Delphi-Quellcode:
function ReverseBits(Value,Len : integer) : integer;
begin
asm
mov edx,Value
mov ecx,Len
1.) das zusätzliche begin end muß raus
2.) Parameter überigt Delphi standardäßig in den Registern EAX,EDX,ECX
3.) ergo: EAX=Value und EDX=Len
4.) mit mov edx, Value -> mov edx,eax und
5.) mit mov ecx, Len -> mov ecx,edx überschreibst du deine Parameter so daß nachfolgender Pseudocode dies verdeutlicht
6.) mov edx, Value; mov ecx, Len; wäre also mov Len, Value; mov ecx, Len
du überschreibst also deine eigenen Parameter !! so kann das nicht funktionieren.
Mein Tipp an dich: vergiß in deiner Situation in Assembler programmieren zu wollen. Der Compiler erzeugt aus reinem PASCAL Code sehr wohl ausreichend guten Assembler.
Delphi-Quellcode:
function GetReversedBits(AValue: Cardinal; ALen: Byte): Cardinal;
// AValue = EAX; ALen = EDX
asm
test edx, edx
jz @Exit
// ALen == 0 ??
sub ecx, ecx
// ECX == @Result := 0
@Start:
shr eax, 1
// AValue div 2
adc ecx, ecx
// @Result = @Result + @Result + Ord(previous AValue)
dec edx
jnz @Start
mov eax, ecx
@Exit:
end;
- shr, shl sind auf heutigen Rechnern langsammer als ADD/ADC/SUB/SBB (Stichworte Pipelines, Instruction Shuffling)
- loop arbeitet nur auf register CX und nicht ECX auf einigen CPU's
- Kombinationen aus
dec Register; branch Adresse; sind schneller als der Loop OpCode
- Avalue und @Result sollten Cardinal sein, Integer ist Vorzeichenbehaftet und der OpCode SHR arbeitet ohne Vorzeichen
- ALen sollte der kleinstmögliche Datentyp sein, da theoretisch ALen >= 32 wenig Sinn macht
Gruß Hagen